ETH Price: $2,276.52 (-5.98%)

Token

PornVault (PORN)
 

Overview

Max Total Supply

1,994 PORN

Holders

7

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
48.151120457831573621 PORN

Value
$0.00
0x59afef3e7fc04e31021daa4d5a7e45a2bb5b79a2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PORN

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-13
*/

pragma solidity 0.6.12;


// SPDX-License-Identifier: MIT
//
// PORN smart contract
// https://pornvault.finance
// https://t.me/p0rnvault
//
//                              /^\                              
//           L L               /   \               L L           
//        __/|/|_             /  .  \             _|\|\__        
//       /_| [_[_\           /     .-\           /_]_] |_\       
//      /__\  __`-\_____    /    .    \    _____/-`__  /__\      
//     /___] /=@>  _   {>  /-.         \  <}   _  <@=\ [___\     
//    /____/     /` `--/  /      .      \  \--` `\     \____\    
//   /____/  \____/`-._> /               \ <_.-`\____/  \____\   
//  /____/    /__/      /-._     .   _.-  \      \__\    \____\  
// /____/    /__/      /         .         \      \__\    \____\ 
//|____/_  _/__/      /          .          \      \__\_  _\____|
// \__/_ ``_|_/      /      -._  .        _.-\      \_|_`` _\___/
//   /__`-`__\      <_         `-;           _>      /__`-`__\   
//      `-`           `-._       ;       _.-`           `-`      
//                        `-._   ;   _.-`                        
//                            `-._.-`                            
//                                                               
//                     I'M A LITTLE CONFUSED                     
//           IS THIS WHAT GIRLS LOOK AT INSTEAD OF PORN          
//                                                               
//                         WAIT NEVERMIND                        
//             THEY LOOK AT MONEY WHEN THEY MASTURBATE 

/*
 * @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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface INBUNIERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);


    event Log(string log);

}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IFeeApprover {

    function check(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    function setFeeMultiplier(uint _feeMultiplier) external;
    function feePercentX100() external view returns (uint);
    function setPornTokenAddress(address _PornTokenAddress) external;
    function sync() external;
    function calculateAmountsAfterFee(
        address sender,
        address recipient,
        uint256 amount
    ) external  returns (uint256 transferToAmount, uint256 transferToFeeBearerAmount);

    function setPaused() external;


}

interface IPornVault {
    function addPendingRewards(uint _amount) external;
}

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

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

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

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", 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 logByte(byte p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(byte)", 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(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setMigrator(address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

/**
 * @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.
 */
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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract NBUNIERC20 is Context, INBUNIERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    event LiquidityAddition(address indexed dst, uint value);
    event LPTokenClaimed(address dst, uint value);

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;
    uint256 public constant initialSupply = 2000e18;
    uint256 public contractStartTimestamp;

    function initialSetup() internal {
        _name = "PornVault";
        _symbol = "PORN";
        _decimals = 18;
        _mint(address(this), initialSupply);
        contractStartTimestamp = block.timestamp;
        uniswapRouterV2 = IUniswapV2Router02(address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D));
        uniswapFactory = IUniswapV2Factory(address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f));
        createUniswapPairMainnet();
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory)
    {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public override view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    // function balanceOf(address account) public override returns (uint256) {
    //     return _balances[account];
    // }
    function balanceOf(address _owner) public override view returns (uint256) {
        return _balances[_owner];
    }


    IUniswapV2Router02 public uniswapRouterV2;
    IUniswapV2Factory public uniswapFactory;


    address public tokenUniswapPair;

    function createUniswapPairMainnet()
        public
        returns (address)
    {
        require(tokenUniswapPair == address(0), "Token: pool already created");
        tokenUniswapPair = uniswapFactory.createPair(
            address(uniswapRouterV2.WETH()),
            address(this)
        );
        return tokenUniswapPair;
    }


    ///  Liquidity generation logic
    ///  Steps - All tokens that will ever exist go to this contract
    ///  This contract accepts ETH as payable
    ///  ETH is mapped to people
    ///  When liquidity generation event is over, everyone can call the mint LP function,
    ///  Which will put all the ETH and tokens inside the Uniswap contract without any involvement
    ///  This LP will go into this contract
    ///  And will be able to proportionally be withdrawn based on ETH put in.
    ///  An emergency drain function allows the contract owner to drain all ETH and tokens from this contract
    ///  after the liquidity generation event happened, to send ETH back to contributors in case something goes wrong.


    string public liquidityGenerationParticipationAgreement = "I agree that the developer of PORN is not responsible of your investment. This project is experimental, DYOR.";

    function getSecondsLeftInLiquidityGenerationEvent()
        public
        view
        returns (uint256)
    {
        require(liquidityGenerationOngoing(), "Event over");
        console.log("2 days since start is", contractStartTimestamp.add(2 days), "Time now is", block.timestamp);
        return contractStartTimestamp.add(2 days).sub(block.timestamp);
    }

    function liquidityGenerationOngoing()
        public
        view
        returns (bool)
    {
        console.log("2 days since start is", contractStartTimestamp.add(2 days), "Time now is", block.timestamp);
        console.log("liquidity generation ongoing", contractStartTimestamp.add(2 days) < block.timestamp);
        return contractStartTimestamp.add(2 days) > block.timestamp;
    }

    uint256 public totalLPTokensMinted;
    uint256 public totalETHContributed;
    uint256 public LPperETHUnit;
    bool public LPGenerationCompleted;

    mapping (address => uint)  public ethContributed;
    // Possible ways this could break addressed
    // 1) No agreement to terms - added require
    // 2) Adding liquidity after LGE is over - added require
    // 3) Overflow from uint - impossible there is not enough ETH available
    // 4) Depositing 0 - not an issue it will just add 0 totally
    function addLiquidity(bool agreesToTermsOutlinedInLiquidityGenerationParticipationAgreement)
        public
        payable
    {
        require(liquidityGenerationOngoing(), "Liquidity Generation Event over");
        require(agreesToTermsOutlinedInLiquidityGenerationParticipationAgreement, "No agreement provided");
        ethContributed[msg.sender] += msg.value; // Overflow protection from safemath is not needed here
        totalETHContributed = totalETHContributed.add(msg.value); // For front-end display during LGE. This resets with definitive correct balance while calling pair.
        emit LiquidityAddition(msg.sender, msg.value);
    }

    // Sends all available balances and mint LP tokens
    // Possible ways this could break addressed
    // 1) Multiple calls and resetting amounts - addressed with boolean
    // 2) Failed WETH wrapping/unwrapping addressed with checks
    // 3) Failure to create LP tokens, addressed with checks
    // 4) Unacceptable division errors. Addressed with multiplications by 1e18
    // 5) Pair not set - impossible since its set in constructor
    function addLiquidityToUniswapPORNxWETHPair() public {
        require(liquidityGenerationOngoing() == false, "PORN LGE ongoing");
        require(LPGenerationCompleted == false, "PORN LGE already finished");
        totalETHContributed = address(this).balance;
        IUniswapV2Pair pair = IUniswapV2Pair(tokenUniswapPair);
        console.log("Balance of this", totalETHContributed / 1e18);
        //Wrap eth
        address WETH = uniswapRouterV2.WETH();
        IWETH(WETH).deposit{value : totalETHContributed}();
        require(address(this).balance == 0 , "Transfer Failed");
        IWETH(WETH).transfer(address(pair),totalETHContributed);
        emit Transfer(address(this), address(pair), _balances[address(this)]);
        _balances[address(pair)] = _balances[address(this)];
        _balances[address(this)] = 0;
        pair.mint(address(this));
        totalLPTokensMinted = pair.balanceOf(address(this));
        console.log("Total tokens minted",totalLPTokensMinted);
        require(totalLPTokensMinted != 0 , "LP creation failed");
        LPperETHUnit = totalLPTokensMinted.mul(1e18).div(totalETHContributed); // 1e18x for  change
        console.log("Total per LP token", LPperETHUnit);
        require(LPperETHUnit != 0 , "LP creation failed");
        LPGenerationCompleted = true;
    }

    // Possible ways this could break addressed
    // 1) Accessing before event is over and resetting eth contributed -- added require
    // 2) No uniswap pair - impossible at this moment because of the LPGenerationCompleted bool
    // 3) LP per unit is 0 - impossible checked at generation function
    function claimLPTokens() public {
        require(LPGenerationCompleted, "Event not over yet");
        require(ethContributed[msg.sender] > 0 , "Nothing to claim, move along");
        IUniswapV2Pair pair = IUniswapV2Pair(tokenUniswapPair);
        uint256 amountLPToTransfer = ethContributed[msg.sender].mul(LPperETHUnit).div(1e18);
        pair.transfer(msg.sender, amountLPToTransfer); // stored as 1e18x value for change
        ethContributed[msg.sender] = 0;
        emit LPTokenClaimed(msg.sender, amountLPToTransfer);
    }

    // Emergency drain in case of bug
    // Adds all funds to owner to refund people
    // Designed to be as simple as possible
    function emergencyDrain24hAfterLGEIsDone() public onlyOwner {
        require(contractStartTimestamp.add(1 days) < block.timestamp, "LGE is still ongoing"); // About 24h after liquidity generation happens
        (bool success, ) = msg.sender.call.value(address(this).balance)("");
        require(success, "Transfer failed.");
        _balances[msg.sender] = _balances[address(this)];
        _balances[address(this)] = 0;
    }

    // No mint function

    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        virtual
        override
        view
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function setShouldTransferChecker(address _transferCheckerAddress)
        public
        onlyOwner
    {
        transferCheckerAddress = _transferCheckerAddress;
    }

    address public transferCheckerAddress;

    function setFeeDistributor(address _feeDistributor)
        public
        onlyOwner
    {
        feeDistributor = _feeDistributor;
    }

    address public feeDistributor;



    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");



        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );

        (uint256 transferToAmount, uint256 transferToFeeDistributorAmount) = IFeeApprover(transferCheckerAddress).calculateAmountsAfterFee(sender, recipient, amount);


        // Addressing a broken checker contract
        require(transferToAmount.add(transferToFeeDistributorAmount) == amount, "Math broke, does gravity still work?");

        _balances[recipient] = _balances[recipient].add(transferToAmount);
        emit Transfer(sender, recipient, transferToAmount);

        if(transferToFeeDistributorAmount > 0 && feeDistributor != address(0)){
            _balances[feeDistributor] = _balances[feeDistributor].add(transferToFeeDistributorAmount);
            emit Transfer(sender, feeDistributor, transferToFeeDistributorAmount);
            if(feeDistributor != address(0)){
                IPornVault(feeDistributor).addPendingRewards(transferToFeeDistributorAmount);
            }
        }
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// PornToken
contract PORN is NBUNIERC20 {
    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
        constructor() public {
        initialSetup();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"LPTokenClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"LiquidityAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"log","type":"string"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LPGenerationCompleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPperETHUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"agreesToTermsOutlinedInLiquidityGenerationParticipationAgreement","type":"bool"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"addLiquidityToUniswapPORNxWETHPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimLPTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createUniswapPairMainnet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyDrain24hAfterLGEIsDone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ethContributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondsLeftInLiquidityGenerationEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityGenerationOngoing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityGenerationParticipationAgreement","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeDistributor","type":"address"}],"name":"setFeeDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transferCheckerAddress","type":"address"}],"name":"setShouldTransferChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenUniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalETHContributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLPTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferCheckerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterV2","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

