ETH Price: $2,604.56 (-0.24%)

Contract

0x06e5bffEdA8383848Fd04D047c839ecec6329627
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Owner Withdrawal180173302023-08-29 2:32:35415 days ago1693276355IN
0x06e5bffE...ec6329627
0 ETH0.0007442323
Withdraw All Pos...178500562023-08-05 16:47:23439 days ago1691254043IN
0x06e5bffE...ec6329627
0 ETH0.0010141414.82258943
Withdraw All Pos...178440152023-08-04 20:31:35440 days ago1691181095IN
0x06e5bffE...ec6329627
0 ETH0.0014453821.12550231
Declare Winner178439582023-08-04 20:20:11440 days ago1691180411IN
0x06e5bffE...ec6329627
0 ETH0.0013718823
Close Entries178438742023-08-04 20:03:23440 days ago1691179403IN
0x06e5bffE...ec6329627
0 ETH0.0009748831
Add To Position178438502023-08-04 19:58:23440 days ago1691179103IN
0x06e5bffE...ec6329627
0.08 ETH0.0026989830.25019598
Add To Position178438422023-08-04 19:56:47440 days ago1691179007IN
0x06e5bffE...ec6329627
0.12 ETH0.0028307831.73174014
Open Entries178438062023-08-04 19:49:23440 days ago1691178563IN
0x06e5bffE...ec6329627
0 ETH0.0012578823.56343532
Close Entries178437822023-08-04 19:44:35440 days ago1691178275IN
0x06e5bffE...ec6329627
0 ETH0.0008490927
Withdraw All Pos...178437782023-08-04 19:43:47440 days ago1691178227IN
0x06e5bffE...ec6329627
0 ETH0.0016326723.86289666
Open Entries178437752023-08-04 19:43:11440 days ago1691178191IN
0x06e5bffE...ec6329627
0 ETH0.0013345725
Create Game With...178437682023-08-04 19:41:47440 days ago1691178107IN
0x06e5bffE...ec6329627
0 ETH0.0029398322
Declare Winner178437592023-08-04 19:39:59440 days ago1691177999IN
0x06e5bffE...ec6329627
0 ETH0.0011929420
Close Entries178435262023-08-04 18:52:59440 days ago1691175179IN
0x06e5bffE...ec6329627
0 ETH0.000786225
Add To Position178435132023-08-04 18:50:23440 days ago1691175023IN
0x06e5bffE...ec6329627
0.05 ETH0.0016975723.5375301
Add To Position178435132023-08-04 18:50:23440 days ago1691175023IN
0x06e5bffE...ec6329627
1 ETH0.0021000623.5375301
Add To Position178435112023-08-04 18:49:59440 days ago1691174999IN
0x06e5bffE...ec6329627
0.02 ETH0.0020767823.27658903
Add To Position178435052023-08-04 18:48:47440 days ago1691174927IN
0x06e5bffE...ec6329627
1 ETH0.0016887723.4194542
Add To Position178434352023-08-04 18:34:47440 days ago1691174087IN
0x06e5bffE...ec6329627
0.2 ETH0.0021819724.4589108
Add To Position178433172023-08-04 18:10:35440 days ago1691172635IN
0x06e5bffE...ec6329627
0.2 ETH0.0019865527.54431538
Add To Position178433042023-08-04 18:07:59440 days ago1691172479IN
0x06e5bffE...ec6329627
0.05 ETH0.0027187530.47176436
Open Entries178433022023-08-04 18:07:35440 days ago1691172455IN
0x06e5bffE...ec6329627
0 ETH0.0017616333
Withdraw All Pos...178429542023-08-04 16:57:35440 days ago1691168255IN
0x06e5bffE...ec6329627
0 ETH0.0022335626.36189608
Create Game With...178426052023-08-04 15:46:59440 days ago1691164019IN
0x06e5bffE...ec6329627
0 ETH0.0034743526
Set Default Min ...178425092023-08-04 15:27:47440 days ago1691162867IN
0x06e5bffE...ec6329627
0 ETH0.0009008831.06188962
View all transactions

Latest 10 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
180173302023-08-29 2:32:35415 days ago1693276355
0x06e5bffE...ec6329627
3.28 ETH
178500562023-08-05 16:47:23439 days ago1691254043
0x06e5bffE...ec6329627
0.24 ETH
178440152023-08-04 20:31:35440 days ago1691181095
0x06e5bffE...ec6329627
0.4 ETH
178437782023-08-04 19:43:47440 days ago1691178227
0x06e5bffE...ec6329627
2 ETH
178429542023-08-04 16:57:35440 days ago1691168255
0x06e5bffE...ec6329627
0.1 ETH
178368792023-08-03 20:33:59441 days ago1691094839
0x06e5bffE...ec6329627
1 ETH
178366772023-08-03 19:53:11441 days ago1691092391
0x06e5bffE...ec6329627
0.4 ETH
178366692023-08-03 19:51:35441 days ago1691092295
0x06e5bffE...ec6329627
4 ETH
178366682023-08-03 19:51:23441 days ago1691092283
0x06e5bffE...ec6329627
0.1 ETH
178359402023-08-03 17:24:35441 days ago1691083475
0x06e5bffE...ec6329627
0.2 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Livestreambets

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : Livestreambets.sol
// SPDX-License-Identifier: MIT

/*
  [Website]         https://www.livestreambets.gg
  [Twitter/X]       https://twitter.com/livestreambets
  [Telegram]        https://t.me/livestreambetsgg
*/

pragma solidity ^0.8.19;