610120604052606d60808181529062002ba360a03980516200002a91600b9160209091019062000479565b503480156200003857600080fd5b506000620000456200009f565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000099620000a3565b62000515565b3390565b60408051808201909152600980825268141bdc9b95985d5b1d60ba1b6020909201918252620000d59160049162000479565b50604080518082019091526004808252632827a92760e11b6020909201918252620001039160059162000479565b506006805460ff191660121790556200012630686c6b935b8bbd4000006200017f565b42600755600880546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560098054909116735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f1790556200017c62000292565b50565b6001600160a01b038216620001db576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620001e96000838362000412565b62000205816003546200041760201b62001a611790919060201c565b6003556001600160a01b0382166000908152600160209081526040909120546200023a91839062001a6162000417821b17901c565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600a546000906001600160a01b031615620002f4576040805162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a20706f6f6c20616c726561647920637265617465640000000000604482015290519081900360640190fd5b600954600854604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693169163ad5c4648916004808301926020929190829003018186803b1580156200034457600080fd5b505afa15801562000359573d6000803e3d6000fd5b505050506040513d60208110156200037057600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b158015620003c057600080fd5b505af1158015620003d5573d6000803e3d6000fd5b505050506040513d6020811015620003ec57600080fd5b5051600a80546001600160a01b0319166001600160a01b03928316179081905516919050565b505050565b60008282018381101562000472576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004bc57805160ff1916838001178555620004ec565b82800160010185558215620004ec579182015b82811115620004ec578251825591602001919060010190620004cf565b50620004fa929150620004fe565b5090565b5b80821115620004fa5760008155600101620004ff565b61267e80620005256000396000f3fe6080604052600436106102195760003560e01c80635b5f3e871161012357806395d89b41116100ab578063da620cd71161006f578063da620cd7146106ba578063dd62ed3e146106d9578063e55a4c6914610714578063f2fde38b14610729578063f96f5b351461075c57610219565b806395d89b41146105eb578063a457c2d714610600578063a9059cbb14610639578063b2aef26b14610672578063ccfc2e8d1461068757610219565b8063715018a6116100f2578063715018a61461058257806375b208bc146105975780638bdb2afa146105ac5780638da5cb5b146105c15780638e8e2925146105d657610219565b80635b5f3e871461051057806360a02590146105255780636a2f796c1461053a57806370a082311461054f57610219565b806323b872dd116101a657806338af66321161017557806338af66321461046e578063395093511461048357806342966c68146104bc5780634d332457146104e6578063596fa9e3146104fb57610219565b806323b872dd146103d6578063313ce5671461041957806331a22a2014610444578063378dc3dc1461045957610219565b80630fe06a1b116101ed5780630fe06a1b1461034d57806310a7a6591461036457806314b8fecc1461039757806318160ddd146103ac57806323399434146103c157610219565b80622b13291461021e57806306fdde0314610245578063095ea7b3146102cf5780630d43e8ad1461031c575b600080fd5b34801561022a57600080fd5b5061023361078f565b60408051918252519081900360200190f35b34801561025157600080fd5b5061025a610795565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029457818101518382015260200161027c565b50505050905090810190601f1680156102c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102db57600080fd5b50610308600480360360408110156102f257600080fd5b506001600160a01b03813516906020013561082b565b604080519115158252519081900360200190f35b34801561032857600080fd5b50610331610849565b604080516001600160a01b039092168252519081900360200190f35b34801561035957600080fd5b50610362610858565b005b34801561037057600080fd5b506103626004803603602081101561038757600080fd5b50356001600160a01b0316610d6e565b3480156103a357600080fd5b50610308610de8565b3480156103b857600080fd5b50610233610df1565b3480156103cd57600080fd5b50610233610df7565b3480156103e257600080fd5b50610308600480360360608110156103f957600080fd5b506001600160a01b03813581169160208101359091169060400135610dfd565b34801561042557600080fd5b5061042e610e84565b6040805160ff9092168252519081900360200190f35b34801561045057600080fd5b50610233610e8d565b34801561046557600080fd5b50610233610e93565b34801561047a57600080fd5b50610362610ea0565b34801561048f57600080fd5b50610308600480360360408110156104a657600080fd5b506001600160a01b03813516906020013561105e565b3480156104c857600080fd5b50610362600480360360208110156104df57600080fd5b50356110ac565b3480156104f257600080fd5b506103316110b9565b34801561050757600080fd5b506103316110c8565b34801561051c57600080fd5b506102336110d7565b34801561053157600080fd5b506103086111b9565b34801561054657600080fd5b50610233611274565b34801561055b57600080fd5b506102336004803603602081101561057257600080fd5b50356001600160a01b031661127a565b34801561058e57600080fd5b50610362611295565b3480156105a357600080fd5b50610331611337565b3480156105b857600080fd5b506103316114b0565b3480156105cd57600080fd5b506103316114bf565b3480156105e257600080fd5b5061025a6114ce565b3480156105f757600080fd5b5061025a61155c565b34801561060c57600080fd5b506103086004803603604081101561062357600080fd5b506001600160a01b0381351690602001356115bd565b34801561064557600080fd5b506103086004803603604081101561065c57600080fd5b506001600160a01b038135169060200135611625565b34801561067e57600080fd5b50610331611639565b34801561069357600080fd5b50610362600480360360208110156106aa57600080fd5b50356001600160a01b0316611648565b610362600480360360208110156106d057600080fd5b503515156116c2565b3480156106e557600080fd5b50610233600480360360408110156106fc57600080fd5b506001600160a01b03813581169160200135166117c5565b34801561072057600080fd5b506103626117f0565b34801561073557600080fd5b506103626004803603602081101561074c57600080fd5b50356001600160a01b0316611957565b34801561076857600080fd5b506102336004803603602081101561077f57600080fd5b50356001600160a01b0316611a4f565b600c5481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108215780601f106107f657610100808354040283529160200191610821565b820191906000526020600020905b81548152906001019060200180831161080457829003601f168201915b5050505050905090565b600061083f610838611ac2565b8484611ac6565b5060015b92915050565b6012546001600160a01b031681565b6108606111b9565b156108a5576040805162461bcd60e51b815260206004820152601060248201526f504f524e204c4745206f6e676f696e6760801b604482015290519081900360640190fd5b600f5460ff16156108fd576040805162461bcd60e51b815260206004820152601960248201527f504f524e204c474520616c72656164792066696e697368656400000000000000604482015290519081900360640190fd5b47600d819055600a5460408051808201909152600f81526e42616c616e6365206f66207468697360881b60208201526001600160a01b039091169161094d9190670de0b6b3a76400009004611bb2565b600854604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561099257600080fd5b505afa1580156109a6573d6000803e3d6000fd5b505050506040513d60208110156109bc57600080fd5b5051600d5460408051630d0e30db60e41b815290519293506001600160a01b0384169263d0e30db0929160048082019260009290919082900301818588803b158015610a0757600080fd5b505af1158015610a1b573d6000803e3d6000fd5b505050505047600014610a67576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b806001600160a01b031663a9059cbb83600d546040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ac057600080fd5b505af1158015610ad4573d6000803e3d6000fd5b505050506040513d6020811015610aea57600080fd5b50503060008181526001602090815260409182902054825190815291516001600160a01b038616939260008051602061257683398151915292908290030190a330600081815260016020908152604080832080546001600160a01b038816808652838620919091558585529084905581516335313c2160e11b8152600481019590955290519093636a6278429360248083019493928390030190829087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d6020811015610bbf57600080fd5b5050604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610c0757600080fd5b505afa158015610c1b573d6000803e3d6000fd5b505050506040513d6020811015610c3157600080fd5b5051600c819055604080518082019091526013815272151bdd185b081d1bdad95b9cc81b5a5b9d1959606a1b6020820152610c6b91611bb2565b600c54610cb4576040805162461bcd60e51b815260206004820152601260248201527113140818dc99585d1a5bdb8819985a5b195960721b604482015290519081900360640190fd5b610cdd600d54610cd7670de0b6b3a7640000600c54611c6490919063ffffffff16565b90611cbd565b600e8190556040805180820190915260128152712a37ba30b6103832b9102628103a37b5b2b760711b6020820152610d1491611bb2565b600e54610d5d576040805162461bcd60e51b815260206004820152601260248201527113140818dc99585d1a5bdb8819985a5b195960721b604482015290519081900360640190fd5b5050600f805460ff19166001179055565b610d76611ac2565b6000546001600160a01b03908116911614610dc6576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5460ff1681565b60035490565b600d5481565b6000610e0a848484611cff565b610e7a84610e16611ac2565b610e758560405180606001604052806028815260200161252e602891396001600160a01b038a16600090815260026020526040812090610e54611ac2565b6001600160a01b031681526020810191909152604001600020549190612038565b611ac6565b5060019392505050565b60065460ff1690565b600e5481565b686c6b935b8bbd40000081565b600f5460ff16610eec576040805162461bcd60e51b8152602060048201526012602482015271115d995b9d081b9bdd081bdd995c881e595d60721b604482015290519081900360640190fd5b33600090815260106020526040902054610f4d576040805162461bcd60e51b815260206004820152601c60248201527f4e6f7468696e6720746f20636c61696d2c206d6f766520616c6f6e6700000000604482015290519081900360640190fd5b600a54600e54336000908152601060205260408120546001600160a01b03909316929091610f8991670de0b6b3a764000091610cd79190611c64565b9050816001600160a01b031663a9059cbb33836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610fe257600080fd5b505af1158015610ff6573d6000803e3d6000fd5b505050506040513d602081101561100c57600080fd5b5050336000818152601060209081526040808320929092558151928352820183905280517f586e28f4f60b4d906fc69694ea6d7fe5c5668730ce3286d7af8eca868f3c27609281900390910190a15050565b600061083f61106b611ac2565b84610e75856002600061107c611ac2565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611a61565b6110b633826120cf565b50565b600a546001600160a01b031681565b6008546001600160a01b031681565b60006110e16111b9565b61111f576040805162461bcd60e51b815260206004820152600a60248201526922bb32b73a1037bb32b960b11b604482015290519081900360640190fd5b611192604051806040016040528060158152602001743220646179732073696e636520737461727420697360581b8152506111686202a300600754611a6190919063ffffffff16565b6040518060400160405280600b81526020016a54696d65206e6f7720697360a81b815250426121b9565b6111b4426111ae6202a300600754611a6190919063ffffffff16565b906122dc565b905090565b6000611204604051806040016040528060158152602001743220646179732073696e636520737461727420697360581b8152506111686202a300600754611a6190919063ffffffff16565b61125c6040518060400160405280601c81526020017f6c69717569646974792067656e65726174696f6e206f6e676f696e6700000000815250426112566202a300600754611a6190919063ffffffff16565b1061231e565b600754429061126e906202a300611a61565b11905090565b60075481565b6001600160a01b031660009081526001602052604090205490565b61129d611ac2565b6000546001600160a01b039081169116146112ed576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600a546000906001600160a01b031615611398576040805162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a20706f6f6c20616c726561647920637265617465640000000000604482015290519081900360640190fd5b600954600854604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693169163ad5c4648916004808301926020929190829003018186803b1580156113e757600080fd5b505afa1580156113fb573d6000803e3d6000fd5b505050506040513d602081101561141157600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b505050506040513d602081101561148a57600080fd5b5051600a80546001600160a01b0319166001600160a01b03928316179081905516919050565b6009546001600160a01b031681565b6000546001600160a01b031690565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156115545780601f1061152957610100808354040283529160200191611554565b820191906000526020600020905b81548152906001019060200180831161153757829003601f168201915b505050505081565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108215780601f106107f657610100808354040283529160200191610821565b600061083f6115ca611ac2565b84610e758560405180606001604052806025815260200161262460259139600260006115f4611ac2565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612038565b600061083f611632611ac2565b8484611cff565b6011546001600160a01b031681565b611650611ac2565b6000546001600160a01b039081169116146116a0576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6116ca6111b9565b61171b576040805162461bcd60e51b815260206004820152601f60248201527f4c69717569646974792047656e65726174696f6e204576656e74206f76657200604482015290519081900360640190fd5b80611765576040805162461bcd60e51b8152602060048201526015602482015274139bc81859dc99595b595b9d081c1c9bdd9a591959605a1b604482015290519081900360640190fd5b336000908152601060205260409020805434908101909155600d5461178991611a61565b600d5560408051348152905133917f20b711375edba008429d2f91787c68aa13aab7f267c346bf91be1a104d8b7b8b919081900360200190a250565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6117f8611ac2565b6000546001600160a01b03908116911614611848576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b600754429061185a9062015180611a61565b106118a3576040805162461bcd60e51b81526020600482015260146024820152734c4745206973207374696c6c206f6e676f696e6760601b604482015290519081900360640190fd5b604051600090339047908381818185875af1925050503d80600081146118e5576040519150601f19603f3d011682016040523d82523d6000602084013e6118ea565b606091505b5050905080611933576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b50306000818152600160205260408082208054338452918320919091559181529055565b61195f611ac2565b6000546001600160a01b039081169116146119af576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b6001600160a01b0381166119f45760405162461bcd60e51b815260040180806020018281038252602681526020018061249f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60106020526000908152604090205481565b600082820183811015611abb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038316611b0b5760405162461bcd60e51b81526004018080602001828103825260248152602001806126006024913960400191505060405180910390fd5b6001600160a01b038216611b505760405162461bcd60e51b81526004018080602001828103825260228152602001806124c56022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611c6082826040516024018080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611bfd578181015183820152602001611be5565b50505050905090810190601f168015611c2a5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166309710a9d60e41b17905293506123ce92505050565b5050565b600082611c7357506000610843565b82820282848281611c8057fe5b0414611abb5760405162461bcd60e51b815260040180806020018281038252602181526020018061250d6021913960400191505060405180910390fd5b6000611abb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506123ef565b6001600160a01b038316611d445760405162461bcd60e51b81526004018080602001828103825260258152602001806125b76025913960400191505060405180910390fd5b6001600160a01b038216611d895760405162461bcd60e51b815260040180806020018281038252602381526020018061245a6023913960400191505060405180910390fd5b611d94838383612454565b611dd1816040518060600160405280602681526020016124e7602691396001600160a01b0386166000908152600160205260409020549190612038565b6001600160a01b0380851660008181526001602052604080822094909455601154845163301a580160e01b81526004810193909352868416602484015260448301869052845191948594919091169263301a5801926064808301939282900301818787803b158015611e4257600080fd5b505af1158015611e56573d6000803e3d6000fd5b505050506040513d6040811015611e6c57600080fd5b508051602090910151909250905082611e858383611a61565b14611ec15760405162461bcd60e51b81526004018080602001828103825260248152602001806125dc6024913960400191505060405180910390fd5b6001600160a01b038416600090815260016020526040902054611ee49083611a61565b6001600160a01b03808616600081815260016020908152604091829020949094558051868152905191939289169260008051602061257683398151915292918290030190a3600081118015611f4357506012546001600160a01b031615155b15612031576012546001600160a01b0316600090815260016020526040902054611f6d9082611a61565b601280546001600160a01b0390811660009081526001602090815260409182902094909455915482518581529251908216939189169260008051602061257683398151915292908290030190a36012546001600160a01b0316156120315760125460408051630211eb7d60e51b81526004810184905290516001600160a01b039092169163423d6fa09160248082019260009290919082900301818387803b15801561201857600080fd5b505af115801561202c573d6000803e3d6000fd5b505050505b5050505050565b600081848411156120c75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561208c578181015183820152602001612074565b50505050905090810190601f1680156120b95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166121145760405162461bcd60e51b81526004018080602001828103825260218152602001806125966021913960400191505060405180910390fd5b61212082600083612454565b61215d8160405180606001604052806022815260200161247d602291396001600160a01b0385166000908152600160205260409020549190612038565b6001600160a01b03831660009081526001602052604090205560035461218390826122dc565b6003556040805182815290516000916001600160a01b038516916000805160206125768339815191529181900360200190a35050565b6122d684848484604051602401808060200185815260200180602001848152602001838103835287818151815260200191508051906020019080838360005b838110156122105781810151838201526020016121f8565b50505050905090810190601f16801561223d5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015612270578181015183820152602001612258565b50505050905090810190601f16801561229d5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b031663a0c4b22560e01b17905296506123ce95505050505050565b50505050565b6000611abb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612038565b611c60828260405160240180806020018315158152602001828103825284818151815260200191508051906020019080838360005b8381101561236b578181015183820152602001612353565b50505050905090810190601f1680156123985780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b031663c3b5563560e01b17905293506123ce92505050565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000818361243e5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561208c578181015183820152602001612074565b50600083858161244a57fe5b0495945050505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734d6174682062726f6b652c20646f65732067726176697479207374696c6c20776f726b3f45524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cd714b1ec32309bb64e0d34bf8227b362b20078ec673aa191155ab6246eaf47264736f6c634300060c00334920616772656520746861742074686520646576656c6f706572206f6620504f524e206973206e6f7420726573706f6e7369626c65206f6620796f757220696e766573746d656e742e20546869732070726f6a656374206973206578706572696d656e74616c2c2044594f522e