import "hardhat/console.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract Livestreambets is Ownable, Pausable, ReentrancyGuard {
    enum GameStatus {
        EntriesClosed,
        EntriesOpen,
        Expired, // Terminal state
        WinnerDeclared, // Terminal state
        Cancelled // Terminal state
    }

    struct Position {
        uint256 amount;
        bool hasWithdrawn;
    }

    struct Game {
        uint256 expiresAt;
        uint256 options;
        uint256 minPositionSize; // individual position minimum size
        uint256 maxAmountPerOption; // maximum total amount that can be bet on a single option across all account positions
        uint256 winner;
        bool entriesOpen;
        bool winnerDeclared;
        bool cancelled;
        bool rakeRecorded;
    }

    // Game management
    uint256 public defaultExpirationPeriod;
    uint256 public maxOptions;
    uint256 public defaultMinPositionSize;
    uint256 public defaultMaxAmountPerOption;
    address public gameManager;
    Game[] public games;

    // Rake management
    uint256 public earnedRakeAmount;
    uint256 public claimedRakeAmount;
    address payable public rakeRecipient;

    // SEE: positionKeyHash
    mapping(bytes32 => Position) public positions;

    // SEE: gameOptionKeyHash
    mapping(bytes32 => uint256) public totalOfAllPositionsForGameOption;

    error NotAllowed();
    error InvalidGameStatus();
    error PositionSizeTooSmall();
    error MaxAmountForOptionExceeded();
    error WithdrawalFailed();

    error InvalidGameConfiguration();
    error InvalidGame();
    error InvalidGameOption();

    error EmptyPosition();
    error InvalidAmount();
    error GameNotFinished();

    event WinnerDeclared(uint256 gameId, uint256 winningOptionId);
    event AddedToPosition(
        uint256 gameId,
        uint256 optionId,
        address account,
        uint256 originalPositionSize,
        uint256 amountAddedToPosition
    );
    event GameCreated(uint256 indexed gameId);
    event UserWithdrawal(
        uint256 gameId,
        uint256 optionId,
        address account,
        uint256 amount
    );
    event BulkUserWithdrawal(uint256 gameId, address account, uint256 amount);
    event RakeWithdrawn(uint256 amount);
    event StatusChange(
        uint256 gameId,
        GameStatus oldStatus,
        GameStatus newStatus
    );
    event OwnerDeposit(uint256 amount);
    event OwnerWithdrawal(uint256 amount);

    modifier checkGameId(uint256 gameId_) {
        if (gameId_ >= games.length) {
            revert InvalidGame();
        }
        _;
    }

    modifier onlyOwnerOrGameManager() {
        require(
            msg.sender == owner() || msg.sender == gameManager,
            "Caller is neither the owner nor game manager"
        );
        _;
    }

    constructor(address payable rakeRecipient_, address gameManager_) {
        setDefaultExpirationPeriod(3 days);
        setMaxOptions(10);
        setDefaultMinPositionSize(0.1 ether);
        setDefaultMaxAmountPerOption(1 ether);
        setRakeRecipient(rakeRecipient_);
        setGameManager(gameManager_);
    }

    function positionKeyHash(
        uint256 gameId_,
        address account_,
        uint256 optionId_
    ) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(gameId_, account_, optionId_));
    }

    function gameOptionKeyHash(
        uint256 gameId_,
        uint256 optionId_
    ) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(gameId_, optionId_));
    }

    function gameCount() public view returns (uint256) {
        return games.length;
    }

    function gameStatus(
        uint256 gameId_
    ) public view checkGameId(gameId_) returns (GameStatus) {
        Game storage game = games[gameId_];
        return _gameStatus(game);
    }

    // Check terminal states first, then check non-terminal states.
    function _gameStatus(Game storage game) internal view returns (GameStatus) {
        // Terminal state (manual).
        if (game.winnerDeclared) {
            return GameStatus.WinnerDeclared;
        }

        // Terminal state (manual).
        if (game.cancelled) {
            return GameStatus.Cancelled;
        }

        // Terminal state (automatic).
        if (block.timestamp > game.expiresAt) {
            return GameStatus.Expired;
        }

        // Non-terminal state (manual).
        if (game.entriesOpen) {
            return GameStatus.EntriesOpen;
        }

        // Non-terminal state (manual).
        return GameStatus.EntriesClosed;
    }

    //////////  Game management functions  //////////

    function createGameWithDefaults(
        uint256 options_
    ) external onlyOwnerOrGameManager {
        createGame(
            defaultExpirationPeriod,
            options_,
            defaultMinPositionSize,
            defaultMaxAmountPerOption
        );
    }

    function createGame(
        uint256 expirationPeriod_,
        uint256 options_,
        uint256 minPositionSize_,
        uint256 maxAmountPerOption_
    ) public onlyOwnerOrGameManager {
        // A race must have at least 2 options and at most maxOptions.
        if (options_ < 2 || options_ > maxOptions) {
            revert InvalidGameConfiguration();
        }

        // Create the game and push it onto the games array.
        games.push(
            Game(
                block.timestamp + expirationPeriod_, // uint256 expiresAt
                options_, // uint256 options
                minPositionSize_, // uint256 minPositionSize;
                maxAmountPerOption_, // uint256 maxAmountPerOption
                0, // uint256 winner
                false, // bool entriesOpen
                false, // bool winnerDeclared
                false, // bool cancelled
                false // bool rakeRecorded
            )
        );

        // Emit event.
        emit GameCreated(games.length - 1);
    }

    function openEntries(
        uint256 gameId_
    ) external onlyOwnerOrGameManager checkGameId(gameId_) {
        Game storage game = games[gameId_];

        // Game must be in EntriesClosed state.
        GameStatus gameStatus__ = _gameStatus(game);
        if (gameStatus__ != GameStatus.EntriesClosed) {
            revert InvalidGameStatus();
        }

        // Open the game for betting.
        game.entriesOpen = true;

        // Emit event.
        emit StatusChange(gameId_, gameStatus__, GameStatus.EntriesOpen);
    }

    function closeEntries(
        uint256 gameId_
    ) external onlyOwnerOrGameManager checkGameId(gameId_) {
        Game storage game = games[gameId_];

        // Game must be in EntriesOpen state.
        GameStatus gameStatus__ = _gameStatus(game);
        if (gameStatus__ != GameStatus.EntriesOpen) {
            revert InvalidGameStatus();
        }

        // Open the game for betting.
        game.entriesOpen = false;

        // Emit event.
        emit StatusChange(gameId_, gameStatus__, GameStatus.EntriesClosed);
    }

    function cancelGame(
        uint256 gameId_
    ) external onlyOwnerOrGameManager checkGameId(gameId_) {
        Game storage game = games[gameId_];
        GameStatus gameStatus__ = _gameStatus(game);

        // Game must be in a cancellable state (either EntriesOpen or EntriesClosed).
        if (
            gameStatus__ != GameStatus.EntriesOpen &&
            gameStatus__ != GameStatus.EntriesClosed
        ) {
            revert InvalidGameStatus();
        }

        // Cancel the game.
        game.cancelled = true;

        // Emit event.
        emit StatusChange(gameId_, gameStatus__, GameStatus.Cancelled);
    }

    function declareWinner(
        uint256 gameId_,
        uint256 winningOptionId_
    ) external onlyOwnerOrGameManager checkGameId(gameId_) {
        Game storage game = games[gameId_];
        GameStatus gameStatus__ = _gameStatus(game);

        // Game must be in EntriesClosed state.
        if (gameStatus__ != GameStatus.EntriesClosed) {
            revert InvalidGameStatus();
        }

        // Check that the winner is within the possible range of options.
        if (winningOptionId_ >= game.options) {
            revert InvalidGameOption();
        }

        // Save the winner.
        game.winnerDeclared = true;
        game.winner = winningOptionId_;

        // Emit events.
        emit WinnerDeclared(gameId_, winningOptionId_);
        emit StatusChange(gameId_, gameStatus__, GameStatus.EntriesOpen);
    }

    function withdrawRake(uint256 amount_) public onlyOwner nonReentrant {
        // Check that the amount is available to claim.
        if (amount_ > claimableRakeAmount()) {
            revert InvalidAmount();
        }

        // Record the amount claimed.
        claimedRakeAmount += amount_;

        // Pay out earnings to account using .call().
        (bool success, ) = rakeRecipient.call{value: amount_}("");

        // Revert if unsuccessful.
        if (!success) {
            revert WithdrawalFailed();
        }

        // Emit event
        emit RakeWithdrawn(amount_);
    }

    function withdrawAllAvailableRake() external onlyOwner {
        withdrawRake(claimableRakeAmount());
    }

    function claimableRakeAmount() public view returns (uint256) {
        return earnedRakeAmount - claimedRakeAmount;
    }

    // Convenience external view function to get the total of all positions for a game.
    function totalsOfAllPositionsForAllGameOptions(
        uint256 gameId_
    ) external view checkGameId(gameId_) returns (uint256[] memory) {
        Game storage game = games[gameId_];
        uint256[] memory totals = new uint256[](game.options);

        for (uint256 i = 0; i < game.options; i++) {
            totals[i] = totalOfAllPositionsForGameOption[
                gameOptionKeyHash(gameId_, i)
            ];
        }

        return totals;
    }

    function totalLockedInGame(
        uint256 gameId_
    ) external view checkGameId(gameId_) returns (uint256) {
        Game storage game = games[gameId_];
        uint256 total = 0;

        for (uint256 i = 0; i < game.options; i++) {
            total += totalOfAllPositionsForGameOption[
                gameOptionKeyHash(gameId_, i)
            ];
        }

        return total;
    }

    // Convenience external view function to get all of a user's positions for a game.
    function positionsForGameForAccount(
        uint256 gameId_,
        address account_
    ) external view checkGameId(gameId_) returns (Position[] memory) {
        Game storage game = games[gameId_];
        Position[] memory positions__ = new Position[](game.options);

        for (uint256 i = 0; i < game.options; i++) {
            positions__[i] = positions[positionKeyHash(gameId_, account_, i)];
        }

        return positions__;
    }

    // Convenience external view function to get a user's total committed to a game.
    function totalCommittedToGameForAccount(
        uint256 gameId_,
        address account_
    ) external view checkGameId(gameId_) returns (uint256) {
        Game storage game = games[gameId_];
        uint256 total = 0;

        for (uint256 i = 0; i < game.options; i++) {
            total += positions[positionKeyHash(gameId_, account_, i)].amount;
        }

        return total;
    }

    // Compute losing positions to allow them to be withdrawn by the owner, and record the amount in earnedRakeAmount.
    function recordRake(
        uint256 gameId_
    ) external onlyOwner checkGameId(gameId_) {
        Game storage game = games[gameId_];
        GameStatus gameStatus__ = _gameStatus(game);

        // Ensure that the winner has been declared, so we can add up the losing positions.
        if (gameStatus__ != GameStatus.WinnerDeclared) {
            revert InvalidGameStatus();
        }

        // Ensure that the rake has not already been computed for this game.
        if (game.rakeRecorded) {
            revert NotAllowed();
        }

        // Compute the total amount of rake available to be claimed.
        for (uint256 i = 0; i < game.options; i++) {
            // Skip the winning option.
            if (i == game.winner) {
                continue;
            }

            // Get the total of all losing positions.
            // Add the amount to the total claimable rake for the owner.
            earnedRakeAmount += totalOfAllPositionsForGameOption[
                gameOptionKeyHash(gameId_, i)
            ];
        }
        // Record that the rake was calculated for this game.
        game.rakeRecorded = true;
    }

    // Handle the 3 terminal states (Expired, Cancelled, and WinnerSelected), and allow users to withdraw their positions and winnings where eligible.
    function withdrawAllPositionsAndWinningsFromGame(
        uint256 gameId_
    ) external checkGameId(gameId_) whenNotPaused nonReentrant {
        Game storage game = games[gameId_];
        GameStatus gameStatus__ = _gameStatus(game);

        if (gameStatus__ == GameStatus.WinnerDeclared) {
            // If a winner has been selected, only allow winners to withdraw their winnings.
            _processWithdrawalForWinnerDeclaredState(gameId_, game.winner);
        } else if (
            gameStatus__ == GameStatus.Expired ||
            gameStatus__ == GameStatus.Cancelled
        ) {
            // If the game is Expired or Cancelled, allow all users to withdraw all their positions.
            _processFullWithdrawalForAllOfUsersPositions(gameId_, game.options);
        } else {
            revert InvalidGameStatus();
        }
    }

    // Used in cases where we want the user to be able to withdraw all the money they have committed to the game (Expired and Cancelled states).
    function _processFullWithdrawalForAllOfUsersPositions(
        uint256 gameId_,
        uint256 gameOptions_
    ) internal {
        uint256 totalAmountForWithdrawal = 0;

        for (uint256 i = 0; i < gameOptions_; i++) {
            Position storage position = positions[
                positionKeyHash(gameId_, msg.sender, i)
            ];

            // Check if the account has already withdrawn their winnings.
            if (position.hasWithdrawn) {
                continue;
            }

            // Check if the account holds the position.
            if (position.amount == 0) {
                continue;
            }

            // Record that the account has withdrawn their position.
            position.hasWithdrawn = true;

            // Add the amount to the total amount for withdrawal.
            totalAmountForWithdrawal += position.amount;
        }

        // Check that the total amount for withdrawal is greater than 0.
        if (totalAmountForWithdrawal == 0) {
            revert EmptyPosition();
        }

        // Bulk payout to account.
        (bool success, ) = msg.sender.call{value: totalAmountForWithdrawal}("");

        // Revert if unsuccessful.
        if (!success) {
            revert WithdrawalFailed();
        }

        // Emit event
        emit BulkUserWithdrawal(gameId_, msg.sender, totalAmountForWithdrawal);
    }

    // Used in cases where there is a winner declared (WinnerDeclared state only), and we want users who held that position to be able to withdraw their winnings.
    function _processWithdrawalForWinnerDeclaredState(
        uint256 gameId_,
        uint256 winningGameOptionId_
    ) internal {
        // Get the account's winning position.
        Position storage position = positions[
            positionKeyHash(gameId_, msg.sender, winningGameOptionId_)
        ];

        // Check if the account has already withdrawn their winnings.
        if (position.hasWithdrawn) {
            revert WithdrawalFailed();
        }

        // Check if the account holds the position.
        if (position.amount == 0) {
            revert EmptyPosition();
        }

        // Calculate the winnings using 2:1 odds. This final value includes the original position amount and the winnings.
        uint256 totalEligibleForWithdrawal = position.amount * 2;

        position.hasWithdrawn = true;

        // Pay out earnings to account.
        (bool success, ) = msg.sender.call{value: totalEligibleForWithdrawal}(
            ""
        );

        // Revert if unsuccessful.
        if (!success) {
            revert WithdrawalFailed();
        }

        // Emit event
        emit UserWithdrawal(
            gameId_,
            winningGameOptionId_,
            msg.sender,
            totalEligibleForWithdrawal
        );
    }

    function addToPosition(
        uint256 gameId_,
        uint256 optionId_
    ) external payable checkGameId(gameId_) nonReentrant whenNotPaused {
        Game storage game = games[gameId_];
        GameStatus gameStatus__ = _gameStatus(game);

        // Check that the game is open for betting.
        if (gameStatus__ != GameStatus.EntriesOpen) {
            revert InvalidGameStatus();
        }

        // Check that the option is within the possible range of options.
        if (optionId_ >= game.options) {
            revert InvalidGameOption();
        }

        // Retrieve the user's current position.
        Position storage position = positions[
            positionKeyHash(gameId_, msg.sender, optionId_)
        ];

        // Check that the total amount for the position is at least the minBetSize
        uint256 newPositionSize = position.amount + msg.value;

        if (newPositionSize < game.minPositionSize) {
            revert PositionSizeTooSmall();
        }

        // Check that the total sum of positions on the option does not exceed maxAmountPerOption.
        bytes32 gameOptionKey = gameOptionKeyHash(gameId_, optionId_);

        uint256 newTotalAmountCommitted = totalOfAllPositionsForGameOption[
            gameOptionKey
        ] + msg.value;

        if (newTotalAmountCommitted > game.maxAmountPerOption) {
            revert MaxAmountForOptionExceeded();
        }

        // Save the new position.
        totalOfAllPositionsForGameOption[
            gameOptionKey
        ] = newTotalAmountCommitted;
        position.amount = newPositionSize;

        // Emit event.
        emit AddedToPosition(
            gameId_,
            optionId_,
            msg.sender,
            position.amount, // account's original position size
            msg.value // amount added to account's position
        );
    }

    //////////  Admin config functions  //////////

    function setDefaultExpirationPeriod(
        uint256 defaultExpirationPeriod_
    ) public onlyOwner {
        defaultExpirationPeriod = defaultExpirationPeriod_;
    }

    function setDefaultMinPositionSize(
        uint256 defaultMinPositionSize_
    ) public onlyOwner {
        defaultMinPositionSize = defaultMinPositionSize_;
    }

    function setDefaultMaxAmountPerOption(
        uint256 defaultMaxAmountPerOption_
    ) public onlyOwner {
        defaultMaxAmountPerOption = defaultMaxAmountPerOption_;
    }

    function setMaxOptions(uint256 maxOptions_) public onlyOwner {
        maxOptions = maxOptions_;
    }

    function setRakeRecipient(address payable rakeRecipient_) public onlyOwner {
        rakeRecipient = rakeRecipient_;
    }

    function setGameManager(address gameManager_) public onlyOwner {
        gameManager = gameManager_;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    //////////  Admin balance management functions  //////////

    function ownerDeposit() external payable onlyOwner {
        if (msg.value == 0) {
            revert InvalidAmount();
        }

        // Emit event.
        emit OwnerDeposit(msg.value);
    }

    function ownerWithdrawal(uint256 amount_) external onlyOwner {
        // Check that the amount is available to claim.
        if (amount_ > address(this).balance || amount_ == 0) {
            revert InvalidAmount();
        }

        // Pay out earnings to account using .call().
        (bool success, ) = msg.sender.call{value: amount_}("");

        // Revert if unsuccessful.
        if (!success) {
            revert WithdrawalFailed();
        }

        // Emit event
        emit OwnerWithdrawal(amount_);
    }

    //////////  Fallback functions  //////////

    fallback() external {
        revert NotAllowed();
    }

    receive() external payable {
        revert NotAllowed();
    }
}