Deployed Bytecode

0x6080604052600436106102195760003560e01c80635b5f3e871161012357806395d89b41116100ab578063da620cd71161006f578063da620cd7146106ba578063dd62ed3e146106d9578063e55a4c6914610714578063f2fde38b14610729578063f96f5b351461075c57610219565b806395d89b41146105eb578063a457c2d714610600578063a9059cbb14610639578063b2aef26b14610672578063ccfc2e8d1461068757610219565b8063715018a6116100f2578063715018a61461058257806375b208bc146105975780638bdb2afa146105ac5780638da5cb5b146105c15780638e8e2925146105d657610219565b80635b5f3e871461051057806360a02590146105255780636a2f796c1461053a57806370a082311461054f57610219565b806323b872dd116101a657806338af66321161017557806338af66321461046e578063395093511461048357806342966c68146104bc5780634d332457146104e6578063596fa9e3146104fb57610219565b806323b872dd146103d6578063313ce5671461041957806331a22a2014610444578063378dc3dc1461045957610219565b80630fe06a1b116101ed5780630fe06a1b1461034d57806310a7a6591461036457806314b8fecc1461039757806318160ddd146103ac57806323399434146103c157610219565b80622b13291461021e57806306fdde0314610245578063095ea7b3146102cf5780630d43e8ad1461031c575b600080fd5b34801561022a57600080fd5b5061023361078f565b60408051918252519081900360200190f35b34801561025157600080fd5b5061025a610795565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029457818101518382015260200161027c565b50505050905090810190601f1680156102c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102db57600080fd5b50610308600480360360408110156102f257600080fd5b506001600160a01b03813516906020013561082b565b604080519115158252519081900360200190f35b34801561032857600080fd5b50610331610849565b604080516001600160a01b039092168252519081900360200190f35b34801561035957600080fd5b50610362610858565b005b34801561037057600080fd5b506103626004803603602081101561038757600080fd5b50356001600160a01b0316610d6e565b3480156103a357600080fd5b50610308610de8565b3480156103b857600080fd5b50610233610df1565b3480156103cd57600080fd5b50610233610df7565b3480156103e257600080fd5b50610308600480360360608110156103f957600080fd5b506001600160a01b03813581169160208101359091169060400135610dfd565b34801561042557600080fd5b5061042e610e84565b6040805160ff9092168252519081900360200190f35b34801561045057600080fd5b50610233610e8d565b34801561046557600080fd5b50610233610e93565b34801561047a57600080fd5b50610362610ea0565b34801561048f57600080fd5b50610308600480360360408110156104a657600080fd5b506001600160a01b03813516906020013561105e565b3480156104c857600080fd5b50610362600480360360208110156104df57600080fd5b50356110ac565b3480156104f257600080fd5b506103316110b9565b34801561050757600080fd5b506103316110c8565b34801561051c57600080fd5b506102336110d7565b34801561053157600080fd5b506103086111b9565b34801561054657600080fd5b50610233611274565b34801561055b57600080fd5b506102336004803603602081101561057257600080fd5b50356001600160a01b031661127a565b34801561058e57600080fd5b50610362611295565b3480156105a357600080fd5b50610331611337565b3480156105b857600080fd5b506103316114b0565b3480156105cd57600080fd5b506103316114bf565b3480156105e257600080fd5b5061025a6114ce565b3480156105f757600080fd5b5061025a61155c565b34801561060c57600080fd5b506103086004803603604081101561062357600080fd5b506001600160a01b0381351690602001356115bd565b34801561064557600080fd5b506103086004803603604081101561065c57600080fd5b506001600160a01b038135169060200135611625565b34801561067e57600080fd5b50610331611639565b34801561069357600080fd5b50610362600480360360208110156106aa57600080fd5b50356001600160a01b0316611648565b610362600480360360208110156106d057600080fd5b503515156116c2565b3480156106e557600080fd5b50610233600480360360408110156106fc57600080fd5b506001600160a01b03813581169160200135166117c5565b34801561072057600080fd5b506103626117f0565b34801561073557600080fd5b506103626004803603602081101561074c57600080fd5b50356001600160a01b0316611957565b34801561076857600080fd5b506102336004803603602081101561077f57600080fd5b50356001600160a01b0316611a4f565b600c5481565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108215780601f106107f657610100808354040283529160200191610821565b820191906000526020600020905b81548152906001019060200180831161080457829003601f168201915b5050505050905090565b600061083f610838611ac2565b8484611ac6565b5060015b92915050565b6012546001600160a01b031681565b6108606111b9565b156108a5576040805162461bcd60e51b815260206004820152601060248201526f504f524e204c4745206f6e676f696e6760801b604482015290519081900360640190fd5b600f5460ff16156108fd576040805162461bcd60e51b815260206004820152601960248201527f504f524e204c474520616c72656164792066696e697368656400000000000000604482015290519081900360640190fd5b47600d819055600a5460408051808201909152600f81526e42616c616e6365206f66207468697360881b60208201526001600160a01b039091169161094d9190670de0b6b3a76400009004611bb2565b600854604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561099257600080fd5b505afa1580156109a6573d6000803e3d6000fd5b505050506040513d60208110156109bc57600080fd5b5051600d5460408051630d0e30db60e41b815290519293506001600160a01b0384169263d0e30db0929160048082019260009290919082900301818588803b158015610a0757600080fd5b505af1158015610a1b573d6000803e3d6000fd5b505050505047600014610a67576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b806001600160a01b031663a9059cbb83600d546040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ac057600080fd5b505af1158015610ad4573d6000803e3d6000fd5b505050506040513d6020811015610aea57600080fd5b50503060008181526001602090815260409182902054825190815291516001600160a01b038616939260008051602061257683398151915292908290030190a330600081815260016020908152604080832080546001600160a01b038816808652838620919091558585529084905581516335313c2160e11b8152600481019590955290519093636a6278429360248083019493928390030190829087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d6020811015610bbf57600080fd5b5050604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610c0757600080fd5b505afa158015610c1b573d6000803e3d6000fd5b505050506040513d6020811015610c3157600080fd5b5051600c819055604080518082019091526013815272151bdd185b081d1bdad95b9cc81b5a5b9d1959606a1b6020820152610c6b91611bb2565b600c54610cb4576040805162461bcd60e51b815260206004820152601260248201527113140818dc99585d1a5bdb8819985a5b195960721b604482015290519081900360640190fd5b610cdd600d54610cd7670de0b6b3a7640000600c54611c6490919063ffffffff16565b90611cbd565b600e8190556040805180820190915260128152712a37ba30b6103832b9102628103a37b5b2b760711b6020820152610d1491611bb2565b600e54610d5d576040805162461bcd60e51b815260206004820152601260248201527113140818dc99585d1a5bdb8819985a5b195960721b604482015290519081900360640190fd5b5050600f805460ff19166001179055565b610d76611ac2565b6000546001600160a01b03908116911614610dc6576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b600f5460ff1681565b60035490565b600d5481565b6000610e0a848484611cff565b610e7a84610e16611ac2565b610e758560405180606001604052806028815260200161252e602891396001600160a01b038a16600090815260026020526040812090610e54611ac2565b6001600160a01b031681526020810191909152604001600020549190612038565b611ac6565b5060019392505050565b60065460ff1690565b600e5481565b686c6b935b8bbd40000081565b600f5460ff16610eec576040805162461bcd60e51b8152602060048201526012602482015271115d995b9d081b9bdd081bdd995c881e595d60721b604482015290519081900360640190fd5b33600090815260106020526040902054610f4d576040805162461bcd60e51b815260206004820152601c60248201527f4e6f7468696e6720746f20636c61696d2c206d6f766520616c6f6e6700000000604482015290519081900360640190fd5b600a54600e54336000908152601060205260408120546001600160a01b03909316929091610f8991670de0b6b3a764000091610cd79190611c64565b9050816001600160a01b031663a9059cbb33836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610fe257600080fd5b505af1158015610ff6573d6000803e3d6000fd5b505050506040513d602081101561100c57600080fd5b5050336000818152601060209081526040808320929092558151928352820183905280517f586e28f4f60b4d906fc69694ea6d7fe5c5668730ce3286d7af8eca868f3c27609281900390910190a15050565b600061083f61106b611ac2565b84610e75856002600061107c611ac2565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611a61565b6110b633826120cf565b50565b600a546001600160a01b031681565b6008546001600160a01b031681565b60006110e16111b9565b61111f576040805162461bcd60e51b815260206004820152600a60248201526922bb32b73a1037bb32b960b11b604482015290519081900360640190fd5b611192604051806040016040528060158152602001743220646179732073696e636520737461727420697360581b8152506111686202a300600754611a6190919063ffffffff16565b6040518060400160405280600b81526020016a54696d65206e6f7720697360a81b815250426121b9565b6111b4426111ae6202a300600754611a6190919063ffffffff16565b906122dc565b905090565b6000611204604051806040016040528060158152602001743220646179732073696e636520737461727420697360581b8152506111686202a300600754611a6190919063ffffffff16565b61125c6040518060400160405280601c81526020017f6c69717569646974792067656e65726174696f6e206f6e676f696e6700000000815250426112566202a300600754611a6190919063ffffffff16565b1061231e565b600754429061126e906202a300611a61565b11905090565b60075481565b6001600160a01b031660009081526001602052604090205490565b61129d611ac2565b6000546001600160a01b039081169116146112ed576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600a546000906001600160a01b031615611398576040805162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a20706f6f6c20616c726561647920637265617465640000000000604482015290519081900360640190fd5b600954600854604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693169163ad5c4648916004808301926020929190829003018186803b1580156113e757600080fd5b505afa1580156113fb573d6000803e3d6000fd5b505050506040513d602081101561141157600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b505050506040513d602081101561148a57600080fd5b5051600a80546001600160a01b0319166001600160a01b03928316179081905516919050565b6009546001600160a01b031681565b6000546001600160a01b031690565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156115545780601f1061152957610100808354040283529160200191611554565b820191906000526020600020905b81548152906001019060200180831161153757829003601f168201915b505050505081565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108215780601f106107f657610100808354040283529160200191610821565b600061083f6115ca611ac2565b84610e758560405180606001604052806025815260200161262460259139600260006115f4611ac2565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612038565b600061083f611632611ac2565b8484611cff565b6011546001600160a01b031681565b611650611ac2565b6000546001600160a01b039081169116146116a0576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6116ca6111b9565b61171b576040805162461bcd60e51b815260206004820152601f60248201527f4c69717569646974792047656e65726174696f6e204576656e74206f76657200604482015290519081900360640190fd5b80611765576040805162461bcd60e51b8152602060048201526015602482015274139bc81859dc99595b595b9d081c1c9bdd9a591959605a1b604482015290519081900360640190fd5b336000908152601060205260409020805434908101909155600d5461178991611a61565b600d5560408051348152905133917f20b711375edba008429d2f91787c68aa13aab7f267c346bf91be1a104d8b7b8b919081900360200190a250565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6117f8611ac2565b6000546001600160a01b03908116911614611848576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b600754429061185a9062015180611a61565b106118a3576040805162461bcd60e51b81526020600482015260146024820152734c4745206973207374696c6c206f6e676f696e6760601b604482015290519081900360640190fd5b604051600090339047908381818185875af1925050503d80600081146118e5576040519150601f19603f3d011682016040523d82523d6000602084013e6118ea565b606091505b5050905080611933576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b50306000818152600160205260408082208054338452918320919091559181529055565b61195f611ac2565b6000546001600160a01b039081169116146119af576040805162461bcd60e51b81526020600482018190526024820152600080516020612556833981519152604482015290519081900360640190fd5b6001600160a01b0381166119f45760405162461bcd60e51b815260040180806020018281038252602681526020018061249f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60106020526000908152604090205481565b600082820183811015611abb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038316611b0b5760405162461bcd60e51b81526004018080602001828103825260248152602001806126006024913960400191505060405180910390fd5b6001600160a01b038216611b505760405162461bcd60e51b81526004018080602001828103825260228152602001806124c56022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611c6082826040516024018080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611bfd578181015183820152602001611be5565b50505050905090810190601f168015611c2a5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166309710a9d60e41b17905293506123ce92505050565b5050565b600082611c7357506000610843565b82820282848281611c8057fe5b0414611abb5760405162461bcd60e51b815260040180806020018281038252602181526020018061250d6021913960400191505060405180910390fd5b6000611abb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506123ef565b6001600160a01b038316611d445760405162461bcd60e51b81526004018080602001828103825260258152602001806125b76025913960400191505060405180910390fd5b6001600160a01b038216611d895760405162461bcd60e51b815260040180806020018281038252602381526020018061245a6023913960400191505060405180910390fd5b611d94838383612454565b611dd1816040518060600160405280602681526020016124e7602691396001600160a01b0386166000908152600160205260409020549190612038565b6001600160a01b0380851660008181526001602052604080822094909455601154845163301a580160e01b81526004810193909352868416602484015260448301869052845191948594919091169263301a5801926064808301939282900301818787803b158015611e4257600080fd5b505af1158015611e56573d6000803e3d6000fd5b505050506040513d6040811015611e6c57600080fd5b508051602090910151909250905082611e858383611a61565b14611ec15760405162461bcd60e51b81526004018080602001828103825260248152602001806125dc6024913960400191505060405180910390fd5b6001600160a01b038416600090815260016020526040902054611ee49083611a61565b6001600160a01b03808616600081815260016020908152604091829020949094558051868152905191939289169260008051602061257683398151915292918290030190a3600081118015611f4357506012546001600160a01b031615155b15612031576012546001600160a01b0316600090815260016020526040902054611f6d9082611a61565b601280546001600160a01b0390811660009081526001602090815260409182902094909455915482518581529251908216939189169260008051602061257683398151915292908290030190a36012546001600160a01b0316156120315760125460408051630211eb7d60e51b81526004810184905290516001600160a01b039092169163423d6fa09160248082019260009290919082900301818387803b15801561201857600080fd5b505af115801561202c573d6000803e3d6000fd5b505050505b5050505050565b600081848411156120c75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561208c578181015183820152602001612074565b50505050905090810190601f1680156120b95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166121145760405162461bcd60e51b81526004018080602001828103825260218152602001806125966021913960400191505060405180910390fd5b61212082600083612454565b61215d8160405180606001604052806022815260200161247d602291396001600160a01b0385166000908152600160205260409020549190612038565b6001600160a01b03831660009081526001602052604090205560035461218390826122dc565b6003556040805182815290516000916001600160a01b038516916000805160206125768339815191529181900360200190a35050565b6122d684848484604051602401808060200185815260200180602001848152602001838103835287818151815260200191508051906020019080838360005b838110156122105781810151838201526020016121f8565b50505050905090810190601f16801561223d5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015612270578181015183820152602001612258565b50505050905090810190601f16801561229d5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b031663a0c4b22560e01b17905296506123ce95505050505050565b50505050565b6000611abb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612038565b611c60828260405160240180806020018315158152602001828103825284818151815260200191508051906020019080838360005b8381101561236b578181015183820152602001612353565b50505050905090810190601f1680156123985780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b031663c3b5563560e01b17905293506123ce92505050565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000818361243e5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561208c578181015183820152602001612074565b50600083858161244a57fe5b0495945050505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734d6174682062726f6b652c20646f65732067726176697479207374696c6c20776f726b3f45524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cd714b1ec32309bb64e0d34bf8227b362b20078ec673aa191155ab6246eaf47264736f6c634300060c0033