File 2 of 6 : 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);
    }
}

File 3 of 6 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 4 of 6 : 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;
    }
}

File 5 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 6 of 6 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;

	function _sendLogPayload(bytes memory payload) private view {
		address consoleAddress = CONSOLE_ADDRESS;
		/// @solidity memory-safe-assembly
		assembly {
			pop(staticcall(gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0))
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

	function log(uint256 p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
	}

	function log(uint256 p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
	}

	function log(uint256 p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
	}

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, address p3) internal view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, address p3) internal view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, address p3) internal view {
		_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 view {
		_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 view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"rakeRecipient_","type":"address"},{"internalType":"address","name":"gameManager_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyPosition","type":"error"},{"inputs":[],"name":"GameNotFinished","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidGame","type":"error"},{"inputs":[],"name":"InvalidGameConfiguration","type":"error"},{"inputs":[],"name":"InvalidGameOption","type":"error"},{"inputs":[],"name":"InvalidGameStatus","type":"error"},{"inputs":[],"name":"MaxAmountForOptionExceeded","type":"error"},{"inputs":[],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"PositionSizeTooSmall","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"optionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"originalPositionSize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountAddedToPosition","type":"uint256"}],"name":"AddedToPosition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BulkUserWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"GameCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"enum Livestreambets.GameStatus","name":"oldStatus","type":"uint8"},{"indexed":false,"internalType":"enum Livestreambets.GameStatus","name":"newStatus","type":"uint8"}],"name":"StatusChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"optionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winningOptionId","type":"uint256"}],"name":"WinnerDeclared","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"},{"internalType":"uint256","name":"optionId_","type":"uint256"}],"name":"addToPosition","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"cancelGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimableRakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimedRakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"closeEntries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"expirationPeriod_","type":"uint256"},{"internalType":"uint256","name":"options_","type":"uint256"},{"internalType":"uint256","name":"minPositionSize_","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerOption_","type":"uint256"}],"name":"createGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"options_","type":"uint256"}],"name":"createGameWithDefaults","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"},{"internalType":"uint256","name":"winningOptionId_","type":"uint256"}],"name":"declareWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultExpirationPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMaxAmountPerOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMinPositionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earnedRakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"},{"internalType":"uint256","name":"optionId_","type":"uint256"}],"name":"gameOptionKeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"gameStatus","outputs":[{"internalType":"enum Livestreambets.GameStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"uint256","name":"expiresAt","type":"uint256"},{"internalType":"uint256","name":"options","type":"uint256"},{"internalType":"uint256","name":"minPositionSize","type":"uint256"},{"internalType":"uint256","name":"maxAmountPerOption","type":"uint256"},{"internalType":"uint256","name":"winner","type":"uint256"},{"internalType":"bool","name":"entriesOpen","type":"bool"},{"internalType":"bool","name":"winnerDeclared","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"bool","name":"rakeRecorded","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOptions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"openEntries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"ownerWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"},{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"optionId_","type":"uint256"}],"name":"positionKeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"positions","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"hasWithdrawn","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"},{"internalType":"address","name":"account_","type":"address"}],"name":"positionsForGameForAccount","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"hasWithdrawn","type":"bool"}],"internalType":"struct Livestreambets.Position[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rakeRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"recordRake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"defaultExpirationPeriod_","type":"uint256"}],"name":"setDefaultExpirationPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"defaultMaxAmountPerOption_","type":"uint256"}],"name":"setDefaultMaxAmountPerOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"defaultMinPositionSize_","type":"uint256"}],"name":"setDefaultMinPositionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gameManager_","type":"address"}],"name":"setGameManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxOptions_","type":"uint256"}],"name":"setMaxOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"rakeRecipient_","type":"address"}],"name":"setRakeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"},{"internalType":"address","name":"account_","type":"address"}],"name":"totalCommittedToGameForAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"totalLockedInGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"totalOfAllPositionsForGameOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"totalsOfAllPositionsForAllGameOptions","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllAvailableRake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId_","type":"uint256"}],"name":"withdrawAllPositionsAndWinningsFromGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdrawRake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620041bc380380620041bc83398181016040528101906200003791906200043f565b620000576200004b620000fa60201b60201c565b6200010260201b60201c565b60008060146101000a81548160ff021916908315150217905550600180819055506200008c6203f480620001c660201b60201c565b6200009e600a620001e060201b60201c565b620000b767016345785d8a0000620001fa60201b60201c565b620000d0670de0b6b3a76400006200021460201b60201c565b620000e1826200022e60201b60201c565b620000f2816200028260201b60201c565b505062000509565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001d6620002d660201b60201c565b8060028190555050565b620001f0620002d660201b60201c565b8060038190555050565b6200020a620002d660201b60201c565b8060048190555050565b62000224620002d660201b60201c565b8060058190555050565b6200023e620002d660201b60201c565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b62000292620002d660201b60201c565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620002e6620000fa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200030c6200036760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000365576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035c90620004e7565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003c28262000395565b9050919050565b620003d481620003b5565b8114620003e057600080fd5b50565b600081519050620003f481620003c9565b92915050565b6000620004078262000395565b9050919050565b6200041981620003fa565b81146200042557600080fd5b50565b60008151905062000439816200040e565b92915050565b6000806040838503121562000459576200045862000390565b5b60006200046985828601620003e3565b92505060206200047c8582860162000428565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620004cf60208362000486565b9150620004dc8262000497565b602082019050919050565b600060208201905081810360008301526200050281620004c0565b9050919050565b613ca380620005196000396000f3fe6080604052600436106102765760003560e01c806379afb9291161014f578063b0090ea3116100c1578063daf75c051161007a578063daf75c051461098a578063dff3f3b9146109c7578063e90ae59c146109f0578063ee0d48f614610a19578063ef78411114610a42578063f2fde38b14610a6d576102ad565b8063b0090ea314610890578063b01b810c146108a7578063b2a5bab8146108d0578063b7127e411461090d578063bdaae1e714610936578063c6b052661461095f576102ad565b80639106447c116101135780639106447c1461077257806396e5075a1461079b57806399c76246146107c45780639f20daaa146107ed578063a345758e1461082a578063a8e492d914610853576102ad565b806379afb929146106c05780637b1aa45f146106fd5780638456cb59146107075780638b6ae4121461071e5780638da5cb5b14610747576102ad565b80634738638b116101e8578063544ed9b4116101ac578063544ed9b4146105d65780635c975abb146105ff5780635df170771461062a5780635e68fc061461065557806369958ab914610680578063715018a6146106a9576102ad565b80634738638b146104da578063483fcb87146105175780634a7e75f4146105425780634d1975b41461056d578063514ea4bf14610598576102ad565b806328df30bc1161023a57806328df30bc146103d95780632c542ede146104045780632d9398771461042057806334239c9c14610449578063347e1e0a146104865780633f4ba83a146104c3576102ad565b80630482a329146102ec5780630511c17c14610317578063117a5b90146103425780631643c8c4146103875780631ba3a9c3146103b0576102ad565b366102ad576040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3480156102b957600080fd5b506040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3480156102f857600080fd5b50610301610a96565b60405161030e9190612ecb565b60405180910390f35b34801561032357600080fd5b5061032c610aad565b6040516103399190612ecb565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190612f17565b610ab3565b60405161037e99989796959493929190612f5f565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612fec565b610b45565b005b3480156103bc57600080fd5b506103d760048036038101906103d29190612f17565b610dc1565b005b3480156103e557600080fd5b506103ee610f31565b6040516103fb919061306d565b60405180910390f35b61041e60048036038101906104199190612fec565b610f57565b005b34801561042c57600080fd5b5061044760048036038101906104429190612f17565b6111cd565b005b34801561045557600080fd5b50610470600480360381019061046b9190612f17565b6113c9565b60405161047d91906130ff565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613158565b611442565b6040516104ba9190613294565b60405180910390f35b3480156104cf57600080fd5b506104d861159f565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906132ec565b6115b1565b60405161050e9190612ecb565b60405180910390f35b34801561052357600080fd5b5061052c6115c9565b6040516105399190612ecb565b60405180910390f35b34801561054e57600080fd5b506105576115cf565b6040516105649190612ecb565b60405180910390f35b34801561057957600080fd5b506105826115d5565b60405161058f9190612ecb565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906132ec565b6115e2565b6040516105cd929190613319565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190612f17565b611613565b005b34801561060b57600080fd5b5061061461180f565b6040516106219190613342565b60405180910390f35b34801561063657600080fd5b5061063f611825565b60405161064c9190612ecb565b60405180910390f35b34801561066157600080fd5b5061066a61182b565b6040516106779190612ecb565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190612f17565b611831565b005b3480156106b557600080fd5b506106be611a60565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190612f17565b611a74565b6040516106f4919061340c565b60405180910390f35b610705611b96565b005b34801561071357600080fd5b5061071c611c11565b005b34801561072a57600080fd5b5061074560048036038101906107409190612f17565b611c23565b005b34801561075357600080fd5b5061075c611d05565b604051610769919061343d565b60405180910390f35b34801561077e57600080fd5b5061079960048036038101906107949190612f17565b611d2e565b005b3480156107a757600080fd5b506107c260048036038101906107bd9190612f17565b611d40565b005b3480156107d057600080fd5b506107eb60048036038101906107e69190612f17565b611d52565b005b3480156107f957600080fd5b50610814600480360381019061080f9190613158565b611d64565b6040516108219190612ecb565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190613484565b611e29565b005b34801561085f57600080fd5b5061087a600480360381019061087591906134b1565b611e75565b6040516108879190613513565b60405180910390f35b34801561089c57600080fd5b506108a5611eab565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190612f17565b611ec5565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190612fec565b61206e565b6040516109049190613513565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f919061352e565b6120a1565b005b34801561094257600080fd5b5061095d6004803603810190610958919061355b565b6120ed565b005b34801561096b57600080fd5b5061097461237d565b604051610981919061343d565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac9190612f17565b6123a3565b6040516109be9190612ecb565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e99190612f17565b612463565b005b3480156109fc57600080fd5b50610a176004803603810190610a129190612f17565b61258e565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190612f17565b612700565b005b348015610a4e57600080fd5b50610a57612712565b604051610a649190612ecb565b60405180910390f35b348015610a7957600080fd5b50610a946004803603810190610a8f919061352e565b612718565b005b6000600954600854610aa891906135f1565b905090565b60045481565b60078181548110610ac357600080fd5b90600052602060002090600602016000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900460ff16905089565b610b4d611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610bd35750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906136a8565b60405180910390fd5b816007805490508110610c51576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078481548110610c6757610c666136c8565b5b906000526020600020906006020190506000610c828261279b565b905060006004811115610c9857610c97613088565b5b816004811115610cab57610caa613088565b5b14610ce2576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600101548410610d1f576040517fcb7c84b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260050160016101000a81548160ff0219169083151502179055508382600401819055507fd620cad007f711f526385f9e9ecc931ea58b1285ae09a10d659b1eb9e3f374658585604051610d769291906136f7565b60405180910390a17feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e85826001604051610db293929190613720565b60405180910390a15050505050565b806007805490508110610e00576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0861281c565b610e10612866565b600060078381548110610e2657610e256136c8565b5b906000526020600020906006020190506000610e418261279b565b905060036004811115610e5757610e56613088565b5b816004811115610e6a57610e69613088565b5b03610e8257610e7d8483600401546128b5565b610f23565b60026004811115610e9657610e95613088565b5b816004811115610ea957610ea8613088565b5b1480610ed85750600480811115610ec357610ec2613088565b5b816004811115610ed657610ed5613088565b5b145b15610ef057610eeb848360010154612a76565b610f22565b6040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5050610f2d612c35565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b816007805490508110610f96576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9e612866565b610fa661281c565b600060078481548110610fbc57610fbb6136c8565b5b906000526020600020906006020190506000610fd78261279b565b905060016004811115610fed57610fec613088565b5b81600481111561100057610fff613088565b5b14611037576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600101548410611074576040517fcb7c84b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b6000611085883389611e75565b8152602001908152602001600020905060003482600001546110a79190613757565b905083600201548110156110e7576040517f99c3460e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110f3888861206e565b9050600034600c6000848152602001908152602001600020546111169190613757565b90508560030154811115611156576040517ffdb59c8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c6000848152602001908152602001600020819055508284600001819055507f942a77644519640071b23ff6ee3b7b47dd6a4738c5775fbb1760ec2b646038808989338760000154346040516111b295949392919061378b565b60405180910390a15050505050506111c8612c35565b505050565b6111d5611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061125b5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61129a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611291906136a8565b60405180910390fd5b8060078054905081106112d9576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600783815481106112ef576112ee6136c8565b5b90600052602060002090600602019050600061130a8261279b565b9050600060048111156113205761131f613088565b5b81600481111561133357611332613088565b5b1461136a576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260050160006101000a81548160ff0219169083151502179055507feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e848260016040516113bb93929190613720565b60405180910390a150505050565b600081600780549050811061140a576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600784815481106114205761141f6136c8565b5b906000526020600020906006020190506114398161279b565b92505050919050565b6060826007805490508110611483576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078581548110611499576114986136c8565b5b906000526020600020906006020190506000816001015467ffffffffffffffff8111156114c9576114c86137de565b5b60405190808252806020026020018201604052801561150257816020015b6114ef612e96565b8152602001906001900390816114e75790505b50905060005b826001015481101561159257600b6000611523898985611e75565b8152602001908152602001600020604051806040016040529081600082015481526020016001820160009054906101000a900460ff161515151581525050828281518110611574576115736136c8565b5b6020026020010181905250808061158a9061380d565b915050611508565b5080935050505092915050565b6115a7612c3e565b6115af612cbc565b565b600c6020528060005260406000206000915090505481565b60055481565b60085481565b6000600780549050905090565b600b6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b61161b611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116a15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d7906136a8565b60405180910390fd5b80600780549050811061171f576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078381548110611735576117346136c8565b5b9060005260206000209060060201905060006117508261279b565b90506001600481111561176657611765613088565b5b81600481111561177957611778613088565b5b146117b0576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260050160006101000a81548160ff0219169083151502179055507feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e8482600060405161180193929190613720565b60405180910390a150505050565b60008060149054906101000a900460ff16905090565b60035481565b60095481565b611839611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118bf5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f5906136a8565b60405180910390fd5b80600780549050811061193d576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078381548110611953576119526136c8565b5b90600052602060002090600602019050600061196e8261279b565b90506001600481111561198457611983613088565b5b81600481111561199757611996613088565b5b141580156119ca5750600060048111156119b4576119b3613088565b5b8160048111156119c7576119c6613088565b5b14155b15611a01576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260050160026101000a81548160ff0219169083151502179055507feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e84826004604051611a5293929190613720565b60405180910390a150505050565b611a68612c3e565b611a726000612d1e565b565b6060816007805490508110611ab5576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078481548110611acb57611aca6136c8565b5b906000526020600020906006020190506000816001015467ffffffffffffffff811115611afb57611afa6137de565b5b604051908082528060200260200182016040528015611b295781602001602082028036833780820191505090505b50905060005b8260010154811015611b8a57600c6000611b49888461206e565b815260200190815260200160002054828281518110611b6b57611b6a6136c8565b5b6020026020010181815250508080611b829061380d565b915050611b2f565b50809350505050919050565b611b9e612c3e565b60003403611bd8576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fb5dccff0c2e7a9547b26fe7dbfbfbd99813a8711e4baf7f2ec73cd69655dfe2c34604051611c079190612ecb565b60405180910390a1565b611c19612c3e565b611c21612de2565b565b611c2b611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cb15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906136a8565b60405180910390fd5b611d02600254826004546005546120ed565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d36612c3e565b8060028190555050565b611d48612c3e565b8060048190555050565b611d5a612c3e565b8060058190555050565b6000826007805490508110611da5576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078581548110611dbb57611dba6136c8565b5b906000526020600020906006020190506000805b8260010154811015611e1c57600b6000611dea898985611e75565b81526020019081526020016000206000015482611e079190613757565b91508080611e149061380d565b915050611dcf565b5080935050505092915050565b611e31612c3e565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000838383604051602001611e8c939291906138be565b6040516020818303038152906040528051906020012090509392505050565b611eb3612c3e565b611ec3611ebe610a96565b61258e565b565b611ecd612c3e565b806007805490508110611f0c576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078381548110611f2257611f216136c8565b5b906000526020600020906006020190506000611f3d8261279b565b905060036004811115611f5357611f52613088565b5b816004811115611f6657611f65613088565b5b14611f9d576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160050160039054906101000a900460ff1615611fe6576040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b826001015481101561204a57826004015481031561203757600c600061200f878461206e565b8152602001908152602001600020546008600082825461202f9190613757565b925050819055505b80806120429061380d565b915050611fe9565b5060018260050160036101000a81548160ff02191690831515021790555050505050565b600082826040516020016120839291906138fb565b60405160208183030381529060405280519060200120905092915050565b6120a9612c3e565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6120f5611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061217b5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b1906136a8565b60405180910390fd5b60028310806121ca575060035483115b15612201576040517f177adf0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007604051806101200160405280864261221b9190613757565b815260200185815260200184815260200183815260200160008152602001600015158152602001600015158152602001600015158152602001600015158152509080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff0219169083151502179055505050600160078054905061234b91906135f1565b7fbd19c47e9925eb6f7be8bb1c13a841e0240aaeaf17f217e90022e9c8eb66877f60405160405180910390a250505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160078054905081106123e4576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600784815481106123fa576123f96136c8565b5b906000526020600020906006020190506000805b826001015481101561245757600c6000612428888461206e565b815260200190815260200160002054826124429190613757565b9150808061244f9061380d565b91505061240e565b50809350505050919050565b61246b612c3e565b478111806124795750600081145b156124b0576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16826040516124d690613958565b60006040518083038185875af1925050503d8060008114612513576040519150601f19603f3d011682016040523d82523d6000602084013e612518565b606091505b5050905080612553576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f36a8cfbf7655e6019c9246e01ded1d727877ea135a5dcc275658e566fab1e978826040516125829190612ecb565b60405180910390a15050565b612596612c3e565b61259e612866565b6125a6610a96565b8111156125df576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960008282546125f19190613757565b925050819055506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161264090613958565b60006040518083038185875af1925050503d806000811461267d576040519150601f19603f3d011682016040523d82523d6000602084013e612682565b606091505b50509050806126bd576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa50c5d86b7fe5903552dca0219d47d925b98990b9d14c1f7291481f7a9298822826040516126ec9190612ecb565b60405180910390a1506126fd612c35565b50565b612708612c3e565b8060038190555050565b60025481565b612720612c3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361278f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612786906139df565b60405180910390fd5b61279881612d1e565b50565b60008160050160019054906101000a900460ff16156127bd5760039050612817565b8160050160029054906101000a900460ff16156127dd5760049050612817565b81600001544211156127f25760029050612817565b8160050160009054906101000a900460ff16156128125760019050612817565b600090505b919050565b61282461180f565b15612864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285b90613a4b565b60405180910390fd5b565b6002600154036128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290613ab7565b60405180910390fd5b6002600181905550565b6000600b60006128c6853386611e75565b815260200190815260200160002090508060010160009054906101000a900460ff161561291f576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081600001540361295d576040517f4dfbbff300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600282600001546129709190613ad7565b905060018260010160006101000a81548160ff02191690831515021790555060003373ffffffffffffffffffffffffffffffffffffffff16826040516129b590613958565b60006040518083038185875af1925050503d80600081146129f2576040519150601f19603f3d011682016040523d82523d6000602084013e6129f7565b606091505b5050905080612a32576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe5c7778b97408103623fad96d2d801c69d572015cb790d3cb8530fce38c44f0385853385604051612a679493929190613b19565b60405180910390a15050505050565b6000805b82811015612b16576000600b6000612a93873386611e75565b815260200190815260200160002090508060010160009054906101000a900460ff1615612ac05750612b03565b6000816000015403612ad25750612b03565b60018160010160006101000a81548160ff021916908315150217905550806000015483612aff9190613757565b9250505b8080612b0e9061380d565b915050612a7a565b5060008103612b51576040517f4dfbbff300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051612b7790613958565b60006040518083038185875af1925050503d8060008114612bb4576040519150601f19603f3d011682016040523d82523d6000602084013e612bb9565b606091505b5050905080612bf4576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f91d59bcf762c6c32cba8bd570c6c925b6d1c8bee1be34a6777c4191e194debdd843384604051612c2793929190613b5e565b60405180910390a150505050565b60018081905550565b612c46612e45565b73ffffffffffffffffffffffffffffffffffffffff16612c64611d05565b73ffffffffffffffffffffffffffffffffffffffff1614612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb190613be1565b60405180910390fd5b565b612cc4612e4d565b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d07612e45565b604051612d14919061343d565b60405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612dea61281c565b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e2e612e45565b604051612e3b919061343d565b60405180910390a1565b600033905090565b612e5561180f565b612e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8b90613c4d565b60405180910390fd5b565b6040518060400160405280600081526020016000151581525090565b6000819050919050565b612ec581612eb2565b82525050565b6000602082019050612ee06000830184612ebc565b92915050565b600080fd5b612ef481612eb2565b8114612eff57600080fd5b50565b600081359050612f1181612eeb565b92915050565b600060208284031215612f2d57612f2c612ee6565b5b6000612f3b84828501612f02565b91505092915050565b60008115159050919050565b612f5981612f44565b82525050565b600061012082019050612f75600083018c612ebc565b612f82602083018b612ebc565b612f8f604083018a612ebc565b612f9c6060830189612ebc565b612fa96080830188612ebc565b612fb660a0830187612f50565b612fc360c0830186612f50565b612fd060e0830185612f50565b612fde610100830184612f50565b9a9950505050505050505050565b6000806040838503121561300357613002612ee6565b5b600061301185828601612f02565b925050602061302285828601612f02565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130578261302c565b9050919050565b6130678161304c565b82525050565b6000602082019050613082600083018461305e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106130c8576130c7613088565b5b50565b60008190506130d9826130b7565b919050565b60006130e9826130cb565b9050919050565b6130f9816130de565b82525050565b600060208201905061311460008301846130f0565b92915050565b60006131258261302c565b9050919050565b6131358161311a565b811461314057600080fd5b50565b6000813590506131528161312c565b92915050565b6000806040838503121561316f5761316e612ee6565b5b600061317d85828601612f02565b925050602061318e85828601613143565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6131cd81612eb2565b82525050565b6131dc81612f44565b82525050565b6040820160008201516131f860008501826131c4565b50602082015161320b60208501826131d3565b50505050565b600061321d83836131e2565b60408301905092915050565b6000602082019050919050565b600061324182613198565b61324b81856131a3565b9350613256836131b4565b8060005b8381101561328757815161326e8882613211565b975061327983613229565b92505060018101905061325a565b5085935050505092915050565b600060208201905081810360008301526132ae8184613236565b905092915050565b6000819050919050565b6132c9816132b6565b81146132d457600080fd5b50565b6000813590506132e6816132c0565b92915050565b60006020828403121561330257613301612ee6565b5b6000613310848285016132d7565b91505092915050565b600060408201905061332e6000830185612ebc565b61333b6020830184612f50565b9392505050565b60006020820190506133576000830184612f50565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061339583836131c4565b60208301905092915050565b6000602082019050919050565b60006133b98261335d565b6133c38185613368565b93506133ce83613379565b8060005b838110156133ff5781516133e68882613389565b97506133f1836133a1565b9250506001810190506133d2565b5085935050505092915050565b6000602082019050818103600083015261342681846133ae565b905092915050565b6134378161311a565b82525050565b6000602082019050613452600083018461342e565b92915050565b6134618161304c565b811461346c57600080fd5b50565b60008135905061347e81613458565b92915050565b60006020828403121561349a57613499612ee6565b5b60006134a88482850161346f565b91505092915050565b6000806000606084860312156134ca576134c9612ee6565b5b60006134d886828701612f02565b93505060206134e986828701613143565b92505060406134fa86828701612f02565b9150509250925092565b61350d816132b6565b82525050565b60006020820190506135286000830184613504565b92915050565b60006020828403121561354457613543612ee6565b5b600061355284828501613143565b91505092915050565b6000806000806080858703121561357557613574612ee6565b5b600061358387828801612f02565b945050602061359487828801612f02565b93505060406135a587828801612f02565b92505060606135b687828801612f02565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135fc82612eb2565b915061360783612eb2565b925082820390508181111561361f5761361e6135c2565b5b92915050565b600082825260208201905092915050565b7f43616c6c6572206973206e65697468657220746865206f776e6572206e6f722060008201527f67616d65206d616e616765720000000000000000000000000000000000000000602082015250565b6000613692602c83613625565b915061369d82613636565b604082019050919050565b600060208201905081810360008301526136c181613685565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061370c6000830185612ebc565b6137196020830184612ebc565b9392505050565b60006060820190506137356000830186612ebc565b61374260208301856130f0565b61374f60408301846130f0565b949350505050565b600061376282612eb2565b915061376d83612eb2565b9250828201905080821115613785576137846135c2565b5b92915050565b600060a0820190506137a06000830188612ebc565b6137ad6020830187612ebc565b6137ba604083018661342e565b6137c76060830185612ebc565b6137d46080830184612ebc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061381882612eb2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361384a576138496135c2565b5b600182019050919050565b6000819050919050565b61387061386b82612eb2565b613855565b82525050565b60008160601b9050919050565b600061388e82613876565b9050919050565b60006138a082613883565b9050919050565b6138b86138b38261311a565b613895565b82525050565b60006138ca828661385f565b6020820191506138da82856138a7565b6014820191506138ea828461385f565b602082019150819050949350505050565b6000613907828561385f565b602082019150613917828461385f565b6020820191508190509392505050565b600081905092915050565b50565b6000613942600083613927565b915061394d82613932565b600082019050919050565b600061396382613935565b9150819050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139c9602683613625565b91506139d48261396d565b604082019050919050565b600060208201905081810360008301526139f8816139bc565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613a35601083613625565b9150613a40826139ff565b602082019050919050565b60006020820190508181036000830152613a6481613a28565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613aa1601f83613625565b9150613aac82613a6b565b602082019050919050565b60006020820190508181036000830152613ad081613a94565b9050919050565b6000613ae282612eb2565b9150613aed83612eb2565b9250828202613afb81612eb2565b91508282048414831517613b1257613b116135c2565b5b5092915050565b6000608082019050613b2e6000830187612ebc565b613b3b6020830186612ebc565b613b48604083018561342e565b613b556060830184612ebc565b95945050505050565b6000606082019050613b736000830186612ebc565b613b80602083018561342e565b613b8d6040830184612ebc565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bcb602083613625565b9150613bd682613b95565b602082019050919050565b60006020820190508181036000830152613bfa81613bbe565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613c37601483613625565b9150613c4282613c01565b602082019050919050565b60006020820190508181036000830152613c6681613c2a565b905091905056fea2646970667358221220b423eb98b61015ea2b8d28e6489de25d9cba4f4eb1f433879539042d1032336164736f6c634300081300330000000000000000000000007fb1075d7c8884da98181740ebecf6b1a10663a80000000000000000000000007fb1075d7c8884da98181740ebecf6b1a10663a8