Deployed Bytecode Sourcemap

114077:421:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100236:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;96540:88;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105557:210;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;105557:210:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;108694:29;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;108694:29:0;;;;;;;;;;;;;;101872:1334;;;;;;;;;;;;;:::i;:::-;;108315:174;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;108315:174:0;-1:-1:-1;;;;;108315:174:0;;:::i;100352:33::-;;;;;;;;;;;;;:::i;97620:100::-;;;;;;;;;;;;;:::i;100277:34::-;;;;;;;;;;;;;:::i;106241:454::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;106241:454:0;;;;;;;;;;;;;;;;;:::i;97472:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;100318:27;;;;;;;;;;;;;:::i;95915:47::-;;;;;;;;;;;;;:::i;103521:540::-;;;;;;;;;;;;;:::i;107104:300::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;107104:300:0;;;;;;;;:::i;104672:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;104672:81:0;;:::i;98137:31::-;;;;;;;;;;;;;:::i;98039:41::-;;;;;;;;;;;;;:::i;99450:372::-;;;;;;;;;;;;;:::i;99830:398::-;;;;;;;;;;;;;:::i;95969:37::-;;;;;;;;;;;;;:::i;97912:117::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97912:117:0;-1:-1:-1;;;;;97912:117:0;;:::i;93677:148::-;;;;;;;;;;;;;:::i;98177:347::-;;;;;;;;;;;;;:::i;98087:39::-;;;;;;;;;;;;;:::i;93035:79::-;;;;;;;;;;;;;:::i;99272:169::-;;;;;;;;;;;;;:::i;96747:87::-;;;;;;;;;;;;;:::i;107907:400::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;107907:400:0;;;;;;;;:::i;104966:180::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;104966:180:0;;;;;;;;:::i;108497:37::-;;;;;;;;;;;;;:::i;108543:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;108543:143:0;-1:-1:-1;;;;;108543:143:0;;:::i;100752:661::-;;;;;;;;;;;;;;;;-1:-1:-1;100752:661:0;;;;:::i;105209:201::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;105209:201:0;;;;;;;;;;:::i;104202:435::-;;;;;;;;;;;;;:::i;93980:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93980:244:0;-1:-1:-1;;;;;93980:244:0;;:::i;100394:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;100394:48:0;-1:-1:-1;;;;;100394:48:0;;:::i;100236:34::-;;;;:::o;96540:88::-;96615:5;96608:12;;;;;;;;-1:-1:-1;;96608:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96577:13;;96608:12;;96615:5;;96608:12;;96615:5;96608:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96540:88;:::o;105557:210::-;105676:4;105698:39;105707:12;:10;:12::i;:::-;105721:7;105730:6;105698:8;:39::i;:::-;-1:-1:-1;105755:4:0;105557:210;;;;;:::o;108694:29::-;;;-1:-1:-1;;;;;108694:29:0;;:::o;101872:1334::-;101944:28;:26;:28::i;:::-;:37;101936:66;;;;;-1:-1:-1;;;101936:66:0;;;;;;;;;;;;-1:-1:-1;;;101936:66:0;;;;;;;;;;;;;;;102021:21;;;;:30;102013:68;;;;;-1:-1:-1;;;102013:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;102114:21;102092:19;:43;;;102183:16;;102211:58;;;;;;;;;;;;-1:-1:-1;;;102211:58:0;;;;-1:-1:-1;;;;;102183:16:0;;;;102211:58;;;102264:4;;102242:26;102211:11;:58::i;:::-;102315:15;;:22;;;-1:-1:-1;;;102315:22:0;;;;102300:12;;-1:-1:-1;;;;;102315:15:0;;:20;;:22;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;102315:22:0;102376:19;;102348:50;;;-1:-1:-1;;;102348:50:0;;;;102315:22;;-1:-1:-1;;;;;;102348:19:0;;;;;102376;102348:50;;;;;;;;;;;;;;;102376:19;102348;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102417:21;102442:1;102417:26;102409:55;;;;;-1:-1:-1;;;102409:55:0;;;;;;;;;;;;-1:-1:-1;;;102409:55:0;;;;;;;;;;;;;;;102481:4;-1:-1:-1;;;;;102475:20:0;;102504:4;102510:19;;102475:55;;;;;;;;;;;;;-1:-1:-1;;;;;102475:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;102563:4:0;102585:24;;;;:9;102475:55;102585:24;;;;;;;;;102546:64;;;;;;;-1:-1:-1;;;;;102546:64:0;;;102563:4;-1:-1:-1;;;;;;;;;;;102546:64:0;;;;;;;;102666:4;102648:24;;;;:9;:24;;;;;;;;;;-1:-1:-1;;;;;102621:24:0;;;;;;;;:51;;;;102683:24;;;:28;;;;102722:24;;-1:-1:-1;;;102722:24:0;;;;;;;;;;;102621;;102722:9;;:24;;;;;102648;102722;;;;;;;;102621;102722;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;102779:29:0;;;-1:-1:-1;;;102779:29:0;;102802:4;102779:29;;;;;;-1:-1:-1;;;;;102779:14:0;;;;;:29;;;;;102722:24;;102779:29;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;102779:29:0;102757:19;:51;;;102819:54;;;;;;;;;;;;-1:-1:-1;;;102779:29:0;102819:54;;;;;:11;:54::i;:::-;102892:19;;102884:56;;;;;-1:-1:-1;;;102884:56:0;;;;;;;;;;;;-1:-1:-1;;;102884:56:0;;;;;;;;;;;;;;;102966:54;103000:19;;102966:29;102990:4;102966:19;;:23;;:29;;;;:::i;:::-;:33;;:54::i;:::-;102951:12;:69;;;103052:47;;;;;;;;;;;;-1:-1:-1;;;103052:47:0;;;;;;:11;:47::i;:::-;103118:12;;103110:49;;;;;-1:-1:-1;;;103110:49:0;;;;;;;;;;;;-1:-1:-1;;;103110:49:0;;;;;;;;;;;;;;;-1:-1:-1;;103170:21:0;:28;;-1:-1:-1;;103170:28:0;103194:4;103170:28;;;101872:1334::o;108315:174::-;93257:12;:10;:12::i;:::-;93247:6;;-1:-1:-1;;;;;93247:6:0;;;:22;;;93239:67;;;;;-1:-1:-1;;;93239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;93239:67:0;;;;;;;;;;;;;;;108433:22:::1;:48:::0;;-1:-1:-1;;;;;;108433:48:0::1;-1:-1:-1::0;;;;;108433:48:0;;;::::1;::::0;;;::::1;::::0;;108315:174::o;100352:33::-;;;;;;:::o;97620:100::-;97700:12;;97620:100;:::o;100277:34::-;;;;:::o;106241:454::-;106381:4;106398:36;106408:6;106416:9;106427:6;106398:9;:36::i;:::-;106445:220;106468:6;106489:12;:10;:12::i;:::-;106516:138;106572:6;106516:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;106516:19:0;;;;;;:11;:19;;;;;;106536:12;:10;:12::i;:::-;-1:-1:-1;;;;;106516:33:0;;;;;;;;;;;;-1:-1:-1;106516:33:0;;;:138;:37;:138::i;:::-;106445:8;:220::i;:::-;-1:-1:-1;106683:4:0;106241:454;;;;;:::o;97472:83::-;97538:9;;;;97472:83;:::o;100318:27::-;;;;:::o;95915:47::-;95955:7;95915:47;:::o;103521:540::-;103572:21;;;;103564:52;;;;;-1:-1:-1;;;103564:52:0;;;;;;;;;;;;-1:-1:-1;;;103564:52:0;;;;;;;;;;;;;;;103650:10;103664:1;103635:26;;;:14;:26;;;;;;103627:72;;;;;-1:-1:-1;;;103627:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;103747:16;;103835:12;;103819:10;103710:19;103804:26;;;:14;:26;;;;;;-1:-1:-1;;;;;103747:16:0;;;;103710:19;;103804:54;;103853:4;;103804:44;;:26;:30;:44::i;:54::-;103775:83;;103869:4;-1:-1:-1;;;;;103869:13:0;;103883:10;103895:18;103869:45;;;;;;;;;;;;;-1:-1:-1;;;;;103869:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;103976:10:0;103990:1;103961:26;;;:14;103869:45;103961:26;;;;;;;:30;;;;104007:46;;;;;;;;;;;;;;;;;;;;;;103521:540;;:::o;107104:300::-;107219:4;107241:133;107264:12;:10;:12::i;:::-;107291:7;107313:50;107352:10;107313:11;:25;107325:12;:10;:12::i;:::-;-1:-1:-1;;;;;107313:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;107313:25:0;;;:34;;;;;;;;;;;:38;:50::i;104672:81::-;104720:25;104726:10;104738:6;104720:5;:25::i;:::-;104672:81;:::o;98137:31::-;;;-1:-1:-1;;;;;98137:31:0;;:::o;98039:41::-;;;-1:-1:-1;;;;;98039:41:0;;:::o;99450:372::-;99550:7;99583:28;:26;:28::i;:::-;99575:51;;;;;-1:-1:-1;;;99575:51:0;;;;;;;;;;;;-1:-1:-1;;;99575:51:0;;;;;;;;;;;;;;;99637:104;;;;;;;;;;;;;;-1:-1:-1;;;99637:104:0;;;99674:34;99701:6;99674:22;;:26;;:34;;;;:::i;:::-;99637:104;;;;;;;;;;;;;-1:-1:-1;;;99637:104:0;;;99725:15;99637:11;:104::i;:::-;99759:55;99798:15;99759:34;99786:6;99759:22;;:26;;:34;;;;:::i;:::-;:38;;:55::i;:::-;99752:62;;99450:372;:::o;99830:398::-;99916:4;99938:104;;;;;;;;;;;;;;-1:-1:-1;;;99938:104:0;;;99975:34;100002:6;99975:22;;:26;;:34;;;;:::i;99938:104::-;100053:97;;;;;;;;;;;;;;;;;;100134:15;100097:34;100124:6;100097:22;;:26;;:34;;;;:::i;:::-;:52;100053:11;:97::i;:::-;100168:22;;100205:15;;100168:34;;100195:6;100168:26;:34::i;:::-;:52;100161:59;;99830:398;:::o;95969:37::-;;;;:::o;97912:117::-;-1:-1:-1;;;;;98004:17:0;97977:7;98004:17;;;:9;:17;;;;;;;97912:117::o;93677:148::-;93257:12;:10;:12::i;:::-;93247:6;;-1:-1:-1;;;;;93247:6:0;;;:22;;;93239:67;;;;;-1:-1:-1;;;93239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;93239:67:0;;;;;;;;;;;;;;;93784:1:::1;93768:6:::0;;93747:40:::1;::::0;-1:-1:-1;;;;;93768:6:0;;::::1;::::0;93747:40:::1;::::0;93784:1;;93747:40:::1;93815:1;93798:19:::0;;-1:-1:-1;;;;;;93798:19:0::1;::::0;;93677:148::o;98177:347::-;98280:16;;98247:7;;-1:-1:-1;;;;;98280:16:0;:30;98272:70;;;;;-1:-1:-1;;;98272:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;98372:14;;98420:15;;:22;;;-1:-1:-1;;;98420:22:0;;;;-1:-1:-1;;;;;98372:14:0;;;;:25;;98420:15;;:20;;:22;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98420:22:0;98372:110;;;-1:-1:-1;;;;;;98372:110:0;;;;;;;-1:-1:-1;;;;;98372:110:0;;;;;;;98466:4;98372:110;;;;;;;;;;98420:22;;98372:110;;;;;;;-1:-1:-1;98372:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98372:110:0;98353:16;:129;;-1:-1:-1;;;;;;98353:129:0;-1:-1:-1;;;;;98353:129:0;;;;;;;;98500:16;;98177:347;-1:-1:-1;98177:347:0:o;98087:39::-;;;-1:-1:-1;;;;;98087:39:0;;:::o;93035:79::-;93073:7;93100:6;-1:-1:-1;;;;;93100:6:0;93035:79;:::o;99272:169::-;;;;;;;;;;;;;;;-1:-1:-1;;99272:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96747:87::-;96819:7;96812:14;;;;;;;;-1:-1:-1;;96812:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96786:13;;96812:14;;96819:7;;96812:14;;96819:7;96812:14;;;;;;;;;;;;;;;;;;;;;;;;107907:400;108027:4;108049:228;108072:12;:10;:12::i;:::-;108099:7;108121:145;108178:15;108121:145;;;;;;;;;;;;;;;;;:11;:25;108133:12;:10;:12::i;:::-;-1:-1:-1;;;;;108121:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;108121:25:0;;;:34;;;;;;;;;;;:145;:38;:145::i;104966:180::-;105052:4;105074:42;105084:12;:10;:12::i;:::-;105098:9;105109:6;105074:9;:42::i;108497:37::-;;;-1:-1:-1;;;;;108497:37:0;;:::o;108543:143::-;93257:12;:10;:12::i;:::-;93247:6;;-1:-1:-1;;;;;93247:6:0;;;:22;;;93239:67;;;;;-1:-1:-1;;;93239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;93239:67:0;;;;;;;;;;;;;;;108646:14:::1;:32:::0;;-1:-1:-1;;;;;;108646:32:0::1;-1:-1:-1::0;;;;;108646:32:0;;;::::1;::::0;;;::::1;::::0;;108543:143::o;100752:661::-;100902:28;:26;:28::i;:::-;100894:72;;;;;-1:-1:-1;;;100894:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;100985:64;100977:98;;;;;-1:-1:-1;;;100977:98:0;;;;;;;;;;;;-1:-1:-1;;;100977:98:0;;;;;;;;;;;;;;;101101:10;101086:26;;;;:14;:26;;;;;:39;;101116:9;101086:39;;;;;;101214:19;;:34;;:23;:34::i;:::-;101192:19;:56;101365:40;;;101395:9;101365:40;;;;101383:10;;101365:40;;;;;;;;;;100752:661;:::o;105209:201::-;-1:-1:-1;;;;;105375:18:0;;;105343:7;105375:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;105209:201::o;104202:435::-;93257:12;:10;:12::i;:::-;93247:6;;-1:-1:-1;;;;;93247:6:0;;;:22;;;93239:67;;;;;-1:-1:-1;;;93239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;93239:67:0;;;;;;;;;;;;;;;104281:22:::1;::::0;104318:15:::1;::::0;104281:34:::1;::::0;104308:6:::1;104281:26;:34::i;:::-;:52;104273:85;;;::::0;;-1:-1:-1;;;104273:85:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;104273:85:0;;;;;;;;;;;;;::::1;;104436:48;::::0;104418:12:::1;::::0;104436:10:::1;::::0;104458:21:::1;::::0;104418:12;104436:48;104418:12;104436:48;104458:21;104436:10;:48:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104417:67;;;104503:7;104495:36;;;::::0;;-1:-1:-1;;;104495:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;104495:36:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;104584:4:0::1;104566:24;::::0;;;:9:::1;:24;::::0;;;;;;;104552:10:::1;104542:21:::0;;;;;:48;;;;104601:24;;;:28;;104202:435::o;93980:244::-;93257:12;:10;:12::i;:::-;93247:6;;-1:-1:-1;;;;;93247:6:0;;;:22;;;93239:67;;;;;-1:-1:-1;;;93239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;93239:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;94069:22:0;::::1;94061:73;;;;-1:-1:-1::0;;;94061:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94171:6;::::0;;94150:38:::1;::::0;-1:-1:-1;;;;;94150:38:0;;::::1;::::0;94171:6;::::1;::::0;94150:38:::1;::::0;::::1;94199:6;:17:::0;;-1:-1:-1;;;;;;94199:17:0::1;-1:-1:-1::0;;;;;94199:17:0;;;::::1;::::0;;;::::1;::::0;;93980:244::o;100394:48::-;;;;;;;;;;;;;:::o;6106:181::-;6164:7;6196:5;;;6220:6;;;;6212:46;;;;;-1:-1:-1;;;6212:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6278:1;6106:181;-1:-1:-1;;;6106:181:0:o;2160:106::-;2248:10;2160:106;:::o;112526:380::-;-1:-1:-1;;;;;112662:19:0;;112654:68;;;;-1:-1:-1;;;112654:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112741:21:0;;112733:68;;;;-1:-1:-1;;;112733:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112814:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;112866:32;;;;;;;;;;;;;;;;;112526:380;;;:::o;23580:132::-;23639:68;23699:2;23703;23655:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23655:51:0;;;-1:-1:-1;;23655:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23655:51:0;-1:-1:-1;;;23655:51:0;;;;-1:-1:-1;23639:15:0;;-1:-1:-1;;;23639:68:0:i;:::-;23580:132;;:::o;7460:471::-;7518:7;7763:6;7759:47;;-1:-1:-1;7793:1:0;7786:8;;7759:47;7830:5;;;7834:1;7830;:5;:1;7854:5;;;;;:10;7846:56;;;;-1:-1:-1;;;7846:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8407:132;8465:7;8492:39;8496:1;8499;8492:39;;;;;;;;;;;;;;;;;:3;:39::i;109218:1420::-;-1:-1:-1;;;;;109358:20:0;;109350:70;;;;-1:-1:-1;;;109350:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;109439:23:0;;109431:71;;;;-1:-1:-1;;;109431:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109519:47;109540:6;109548:9;109559:6;109519:20;:47::i;:::-;109599:108;109635:6;109599:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;109599:17:0;;;;;;:9;:17;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;109579:17:0;;;;;;;:9;:17;;;;;;:128;;;;109802:22;;109789:88;;-1:-1:-1;;;109789:88:0;;;;;;;;;;;;;;;;;;;;;;;;109579:17;;;;109802:22;;;;;109789:61;;:88;;;;;109579:17;109789:88;;;;;109579:17;109802:22;109789:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;109789:88:0;;;;;;;;;-1:-1:-1;109789:88:0;-1:-1:-1;110005:6:0;109949:52;109789:88;;109949:20;:52::i;:::-;:62;109941:111;;;;-1:-1:-1;;;109941:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;110088:20:0;;;;;;:9;:20;;;;;;:42;;110113:16;110088:24;:42::i;:::-;-1:-1:-1;;;;;110065:20:0;;;;;;;:9;:20;;;;;;;;;:65;;;;110146:45;;;;;;;110065:20;;110146:45;;;;-1:-1:-1;;;;;;;;;;;110146:45:0;;;;;;;;110240:1;110207:30;:34;:66;;;;-1:-1:-1;110245:14:0;;-1:-1:-1;;;;;110245:14:0;:28;;110207:66;110204:427;;;110327:14;;-1:-1:-1;;;;;110327:14:0;110317:25;;;;:9;:25;;;;;;:61;;110347:30;110317:29;:61::i;:::-;110299:14;;;-1:-1:-1;;;;;110299:14:0;;;110289:25;;;;:9;:25;;;;;;;;;:89;;;;110415:14;;110398:64;;;;;;;110415:14;;;;110398:64;;;;-1:-1:-1;;;;;;;;;;;110398:64:0;;;;;;;;110480:14;;-1:-1:-1;;;;;110480:14:0;:28;110477:143;;110539:14;;110528:76;;;-1:-1:-1;;;110528:76:0;;;;;;;;;;-1:-1:-1;;;;;110539:14:0;;;;110528:44;;:76;;;;;110539:14;;110528:76;;;;;;;;110539:14;;110528:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110477:143;109218:1420;;;;;:::o;7009:192::-;7095:7;7131:12;7123:6;;;;7115:29;;;;-1:-1:-1;;;7115:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7167:5:0;;;7009:192::o;111631:455::-;-1:-1:-1;;;;;111715:21:0;;111707:67;;;;-1:-1:-1;;;111707:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111787:49;111808:7;111825:1;111829:6;111787:20;:49::i;:::-;111870:105;111907:6;111870:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111870:18:0;;;;;;:9;:18;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;111849:18:0;;;;;;:9;:18;;;;;:126;112001:12;;:24;;112018:6;112001:16;:24::i;:::-;111986:12;:39;112041:37;;;;;;;;112067:1;;-1:-1:-1;;;;;112041:37:0;;;-1:-1:-1;;;;;;;;;;;112041:37:0;;;;;;;;111631:455;;:::o;47136:179::-;47222:88;47294:2;47298;47302;47306;47238:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47238:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47238:71:0;;;-1:-1:-1;;47238:71:0;;;;;;;;;;;;;;-1:-1:-1;;;;;47238:71:0;-1:-1:-1;;;47238:71:0;;;;-1:-1:-1;47222:15:0;;-1:-1:-1;;;;;;47222:88:0:i;:::-;47136:179;;;;:::o;6570:136::-;6628:7;6655:43;6659:1;6662;6655:43;;;;;;;;;;;;;;;;;:3;:43::i;23865:132::-;23924:68;23984:2;23988;23940:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23940:51:0;;;-1:-1:-1;;23940:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23940:51:0;-1:-1:-1;;;23940:51:0;;;;-1:-1:-1;23924:15:0;;-1:-1:-1;;;23924:68:0:i;17559:295::-;17648:14;;17510:42;17760:2;17747:16;;17624:21;;17648:14;17747:16;17510:42;17788:5;17777:68;17768:77;;17721:129;;;:::o;9035:278::-;9121:7;9156:12;9149:5;9141:28;;;;-1:-1:-1;;;9141:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9180:9;9196:1;9192;:5;;;;;;;9035:278;-1:-1:-1;;;;;9035:278:0:o;113931:125::-;;;;:::o

Swarm Source

ipfs://cd714b1ec32309bb64e0d34bf8227b362b20078ec673aa191155ab6246eaf472
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.