Deployed Bytecode

0x6080604052600436106102765760003560e01c806379afb9291161014f578063b0090ea3116100c1578063daf75c051161007a578063daf75c051461098a578063dff3f3b9146109c7578063e90ae59c146109f0578063ee0d48f614610a19578063ef78411114610a42578063f2fde38b14610a6d576102ad565b8063b0090ea314610890578063b01b810c146108a7578063b2a5bab8146108d0578063b7127e411461090d578063bdaae1e714610936578063c6b052661461095f576102ad565b80639106447c116101135780639106447c1461077257806396e5075a1461079b57806399c76246146107c45780639f20daaa146107ed578063a345758e1461082a578063a8e492d914610853576102ad565b806379afb929146106c05780637b1aa45f146106fd5780638456cb59146107075780638b6ae4121461071e5780638da5cb5b14610747576102ad565b80634738638b116101e8578063544ed9b4116101ac578063544ed9b4146105d65780635c975abb146105ff5780635df170771461062a5780635e68fc061461065557806369958ab914610680578063715018a6146106a9576102ad565b80634738638b146104da578063483fcb87146105175780634a7e75f4146105425780634d1975b41461056d578063514ea4bf14610598576102ad565b806328df30bc1161023a57806328df30bc146103d95780632c542ede146104045780632d9398771461042057806334239c9c14610449578063347e1e0a146104865780633f4ba83a146104c3576102ad565b80630482a329146102ec5780630511c17c14610317578063117a5b90146103425780631643c8c4146103875780631ba3a9c3146103b0576102ad565b366102ad576040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3480156102b957600080fd5b506040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3480156102f857600080fd5b50610301610a96565b60405161030e9190612ecb565b60405180910390f35b34801561032357600080fd5b5061032c610aad565b6040516103399190612ecb565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190612f17565b610ab3565b60405161037e99989796959493929190612f5f565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612fec565b610b45565b005b3480156103bc57600080fd5b506103d760048036038101906103d29190612f17565b610dc1565b005b3480156103e557600080fd5b506103ee610f31565b6040516103fb919061306d565b60405180910390f35b61041e60048036038101906104199190612fec565b610f57565b005b34801561042c57600080fd5b5061044760048036038101906104429190612f17565b6111cd565b005b34801561045557600080fd5b50610470600480360381019061046b9190612f17565b6113c9565b60405161047d91906130ff565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613158565b611442565b6040516104ba9190613294565b60405180910390f35b3480156104cf57600080fd5b506104d861159f565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906132ec565b6115b1565b60405161050e9190612ecb565b60405180910390f35b34801561052357600080fd5b5061052c6115c9565b6040516105399190612ecb565b60405180910390f35b34801561054e57600080fd5b506105576115cf565b6040516105649190612ecb565b60405180910390f35b34801561057957600080fd5b506105826115d5565b60405161058f9190612ecb565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906132ec565b6115e2565b6040516105cd929190613319565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190612f17565b611613565b005b34801561060b57600080fd5b5061061461180f565b6040516106219190613342565b60405180910390f35b34801561063657600080fd5b5061063f611825565b60405161064c9190612ecb565b60405180910390f35b34801561066157600080fd5b5061066a61182b565b6040516106779190612ecb565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190612f17565b611831565b005b3480156106b557600080fd5b506106be611a60565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190612f17565b611a74565b6040516106f4919061340c565b60405180910390f35b610705611b96565b005b34801561071357600080fd5b5061071c611c11565b005b34801561072a57600080fd5b5061074560048036038101906107409190612f17565b611c23565b005b34801561075357600080fd5b5061075c611d05565b604051610769919061343d565b60405180910390f35b34801561077e57600080fd5b5061079960048036038101906107949190612f17565b611d2e565b005b3480156107a757600080fd5b506107c260048036038101906107bd9190612f17565b611d40565b005b3480156107d057600080fd5b506107eb60048036038101906107e69190612f17565b611d52565b005b3480156107f957600080fd5b50610814600480360381019061080f9190613158565b611d64565b6040516108219190612ecb565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190613484565b611e29565b005b34801561085f57600080fd5b5061087a600480360381019061087591906134b1565b611e75565b6040516108879190613513565b60405180910390f35b34801561089c57600080fd5b506108a5611eab565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190612f17565b611ec5565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190612fec565b61206e565b6040516109049190613513565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f919061352e565b6120a1565b005b34801561094257600080fd5b5061095d6004803603810190610958919061355b565b6120ed565b005b34801561096b57600080fd5b5061097461237d565b604051610981919061343d565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac9190612f17565b6123a3565b6040516109be9190612ecb565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e99190612f17565b612463565b005b3480156109fc57600080fd5b50610a176004803603810190610a129190612f17565b61258e565b005b348015610a2557600080fd5b50610a406004803603810190610a3b9190612f17565b612700565b005b348015610a4e57600080fd5b50610a57612712565b604051610a649190612ecb565b60405180910390f35b348015610a7957600080fd5b50610a946004803603810190610a8f919061352e565b612718565b005b6000600954600854610aa891906135f1565b905090565b60045481565b60078181548110610ac357600080fd5b90600052602060002090600602016000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900460ff16905089565b610b4d611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610bd35750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906136a8565b60405180910390fd5b816007805490508110610c51576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078481548110610c6757610c666136c8565b5b906000526020600020906006020190506000610c828261279b565b905060006004811115610c9857610c97613088565b5b816004811115610cab57610caa613088565b5b14610ce2576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600101548410610d1f576040517fcb7c84b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260050160016101000a81548160ff0219169083151502179055508382600401819055507fd620cad007f711f526385f9e9ecc931ea58b1285ae09a10d659b1eb9e3f374658585604051610d769291906136f7565b60405180910390a17feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e85826001604051610db293929190613720565b60405180910390a15050505050565b806007805490508110610e00576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0861281c565b610e10612866565b600060078381548110610e2657610e256136c8565b5b906000526020600020906006020190506000610e418261279b565b905060036004811115610e5757610e56613088565b5b816004811115610e6a57610e69613088565b5b03610e8257610e7d8483600401546128b5565b610f23565b60026004811115610e9657610e95613088565b5b816004811115610ea957610ea8613088565b5b1480610ed85750600480811115610ec357610ec2613088565b5b816004811115610ed657610ed5613088565b5b145b15610ef057610eeb848360010154612a76565b610f22565b6040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5050610f2d612c35565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b816007805490508110610f96576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9e612866565b610fa661281c565b600060078481548110610fbc57610fbb6136c8565b5b906000526020600020906006020190506000610fd78261279b565b905060016004811115610fed57610fec613088565b5b81600481111561100057610fff613088565b5b14611037576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600101548410611074576040517fcb7c84b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b6000611085883389611e75565b8152602001908152602001600020905060003482600001546110a79190613757565b905083600201548110156110e7576040517f99c3460e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110f3888861206e565b9050600034600c6000848152602001908152602001600020546111169190613757565b90508560030154811115611156576040517ffdb59c8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c6000848152602001908152602001600020819055508284600001819055507f942a77644519640071b23ff6ee3b7b47dd6a4738c5775fbb1760ec2b646038808989338760000154346040516111b295949392919061378b565b60405180910390a15050505050506111c8612c35565b505050565b6111d5611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061125b5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61129a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611291906136a8565b60405180910390fd5b8060078054905081106112d9576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600783815481106112ef576112ee6136c8565b5b90600052602060002090600602019050600061130a8261279b565b9050600060048111156113205761131f613088565b5b81600481111561133357611332613088565b5b1461136a576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260050160006101000a81548160ff0219169083151502179055507feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e848260016040516113bb93929190613720565b60405180910390a150505050565b600081600780549050811061140a576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600784815481106114205761141f6136c8565b5b906000526020600020906006020190506114398161279b565b92505050919050565b6060826007805490508110611483576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078581548110611499576114986136c8565b5b906000526020600020906006020190506000816001015467ffffffffffffffff8111156114c9576114c86137de565b5b60405190808252806020026020018201604052801561150257816020015b6114ef612e96565b8152602001906001900390816114e75790505b50905060005b826001015481101561159257600b6000611523898985611e75565b8152602001908152602001600020604051806040016040529081600082015481526020016001820160009054906101000a900460ff161515151581525050828281518110611574576115736136c8565b5b6020026020010181905250808061158a9061380d565b915050611508565b5080935050505092915050565b6115a7612c3e565b6115af612cbc565b565b600c6020528060005260406000206000915090505481565b60055481565b60085481565b6000600780549050905090565b600b6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b61161b611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116a15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d7906136a8565b60405180910390fd5b80600780549050811061171f576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078381548110611735576117346136c8565b5b9060005260206000209060060201905060006117508261279b565b90506001600481111561176657611765613088565b5b81600481111561177957611778613088565b5b146117b0576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260050160006101000a81548160ff0219169083151502179055507feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e8482600060405161180193929190613720565b60405180910390a150505050565b60008060149054906101000a900460ff16905090565b60035481565b60095481565b611839611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118bf5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f5906136a8565b60405180910390fd5b80600780549050811061193d576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078381548110611953576119526136c8565b5b90600052602060002090600602019050600061196e8261279b565b90506001600481111561198457611983613088565b5b81600481111561199757611996613088565b5b141580156119ca5750600060048111156119b4576119b3613088565b5b8160048111156119c7576119c6613088565b5b14155b15611a01576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260050160026101000a81548160ff0219169083151502179055507feef47ba4363cae9212bc3abe2892d33ef395cd9cda8ef23d2ff34b6f296f1f9e84826004604051611a5293929190613720565b60405180910390a150505050565b611a68612c3e565b611a726000612d1e565b565b6060816007805490508110611ab5576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078481548110611acb57611aca6136c8565b5b906000526020600020906006020190506000816001015467ffffffffffffffff811115611afb57611afa6137de565b5b604051908082528060200260200182016040528015611b295781602001602082028036833780820191505090505b50905060005b8260010154811015611b8a57600c6000611b49888461206e565b815260200190815260200160002054828281518110611b6b57611b6a6136c8565b5b6020026020010181815250508080611b829061380d565b915050611b2f565b50809350505050919050565b611b9e612c3e565b60003403611bd8576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fb5dccff0c2e7a9547b26fe7dbfbfbd99813a8711e4baf7f2ec73cd69655dfe2c34604051611c079190612ecb565b60405180910390a1565b611c19612c3e565b611c21612de2565b565b611c2b611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cb15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906136a8565b60405180910390fd5b611d02600254826004546005546120ed565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d36612c3e565b8060028190555050565b611d48612c3e565b8060048190555050565b611d5a612c3e565b8060058190555050565b6000826007805490508110611da5576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078581548110611dbb57611dba6136c8565b5b906000526020600020906006020190506000805b8260010154811015611e1c57600b6000611dea898985611e75565b81526020019081526020016000206000015482611e079190613757565b91508080611e149061380d565b915050611dcf565b5080935050505092915050565b611e31612c3e565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000838383604051602001611e8c939291906138be565b6040516020818303038152906040528051906020012090509392505050565b611eb3612c3e565b611ec3611ebe610a96565b61258e565b565b611ecd612c3e565b806007805490508110611f0c576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060078381548110611f2257611f216136c8565b5b906000526020600020906006020190506000611f3d8261279b565b905060036004811115611f5357611f52613088565b5b816004811115611f6657611f65613088565b5b14611f9d576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160050160039054906101000a900460ff1615611fe6576040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b826001015481101561204a57826004015481031561203757600c600061200f878461206e565b8152602001908152602001600020546008600082825461202f9190613757565b925050819055505b80806120429061380d565b915050611fe9565b5060018260050160036101000a81548160ff02191690831515021790555050505050565b600082826040516020016120839291906138fb565b60405160208183030381529060405280519060200120905092915050565b6120a9612c3e565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6120f5611d05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061217b5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b1906136a8565b60405180910390fd5b60028310806121ca575060035483115b15612201576040517f177adf0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007604051806101200160405280864261221b9190613757565b815260200185815260200184815260200183815260200160008152602001600015158152602001600015158152602001600015158152602001600015158152509080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff0219169083151502179055505050600160078054905061234b91906135f1565b7fbd19c47e9925eb6f7be8bb1c13a841e0240aaeaf17f217e90022e9c8eb66877f60405160405180910390a250505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160078054905081106123e4576040517f57e25a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600784815481106123fa576123f96136c8565b5b906000526020600020906006020190506000805b826001015481101561245757600c6000612428888461206e565b815260200190815260200160002054826124429190613757565b9150808061244f9061380d565b91505061240e565b50809350505050919050565b61246b612c3e565b478111806124795750600081145b156124b0576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16826040516124d690613958565b60006040518083038185875af1925050503d8060008114612513576040519150601f19603f3d011682016040523d82523d6000602084013e612518565b606091505b5050905080612553576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f36a8cfbf7655e6019c9246e01ded1d727877ea135a5dcc275658e566fab1e978826040516125829190612ecb565b60405180910390a15050565b612596612c3e565b61259e612866565b6125a6610a96565b8111156125df576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960008282546125f19190613757565b925050819055506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161264090613958565b60006040518083038185875af1925050503d806000811461267d576040519150601f19603f3d011682016040523d82523d6000602084013e612682565b606091505b50509050806126bd576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa50c5d86b7fe5903552dca0219d47d925b98990b9d14c1f7291481f7a9298822826040516126ec9190612ecb565b60405180910390a1506126fd612c35565b50565b612708612c3e565b8060038190555050565b60025481565b612720612c3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361278f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612786906139df565b60405180910390fd5b61279881612d1e565b50565b60008160050160019054906101000a900460ff16156127bd5760039050612817565b8160050160029054906101000a900460ff16156127dd5760049050612817565b81600001544211156127f25760029050612817565b8160050160009054906101000a900460ff16156128125760019050612817565b600090505b919050565b61282461180f565b15612864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285b90613a4b565b60405180910390fd5b565b6002600154036128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290613ab7565b60405180910390fd5b6002600181905550565b6000600b60006128c6853386611e75565b815260200190815260200160002090508060010160009054906101000a900460ff161561291f576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081600001540361295d576040517f4dfbbff300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600282600001546129709190613ad7565b905060018260010160006101000a81548160ff02191690831515021790555060003373ffffffffffffffffffffffffffffffffffffffff16826040516129b590613958565b60006040518083038185875af1925050503d80600081146129f2576040519150601f19603f3d011682016040523d82523d6000602084013e6129f7565b606091505b5050905080612a32576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe5c7778b97408103623fad96d2d801c69d572015cb790d3cb8530fce38c44f0385853385604051612a679493929190613b19565b60405180910390a15050505050565b6000805b82811015612b16576000600b6000612a93873386611e75565b815260200190815260200160002090508060010160009054906101000a900460ff1615612ac05750612b03565b6000816000015403612ad25750612b03565b60018160010160006101000a81548160ff021916908315150217905550806000015483612aff9190613757565b9250505b8080612b0e9061380d565b915050612a7a565b5060008103612b51576040517f4dfbbff300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051612b7790613958565b60006040518083038185875af1925050503d8060008114612bb4576040519150601f19603f3d011682016040523d82523d6000602084013e612bb9565b606091505b5050905080612bf4576040517f27fcd9d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f91d59bcf762c6c32cba8bd570c6c925b6d1c8bee1be34a6777c4191e194debdd843384604051612c2793929190613b5e565b60405180910390a150505050565b60018081905550565b612c46612e45565b73ffffffffffffffffffffffffffffffffffffffff16612c64611d05565b73ffffffffffffffffffffffffffffffffffffffff1614612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb190613be1565b60405180910390fd5b565b612cc4612e4d565b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d07612e45565b604051612d14919061343d565b60405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612dea61281c565b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e2e612e45565b604051612e3b919061343d565b60405180910390a1565b600033905090565b612e5561180f565b612e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8b90613c4d565b60405180910390fd5b565b6040518060400160405280600081526020016000151581525090565b6000819050919050565b612ec581612eb2565b82525050565b6000602082019050612ee06000830184612ebc565b92915050565b600080fd5b612ef481612eb2565b8114612eff57600080fd5b50565b600081359050612f1181612eeb565b92915050565b600060208284031215612f2d57612f2c612ee6565b5b6000612f3b84828501612f02565b91505092915050565b60008115159050919050565b612f5981612f44565b82525050565b600061012082019050612f75600083018c612ebc565b612f82602083018b612ebc565b612f8f604083018a612ebc565b612f9c6060830189612ebc565b612fa96080830188612ebc565b612fb660a0830187612f50565b612fc360c0830186612f50565b612fd060e0830185612f50565b612fde610100830184612f50565b9a9950505050505050505050565b6000806040838503121561300357613002612ee6565b5b600061301185828601612f02565b925050602061302285828601612f02565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130578261302c565b9050919050565b6130678161304c565b82525050565b6000602082019050613082600083018461305e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106130c8576130c7613088565b5b50565b60008190506130d9826130b7565b919050565b60006130e9826130cb565b9050919050565b6130f9816130de565b82525050565b600060208201905061311460008301846130f0565b92915050565b60006131258261302c565b9050919050565b6131358161311a565b811461314057600080fd5b50565b6000813590506131528161312c565b92915050565b6000806040838503121561316f5761316e612ee6565b5b600061317d85828601612f02565b925050602061318e85828601613143565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6131cd81612eb2565b82525050565b6131dc81612f44565b82525050565b6040820160008201516131f860008501826131c4565b50602082015161320b60208501826131d3565b50505050565b600061321d83836131e2565b60408301905092915050565b6000602082019050919050565b600061324182613198565b61324b81856131a3565b9350613256836131b4565b8060005b8381101561328757815161326e8882613211565b975061327983613229565b92505060018101905061325a565b5085935050505092915050565b600060208201905081810360008301526132ae8184613236565b905092915050565b6000819050919050565b6132c9816132b6565b81146132d457600080fd5b50565b6000813590506132e6816132c0565b92915050565b60006020828403121561330257613301612ee6565b5b6000613310848285016132d7565b91505092915050565b600060408201905061332e6000830185612ebc565b61333b6020830184612f50565b9392505050565b60006020820190506133576000830184612f50565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061339583836131c4565b60208301905092915050565b6000602082019050919050565b60006133b98261335d565b6133c38185613368565b93506133ce83613379565b8060005b838110156133ff5781516133e68882613389565b97506133f1836133a1565b9250506001810190506133d2565b5085935050505092915050565b6000602082019050818103600083015261342681846133ae565b905092915050565b6134378161311a565b82525050565b6000602082019050613452600083018461342e565b92915050565b6134618161304c565b811461346c57600080fd5b50565b60008135905061347e81613458565b92915050565b60006020828403121561349a57613499612ee6565b5b60006134a88482850161346f565b91505092915050565b6000806000606084860312156134ca576134c9612ee6565b5b60006134d886828701612f02565b93505060206134e986828701613143565b92505060406134fa86828701612f02565b9150509250925092565b61350d816132b6565b82525050565b60006020820190506135286000830184613504565b92915050565b60006020828403121561354457613543612ee6565b5b600061355284828501613143565b91505092915050565b6000806000806080858703121561357557613574612ee6565b5b600061358387828801612f02565b945050602061359487828801612f02565b93505060406135a587828801612f02565b92505060606135b687828801612f02565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135fc82612eb2565b915061360783612eb2565b925082820390508181111561361f5761361e6135c2565b5b92915050565b600082825260208201905092915050565b7f43616c6c6572206973206e65697468657220746865206f776e6572206e6f722060008201527f67616d65206d616e616765720000000000000000000000000000000000000000602082015250565b6000613692602c83613625565b915061369d82613636565b604082019050919050565b600060208201905081810360008301526136c181613685565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061370c6000830185612ebc565b6137196020830184612ebc565b9392505050565b60006060820190506137356000830186612ebc565b61374260208301856130f0565b61374f60408301846130f0565b949350505050565b600061376282612eb2565b915061376d83612eb2565b9250828201905080821115613785576137846135c2565b5b92915050565b600060a0820190506137a06000830188612ebc565b6137ad6020830187612ebc565b6137ba604083018661342e565b6137c76060830185612ebc565b6137d46080830184612ebc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061381882612eb2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361384a576138496135c2565b5b600182019050919050565b6000819050919050565b61387061386b82612eb2565b613855565b82525050565b60008160601b9050919050565b600061388e82613876565b9050919050565b60006138a082613883565b9050919050565b6138b86138b38261311a565b613895565b82525050565b60006138ca828661385f565b6020820191506138da82856138a7565b6014820191506138ea828461385f565b602082019150819050949350505050565b6000613907828561385f565b602082019150613917828461385f565b6020820191508190509392505050565b600081905092915050565b50565b6000613942600083613927565b915061394d82613932565b600082019050919050565b600061396382613935565b9150819050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139c9602683613625565b91506139d48261396d565b604082019050919050565b600060208201905081810360008301526139f8816139bc565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613a35601083613625565b9150613a40826139ff565b602082019050919050565b60006020820190508181036000830152613a6481613a28565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613aa1601f83613625565b9150613aac82613a6b565b602082019050919050565b60006020820190508181036000830152613ad081613a94565b9050919050565b6000613ae282612eb2565b9150613aed83612eb2565b9250828202613afb81612eb2565b91508282048414831517613b1257613b116135c2565b5b5092915050565b6000608082019050613b2e6000830187612ebc565b613b3b6020830186612ebc565b613b48604083018561342e565b613b556060830184612ebc565b95945050505050565b6000606082019050613b736000830186612ebc565b613b80602083018561342e565b613b8d6040830184612ebc565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bcb602083613625565b9150613bd682613b95565b602082019050919050565b60006020820190508181036000830152613bfa81613bbe565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613c37601483613625565b9150613c4282613c01565b602082019050919050565b60006020820190508181036000830152613c6681613c2a565b905091905056fea2646970667358221220b423eb98b61015ea2b8d28e6489de25d9cba4f4eb1f433879539042d1032336164736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007fb1075d7c8884da98181740ebecf6b1a10663a80000000000000000000000007fb1075d7c8884da98181740ebecf6b1a10663a8

-----Decoded View---------------
Arg [0] : rakeRecipient_ (address): 0x7fB1075D7C8884Da98181740EbECf6B1a10663A8
Arg [1] : gameManager_ (address): 0x7fB1075D7C8884Da98181740EbECf6B1a10663A8

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007fb1075d7c8884da98181740ebecf6b1a10663a8
Arg [1] : 0000000000000000000000007fb1075d7c8884da98181740ebecf6b1a10663a8


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.