ETH Price: $3,383.90 (-1.84%)
Gas: 3 Gwei

Token

SIMPTOKEN v2 (SIMP)
 

Overview

Max Total Supply

1,000,000,000 SIMP

Holders

157

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
707,780 SIMP

Value
$0.00
0x5609ffc9e2525c1b7f3a1b8522cf8e88be3c2ef7
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:
SIMP

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-28
*/

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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 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;
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        // 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
    }

    /**
     * @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) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
    unchecked {
        require(b <= a, errorMessage);
        return a - b;
    }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
    unchecked {
        require(b > 0, errorMessage);
        return a / b;
    }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
    unchecked {
        require(b > 0, errorMessage);
        return a % b;
    }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

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

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

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

    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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 Contracts guidelines: functions revert
 * instead 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 ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + 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) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(owner, spender, currentAllowance - subtractedValue);
    }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[from] = fromBalance - amount;
    }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @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:
     *
     * - `account` 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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
    unchecked {
        _balances[account] = accountBalance - amount;
    }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This 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 Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
        unchecked {
            _approve(owner, spender, currentAllowance - amount);
        }
        }
    }

    /**
     * @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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: hardhat/console.sol


pragma solidity >= 0.4.22 <0.9.0;

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 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));
    }

}

// File: contracts/SIMP.sol



pragma solidity ^0.8.0;








contract SIMP is ERC20, Ownable {
    using SafeMath for uint256;

    modifier lockSwap {
        _inSwap = true;
        _;
        _inSwap = false;
    }

    modifier liquidityAdd {
        _inLiquidityAdd = true;
        _;
        _inLiquidityAdd = false;
    }

    uint256 public constant MAX_SUPPLY = 1_000_000_000 ether;

    uint256 internal _maxTransfer = 5;
    uint256 public marketingRate = 5;
    uint256 public treasuryRate = 5;
    uint256 public reflectRate = 5;
    /// @notice Contract SIMP balance threshold before `_swap` is invoked
    uint256 public minTokenBalance = 10000000 ether;
    bool public swapFees = true;

    // total wei reflected ever
    uint256 public ethReflectionBasis;
    uint256 public totalReflected;
    uint256 public totalMarketing;
    uint256 public totalTreasury;

    address payable public marketingWallet;
    address payable public treasuryWallet;

    uint256 internal _totalSupply = 0;
    IUniswapV2Router02 internal _router = IUniswapV2Router02(address(0));
    address internal _pair;
    bool internal _inSwap = false;
    bool internal _inLiquidityAdd = false;
    bool public tradingActive = false;

    mapping(address => uint256) private _balances;
    mapping(address => bool) private _taxExcluded;
    mapping(address => uint256) public lastReflectionBasis;

    constructor(
        address _uniswapFactory,
        address _uniswapRouter,
        address payable _marketingWallet,
        address payable _treasuryWallet
    ) ERC20("SIMPTOKEN v2", "SIMP") Ownable() {
        addTaxExcluded(owner());
        addTaxExcluded(address(0));
        addTaxExcluded(_marketingWallet);
        addTaxExcluded(_treasuryWallet);
        addTaxExcluded(address(this));

        marketingWallet = _marketingWallet;
        treasuryWallet = _treasuryWallet;

        _router = IUniswapV2Router02(_uniswapRouter);
        IUniswapV2Factory uniswapContract = IUniswapV2Factory(_uniswapFactory);
        _pair = uniswapContract.createPair(address(this), _router.WETH());
    }

    /// @notice Change the address of the marketing wallet
    /// @param _marketingWallet The new address of the marketing wallet
    function setMarketingWallet(address payable _marketingWallet) external onlyOwner() {
        marketingWallet = _marketingWallet;
    }

    /// @notice Change the address of the treasury wallet
    /// @param _treasuryWallet The new address of the treasury wallet
    function setTreasuryWallet(address payable _treasuryWallet) external onlyOwner() {
        treasuryWallet = _treasuryWallet;
    }

    /// @notice Change the marketing tax rate
    /// @param _marketingRate The new marketing tax rate
    function setMarketingRate(uint256 _marketingRate) external onlyOwner() {
        require(_marketingRate <= 100, "_marketingRate cannot exceed 100%");
        marketingRate = _marketingRate;
    }

    /// @notice Change the treasury tax rate
    /// @param _treasuryRate The new treasury tax rate
    function setTreasuryRate(uint256 _treasuryRate) external onlyOwner() {
        require(_treasuryRate <= 100, "_treasuryRate cannot exceed 100%");
        treasuryRate = _treasuryRate;
    }

    /// @notice Change the reflection tax rate
    /// @param _reflectRate The new reflection tax rate
    function setReflectRate(uint256 _reflectRate) external onlyOwner() {
        require(_reflectRate <= 100, "_reflectRate cannot exceed 100%");
        reflectRate = _reflectRate;
    }

    /// @notice Change the minimum contract SIMP balance before `_swap` gets invoked
    /// @param _minTokenBalance The new minimum balance
    function setMinTokenBalance(uint256 _minTokenBalance) external onlyOwner() {
        minTokenBalance = _minTokenBalance;
    }

    /// @notice Rescue SIMP from the marketing amount
    /// @dev Should only be used in an emergency
    /// @param _amount The amount of SIMP to rescue
    /// @param _recipient The recipient of the rescued SIMP
    function rescueMarketingTokens(uint256 _amount, address _recipient) external onlyOwner() {
        require(_amount <= totalMarketing, "Amount cannot be greater than totalMarketing");
        _rawTransfer(address(this), _recipient, _amount);
        totalMarketing -= _amount;
    }

    /// @notice Rescue SIMP from the treasury amount
    /// @dev Should only be used in an emergency
    /// @param _amount The amount of SIMP to rescue
    /// @param _recipient The recipient of the rescued SIMP
    function rescueTreasuryTokens(uint256 _amount, address _recipient) external onlyOwner() {
        require(_amount <= totalTreasury, "Amount cannot be greater than totalTreasury");
        _rawTransfer(address(this), _recipient, _amount);
        totalTreasury -= _amount;
    }

    /// @notice Rescue SIMP from the reflection amount
    /// @dev Should only be used in an emergency
    /// @param _amount The amount of SIMP to rescue
    /// @param _recipient The recipient of the rescued SIMP
    function rescueReflectionTokens(uint256 _amount, address _recipient) external onlyOwner() {
        require(_amount <= totalReflected, "Amount cannot be greater than totalReflected");
        _rawTransfer(address(this), _recipient, _amount);
        totalReflected -= _amount;
    }

    function addLiquidity(uint256 tokens) external payable onlyOwner() liquidityAdd {
        _mint(address(this), tokens);
        _approve(address(this), address(_router), tokens);

        _router.addLiquidityETH{value: msg.value}(
            address(this),
            tokens,
            0,
            0,
            owner(),
        // solhint-disable-next-line not-rely-on-time
            block.timestamp
        );
    }

    /// @notice Enables trading on Uniswap
    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    /// @notice Disables trading on Uniswap
    function disableTrading() external onlyOwner {
        tradingActive = false;
    }

    function addReflection() external payable {
        ethReflectionBasis += msg.value;
    }

    function isTaxExcluded(address account) public view returns (bool) {
        return _taxExcluded[account];
    }

    function addTaxExcluded(address account) public onlyOwner() {
        require(!isTaxExcluded(account), "Account must not be excluded");

        _taxExcluded[account] = true;
    }

    function removeTaxExcluded(address account) external onlyOwner() {
        require(isTaxExcluded(account), "Account must not be excluded");

        _taxExcluded[account] = false;
    }

    function balanceOf(address account)
    public
    view
    virtual
    override
    returns (uint256)
    {
        return _balances[account];
    }

    function _addBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] + amount;
    }

    function _subtractBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] - amount;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        if (isTaxExcluded(sender) || isTaxExcluded(recipient)) {
            _rawTransfer(sender, recipient, amount);
            return;
        }

        uint256 maxTxAmount = totalSupply() * _maxTransfer / 1000;
        require(amount <= maxTxAmount || _inLiquidityAdd || _inSwap || recipient == address(_router), "Exceeds max transaction amount");

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance >= minTokenBalance;

        if(contractTokenBalance >= maxTxAmount) {
            contractTokenBalance = maxTxAmount;
        }

        if (
            overMinTokenBalance &&
            !_inSwap &&
            sender != _pair &&
            swapFees
        ) {
            _swap(contractTokenBalance);
        }

        _claimReflection(payable(sender));
        _claimReflection(payable(recipient));

        uint256 send = amount;
        uint256 reflect;
        uint256 marketing;
        uint256 treasury;
        if (sender == _pair || recipient == _pair) {
            require(tradingActive, "Trading is not yet active");
            (
            send,
            reflect,
            marketing,
            treasury
            ) = _getTaxAmounts(amount);
        }
        _rawTransfer(sender, recipient, send);
        _takeTaxes(sender, marketing, treasury, reflect);
    }

    function unclaimedReflection(address addr) public view returns (uint256) {
        if (addr == _pair || addr == address(_router)) return 0;

        uint256 basisDifference = ethReflectionBasis - lastReflectionBasis[addr];
        return basisDifference * balanceOf(addr) / _totalSupply;
    }

    /// @notice Claims reflection pool ETH
    /// @param addr The address to claim the reflection for
    function _claimReflection(address payable addr) internal {
        uint256 unclaimed = unclaimedReflection(addr);
        lastReflectionBasis[addr] = ethReflectionBasis;
        if (unclaimed > 0) {
            addr.transfer(unclaimed);
        }
    }

    function claimReflection() external {
        _claimReflection(payable(msg.sender));
    }

    /// @notice Perform a Uniswap v2 swap from SIMP to ETH and handle tax distribution
    /// @param amount The amount of SIMP to swap in wei
    /// @dev `amount` is always <= this contract's ETH balance. Calculate and distribute marketing and reflection taxes
    function _swap(uint256 amount) internal lockSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _router.WETH();

        _approve(address(this), address(_router), amount);

        uint256 contractEthBalance = address(this).balance;

        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 tradeValue = address(this).balance - contractEthBalance;

        uint256 totalTaxes = totalMarketing.add(totalTreasury).add(totalReflected);
        uint256 marketingAmount = amount.mul(totalMarketing).div(totalTaxes);
        uint256 treasuryAmount = amount.mul(totalTreasury).div(totalTaxes);
        uint256 reflectedAmount = amount.sub(marketingAmount).sub(treasuryAmount);

        uint256 marketingEth = tradeValue.mul(totalMarketing).div(totalTaxes);
        uint256 treasuryEth = tradeValue.mul(totalTreasury).div(totalTaxes);
        uint256 reflectedEth = tradeValue.sub(marketingEth).sub(treasuryEth);

        if (marketingEth > 0) {
            marketingWallet.transfer(marketingEth);
        }
        if (treasuryEth > 0) {
            treasuryWallet.transfer(treasuryEth);
        }
        totalMarketing = totalMarketing.sub(marketingAmount);
        totalTreasury = totalTreasury.sub(treasuryAmount);
        totalReflected = totalReflected.sub(reflectedAmount);
        ethReflectionBasis = ethReflectionBasis.add(reflectedEth);
    }

    function swapAll() external {
        uint256 maxTxAmount = totalSupply() * _maxTransfer / 1000;
        uint256 contractTokenBalance = balanceOf(address(this));

        if(contractTokenBalance >= maxTxAmount)
        {
            contractTokenBalance = maxTxAmount;
        }

        if (
            !_inSwap
        ) {
            _swap(contractTokenBalance);
        }
    }

    function withdrawAll() external onlyOwner() {
        payable(owner()).transfer(address(this).balance);
    }

    /// @notice Transfers SIMP from an account to this contract for taxes
    /// @param _account The account to transfer SIMP from
    /// @param _marketingAmount The amount of marketing tax to transfer
    /// @param _treasuryAmount The amount of treasury tax to transfer
    /// @param _reflectAmount The amount of reflection tax to transfer
    function _takeTaxes(
        address _account,
        uint256 _marketingAmount,
        uint256 _treasuryAmount,
        uint256 _reflectAmount
    ) internal {
        require(_account != address(0), "taxation from the zero address");

        uint256 totalAmount = _marketingAmount.add(_treasuryAmount).add(_reflectAmount);
        _rawTransfer(_account, address(this), totalAmount);
        totalMarketing += _marketingAmount;
        totalTreasury += _treasuryAmount;
        totalReflected += _reflectAmount;
    }

    /// @notice Get a breakdown of send and tax amounts
    /// @param amount The amount to tax in wei
    /// @return send The raw amount to send
    /// @return reflect The raw reflection tax amount
    /// @return marketing The raw marketing tax amount
    /// @return treasury The raw treasury tax amount
    function _getTaxAmounts(uint256 amount)
    internal
    view
    returns (
        uint256 send,
        uint256 reflect,
        uint256 marketing,
        uint256 treasury
    )
    {
        reflect = amount.mul(reflectRate).div(100);
        marketing = amount.mul(marketingRate).div(100);
        treasury = amount.mul(treasuryRate).div(100);
        send = amount.sub(reflect).sub(marketing).sub(treasury);
    }

    // modified from OpenZeppelin ERC20
    function _rawTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        require(sender != address(0), "transfer from the zero address");
        require(recipient != address(0), "transfer to the zero address");

        uint256 senderBalance = balanceOf(sender);
        require(senderBalance >= amount, "transfer amount exceeds balance");
    unchecked {
        _subtractBalance(sender, amount);
    }
        _addBalance(recipient, amount);

        emit Transfer(sender, recipient, amount);
    }

    function setMaxTransfer(uint256 maxTransfer) external onlyOwner() {
        _maxTransfer = maxTransfer;
    }

    /// @notice Enable or disable whether swap occurs during `_transfer`
    /// @param _swapFees If true, enables swap during `_transfer`
    function setSwapFees(bool _swapFees) external onlyOwner() {
        swapFees = _swapFees;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function _mint(address account, uint256 amount) internal override {
        require(_totalSupply.add(amount) <= MAX_SUPPLY, "Max supply exceeded");
        _totalSupply += amount;
        _addBalance(account, amount);
        emit Transfer(address(0), account, amount);
    }

    function mint(address account, uint256 amount) external onlyOwner() {
        _mint(account, amount);
    }

    function airdrop(address[] memory accounts, uint256[] memory amounts) external onlyOwner() {
        require(accounts.length == amounts.length, "array lengths must match");

        for (uint256 i = 0; i < accounts.length; i++) {
            _mint(accounts[i], amounts[i]);
        }
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_uniswapFactory","type":"address"},{"internalType":"address","name":"_uniswapRouter","type":"address"},{"internalType":"address payable","name":"_marketingWallet","type":"address"},{"internalType":"address payable","name":"_treasuryWallet","type":"address"}],"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":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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"addReflection","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addTaxExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReflection","outputs":[],"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":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethReflectionBasis","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isTaxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastReflectionBasis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"reflectRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeTaxExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueMarketingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueReflectionTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueTreasuryTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingRate","type":"uint256"}],"name":"setMarketingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTransfer","type":"uint256"}],"name":"setMaxTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokenBalance","type":"uint256"}],"name":"setMinTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reflectRate","type":"uint256"}],"name":"setReflectRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapFees","type":"bool"}],"name":"setSwapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryRate","type":"uint256"}],"name":"setTreasuryRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"treasuryRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"unclaimedReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260056006556005600755600560085560056009556a084595161401484a000000600a556001600b60006101000a81548160ff02191690831515021790555060006012556000601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006014806101000a81548160ff0219169083151502179055506000601460156101000a81548160ff0219169083151502179055506000601460166101000a81548160ff021916908315150217905550348015620000e657600080fd5b50604051620056a4380380620056a483398181016040528101906200010c919062000816565b6040518060400160405280600c81526020017f53494d50544f4b454e20763200000000000000000000000000000000000000008152506040518060400160405280600481526020017f53494d500000000000000000000000000000000000000000000000000000000081525081600390805190602001906200019092919062000706565b508060049080519060200190620001a992919062000706565b505050620001cc620001c06200047a60201b60201c565b6200048260201b60201c565b620001ec620001e06200054860201b60201c565b6200057260201b60201c565b620001fe60006200057260201b60201c565b6200020f826200057260201b60201c565b62000220816200057260201b60201c565b62000231306200057260201b60201c565b81601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008490508073ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200037f57600080fd5b505afa15801562000394573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ba9190620007e4565b6040518363ffffffff1660e01b8152600401620003d9929190620008e7565b602060405180830381600087803b158015620003f457600080fd5b505af115801562000409573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200042f9190620007e4565b601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000aa1565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005826200047a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005a86200054860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000601576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f89062000914565b60405180910390fd5b6200061281620006b060201b60201c565b1562000655576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064c9062000936565b60405180910390fd5b6001601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b8280546200071490620009b1565b90600052602060002090601f01602090048101928262000738576000855562000784565b82601f106200075357805160ff191683800117855562000784565b8280016001018555821562000784579182015b828111156200078357825182559160200191906001019062000766565b5b50905062000793919062000797565b5090565b5b80821115620007b257600081600090555060010162000798565b5090565b600081519050620007c78162000a6d565b92915050565b600081519050620007de8162000a87565b92915050565b600060208284031215620007fd57620007fc62000a16565b5b60006200080d84828501620007b6565b91505092915050565b6000806000806080858703121562000833576200083262000a16565b5b60006200084387828801620007b6565b94505060206200085687828801620007b6565b93505060406200086987828801620007cd565b92505060606200087c87828801620007cd565b91505092959194509250565b620008938162000969565b82525050565b6000620008a860208362000958565b9150620008b58262000a1b565b602082019050919050565b6000620008cf601c8362000958565b9150620008dc8262000a44565b602082019050919050565b6000604082019050620008fe600083018562000888565b6200090d602083018462000888565b9392505050565b600060208201905081810360008301526200092f8162000899565b9050919050565b600060208201905081810360008301526200095181620008c0565b9050919050565b600082825260208201905092915050565b6000620009768262000991565b9050919050565b60006200098a8262000991565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620009ca57607f821691505b60208210811415620009e157620009e0620009e7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4163636f756e74206d757374206e6f74206265206578636c7564656400000000600082015250565b62000a788162000969565b811462000a8457600080fd5b50565b62000a92816200097d565b811462000a9e57600080fd5b50565b614bf38062000ab16000396000f3fe6080604052600436106103035760003560e01c8063712eb85911610190578063a8602fea116100dc578063bbc0c74211610095578063dd62ed3e1161006f578063dd62ed3e14610afd578063e3f9fc6314610b3a578063e4b7251614610b63578063f2fde38b14610b8e5761030a565b8063bbc0c74214610a7e578063be30877f14610aa9578063d0bf9c5414610ad45761030a565b8063a8602fea14610972578063a9059cbb1461099b578063b0ac1571146109d8578063b1284d3414610a01578063b41356c914610a2a578063b9ccf21d14610a535761030a565b8063897534a9116101495780639579d514116101235780639579d514146108a457806395d89b41146108e15780639ec09e1e1461090c578063a457c2d7146109355761030a565b8063897534a9146108375780638a8c523c146108625780638da5cb5b146108795761030a565b8063712eb85914610761578063715018a61461078a57806375f0a874146107a157806377348de9146107cc578063838a676f146107f5578063853828b6146108205761030a565b80633e9ffbea1161024f5780635b78f35f1161020857806361db2446116101e257806361db24461461069357806367243482146106be57806369ec8e9c146106e757806370a08231146107245761030a565b80635b78f35f146106025780635d098b381461062d5780635facf12e146106565761030a565b80633e9ffbea1461054857806340c10f191461055f5780634626402b146105885780634e6be544146105b35780634fb0b7e7146105bd57806351c6590a146105e65761030a565b806323b872dd116102bc5780633732e214116102965780633732e214146104a057806337563293146104cb57806339509351146104e25780633daacfef1461051f5761030a565b806323b872dd1461040d578063313ce5671461044a57806332cb6b0c146104755761030a565b80630126ec501461030f57806306fdde0314610338578063095ea7b3146103635780631233d83a146103a057806317700f01146103cb57806318160ddd146103e25761030a565b3661030a57005b600080fd5b34801561031b57600080fd5b50610336600480360381019061033191906139f7565b610bb7565b005b34801561034457600080fd5b5061034d610ca0565b60405161035a9190613f33565b60405180910390f35b34801561036f57600080fd5b5061038a600480360381019061038591906138e5565b610d32565b6040516103979190613f18565b60405180910390f35b3480156103ac57600080fd5b506103b5610d55565b6040516103c291906141f5565b60405180910390f35b3480156103d757600080fd5b506103e0610d5b565b005b3480156103ee57600080fd5b506103f7610df4565b60405161040491906141f5565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613892565b610dfe565b6040516104419190613f18565b60405180910390f35b34801561045657600080fd5b5061045f610e2d565b60405161046c919061426a565b60405180910390f35b34801561048157600080fd5b5061048a610e36565b60405161049791906141f5565b60405180910390f35b3480156104ac57600080fd5b506104b5610e46565b6040516104c291906141f5565b60405180910390f35b3480156104d757600080fd5b506104e0610e4c565b005b3480156104ee57600080fd5b50610509600480360381019061050491906138e5565b610e57565b6040516105169190613f18565b60405180910390f35b34801561052b57600080fd5b50610546600480360381019061054191906139f7565b610f01565b005b34801561055457600080fd5b5061055d610fea565b005b34801561056b57600080fd5b50610586600480360381019061058191906138e5565b611048565b005b34801561059457600080fd5b5061059d6110d2565b6040516105aa9190613e9c565b60405180910390f35b6105bb6110f8565b005b3480156105c957600080fd5b506105e460048036038101906105df91906137cb565b611113565b005b61060060048036038101906105fb91906139ca565b611233565b005b34801561060e57600080fd5b506106176113e2565b60405161062491906141f5565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f9190613825565b6113e8565b005b34801561066257600080fd5b5061067d600480360381019061067891906137cb565b6114a8565b60405161068a91906141f5565b60405180910390f35b34801561069f57600080fd5b506106a86115dc565b6040516106b591906141f5565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190613925565b6115e2565b005b3480156106f357600080fd5b5061070e600480360381019061070991906137cb565b611704565b60405161071b9190613f18565b60405180910390f35b34801561073057600080fd5b5061074b600480360381019061074691906137cb565b61175a565b60405161075891906141f5565b60405180910390f35b34801561076d57600080fd5b50610788600480360381019061078391906139ca565b6117a3565b005b34801561079657600080fd5b5061079f61186d565b005b3480156107ad57600080fd5b506107b66118f5565b6040516107c39190613e9c565b60405180910390f35b3480156107d857600080fd5b506107f360048036038101906107ee91906139ca565b61191b565b005b34801561080157600080fd5b5061080a6119a1565b60405161081791906141f5565b60405180910390f35b34801561082c57600080fd5b506108356119a7565b005b34801561084357600080fd5b5061084c611a73565b60405161085991906141f5565b60405180910390f35b34801561086e57600080fd5b50610877611a79565b005b34801561088557600080fd5b5061088e611b12565b60405161089b9190613e81565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906137cb565b611b3c565b6040516108d891906141f5565b60405180910390f35b3480156108ed57600080fd5b506108f6611b54565b6040516109039190613f33565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e91906139f7565b611be6565b005b34801561094157600080fd5b5061095c600480360381019061095791906138e5565b611ccf565b6040516109699190613f18565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613825565b611db9565b005b3480156109a757600080fd5b506109c260048036038101906109bd91906138e5565b611e79565b6040516109cf9190613f18565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa91906139ca565b611e9c565b005b348015610a0d57600080fd5b50610a286004803603810190610a2391906139ca565b611f22565b005b348015610a3657600080fd5b50610a516004803603810190610a4c91906137cb565b611fec565b005b348015610a5f57600080fd5b50610a6861210b565b604051610a759190613f18565b60405180910390f35b348015610a8a57600080fd5b50610a9361211e565b604051610aa09190613f18565b60405180910390f35b348015610ab557600080fd5b50610abe612131565b604051610acb91906141f5565b60405180910390f35b348015610ae057600080fd5b50610afb6004803603810190610af691906139ca565b612137565b005b348015610b0957600080fd5b50610b246004803603810190610b1f9190613852565b612201565b604051610b3191906141f5565b60405180910390f35b348015610b4657600080fd5b50610b616004803603810190610b5c919061399d565b612288565b005b348015610b6f57600080fd5b50610b78612321565b604051610b8591906141f5565b60405180910390f35b348015610b9a57600080fd5b50610bb56004803603810190610bb091906137cb565b612327565b005b610bbf61241f565b73ffffffffffffffffffffffffffffffffffffffff16610bdd611b12565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90614175565b60405180910390fd5b600d54821115610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f90613f75565b60405180910390fd5b610c83308284612427565b81600d6000828254610c959190614438565b925050819055505050565b606060038054610caf90614518565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdb90614518565b8015610d285780601f10610cfd57610100808354040283529160200191610d28565b820191906000526020600020905b815481529060010190602001808311610d0b57829003601f168201915b5050505050905090565b600080610d3d61241f565b9050610d4a8185856125d6565b600191505092915050565b600e5481565b610d6361241f565b73ffffffffffffffffffffffffffffffffffffffff16610d81611b12565b73ffffffffffffffffffffffffffffffffffffffff1614610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90614175565b60405180910390fd5b6000601460166101000a81548160ff021916908315150217905550565b6000601254905090565b600080610e0961241f565b9050610e168582856127a1565b610e2185858561282d565b60019150509392505050565b60006012905090565b6b033b2e3c9fd0803ce800000081565b600d5481565b610e5533612b5a565b565b600080610e6261241f565b9050610ef6818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef19190614357565b6125d6565b600191505092915050565b610f0961241f565b73ffffffffffffffffffffffffffffffffffffffff16610f27611b12565b73ffffffffffffffffffffffffffffffffffffffff1614610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614175565b60405180910390fd5b600e54821115610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb9906140d5565b60405180910390fd5b610fcd308284612427565b81600e6000828254610fdf9190614438565b925050819055505050565b60006103e8600654610ffa610df4565b61100491906143de565b61100e91906143ad565b9050600061101b3061175a565b9050818110611028578190505b60148054906101000a900460ff166110445761104381612c02565b5b5050565b61105061241f565b73ffffffffffffffffffffffffffffffffffffffff1661106e611b12565b73ffffffffffffffffffffffffffffffffffffffff16146110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90614175565b60405180910390fd5b6110ce8282613125565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b34600c600082825461110a9190614357565b92505081905550565b61111b61241f565b73ffffffffffffffffffffffffffffffffffffffff16611139611b12565b73ffffffffffffffffffffffffffffffffffffffff161461118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690614175565b60405180910390fd5b61119881611704565b156111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90614195565b60405180910390fd5b6001601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61123b61241f565b73ffffffffffffffffffffffffffffffffffffffff16611259611b12565b73ffffffffffffffffffffffffffffffffffffffff16146112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690614175565b60405180910390fd5b6001601460156101000a81548160ff0219169083151502179055506112d43082613125565b61130130601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125d6565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008061134d611b12565b426040518863ffffffff1660e01b815260040161136f96959493929190613eb7565b6060604051808303818588803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113c19190613a37565b5050506000601460156101000a81548160ff02191690831515021790555050565b600a5481565b6113f061241f565b73ffffffffffffffffffffffffffffffffffffffff1661140e611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90614175565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806115535750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561156157600090506115d7565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c546115b09190614438565b90506012546115be8461175a565b826115c991906143de565b6115d391906143ad565b9150505b919050565b600c5481565b6115ea61241f565b73ffffffffffffffffffffffffffffffffffffffff16611608611b12565b73ffffffffffffffffffffffffffffffffffffffff161461165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590614175565b60405180910390fd5b80518251146116a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169990614075565b60405180910390fd5b60005b82518110156116ff576116ec8382815181106116c4576116c3614651565b5b60200260200101518383815181106116df576116de614651565b5b6020026020010151613125565b80806116f79061457b565b9150506116a5565b505050565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ab61241f565b73ffffffffffffffffffffffffffffffffffffffff166117c9611b12565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614175565b60405180910390fd5b6064811115611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614115565b60405180910390fd5b8060078190555050565b61187561241f565b73ffffffffffffffffffffffffffffffffffffffff16611893611b12565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e090614175565b60405180910390fd5b6118f36000613215565b565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61192361241f565b73ffffffffffffffffffffffffffffffffffffffff16611941611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614175565b60405180910390fd5b8060068190555050565b60075481565b6119af61241f565b73ffffffffffffffffffffffffffffffffffffffff166119cd611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a90614175565b60405180910390fd5b611a2b611b12565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611a70573d6000803e3d6000fd5b50565b600f5481565b611a8161241f565b73ffffffffffffffffffffffffffffffffffffffff16611a9f611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614175565b60405180910390fd5b6001601460166101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60176020528060005260406000206000915090505481565b606060048054611b6390614518565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8f90614518565b8015611bdc5780601f10611bb157610100808354040283529160200191611bdc565b820191906000526020600020905b815481529060010190602001808311611bbf57829003601f168201915b5050505050905090565b611bee61241f565b73ffffffffffffffffffffffffffffffffffffffff16611c0c611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5990614175565b60405180910390fd5b600f54821115611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614135565b60405180910390fd5b611cb2308284612427565b81600f6000828254611cc49190614438565b925050819055505050565b600080611cda61241f565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d97906141d5565b60405180910390fd5b611dad82868684036125d6565b60019250505092915050565b611dc161241f565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90614175565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611e8461241f565b9050611e9181858561282d565b600191505092915050565b611ea461241f565b73ffffffffffffffffffffffffffffffffffffffff16611ec2611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90614175565b60405180910390fd5b80600a8190555050565b611f2a61241f565b73ffffffffffffffffffffffffffffffffffffffff16611f48611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590614175565b60405180910390fd5b6064811115611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990614095565b60405180910390fd5b8060098190555050565b611ff461241f565b73ffffffffffffffffffffffffffffffffffffffff16612012611b12565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f90614175565b60405180910390fd5b61207181611704565b6120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790614195565b60405180910390fd5b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b601460169054906101000a900460ff1681565b60095481565b61213f61241f565b73ffffffffffffffffffffffffffffffffffffffff1661215d611b12565b73ffffffffffffffffffffffffffffffffffffffff16146121b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121aa90614175565b60405180910390fd5b60648111156121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee906140b5565b60405180910390fd5b8060088190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61229061241f565b73ffffffffffffffffffffffffffffffffffffffff166122ae611b12565b73ffffffffffffffffffffffffffffffffffffffff1614612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90614175565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60085481565b61232f61241f565b73ffffffffffffffffffffffffffffffffffffffff1661234d611b12565b73ffffffffffffffffffffffffffffffffffffffff16146123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a90614175565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240a90613fd5565b60405180910390fd5b61241c81613215565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248e90614015565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe90614035565b60405180910390fd5b60006125128461175a565b905081811015612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e906140f5565b60405180910390fd5b61256184836132db565b61256b838361336d565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125c891906141f5565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d906141b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613ff5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161279491906141f5565b60405180910390a3505050565b60006127ad8484612201565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146128275781811015612819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281090614055565b60405180910390fd5b61282684848484036125d6565b5b50505050565b61283683611704565b80612846575061284582611704565b5b1561285b57612856838383612427565b612b55565b60006103e860065461286b610df4565b61287591906143de565b61287f91906143ad565b9050808211158061289c5750601460159054906101000a900460ff165b806128b1575060148054906101000a900460ff165b806129095750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f90613f95565b60405180910390fd5b60006129533061175a565b90506000600a54821015905082821061296a578291505b808015612982575060148054906101000a900460ff16155b80156129dc5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156129f45750600b60009054906101000a900460ff165b15612a0357612a0282612c02565b5b612a0c86612b5a565b612a1585612b5a565b60008490506000806000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161480612ac85750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15612b3657601460169054906101000a900460ff16612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390614155565b60405180910390fd5b612b25886133ff565b809450819550829650839750505050505b612b418a8a86612427565b612b4d8a8383866134c3565b505050505050505b505050565b6000612b65826114a8565b9050600c54601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115612bfe578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612bfc573d6000803e3d6000fd5b505b5050565b60016014806101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612c3957612c38614680565b5b604051908082528060200260200182016040528015612c675781602001602082028036833780820191505090505b5090503081600081518110612c7f57612c7e614651565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5991906137f8565b81600181518110612d6d57612d6c614651565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612dd430601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125d6565b6000479050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401612e3d959493929190614210565b600060405180830381600087803b158015612e5757600080fd5b505af1158015612e6b573d6000803e3d6000fd5b5050505060008147612e7d9190614438565b90506000612eac600d54612e9e600f54600e546135b990919063ffffffff16565b6135b990919063ffffffff16565b90506000612ed782612ec9600e54896135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612f0283612ef4600f548a6135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612f2b82612f1d858b6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b90506000612f5685612f48600e54896135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612f8186612f73600f548a6135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612faa82612f9c858b6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b9050600083111561301f57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561301d573d6000803e3d6000fd5b505b600082111561309257601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613090573d6000803e3d6000fd5b505b6130a786600e546135fb90919063ffffffff16565b600e819055506130c285600f546135fb90919063ffffffff16565b600f819055506130dd84600d546135fb90919063ffffffff16565b600d819055506130f881600c546135b990919063ffffffff16565b600c819055505050505050505050505060006014806101000a81548160ff02191690831515021790555050565b6b033b2e3c9fd0803ce8000000613147826012546135b990919063ffffffff16565b1115613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317f90613f55565b60405180910390fd5b806012600082825461319a9190614357565b925050819055506131ab828261336d565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161320991906141f5565b60405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133269190614438565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133b89190614357565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060008061342d606461341f600954886135cf90919063ffffffff16565b6135e590919063ffffffff16565b92506134576064613449600754886135cf90919063ffffffff16565b6135e590919063ffffffff16565b91506134816064613473600854886135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506134ba816134ac8461349e878a6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b93509193509193565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90613fb5565b60405180910390fd5b600061355a8261354c85876135b990919063ffffffff16565b6135b990919063ffffffff16565b9050613567853083612427565b83600e60008282546135799190614357565b9250508190555082600f60008282546135929190614357565b9250508190555081600d60008282546135ab9190614357565b925050819055505050505050565b600081836135c79190614357565b905092915050565b600081836135dd91906143de565b905092915050565b600081836135f391906143ad565b905092915050565b600081836136099190614438565b905092915050565b600061362461361f846142aa565b614285565b90508083825260208201905082856020860282011115613647576136466146b4565b5b60005b85811015613677578161365d88826136f1565b84526020840193506020830192505060018101905061364a565b5050509392505050565b600061369461368f846142d6565b614285565b905080838252602082019050828560208602820111156136b7576136b66146b4565b5b60005b858110156136e757816136cd88826137a1565b8452602084019350602083019250506001810190506136ba565b5050509392505050565b60008135905061370081614b61565b92915050565b60008151905061371581614b61565b92915050565b60008135905061372a81614b78565b92915050565b600082601f830112613745576137446146af565b5b8135613755848260208601613611565b91505092915050565b600082601f830112613773576137726146af565b5b8135613783848260208601613681565b91505092915050565b60008135905061379b81614b8f565b92915050565b6000813590506137b081614ba6565b92915050565b6000815190506137c581614ba6565b92915050565b6000602082840312156137e1576137e06146be565b5b60006137ef848285016136f1565b91505092915050565b60006020828403121561380e5761380d6146be565b5b600061381c84828501613706565b91505092915050565b60006020828403121561383b5761383a6146be565b5b60006138498482850161371b565b91505092915050565b60008060408385031215613869576138686146be565b5b6000613877858286016136f1565b9250506020613888858286016136f1565b9150509250929050565b6000806000606084860312156138ab576138aa6146be565b5b60006138b9868287016136f1565b93505060206138ca868287016136f1565b92505060406138db868287016137a1565b9150509250925092565b600080604083850312156138fc576138fb6146be565b5b600061390a858286016136f1565b925050602061391b858286016137a1565b9150509250929050565b6000806040838503121561393c5761393b6146be565b5b600083013567ffffffffffffffff81111561395a576139596146b9565b5b61396685828601613730565b925050602083013567ffffffffffffffff811115613987576139866146b9565b5b6139938582860161375e565b9150509250929050565b6000602082840312156139b3576139b26146be565b5b60006139c18482850161378c565b91505092915050565b6000602082840312156139e0576139df6146be565b5b60006139ee848285016137a1565b91505092915050565b60008060408385031215613a0e57613a0d6146be565b5b6000613a1c858286016137a1565b9250506020613a2d858286016136f1565b9150509250929050565b600080600060608486031215613a5057613a4f6146be565b5b6000613a5e868287016137b6565b9350506020613a6f868287016137b6565b9250506040613a80868287016137b6565b9150509250925092565b6000613a968383613ab1565b60208301905092915050565b613aab8161447e565b82525050565b613aba8161446c565b82525050565b613ac98161446c565b82525050565b6000613ada82614312565b613ae48185614335565b9350613aef83614302565b8060005b83811015613b20578151613b078882613a8a565b9750613b1283614328565b925050600181019050613af3565b5085935050505092915050565b613b3681614490565b82525050565b613b45816144d3565b82525050565b6000613b568261431d565b613b608185614346565b9350613b708185602086016144e5565b613b79816146c3565b840191505092915050565b6000613b91601383614346565b9150613b9c826146d4565b602082019050919050565b6000613bb4602c83614346565b9150613bbf826146fd565b604082019050919050565b6000613bd7601e83614346565b9150613be28261474c565b602082019050919050565b6000613bfa601e83614346565b9150613c0582614775565b602082019050919050565b6000613c1d602683614346565b9150613c288261479e565b604082019050919050565b6000613c40602283614346565b9150613c4b826147ed565b604082019050919050565b6000613c63601e83614346565b9150613c6e8261483c565b602082019050919050565b6000613c86601c83614346565b9150613c9182614865565b602082019050919050565b6000613ca9601d83614346565b9150613cb48261488e565b602082019050919050565b6000613ccc601883614346565b9150613cd7826148b7565b602082019050919050565b6000613cef601f83614346565b9150613cfa826148e0565b602082019050919050565b6000613d12602083614346565b9150613d1d82614909565b602082019050919050565b6000613d35602c83614346565b9150613d4082614932565b604082019050919050565b6000613d58601f83614346565b9150613d6382614981565b602082019050919050565b6000613d7b602183614346565b9150613d86826149aa565b604082019050919050565b6000613d9e602b83614346565b9150613da9826149f9565b604082019050919050565b6000613dc1601983614346565b9150613dcc82614a48565b602082019050919050565b6000613de4602083614346565b9150613def82614a71565b602082019050919050565b6000613e07601c83614346565b9150613e1282614a9a565b602082019050919050565b6000613e2a602483614346565b9150613e3582614ac3565b604082019050919050565b6000613e4d602583614346565b9150613e5882614b12565b604082019050919050565b613e6c816144bc565b82525050565b613e7b816144c6565b82525050565b6000602082019050613e966000830184613ac0565b92915050565b6000602082019050613eb16000830184613aa2565b92915050565b600060c082019050613ecc6000830189613ac0565b613ed96020830188613e63565b613ee66040830187613b3c565b613ef36060830186613b3c565b613f006080830185613ac0565b613f0d60a0830184613e63565b979650505050505050565b6000602082019050613f2d6000830184613b2d565b92915050565b60006020820190508181036000830152613f4d8184613b4b565b905092915050565b60006020820190508181036000830152613f6e81613b84565b9050919050565b60006020820190508181036000830152613f8e81613ba7565b9050919050565b60006020820190508181036000830152613fae81613bca565b9050919050565b60006020820190508181036000830152613fce81613bed565b9050919050565b60006020820190508181036000830152613fee81613c10565b9050919050565b6000602082019050818103600083015261400e81613c33565b9050919050565b6000602082019050818103600083015261402e81613c56565b9050919050565b6000602082019050818103600083015261404e81613c79565b9050919050565b6000602082019050818103600083015261406e81613c9c565b9050919050565b6000602082019050818103600083015261408e81613cbf565b9050919050565b600060208201905081810360008301526140ae81613ce2565b9050919050565b600060208201905081810360008301526140ce81613d05565b9050919050565b600060208201905081810360008301526140ee81613d28565b9050919050565b6000602082019050818103600083015261410e81613d4b565b9050919050565b6000602082019050818103600083015261412e81613d6e565b9050919050565b6000602082019050818103600083015261414e81613d91565b9050919050565b6000602082019050818103600083015261416e81613db4565b9050919050565b6000602082019050818103600083015261418e81613dd7565b9050919050565b600060208201905081810360008301526141ae81613dfa565b9050919050565b600060208201905081810360008301526141ce81613e1d565b9050919050565b600060208201905081810360008301526141ee81613e40565b9050919050565b600060208201905061420a6000830184613e63565b92915050565b600060a0820190506142256000830188613e63565b6142326020830187613b3c565b81810360408301526142448186613acf565b90506142536060830185613ac0565b6142606080830184613e63565b9695505050505050565b600060208201905061427f6000830184613e72565b92915050565b600061428f6142a0565b905061429b828261454a565b919050565b6000604051905090565b600067ffffffffffffffff8211156142c5576142c4614680565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142f1576142f0614680565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614362826144bc565b915061436d836144bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143a2576143a16145c4565b5b828201905092915050565b60006143b8826144bc565b91506143c3836144bc565b9250826143d3576143d26145f3565b5b828204905092915050565b60006143e9826144bc565b91506143f4836144bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561442d5761442c6145c4565b5b828202905092915050565b6000614443826144bc565b915061444e836144bc565b925082821015614461576144606145c4565b5b828203905092915050565b60006144778261449c565b9050919050565b60006144898261449c565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144de826144bc565b9050919050565b60005b838110156145035780820151818401526020810190506144e8565b83811115614512576000848401525b50505050565b6000600282049050600182168061453057607f821691505b6020821081141561454457614543614622565b5b50919050565b614553826146c3565b810181811067ffffffffffffffff8211171561457257614571614680565b5b80604052505050565b6000614586826144bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145b9576145b86145c4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5265666c65637465640000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178207472616e73616374696f6e20616d6f756e740000600082015250565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f6172726179206c656e67746873206d757374206d617463680000000000000000600082015250565b7f5f7265666c656374526174652063616e6e6f7420657863656564203130302500600082015250565b7f5f7472656173757279526174652063616e6e6f74206578636565642031303025600082015250565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c4d61726b6574696e670000000000000000000000000000000000000000602082015250565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b7f5f6d61726b6574696e67526174652063616e6e6f74206578636565642031303060008201527f2500000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5472656173757279000000000000000000000000000000000000000000602082015250565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4163636f756e74206d757374206e6f74206265206578636c7564656400000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b614b6a8161446c565b8114614b7557600080fd5b50565b614b818161447e565b8114614b8c57600080fd5b50565b614b9881614490565b8114614ba357600080fd5b50565b614baf816144bc565b8114614bba57600080fd5b5056fea26469706673582212206bd688adb90a4eb1c6c6f30c880c0e854f96241f024fd42bb420c44a452d056664736f6c634300080700330000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000ef94a60e76eb00296e81515f20da7763340f4a330000000000000000000000009eceb5702048589b4e0482b46c687a2dd4b9d9d5

Deployed Bytecode

0x6080604052600436106103035760003560e01c8063712eb85911610190578063a8602fea116100dc578063bbc0c74211610095578063dd62ed3e1161006f578063dd62ed3e14610afd578063e3f9fc6314610b3a578063e4b7251614610b63578063f2fde38b14610b8e5761030a565b8063bbc0c74214610a7e578063be30877f14610aa9578063d0bf9c5414610ad45761030a565b8063a8602fea14610972578063a9059cbb1461099b578063b0ac1571146109d8578063b1284d3414610a01578063b41356c914610a2a578063b9ccf21d14610a535761030a565b8063897534a9116101495780639579d514116101235780639579d514146108a457806395d89b41146108e15780639ec09e1e1461090c578063a457c2d7146109355761030a565b8063897534a9146108375780638a8c523c146108625780638da5cb5b146108795761030a565b8063712eb85914610761578063715018a61461078a57806375f0a874146107a157806377348de9146107cc578063838a676f146107f5578063853828b6146108205761030a565b80633e9ffbea1161024f5780635b78f35f1161020857806361db2446116101e257806361db24461461069357806367243482146106be57806369ec8e9c146106e757806370a08231146107245761030a565b80635b78f35f146106025780635d098b381461062d5780635facf12e146106565761030a565b80633e9ffbea1461054857806340c10f191461055f5780634626402b146105885780634e6be544146105b35780634fb0b7e7146105bd57806351c6590a146105e65761030a565b806323b872dd116102bc5780633732e214116102965780633732e214146104a057806337563293146104cb57806339509351146104e25780633daacfef1461051f5761030a565b806323b872dd1461040d578063313ce5671461044a57806332cb6b0c146104755761030a565b80630126ec501461030f57806306fdde0314610338578063095ea7b3146103635780631233d83a146103a057806317700f01146103cb57806318160ddd146103e25761030a565b3661030a57005b600080fd5b34801561031b57600080fd5b50610336600480360381019061033191906139f7565b610bb7565b005b34801561034457600080fd5b5061034d610ca0565b60405161035a9190613f33565b60405180910390f35b34801561036f57600080fd5b5061038a600480360381019061038591906138e5565b610d32565b6040516103979190613f18565b60405180910390f35b3480156103ac57600080fd5b506103b5610d55565b6040516103c291906141f5565b60405180910390f35b3480156103d757600080fd5b506103e0610d5b565b005b3480156103ee57600080fd5b506103f7610df4565b60405161040491906141f5565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613892565b610dfe565b6040516104419190613f18565b60405180910390f35b34801561045657600080fd5b5061045f610e2d565b60405161046c919061426a565b60405180910390f35b34801561048157600080fd5b5061048a610e36565b60405161049791906141f5565b60405180910390f35b3480156104ac57600080fd5b506104b5610e46565b6040516104c291906141f5565b60405180910390f35b3480156104d757600080fd5b506104e0610e4c565b005b3480156104ee57600080fd5b50610509600480360381019061050491906138e5565b610e57565b6040516105169190613f18565b60405180910390f35b34801561052b57600080fd5b50610546600480360381019061054191906139f7565b610f01565b005b34801561055457600080fd5b5061055d610fea565b005b34801561056b57600080fd5b50610586600480360381019061058191906138e5565b611048565b005b34801561059457600080fd5b5061059d6110d2565b6040516105aa9190613e9c565b60405180910390f35b6105bb6110f8565b005b3480156105c957600080fd5b506105e460048036038101906105df91906137cb565b611113565b005b61060060048036038101906105fb91906139ca565b611233565b005b34801561060e57600080fd5b506106176113e2565b60405161062491906141f5565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f9190613825565b6113e8565b005b34801561066257600080fd5b5061067d600480360381019061067891906137cb565b6114a8565b60405161068a91906141f5565b60405180910390f35b34801561069f57600080fd5b506106a86115dc565b6040516106b591906141f5565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190613925565b6115e2565b005b3480156106f357600080fd5b5061070e600480360381019061070991906137cb565b611704565b60405161071b9190613f18565b60405180910390f35b34801561073057600080fd5b5061074b600480360381019061074691906137cb565b61175a565b60405161075891906141f5565b60405180910390f35b34801561076d57600080fd5b50610788600480360381019061078391906139ca565b6117a3565b005b34801561079657600080fd5b5061079f61186d565b005b3480156107ad57600080fd5b506107b66118f5565b6040516107c39190613e9c565b60405180910390f35b3480156107d857600080fd5b506107f360048036038101906107ee91906139ca565b61191b565b005b34801561080157600080fd5b5061080a6119a1565b60405161081791906141f5565b60405180910390f35b34801561082c57600080fd5b506108356119a7565b005b34801561084357600080fd5b5061084c611a73565b60405161085991906141f5565b60405180910390f35b34801561086e57600080fd5b50610877611a79565b005b34801561088557600080fd5b5061088e611b12565b60405161089b9190613e81565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906137cb565b611b3c565b6040516108d891906141f5565b60405180910390f35b3480156108ed57600080fd5b506108f6611b54565b6040516109039190613f33565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e91906139f7565b611be6565b005b34801561094157600080fd5b5061095c600480360381019061095791906138e5565b611ccf565b6040516109699190613f18565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613825565b611db9565b005b3480156109a757600080fd5b506109c260048036038101906109bd91906138e5565b611e79565b6040516109cf9190613f18565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa91906139ca565b611e9c565b005b348015610a0d57600080fd5b50610a286004803603810190610a2391906139ca565b611f22565b005b348015610a3657600080fd5b50610a516004803603810190610a4c91906137cb565b611fec565b005b348015610a5f57600080fd5b50610a6861210b565b604051610a759190613f18565b60405180910390f35b348015610a8a57600080fd5b50610a9361211e565b604051610aa09190613f18565b60405180910390f35b348015610ab557600080fd5b50610abe612131565b604051610acb91906141f5565b60405180910390f35b348015610ae057600080fd5b50610afb6004803603810190610af691906139ca565b612137565b005b348015610b0957600080fd5b50610b246004803603810190610b1f9190613852565b612201565b604051610b3191906141f5565b60405180910390f35b348015610b4657600080fd5b50610b616004803603810190610b5c919061399d565b612288565b005b348015610b6f57600080fd5b50610b78612321565b604051610b8591906141f5565b60405180910390f35b348015610b9a57600080fd5b50610bb56004803603810190610bb091906137cb565b612327565b005b610bbf61241f565b73ffffffffffffffffffffffffffffffffffffffff16610bdd611b12565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90614175565b60405180910390fd5b600d54821115610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f90613f75565b60405180910390fd5b610c83308284612427565b81600d6000828254610c959190614438565b925050819055505050565b606060038054610caf90614518565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdb90614518565b8015610d285780601f10610cfd57610100808354040283529160200191610d28565b820191906000526020600020905b815481529060010190602001808311610d0b57829003601f168201915b5050505050905090565b600080610d3d61241f565b9050610d4a8185856125d6565b600191505092915050565b600e5481565b610d6361241f565b73ffffffffffffffffffffffffffffffffffffffff16610d81611b12565b73ffffffffffffffffffffffffffffffffffffffff1614610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90614175565b60405180910390fd5b6000601460166101000a81548160ff021916908315150217905550565b6000601254905090565b600080610e0961241f565b9050610e168582856127a1565b610e2185858561282d565b60019150509392505050565b60006012905090565b6b033b2e3c9fd0803ce800000081565b600d5481565b610e5533612b5a565b565b600080610e6261241f565b9050610ef6818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef19190614357565b6125d6565b600191505092915050565b610f0961241f565b73ffffffffffffffffffffffffffffffffffffffff16610f27611b12565b73ffffffffffffffffffffffffffffffffffffffff1614610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614175565b60405180910390fd5b600e54821115610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb9906140d5565b60405180910390fd5b610fcd308284612427565b81600e6000828254610fdf9190614438565b925050819055505050565b60006103e8600654610ffa610df4565b61100491906143de565b61100e91906143ad565b9050600061101b3061175a565b9050818110611028578190505b60148054906101000a900460ff166110445761104381612c02565b5b5050565b61105061241f565b73ffffffffffffffffffffffffffffffffffffffff1661106e611b12565b73ffffffffffffffffffffffffffffffffffffffff16146110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90614175565b60405180910390fd5b6110ce8282613125565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b34600c600082825461110a9190614357565b92505081905550565b61111b61241f565b73ffffffffffffffffffffffffffffffffffffffff16611139611b12565b73ffffffffffffffffffffffffffffffffffffffff161461118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690614175565b60405180910390fd5b61119881611704565b156111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90614195565b60405180910390fd5b6001601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61123b61241f565b73ffffffffffffffffffffffffffffffffffffffff16611259611b12565b73ffffffffffffffffffffffffffffffffffffffff16146112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690614175565b60405180910390fd5b6001601460156101000a81548160ff0219169083151502179055506112d43082613125565b61130130601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125d6565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008061134d611b12565b426040518863ffffffff1660e01b815260040161136f96959493929190613eb7565b6060604051808303818588803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113c19190613a37565b5050506000601460156101000a81548160ff02191690831515021790555050565b600a5481565b6113f061241f565b73ffffffffffffffffffffffffffffffffffffffff1661140e611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90614175565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806115535750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561156157600090506115d7565b6000601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c546115b09190614438565b90506012546115be8461175a565b826115c991906143de565b6115d391906143ad565b9150505b919050565b600c5481565b6115ea61241f565b73ffffffffffffffffffffffffffffffffffffffff16611608611b12565b73ffffffffffffffffffffffffffffffffffffffff161461165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590614175565b60405180910390fd5b80518251146116a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169990614075565b60405180910390fd5b60005b82518110156116ff576116ec8382815181106116c4576116c3614651565b5b60200260200101518383815181106116df576116de614651565b5b6020026020010151613125565b80806116f79061457b565b9150506116a5565b505050565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ab61241f565b73ffffffffffffffffffffffffffffffffffffffff166117c9611b12565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614175565b60405180910390fd5b6064811115611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90614115565b60405180910390fd5b8060078190555050565b61187561241f565b73ffffffffffffffffffffffffffffffffffffffff16611893611b12565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e090614175565b60405180910390fd5b6118f36000613215565b565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61192361241f565b73ffffffffffffffffffffffffffffffffffffffff16611941611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614175565b60405180910390fd5b8060068190555050565b60075481565b6119af61241f565b73ffffffffffffffffffffffffffffffffffffffff166119cd611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a90614175565b60405180910390fd5b611a2b611b12565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611a70573d6000803e3d6000fd5b50565b600f5481565b611a8161241f565b73ffffffffffffffffffffffffffffffffffffffff16611a9f611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614175565b60405180910390fd5b6001601460166101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60176020528060005260406000206000915090505481565b606060048054611b6390614518565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8f90614518565b8015611bdc5780601f10611bb157610100808354040283529160200191611bdc565b820191906000526020600020905b815481529060010190602001808311611bbf57829003601f168201915b5050505050905090565b611bee61241f565b73ffffffffffffffffffffffffffffffffffffffff16611c0c611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5990614175565b60405180910390fd5b600f54821115611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614135565b60405180910390fd5b611cb2308284612427565b81600f6000828254611cc49190614438565b925050819055505050565b600080611cda61241f565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d97906141d5565b60405180910390fd5b611dad82868684036125d6565b60019250505092915050565b611dc161241f565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90614175565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611e8461241f565b9050611e9181858561282d565b600191505092915050565b611ea461241f565b73ffffffffffffffffffffffffffffffffffffffff16611ec2611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90614175565b60405180910390fd5b80600a8190555050565b611f2a61241f565b73ffffffffffffffffffffffffffffffffffffffff16611f48611b12565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590614175565b60405180910390fd5b6064811115611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990614095565b60405180910390fd5b8060098190555050565b611ff461241f565b73ffffffffffffffffffffffffffffffffffffffff16612012611b12565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f90614175565b60405180910390fd5b61207181611704565b6120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790614195565b60405180910390fd5b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b601460169054906101000a900460ff1681565b60095481565b61213f61241f565b73ffffffffffffffffffffffffffffffffffffffff1661215d611b12565b73ffffffffffffffffffffffffffffffffffffffff16146121b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121aa90614175565b60405180910390fd5b60648111156121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee906140b5565b60405180910390fd5b8060088190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61229061241f565b73ffffffffffffffffffffffffffffffffffffffff166122ae611b12565b73ffffffffffffffffffffffffffffffffffffffff1614612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90614175565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60085481565b61232f61241f565b73ffffffffffffffffffffffffffffffffffffffff1661234d611b12565b73ffffffffffffffffffffffffffffffffffffffff16146123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a90614175565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240a90613fd5565b60405180910390fd5b61241c81613215565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248e90614015565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe90614035565b60405180910390fd5b60006125128461175a565b905081811015612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e906140f5565b60405180910390fd5b61256184836132db565b61256b838361336d565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125c891906141f5565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d906141b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90613ff5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161279491906141f5565b60405180910390a3505050565b60006127ad8484612201565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146128275781811015612819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281090614055565b60405180910390fd5b61282684848484036125d6565b5b50505050565b61283683611704565b80612846575061284582611704565b5b1561285b57612856838383612427565b612b55565b60006103e860065461286b610df4565b61287591906143de565b61287f91906143ad565b9050808211158061289c5750601460159054906101000a900460ff165b806128b1575060148054906101000a900460ff165b806129095750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f90613f95565b60405180910390fd5b60006129533061175a565b90506000600a54821015905082821061296a578291505b808015612982575060148054906101000a900460ff16155b80156129dc5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156129f45750600b60009054906101000a900460ff165b15612a0357612a0282612c02565b5b612a0c86612b5a565b612a1585612b5a565b60008490506000806000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161480612ac85750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15612b3657601460169054906101000a900460ff16612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390614155565b60405180910390fd5b612b25886133ff565b809450819550829650839750505050505b612b418a8a86612427565b612b4d8a8383866134c3565b505050505050505b505050565b6000612b65826114a8565b9050600c54601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115612bfe578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612bfc573d6000803e3d6000fd5b505b5050565b60016014806101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612c3957612c38614680565b5b604051908082528060200260200182016040528015612c675781602001602082028036833780820191505090505b5090503081600081518110612c7f57612c7e614651565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612d2157600080fd5b505afa158015612d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5991906137f8565b81600181518110612d6d57612d6c614651565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612dd430601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125d6565b6000479050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401612e3d959493929190614210565b600060405180830381600087803b158015612e5757600080fd5b505af1158015612e6b573d6000803e3d6000fd5b5050505060008147612e7d9190614438565b90506000612eac600d54612e9e600f54600e546135b990919063ffffffff16565b6135b990919063ffffffff16565b90506000612ed782612ec9600e54896135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612f0283612ef4600f548a6135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612f2b82612f1d858b6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b90506000612f5685612f48600e54896135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612f8186612f73600f548a6135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506000612faa82612f9c858b6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b9050600083111561301f57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561301d573d6000803e3d6000fd5b505b600082111561309257601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613090573d6000803e3d6000fd5b505b6130a786600e546135fb90919063ffffffff16565b600e819055506130c285600f546135fb90919063ffffffff16565b600f819055506130dd84600d546135fb90919063ffffffff16565b600d819055506130f881600c546135b990919063ffffffff16565b600c819055505050505050505050505060006014806101000a81548160ff02191690831515021790555050565b6b033b2e3c9fd0803ce8000000613147826012546135b990919063ffffffff16565b1115613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317f90613f55565b60405180910390fd5b806012600082825461319a9190614357565b925050819055506131ab828261336d565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161320991906141f5565b60405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133269190614438565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133b89190614357565b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060008061342d606461341f600954886135cf90919063ffffffff16565b6135e590919063ffffffff16565b92506134576064613449600754886135cf90919063ffffffff16565b6135e590919063ffffffff16565b91506134816064613473600854886135cf90919063ffffffff16565b6135e590919063ffffffff16565b90506134ba816134ac8461349e878a6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b6135fb90919063ffffffff16565b93509193509193565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90613fb5565b60405180910390fd5b600061355a8261354c85876135b990919063ffffffff16565b6135b990919063ffffffff16565b9050613567853083612427565b83600e60008282546135799190614357565b9250508190555082600f60008282546135929190614357565b9250508190555081600d60008282546135ab9190614357565b925050819055505050505050565b600081836135c79190614357565b905092915050565b600081836135dd91906143de565b905092915050565b600081836135f391906143ad565b905092915050565b600081836136099190614438565b905092915050565b600061362461361f846142aa565b614285565b90508083825260208201905082856020860282011115613647576136466146b4565b5b60005b85811015613677578161365d88826136f1565b84526020840193506020830192505060018101905061364a565b5050509392505050565b600061369461368f846142d6565b614285565b905080838252602082019050828560208602820111156136b7576136b66146b4565b5b60005b858110156136e757816136cd88826137a1565b8452602084019350602083019250506001810190506136ba565b5050509392505050565b60008135905061370081614b61565b92915050565b60008151905061371581614b61565b92915050565b60008135905061372a81614b78565b92915050565b600082601f830112613745576137446146af565b5b8135613755848260208601613611565b91505092915050565b600082601f830112613773576137726146af565b5b8135613783848260208601613681565b91505092915050565b60008135905061379b81614b8f565b92915050565b6000813590506137b081614ba6565b92915050565b6000815190506137c581614ba6565b92915050565b6000602082840312156137e1576137e06146be565b5b60006137ef848285016136f1565b91505092915050565b60006020828403121561380e5761380d6146be565b5b600061381c84828501613706565b91505092915050565b60006020828403121561383b5761383a6146be565b5b60006138498482850161371b565b91505092915050565b60008060408385031215613869576138686146be565b5b6000613877858286016136f1565b9250506020613888858286016136f1565b9150509250929050565b6000806000606084860312156138ab576138aa6146be565b5b60006138b9868287016136f1565b93505060206138ca868287016136f1565b92505060406138db868287016137a1565b9150509250925092565b600080604083850312156138fc576138fb6146be565b5b600061390a858286016136f1565b925050602061391b858286016137a1565b9150509250929050565b6000806040838503121561393c5761393b6146be565b5b600083013567ffffffffffffffff81111561395a576139596146b9565b5b61396685828601613730565b925050602083013567ffffffffffffffff811115613987576139866146b9565b5b6139938582860161375e565b9150509250929050565b6000602082840312156139b3576139b26146be565b5b60006139c18482850161378c565b91505092915050565b6000602082840312156139e0576139df6146be565b5b60006139ee848285016137a1565b91505092915050565b60008060408385031215613a0e57613a0d6146be565b5b6000613a1c858286016137a1565b9250506020613a2d858286016136f1565b9150509250929050565b600080600060608486031215613a5057613a4f6146be565b5b6000613a5e868287016137b6565b9350506020613a6f868287016137b6565b9250506040613a80868287016137b6565b9150509250925092565b6000613a968383613ab1565b60208301905092915050565b613aab8161447e565b82525050565b613aba8161446c565b82525050565b613ac98161446c565b82525050565b6000613ada82614312565b613ae48185614335565b9350613aef83614302565b8060005b83811015613b20578151613b078882613a8a565b9750613b1283614328565b925050600181019050613af3565b5085935050505092915050565b613b3681614490565b82525050565b613b45816144d3565b82525050565b6000613b568261431d565b613b608185614346565b9350613b708185602086016144e5565b613b79816146c3565b840191505092915050565b6000613b91601383614346565b9150613b9c826146d4565b602082019050919050565b6000613bb4602c83614346565b9150613bbf826146fd565b604082019050919050565b6000613bd7601e83614346565b9150613be28261474c565b602082019050919050565b6000613bfa601e83614346565b9150613c0582614775565b602082019050919050565b6000613c1d602683614346565b9150613c288261479e565b604082019050919050565b6000613c40602283614346565b9150613c4b826147ed565b604082019050919050565b6000613c63601e83614346565b9150613c6e8261483c565b602082019050919050565b6000613c86601c83614346565b9150613c9182614865565b602082019050919050565b6000613ca9601d83614346565b9150613cb48261488e565b602082019050919050565b6000613ccc601883614346565b9150613cd7826148b7565b602082019050919050565b6000613cef601f83614346565b9150613cfa826148e0565b602082019050919050565b6000613d12602083614346565b9150613d1d82614909565b602082019050919050565b6000613d35602c83614346565b9150613d4082614932565b604082019050919050565b6000613d58601f83614346565b9150613d6382614981565b602082019050919050565b6000613d7b602183614346565b9150613d86826149aa565b604082019050919050565b6000613d9e602b83614346565b9150613da9826149f9565b604082019050919050565b6000613dc1601983614346565b9150613dcc82614a48565b602082019050919050565b6000613de4602083614346565b9150613def82614a71565b602082019050919050565b6000613e07601c83614346565b9150613e1282614a9a565b602082019050919050565b6000613e2a602483614346565b9150613e3582614ac3565b604082019050919050565b6000613e4d602583614346565b9150613e5882614b12565b604082019050919050565b613e6c816144bc565b82525050565b613e7b816144c6565b82525050565b6000602082019050613e966000830184613ac0565b92915050565b6000602082019050613eb16000830184613aa2565b92915050565b600060c082019050613ecc6000830189613ac0565b613ed96020830188613e63565b613ee66040830187613b3c565b613ef36060830186613b3c565b613f006080830185613ac0565b613f0d60a0830184613e63565b979650505050505050565b6000602082019050613f2d6000830184613b2d565b92915050565b60006020820190508181036000830152613f4d8184613b4b565b905092915050565b60006020820190508181036000830152613f6e81613b84565b9050919050565b60006020820190508181036000830152613f8e81613ba7565b9050919050565b60006020820190508181036000830152613fae81613bca565b9050919050565b60006020820190508181036000830152613fce81613bed565b9050919050565b60006020820190508181036000830152613fee81613c10565b9050919050565b6000602082019050818103600083015261400e81613c33565b9050919050565b6000602082019050818103600083015261402e81613c56565b9050919050565b6000602082019050818103600083015261404e81613c79565b9050919050565b6000602082019050818103600083015261406e81613c9c565b9050919050565b6000602082019050818103600083015261408e81613cbf565b9050919050565b600060208201905081810360008301526140ae81613ce2565b9050919050565b600060208201905081810360008301526140ce81613d05565b9050919050565b600060208201905081810360008301526140ee81613d28565b9050919050565b6000602082019050818103600083015261410e81613d4b565b9050919050565b6000602082019050818103600083015261412e81613d6e565b9050919050565b6000602082019050818103600083015261414e81613d91565b9050919050565b6000602082019050818103600083015261416e81613db4565b9050919050565b6000602082019050818103600083015261418e81613dd7565b9050919050565b600060208201905081810360008301526141ae81613dfa565b9050919050565b600060208201905081810360008301526141ce81613e1d565b9050919050565b600060208201905081810360008301526141ee81613e40565b9050919050565b600060208201905061420a6000830184613e63565b92915050565b600060a0820190506142256000830188613e63565b6142326020830187613b3c565b81810360408301526142448186613acf565b90506142536060830185613ac0565b6142606080830184613e63565b9695505050505050565b600060208201905061427f6000830184613e72565b92915050565b600061428f6142a0565b905061429b828261454a565b919050565b6000604051905090565b600067ffffffffffffffff8211156142c5576142c4614680565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142f1576142f0614680565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614362826144bc565b915061436d836144bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143a2576143a16145c4565b5b828201905092915050565b60006143b8826144bc565b91506143c3836144bc565b9250826143d3576143d26145f3565b5b828204905092915050565b60006143e9826144bc565b91506143f4836144bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561442d5761442c6145c4565b5b828202905092915050565b6000614443826144bc565b915061444e836144bc565b925082821015614461576144606145c4565b5b828203905092915050565b60006144778261449c565b9050919050565b60006144898261449c565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144de826144bc565b9050919050565b60005b838110156145035780820151818401526020810190506144e8565b83811115614512576000848401525b50505050565b6000600282049050600182168061453057607f821691505b6020821081141561454457614543614622565b5b50919050565b614553826146c3565b810181811067ffffffffffffffff8211171561457257614571614680565b5b80604052505050565b6000614586826144bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145b9576145b86145c4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5265666c65637465640000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178207472616e73616374696f6e20616d6f756e740000600082015250565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f6172726179206c656e67746873206d757374206d617463680000000000000000600082015250565b7f5f7265666c656374526174652063616e6e6f7420657863656564203130302500600082015250565b7f5f7472656173757279526174652063616e6e6f74206578636565642031303025600082015250565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c4d61726b6574696e670000000000000000000000000000000000000000602082015250565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b7f5f6d61726b6574696e67526174652063616e6e6f74206578636565642031303060008201527f2500000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5472656173757279000000000000000000000000000000000000000000602082015250565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4163636f756e74206d757374206e6f74206265206578636c7564656400000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b614b6a8161446c565b8114614b7557600080fd5b50565b614b818161447e565b8114614b8c57600080fd5b50565b614b9881614490565b8114614ba357600080fd5b50565b614baf816144bc565b8114614bba57600080fd5b5056fea26469706673582212206bd688adb90a4eb1c6c6f30c880c0e854f96241f024fd42bb420c44a452d056664736f6c63430008070033

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

0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000ef94a60e76eb00296e81515f20da7763340f4a330000000000000000000000009eceb5702048589b4e0482b46c687a2dd4b9d9d5

-----Decoded View---------------
Arg [0] : _uniswapFactory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
Arg [1] : _uniswapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _marketingWallet (address): 0xef94A60e76EB00296E81515f20da7763340f4a33
Arg [3] : _treasuryWallet (address): 0x9Eceb5702048589b4e0482B46c687a2Dd4b9d9d5

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000ef94a60e76eb00296e81515f20da7763340f4a33
Arg [3] : 0000000000000000000000009eceb5702048589b4e0482b46c687a2dd4b9d9d5


Deployed Bytecode Sourcemap

103397:15332:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108479:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24392:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26743:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104178:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109401:85;;;;;;;;;;;;;:::i;:::-;;117881:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27524:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25354:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103685:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104142:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112770:92;;;;;;;;;;;;;:::i;:::-;;28228:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107459:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114731:396;;;;;;;;;;;;;:::i;:::-;;118277:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104296:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109494:92;;;:::i;:::-;;109716:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108773:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103979:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105635:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;112093:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104102:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118394:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109594:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110105:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106154:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17815:103;;;;;;;;;;;;;:::i;:::-;;104251:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117516:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103790:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115135:111;;;;;;;;;;;;;:::i;:::-;;104214:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109265:83;;;;;;;;;;;;;:::i;:::-;;17164:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104712:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24611:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107970:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28971:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105909:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26016:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107104:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106767:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109908:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104033:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104566:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103867:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106462:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26272:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117776:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103829:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18073:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108479:286;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;108599:14:::1;;108588:7;:25;;108580:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;108673:48;108694:4;108701:10;108713:7;108673:12;:48::i;:::-;108750:7;108732:14;;:25;;;;;;;:::i;:::-;;;;;;;;108479:286:::0;;:::o;24392:100::-;24446:13;24479:5;24472:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24392:100;:::o;26743:201::-;26826:4;26843:13;26859:12;:10;:12::i;:::-;26843:28;;26882:32;26891:5;26898:7;26907:6;26882:8;:32::i;:::-;26932:4;26925:11;;;26743:201;;;;:::o;104178:29::-;;;;:::o;109401:85::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;109473:5:::1;109457:13;;:21;;;;;;;;;;;;;;;;;;109401:85::o:0;117881:100::-;117934:7;117961:12;;117954:19;;117881:100;:::o;27524:295::-;27655:4;27672:15;27690:12;:10;:12::i;:::-;27672:30;;27713:38;27729:4;27735:7;27744:6;27713:15;:38::i;:::-;27762:27;27772:4;27778:2;27782:6;27762:9;:27::i;:::-;27807:4;27800:11;;;27524:295;;;;;:::o;25354:93::-;25412:5;25437:2;25430:9;;25354:93;:::o;103685:56::-;103722:19;103685:56;:::o;104142:29::-;;;;:::o;112770:92::-;112817:37;112842:10;112817:16;:37::i;:::-;112770:92::o;28228:240::-;28316:4;28333:13;28349:12;:10;:12::i;:::-;28333:28;;28372:66;28381:5;28388:7;28427:10;28397:11;:18;28409:5;28397:18;;;;;;;;;;;;;;;:27;28416:7;28397:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;28372:8;:66::i;:::-;28456:4;28449:11;;;28228:240;;;;:::o;107459:285::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;107578:14:::1;;107567:7;:25;;107559:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;107652:48;107673:4;107680:10;107692:7;107652:12;:48::i;:::-;107729:7;107711:14;;:25;;;;;;;:::i;:::-;;;;;;;;107459:285:::0;;:::o;114731:396::-;114770:19;114823:4;114808:12;;114792:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:35;;;;:::i;:::-;114770:57;;114838:28;114869:24;114887:4;114869:9;:24::i;:::-;114838:55;;114933:11;114909:20;:35;114906:110;;114993:11;114970:34;;114906:110;115047:7;;;;;;;;;;115028:92;;115081:27;115087:20;115081:5;:27::i;:::-;115028:92;114759:368;;114731:396::o;118277:109::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;118356:22:::1;118362:7;118371:6;118356:5;:22::i;:::-;118277:109:::0;;:::o;104296:37::-;;;;;;;;;;;;;:::o;109494:92::-;109569:9;109547:18;;:31;;;;;;;:::i;:::-;;;;;;;;109494:92::o;109716:184::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;109796:22:::1;109810:7;109796:13;:22::i;:::-;109795:23;109787:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;109888:4;109864:12;:21;109877:7;109864:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;109716:184:::0;:::o;108773:440::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;103619:4:::1;103601:15;;:22;;;;;;;;;;;;;;;;;;108864:28:::2;108878:4;108885:6;108864:5;:28::i;:::-;108903:49;108920:4;108935:7;;;;;;;;;;;108945:6;108903:8;:49::i;:::-;108965:7;;;;;;;;;;;:23;;;108996:9;109029:4;109049:6;109070:1;109086::::0;109102:7:::2;:5;:7::i;:::-;109179:15;108965:240;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;103664:5:::1;103646:15;;:23;;;;;;;;;;;;;;;;;;108773:440:::0;:::o;103979:47::-;;;;:::o;105635:136::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;105747:16:::1;105729:15;;:34;;;;;;;;;;;;;;;;;;105635:136:::0;:::o;112093:298::-;112157:7;112189:5;;;;;;;;;;;112181:13;;:4;:13;;;:41;;;;112214:7;;;;;;;;;;;112198:24;;:4;:24;;;112181:41;112177:55;;;112231:1;112224:8;;;;112177:55;112245:23;112292:19;:25;112312:4;112292:25;;;;;;;;;;;;;;;;112271:18;;:46;;;;:::i;:::-;112245:72;;112371:12;;112353:15;112363:4;112353:9;:15::i;:::-;112335;:33;;;;:::i;:::-;:48;;;;:::i;:::-;112328:55;;;112093:298;;;;:::o;104102:33::-;;;;:::o;118394:295::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;118523:7:::1;:14;118504:8;:15;:33;118496:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;118584:9;118579:103;118603:8;:15;118599:1;:19;118579:103;;;118640:30;118646:8;118655:1;118646:11;;;;;;;;:::i;:::-;;;;;;;;118659:7;118667:1;118659:10;;;;;;;;:::i;:::-;;;;;;;;118640:5;:30::i;:::-;118620:3;;;;;:::i;:::-;;;;118579:103;;;;118394:295:::0;;:::o;109594:114::-;109655:4;109679:12;:21;109692:7;109679:21;;;;;;;;;;;;;;;;;;;;;;;;;109672:28;;109594:114;;;:::o;110105:157::-;110204:7;110236:9;:18;110246:7;110236:18;;;;;;;;;;;;;;;;110229:25;;110105:157;;;:::o;106154:198::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;106262:3:::1;106244:14;:21;;106236:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;106330:14;106314:13;:30;;;;106154:198:::0;:::o;17815:103::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17880:30:::1;17907:1;17880:18;:30::i;:::-;17815:103::o:0;104251:38::-;;;;;;;;;;;;;:::o;117516:111::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;117608:11:::1;117593:12;:26;;;;117516:111:::0;:::o;103790:32::-;;;;:::o;115135:111::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;115198:7:::1;:5;:7::i;:::-;115190:25;;:48;115216:21;115190:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;115135:111::o:0;104214:28::-;;;;:::o;109265:83::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;109336:4:::1;109320:13;;:20;;;;;;;;;;;;;;;;;;109265:83::o:0;17164:87::-;17210:7;17237:6;;;;;;;;;;;17230:13;;17164:87;:::o;104712:54::-;;;;;;;;;;;;;;;;;:::o;24611:104::-;24667:13;24700:7;24693:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24611:104;:::o;107970:281::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;108088:13:::1;;108077:7;:24;;108069:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;108160:48;108181:4;108188:10;108200:7;108160:12;:48::i;:::-;108236:7;108219:13;;:24;;;;;;;:::i;:::-;;;;;;;;107970:281:::0;;:::o;28971:426::-;29064:4;29081:13;29097:12;:10;:12::i;:::-;29081:28;;29120:24;29147:11;:18;29159:5;29147:18;;;;;;;;;;;;;;;:27;29166:7;29147:27;;;;;;;;;;;;;;;;29120:54;;29213:15;29193:16;:35;;29185:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29298:60;29307:5;29314:7;29342:15;29323:16;:34;29298:8;:60::i;:::-;29385:4;29378:11;;;;28971:426;;;;:::o;105909:132::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;106018:15:::1;106001:14;;:32;;;;;;;;;;;;;;;;;;105909:132:::0;:::o;26016:193::-;26095:4;26112:13;26128:12;:10;:12::i;:::-;26112:28;;26151;26161:5;26168:2;26172:6;26151:9;:28::i;:::-;26197:4;26190:11;;;26016:193;;;;:::o;107104:128::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;107208:16:::1;107190:15;:34;;;;107104:128:::0;:::o;106767:186::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;106869:3:::1;106853:12;:19;;106845:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;106933:12;106919:11;:26;;;;106767:186:::0;:::o;109908:189::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;109992:22:::1;110006:7;109992:13;:22::i;:::-;109984:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;110084:5;110060:12;:21;110073:7;110060:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;109908:189:::0;:::o;104033:27::-;;;;;;;;;;;;;:::o;104566:33::-;;;;;;;;;;;;;:::o;103867:30::-;;;;:::o;106462:192::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;106567:3:::1;106550:13;:20;;106542:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;106633:13;106618:12;:28;;;;106462:192:::0;:::o;26272:151::-;26361:7;26388:11;:18;26400:5;26388:18;;;;;;;;;;;;;;;:27;26407:7;26388:27;;;;;;;;;;;;;;;;26381:34;;26272:151;;;;:::o;117776:97::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;117856:9:::1;117845:8;;:20;;;;;;;;;;;;;;;;;;117776:97:::0;:::o;103829:31::-;;;;:::o;18073:201::-;17395:12;:10;:12::i;:::-;17384:23;;:7;:5;:7::i;:::-;:23;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18182:1:::1;18162:22;;:8;:22;;;;18154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18238:28;18257:8;18238:18;:28::i;:::-;18073:201:::0;:::o;15888:98::-;15941:7;15968:10;15961:17;;15888:98;:::o;116942:566::-;117095:1;117077:20;;:6;:20;;;;117069:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;117172:1;117151:23;;:9;:23;;;;117143:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;117220:21;117244:17;117254:6;117244:9;:17::i;:::-;117220:41;;117297:6;117280:13;:23;;117272:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;117367:32;117384:6;117392;117367:16;:32::i;:::-;117417:30;117429:9;117440:6;117417:11;:30::i;:::-;117482:9;117465:35;;117474:6;117465:35;;;117493:6;117465:35;;;;;;:::i;:::-;;;;;;;;117058:450;116942:566;;;:::o;32571:380::-;32724:1;32707:19;;:5;:19;;;;32699:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32805:1;32786:21;;:7;:21;;;;32778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32889:6;32859:11;:18;32871:5;32859:18;;;;;;;;;;;;;;;:27;32878:7;32859:27;;;;;;;;;;;;;;;:36;;;;32927:7;32911:32;;32920:5;32911:32;;;32936:6;32911:32;;;;;;:::i;:::-;;;;;;;;32571:380;;;:::o;33238:441::-;33373:24;33400:25;33410:5;33417:7;33400:9;:25::i;:::-;33373:52;;33460:17;33440:16;:37;33436:236;;33522:6;33502:16;:26;;33494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33598:51;33607:5;33614:7;33642:6;33623:16;:25;33598:8;:51::i;:::-;33436:236;33362:317;33238:441;;;:::o;110551:1534::-;110688:21;110702:6;110688:13;:21::i;:::-;:49;;;;110713:24;110727:9;110713:13;:24::i;:::-;110688:49;110684:142;;;110754:39;110767:6;110775:9;110786:6;110754:12;:39::i;:::-;110808:7;;110684:142;110838:19;110891:4;110876:12;;110860:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:35;;;;:::i;:::-;110838:57;;110924:11;110914:6;:21;;:40;;;;110939:15;;;;;;;;;;;110914:40;:51;;;;110958:7;;;;;;;;;;110914:51;:84;;;;110990:7;;;;;;;;;;;110969:29;;:9;:29;;;110914:84;110906:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;111046:28;111077:24;111095:4;111077:9;:24::i;:::-;111046:55;;111112:24;111163:15;;111139:20;:39;;111112:66;;111218:11;111194:20;:35;111191:101;;111269:11;111246:34;;111191:101;111322:19;:44;;;;;111359:7;;;;;;;;;;111358:8;111322:44;:76;;;;;111393:5;;;;;;;;;;;111383:15;;:6;:15;;;;111322:76;:101;;;;;111415:8;;;;;;;;;;;111322:101;111304:185;;;111450:27;111456:20;111450:5;:27::i;:::-;111304:185;111501:33;111526:6;111501:16;:33::i;:::-;111545:36;111570:9;111545:16;:36::i;:::-;111594:12;111609:6;111594:21;;111626:15;111652:17;111680:16;111721:5;;;;;;;;;;;111711:15;;:6;:15;;;:37;;;;111743:5;;;;;;;;;;;111730:18;;:9;:18;;;111711:37;111707:264;;;111773:13;;;;;;;;;;;111765:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;111937:22;111952:6;111937:14;:22::i;:::-;111831:128;;;;;;;;;;;;;;;;111707:264;111981:37;111994:6;112002:9;112013:4;111981:12;:37::i;:::-;112029:48;112040:6;112048:9;112059:8;112069:7;112029:10;:48::i;:::-;110673:1412;;;;;;;110551:1534;;;;:::o;112504:258::-;112572:17;112592:25;112612:4;112592:19;:25::i;:::-;112572:45;;112656:18;;112628:19;:25;112648:4;112628:25;;;;;;;;;;;;;;;:46;;;;112701:1;112689:9;:13;112685:70;;;112719:4;:13;;:24;112733:9;112719:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112685:70;112561:201;112504:258;:::o;113136:1587::-;103510:4;103500:7;;:14;;;;;;;;;;;;;;;;;;113196:21:::1;113234:1;113220:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113196:40;;113265:4;113247;113252:1;113247:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;113291:7;;;;;;;;;;;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;113281:4;113286:1;113281:7;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;::::0;::::1;113318:49;113335:4;113350:7;;;;;;;;;;;113360:6;113318:8;:49::i;:::-;113380:26;113409:21;113380:50;;113443:7;;;;;;;;;;;:58;;;113516:6;113537:1;113553:4;113580;113600:15;113443:183;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;113639:18;113684;113660:21;:42;;;;:::i;:::-;113639:63;;113715:18;113736:53;113774:14;;113736:33;113755:13;;113736:14;;:18;;:33;;;;:::i;:::-;:37;;:53;;;;:::i;:::-;113715:74;;113800:23;113826:42;113857:10;113826:26;113837:14;;113826:6;:10;;:26;;;;:::i;:::-;:30;;:42;;;;:::i;:::-;113800:68;;113879:22;113904:41;113934:10;113904:25;113915:13;;113904:6;:10;;:25;;;;:::i;:::-;:29;;:41;;;;:::i;:::-;113879:66;;113956:23;113982:47;114014:14;113982:27;113993:15;113982:6;:10;;:27;;;;:::i;:::-;:31;;:47;;;;:::i;:::-;113956:73;;114042:20;114065:46;114100:10;114065:30;114080:14;;114065:10;:14;;:30;;;;:::i;:::-;:34;;:46;;;;:::i;:::-;114042:69;;114122:19;114144:45;114178:10;114144:29;114159:13;;114144:10;:14;;:29;;;;:::i;:::-;:33;;:45;;;;:::i;:::-;114122:67;;114200:20;114223:45;114256:11;114223:28;114238:12;114223:10;:14;;:28;;;;:::i;:::-;:32;;:45;;;;:::i;:::-;114200:68;;114300:1;114285:12;:16;114281:87;;;114318:15;;;;;;;;;;;:24;;:38;114343:12;114318:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;114281:87;114396:1;114382:11;:15;114378:84;;;114414:14;;;;;;;;;;;:23;;:36;114438:11;114414:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;114378:84;114489:35;114508:15;114489:14;;:18;;:35;;;;:::i;:::-;114472:14;:52;;;;114551:33;114569:14;114551:13;;:17;;:33;;;;:::i;:::-;114535:13;:49;;;;114612:35;114631:15;114612:14;;:18;;:35;;;;:::i;:::-;114595:14;:52;;;;114679:36;114702:12;114679:18;;:22;;:36;;;;:::i;:::-;114658:18;:57;;;;113185:1538;;;;;;;;;;103547:5:::0;103537:7;;:15;;;;;;;;;;;;;;;;;;113136:1587;:::o;117989:280::-;103722:19;118074:24;118091:6;118074:12;;:16;;:24;;;;:::i;:::-;:38;;118066:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;118163:6;118147:12;;:22;;;;;;;:::i;:::-;;;;;;;;118180:28;118192:7;118201:6;118180:11;:28::i;:::-;118245:7;118224:37;;118241:1;118224:37;;;118254:6;118224:37;;;;;;:::i;:::-;;;;;;;;117989:280;;:::o;18434:191::-;18508:16;18527:6;;;;;;;;;;;18508:25;;18553:8;18544:6;;:17;;;;;;;;;;;;;;;;;;18608:8;18577:40;;18598:8;18577:40;;;;;;;;;;;;18497:128;18434:191;:::o;110408:135::-;110529:6;110508:9;:18;110518:7;110508:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;110487:9;:18;110497:7;110487:18;;;;;;;;;;;;;;;:48;;;;110408:135;;:::o;110270:130::-;110386:6;110365:9;:18;110375:7;110365:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;110344:9;:18;110354:7;110344:18;;;;;;;;;;;;;;;:48;;;;110270:130;;:::o;116460:433::-;116548:12;116571:15;116597:17;116625:16;116675:32;116703:3;116675:23;116686:11;;116675:6;:10;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;116665:42;;116730:34;116760:3;116730:25;116741:13;;116730:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;116718:46;;116786:33;116815:3;116786:24;116797:12;;116786:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;116775:44;;116837:48;116876:8;116837:34;116861:9;116837:19;116848:7;116837:6;:10;;:19;;;;:::i;:::-;:23;;:34;;;;:::i;:::-;:38;;:48;;;;:::i;:::-;116830:55;;116460:433;;;;;:::o;115604:533::-;115808:1;115788:22;;:8;:22;;;;115780:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;115858:19;115880:57;115922:14;115880:37;115901:15;115880:16;:20;;:37;;;;:::i;:::-;:41;;:57;;;;:::i;:::-;115858:79;;115948:50;115961:8;115979:4;115986:11;115948:12;:50::i;:::-;116027:16;116009:14;;:34;;;;;;;:::i;:::-;;;;;;;;116071:15;116054:13;;:32;;;;;;;:::i;:::-;;;;;;;;116115:14;116097;;:32;;;;;;;:::i;:::-;;;;;;;;115769:368;115604:533;;;;:::o;11092:98::-;11150:7;11181:1;11177;:5;;;;:::i;:::-;11170:12;;11092:98;;;;:::o;11830:::-;11888:7;11919:1;11915;:5;;;;:::i;:::-;11908:12;;11830:98;;;;:::o;12229:::-;12287:7;12318:1;12314;:5;;;;:::i;:::-;12307:12;;12229:98;;;;:::o;11473:::-;11531:7;11562:1;11558;:5;;;;:::i;:::-;11551:12;;11473:98;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1497:139;;;;:::o;1642:143::-;1699:5;1730:6;1724:13;1715:22;;1746:33;1773:5;1746:33;:::i;:::-;1642:143;;;;:::o;1791:155::-;1845:5;1883:6;1870:20;1861:29;;1899:41;1934:5;1899:41;:::i;:::-;1791:155;;;;:::o;1969:370::-;2040:5;2089:3;2082:4;2074:6;2070:17;2066:27;2056:122;;2097:79;;:::i;:::-;2056:122;2214:6;2201:20;2239:94;2329:3;2321:6;2314:4;2306:6;2302:17;2239:94;:::i;:::-;2230:103;;2046:293;1969:370;;;;:::o;2362:::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:94;2722:3;2714:6;2707:4;2699:6;2695:17;2632:94;:::i;:::-;2623:103;;2439:293;2362:370;;;;:::o;2738:133::-;2781:5;2819:6;2806:20;2797:29;;2835:30;2859:5;2835:30;:::i;:::-;2738:133;;;;:::o;2877:139::-;2923:5;2961:6;2948:20;2939:29;;2977:33;3004:5;2977:33;:::i;:::-;2877:139;;;;:::o;3022:143::-;3079:5;3110:6;3104:13;3095:22;;3126:33;3153:5;3126:33;:::i;:::-;3022:143;;;;:::o;3171:329::-;3230:6;3279:2;3267:9;3258:7;3254:23;3250:32;3247:119;;;3285:79;;:::i;:::-;3247:119;3405:1;3430:53;3475:7;3466:6;3455:9;3451:22;3430:53;:::i;:::-;3420:63;;3376:117;3171:329;;;;:::o;3506:351::-;3576:6;3625:2;3613:9;3604:7;3600:23;3596:32;3593:119;;;3631:79;;:::i;:::-;3593:119;3751:1;3776:64;3832:7;3823:6;3812:9;3808:22;3776:64;:::i;:::-;3766:74;;3722:128;3506:351;;;;:::o;3863:345::-;3930:6;3979:2;3967:9;3958:7;3954:23;3950:32;3947:119;;;3985:79;;:::i;:::-;3947:119;4105:1;4130:61;4183:7;4174:6;4163:9;4159:22;4130:61;:::i;:::-;4120:71;;4076:125;3863:345;;;;:::o;4214:474::-;4282:6;4290;4339:2;4327:9;4318:7;4314:23;4310:32;4307:119;;;4345:79;;:::i;:::-;4307:119;4465:1;4490:53;4535:7;4526:6;4515:9;4511:22;4490:53;:::i;:::-;4480:63;;4436:117;4592:2;4618:53;4663:7;4654:6;4643:9;4639:22;4618:53;:::i;:::-;4608:63;;4563:118;4214:474;;;;;:::o;4694:619::-;4771:6;4779;4787;4836:2;4824:9;4815:7;4811:23;4807:32;4804:119;;;4842:79;;:::i;:::-;4804:119;4962:1;4987:53;5032:7;5023:6;5012:9;5008:22;4987:53;:::i;:::-;4977:63;;4933:117;5089:2;5115:53;5160:7;5151:6;5140:9;5136:22;5115:53;:::i;:::-;5105:63;;5060:118;5217:2;5243:53;5288:7;5279:6;5268:9;5264:22;5243:53;:::i;:::-;5233:63;;5188:118;4694:619;;;;;:::o;5319:474::-;5387:6;5395;5444:2;5432:9;5423:7;5419:23;5415:32;5412:119;;;5450:79;;:::i;:::-;5412:119;5570:1;5595:53;5640:7;5631:6;5620:9;5616:22;5595:53;:::i;:::-;5585:63;;5541:117;5697:2;5723:53;5768:7;5759:6;5748:9;5744:22;5723:53;:::i;:::-;5713:63;;5668:118;5319:474;;;;;:::o;5799:894::-;5917:6;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6128:1;6117:9;6113:17;6100:31;6158:18;6150:6;6147:30;6144:117;;;6180:79;;:::i;:::-;6144:117;6285:78;6355:7;6346:6;6335:9;6331:22;6285:78;:::i;:::-;6275:88;;6071:302;6440:2;6429:9;6425:18;6412:32;6471:18;6463:6;6460:30;6457:117;;;6493:79;;:::i;:::-;6457:117;6598:78;6668:7;6659:6;6648:9;6644:22;6598:78;:::i;:::-;6588:88;;6383:303;5799:894;;;;;:::o;6699:323::-;6755:6;6804:2;6792:9;6783:7;6779:23;6775:32;6772:119;;;6810:79;;:::i;:::-;6772:119;6930:1;6955:50;6997:7;6988:6;6977:9;6973:22;6955:50;:::i;:::-;6945:60;;6901:114;6699:323;;;;:::o;7028:329::-;7087:6;7136:2;7124:9;7115:7;7111:23;7107:32;7104:119;;;7142:79;;:::i;:::-;7104:119;7262:1;7287:53;7332:7;7323:6;7312:9;7308:22;7287:53;:::i;:::-;7277:63;;7233:117;7028:329;;;;:::o;7363:474::-;7431:6;7439;7488:2;7476:9;7467:7;7463:23;7459:32;7456:119;;;7494:79;;:::i;:::-;7456:119;7614:1;7639:53;7684:7;7675:6;7664:9;7660:22;7639:53;:::i;:::-;7629:63;;7585:117;7741:2;7767:53;7812:7;7803:6;7792:9;7788:22;7767:53;:::i;:::-;7757:63;;7712:118;7363:474;;;;;:::o;7843:663::-;7931:6;7939;7947;7996:2;7984:9;7975:7;7971:23;7967:32;7964:119;;;8002:79;;:::i;:::-;7964:119;8122:1;8147:64;8203:7;8194:6;8183:9;8179:22;8147:64;:::i;:::-;8137:74;;8093:128;8260:2;8286:64;8342:7;8333:6;8322:9;8318:22;8286:64;:::i;:::-;8276:74;;8231:129;8399:2;8425:64;8481:7;8472:6;8461:9;8457:22;8425:64;:::i;:::-;8415:74;;8370:129;7843:663;;;;;:::o;8512:179::-;8581:10;8602:46;8644:3;8636:6;8602:46;:::i;:::-;8680:4;8675:3;8671:14;8657:28;;8512:179;;;;:::o;8697:142::-;8800:32;8826:5;8800:32;:::i;:::-;8795:3;8788:45;8697:142;;:::o;8845:108::-;8922:24;8940:5;8922:24;:::i;:::-;8917:3;8910:37;8845:108;;:::o;8959:118::-;9046:24;9064:5;9046:24;:::i;:::-;9041:3;9034:37;8959:118;;:::o;9113:732::-;9232:3;9261:54;9309:5;9261:54;:::i;:::-;9331:86;9410:6;9405:3;9331:86;:::i;:::-;9324:93;;9441:56;9491:5;9441:56;:::i;:::-;9520:7;9551:1;9536:284;9561:6;9558:1;9555:13;9536:284;;;9637:6;9631:13;9664:63;9723:3;9708:13;9664:63;:::i;:::-;9657:70;;9750:60;9803:6;9750:60;:::i;:::-;9740:70;;9596:224;9583:1;9580;9576:9;9571:14;;9536:284;;;9540:14;9836:3;9829:10;;9237:608;;;9113:732;;;;:::o;9851:109::-;9932:21;9947:5;9932:21;:::i;:::-;9927:3;9920:34;9851:109;;:::o;9966:147::-;10061:45;10100:5;10061:45;:::i;:::-;10056:3;10049:58;9966:147;;:::o;10119:364::-;10207:3;10235:39;10268:5;10235:39;:::i;:::-;10290:71;10354:6;10349:3;10290:71;:::i;:::-;10283:78;;10370:52;10415:6;10410:3;10403:4;10396:5;10392:16;10370:52;:::i;:::-;10447:29;10469:6;10447:29;:::i;:::-;10442:3;10438:39;10431:46;;10211:272;10119:364;;;;:::o;10489:366::-;10631:3;10652:67;10716:2;10711:3;10652:67;:::i;:::-;10645:74;;10728:93;10817:3;10728:93;:::i;:::-;10846:2;10841:3;10837:12;10830:19;;10489:366;;;:::o;10861:::-;11003:3;11024:67;11088:2;11083:3;11024:67;:::i;:::-;11017:74;;11100:93;11189:3;11100:93;:::i;:::-;11218:2;11213:3;11209:12;11202:19;;10861:366;;;:::o;11233:::-;11375:3;11396:67;11460:2;11455:3;11396:67;:::i;:::-;11389:74;;11472:93;11561:3;11472:93;:::i;:::-;11590:2;11585:3;11581:12;11574:19;;11233:366;;;:::o;11605:::-;11747:3;11768:67;11832:2;11827:3;11768:67;:::i;:::-;11761:74;;11844:93;11933:3;11844:93;:::i;:::-;11962:2;11957:3;11953:12;11946:19;;11605:366;;;:::o;11977:::-;12119:3;12140:67;12204:2;12199:3;12140:67;:::i;:::-;12133:74;;12216:93;12305:3;12216:93;:::i;:::-;12334:2;12329:3;12325:12;12318:19;;11977:366;;;:::o;12349:::-;12491:3;12512:67;12576:2;12571:3;12512:67;:::i;:::-;12505:74;;12588:93;12677:3;12588:93;:::i;:::-;12706:2;12701:3;12697:12;12690:19;;12349:366;;;:::o;12721:::-;12863:3;12884:67;12948:2;12943:3;12884:67;:::i;:::-;12877:74;;12960:93;13049:3;12960:93;:::i;:::-;13078:2;13073:3;13069:12;13062:19;;12721:366;;;:::o;13093:::-;13235:3;13256:67;13320:2;13315:3;13256:67;:::i;:::-;13249:74;;13332:93;13421:3;13332:93;:::i;:::-;13450:2;13445:3;13441:12;13434:19;;13093:366;;;:::o;13465:::-;13607:3;13628:67;13692:2;13687:3;13628:67;:::i;:::-;13621:74;;13704:93;13793:3;13704:93;:::i;:::-;13822:2;13817:3;13813:12;13806:19;;13465:366;;;:::o;13837:::-;13979:3;14000:67;14064:2;14059:3;14000:67;:::i;:::-;13993:74;;14076:93;14165:3;14076:93;:::i;:::-;14194:2;14189:3;14185:12;14178:19;;13837:366;;;:::o;14209:::-;14351:3;14372:67;14436:2;14431:3;14372:67;:::i;:::-;14365:74;;14448:93;14537:3;14448:93;:::i;:::-;14566:2;14561:3;14557:12;14550:19;;14209:366;;;:::o;14581:::-;14723:3;14744:67;14808:2;14803:3;14744:67;:::i;:::-;14737:74;;14820:93;14909:3;14820:93;:::i;:::-;14938:2;14933:3;14929:12;14922:19;;14581:366;;;:::o;14953:::-;15095:3;15116:67;15180:2;15175:3;15116:67;:::i;:::-;15109:74;;15192:93;15281:3;15192:93;:::i;:::-;15310:2;15305:3;15301:12;15294:19;;14953:366;;;:::o;15325:::-;15467:3;15488:67;15552:2;15547:3;15488:67;:::i;:::-;15481:74;;15564:93;15653:3;15564:93;:::i;:::-;15682:2;15677:3;15673:12;15666:19;;15325:366;;;:::o;15697:::-;15839:3;15860:67;15924:2;15919:3;15860:67;:::i;:::-;15853:74;;15936:93;16025:3;15936:93;:::i;:::-;16054:2;16049:3;16045:12;16038:19;;15697:366;;;:::o;16069:::-;16211:3;16232:67;16296:2;16291:3;16232:67;:::i;:::-;16225:74;;16308:93;16397:3;16308:93;:::i;:::-;16426:2;16421:3;16417:12;16410:19;;16069:366;;;:::o;16441:::-;16583:3;16604:67;16668:2;16663:3;16604:67;:::i;:::-;16597:74;;16680:93;16769:3;16680:93;:::i;:::-;16798:2;16793:3;16789:12;16782:19;;16441:366;;;:::o;16813:::-;16955:3;16976:67;17040:2;17035:3;16976:67;:::i;:::-;16969:74;;17052:93;17141:3;17052:93;:::i;:::-;17170:2;17165:3;17161:12;17154:19;;16813:366;;;:::o;17185:::-;17327:3;17348:67;17412:2;17407:3;17348:67;:::i;:::-;17341:74;;17424:93;17513:3;17424:93;:::i;:::-;17542:2;17537:3;17533:12;17526:19;;17185:366;;;:::o;17557:::-;17699:3;17720:67;17784:2;17779:3;17720:67;:::i;:::-;17713:74;;17796:93;17885:3;17796:93;:::i;:::-;17914:2;17909:3;17905:12;17898:19;;17557:366;;;:::o;17929:::-;18071:3;18092:67;18156:2;18151:3;18092:67;:::i;:::-;18085:74;;18168:93;18257:3;18168:93;:::i;:::-;18286:2;18281:3;18277:12;18270:19;;17929:366;;;:::o;18301:118::-;18388:24;18406:5;18388:24;:::i;:::-;18383:3;18376:37;18301:118;;:::o;18425:112::-;18508:22;18524:5;18508:22;:::i;:::-;18503:3;18496:35;18425:112;;:::o;18543:222::-;18636:4;18674:2;18663:9;18659:18;18651:26;;18687:71;18755:1;18744:9;18740:17;18731:6;18687:71;:::i;:::-;18543:222;;;;:::o;18771:254::-;18880:4;18918:2;18907:9;18903:18;18895:26;;18931:87;19015:1;19004:9;19000:17;18991:6;18931:87;:::i;:::-;18771:254;;;;:::o;19031:807::-;19280:4;19318:3;19307:9;19303:19;19295:27;;19332:71;19400:1;19389:9;19385:17;19376:6;19332:71;:::i;:::-;19413:72;19481:2;19470:9;19466:18;19457:6;19413:72;:::i;:::-;19495:80;19571:2;19560:9;19556:18;19547:6;19495:80;:::i;:::-;19585;19661:2;19650:9;19646:18;19637:6;19585:80;:::i;:::-;19675:73;19743:3;19732:9;19728:19;19719:6;19675:73;:::i;:::-;19758;19826:3;19815:9;19811:19;19802:6;19758:73;:::i;:::-;19031:807;;;;;;;;;:::o;19844:210::-;19931:4;19969:2;19958:9;19954:18;19946:26;;19982:65;20044:1;20033:9;20029:17;20020:6;19982:65;:::i;:::-;19844:210;;;;:::o;20060:313::-;20173:4;20211:2;20200:9;20196:18;20188:26;;20260:9;20254:4;20250:20;20246:1;20235:9;20231:17;20224:47;20288:78;20361:4;20352:6;20288:78;:::i;:::-;20280:86;;20060:313;;;;:::o;20379:419::-;20545:4;20583:2;20572:9;20568:18;20560:26;;20632:9;20626:4;20622:20;20618:1;20607:9;20603:17;20596:47;20660:131;20786:4;20660:131;:::i;:::-;20652:139;;20379:419;;;:::o;20804:::-;20970:4;21008:2;20997:9;20993:18;20985:26;;21057:9;21051:4;21047:20;21043:1;21032:9;21028:17;21021:47;21085:131;21211:4;21085:131;:::i;:::-;21077:139;;20804:419;;;:::o;21229:::-;21395:4;21433:2;21422:9;21418:18;21410:26;;21482:9;21476:4;21472:20;21468:1;21457:9;21453:17;21446:47;21510:131;21636:4;21510:131;:::i;:::-;21502:139;;21229:419;;;:::o;21654:::-;21820:4;21858:2;21847:9;21843:18;21835:26;;21907:9;21901:4;21897:20;21893:1;21882:9;21878:17;21871:47;21935:131;22061:4;21935:131;:::i;:::-;21927:139;;21654:419;;;:::o;22079:::-;22245:4;22283:2;22272:9;22268:18;22260:26;;22332:9;22326:4;22322:20;22318:1;22307:9;22303:17;22296:47;22360:131;22486:4;22360:131;:::i;:::-;22352:139;;22079:419;;;:::o;22504:::-;22670:4;22708:2;22697:9;22693:18;22685:26;;22757:9;22751:4;22747:20;22743:1;22732:9;22728:17;22721:47;22785:131;22911:4;22785:131;:::i;:::-;22777:139;;22504:419;;;:::o;22929:::-;23095:4;23133:2;23122:9;23118:18;23110:26;;23182:9;23176:4;23172:20;23168:1;23157:9;23153:17;23146:47;23210:131;23336:4;23210:131;:::i;:::-;23202:139;;22929:419;;;:::o;23354:::-;23520:4;23558:2;23547:9;23543:18;23535:26;;23607:9;23601:4;23597:20;23593:1;23582:9;23578:17;23571:47;23635:131;23761:4;23635:131;:::i;:::-;23627:139;;23354:419;;;:::o;23779:::-;23945:4;23983:2;23972:9;23968:18;23960:26;;24032:9;24026:4;24022:20;24018:1;24007:9;24003:17;23996:47;24060:131;24186:4;24060:131;:::i;:::-;24052:139;;23779:419;;;:::o;24204:::-;24370:4;24408:2;24397:9;24393:18;24385:26;;24457:9;24451:4;24447:20;24443:1;24432:9;24428:17;24421:47;24485:131;24611:4;24485:131;:::i;:::-;24477:139;;24204:419;;;:::o;24629:::-;24795:4;24833:2;24822:9;24818:18;24810:26;;24882:9;24876:4;24872:20;24868:1;24857:9;24853:17;24846:47;24910:131;25036:4;24910:131;:::i;:::-;24902:139;;24629:419;;;:::o;25054:::-;25220:4;25258:2;25247:9;25243:18;25235:26;;25307:9;25301:4;25297:20;25293:1;25282:9;25278:17;25271:47;25335:131;25461:4;25335:131;:::i;:::-;25327:139;;25054:419;;;:::o;25479:::-;25645:4;25683:2;25672:9;25668:18;25660:26;;25732:9;25726:4;25722:20;25718:1;25707:9;25703:17;25696:47;25760:131;25886:4;25760:131;:::i;:::-;25752:139;;25479:419;;;:::o;25904:::-;26070:4;26108:2;26097:9;26093:18;26085:26;;26157:9;26151:4;26147:20;26143:1;26132:9;26128:17;26121:47;26185:131;26311:4;26185:131;:::i;:::-;26177:139;;25904:419;;;:::o;26329:::-;26495:4;26533:2;26522:9;26518:18;26510:26;;26582:9;26576:4;26572:20;26568:1;26557:9;26553:17;26546:47;26610:131;26736:4;26610:131;:::i;:::-;26602:139;;26329:419;;;:::o;26754:::-;26920:4;26958:2;26947:9;26943:18;26935:26;;27007:9;27001:4;26997:20;26993:1;26982:9;26978:17;26971:47;27035:131;27161:4;27035:131;:::i;:::-;27027:139;;26754:419;;;:::o;27179:::-;27345:4;27383:2;27372:9;27368:18;27360:26;;27432:9;27426:4;27422:20;27418:1;27407:9;27403:17;27396:47;27460:131;27586:4;27460:131;:::i;:::-;27452:139;;27179:419;;;:::o;27604:::-;27770:4;27808:2;27797:9;27793:18;27785:26;;27857:9;27851:4;27847:20;27843:1;27832:9;27828:17;27821:47;27885:131;28011:4;27885:131;:::i;:::-;27877:139;;27604:419;;;:::o;28029:::-;28195:4;28233:2;28222:9;28218:18;28210:26;;28282:9;28276:4;28272:20;28268:1;28257:9;28253:17;28246:47;28310:131;28436:4;28310:131;:::i;:::-;28302:139;;28029:419;;;:::o;28454:::-;28620:4;28658:2;28647:9;28643:18;28635:26;;28707:9;28701:4;28697:20;28693:1;28682:9;28678:17;28671:47;28735:131;28861:4;28735:131;:::i;:::-;28727:139;;28454:419;;;:::o;28879:::-;29045:4;29083:2;29072:9;29068:18;29060:26;;29132:9;29126:4;29122:20;29118:1;29107:9;29103:17;29096:47;29160:131;29286:4;29160:131;:::i;:::-;29152:139;;28879:419;;;:::o;29304:222::-;29397:4;29435:2;29424:9;29420:18;29412:26;;29448:71;29516:1;29505:9;29501:17;29492:6;29448:71;:::i;:::-;29304:222;;;;:::o;29532:831::-;29795:4;29833:3;29822:9;29818:19;29810:27;;29847:71;29915:1;29904:9;29900:17;29891:6;29847:71;:::i;:::-;29928:80;30004:2;29993:9;29989:18;29980:6;29928:80;:::i;:::-;30055:9;30049:4;30045:20;30040:2;30029:9;30025:18;30018:48;30083:108;30186:4;30177:6;30083:108;:::i;:::-;30075:116;;30201:72;30269:2;30258:9;30254:18;30245:6;30201:72;:::i;:::-;30283:73;30351:3;30340:9;30336:19;30327:6;30283:73;:::i;:::-;29532:831;;;;;;;;:::o;30369:214::-;30458:4;30496:2;30485:9;30481:18;30473:26;;30509:67;30573:1;30562:9;30558:17;30549:6;30509:67;:::i;:::-;30369:214;;;;:::o;30589:129::-;30623:6;30650:20;;:::i;:::-;30640:30;;30679:33;30707:4;30699:6;30679:33;:::i;:::-;30589:129;;;:::o;30724:75::-;30757:6;30790:2;30784:9;30774:19;;30724:75;:::o;30805:311::-;30882:4;30972:18;30964:6;30961:30;30958:56;;;30994:18;;:::i;:::-;30958:56;31044:4;31036:6;31032:17;31024:25;;31104:4;31098;31094:15;31086:23;;30805:311;;;:::o;31122:::-;31199:4;31289:18;31281:6;31278:30;31275:56;;;31311:18;;:::i;:::-;31275:56;31361:4;31353:6;31349:17;31341:25;;31421:4;31415;31411:15;31403:23;;31122:311;;;:::o;31439:132::-;31506:4;31529:3;31521:11;;31559:4;31554:3;31550:14;31542:22;;31439:132;;;:::o;31577:114::-;31644:6;31678:5;31672:12;31662:22;;31577:114;;;:::o;31697:99::-;31749:6;31783:5;31777:12;31767:22;;31697:99;;;:::o;31802:113::-;31872:4;31904;31899:3;31895:14;31887:22;;31802:113;;;:::o;31921:184::-;32020:11;32054:6;32049:3;32042:19;32094:4;32089:3;32085:14;32070:29;;31921:184;;;;:::o;32111:169::-;32195:11;32229:6;32224:3;32217:19;32269:4;32264:3;32260:14;32245:29;;32111:169;;;;:::o;32286:305::-;32326:3;32345:20;32363:1;32345:20;:::i;:::-;32340:25;;32379:20;32397:1;32379:20;:::i;:::-;32374:25;;32533:1;32465:66;32461:74;32458:1;32455:81;32452:107;;;32539:18;;:::i;:::-;32452:107;32583:1;32580;32576:9;32569:16;;32286:305;;;;:::o;32597:185::-;32637:1;32654:20;32672:1;32654:20;:::i;:::-;32649:25;;32688:20;32706:1;32688:20;:::i;:::-;32683:25;;32727:1;32717:35;;32732:18;;:::i;:::-;32717:35;32774:1;32771;32767:9;32762:14;;32597:185;;;;:::o;32788:348::-;32828:7;32851:20;32869:1;32851:20;:::i;:::-;32846:25;;32885:20;32903:1;32885:20;:::i;:::-;32880:25;;33073:1;33005:66;33001:74;32998:1;32995:81;32990:1;32983:9;32976:17;32972:105;32969:131;;;33080:18;;:::i;:::-;32969:131;33128:1;33125;33121:9;33110:20;;32788:348;;;;:::o;33142:191::-;33182:4;33202:20;33220:1;33202:20;:::i;:::-;33197:25;;33236:20;33254:1;33236:20;:::i;:::-;33231:25;;33275:1;33272;33269:8;33266:34;;;33280:18;;:::i;:::-;33266:34;33325:1;33322;33318:9;33310:17;;33142:191;;;;:::o;33339:96::-;33376:7;33405:24;33423:5;33405:24;:::i;:::-;33394:35;;33339:96;;;:::o;33441:104::-;33486:7;33515:24;33533:5;33515:24;:::i;:::-;33504:35;;33441:104;;;:::o;33551:90::-;33585:7;33628:5;33621:13;33614:21;33603:32;;33551:90;;;:::o;33647:126::-;33684:7;33724:42;33717:5;33713:54;33702:65;;33647:126;;;:::o;33779:77::-;33816:7;33845:5;33834:16;;33779:77;;;:::o;33862:86::-;33897:7;33937:4;33930:5;33926:16;33915:27;;33862:86;;;:::o;33954:121::-;34012:9;34045:24;34063:5;34045:24;:::i;:::-;34032:37;;33954:121;;;:::o;34081:307::-;34149:1;34159:113;34173:6;34170:1;34167:13;34159:113;;;34258:1;34253:3;34249:11;34243:18;34239:1;34234:3;34230:11;34223:39;34195:2;34192:1;34188:10;34183:15;;34159:113;;;34290:6;34287:1;34284:13;34281:101;;;34370:1;34361:6;34356:3;34352:16;34345:27;34281:101;34130:258;34081:307;;;:::o;34394:320::-;34438:6;34475:1;34469:4;34465:12;34455:22;;34522:1;34516:4;34512:12;34543:18;34533:81;;34599:4;34591:6;34587:17;34577:27;;34533:81;34661:2;34653:6;34650:14;34630:18;34627:38;34624:84;;;34680:18;;:::i;:::-;34624:84;34445:269;34394:320;;;:::o;34720:281::-;34803:27;34825:4;34803:27;:::i;:::-;34795:6;34791:40;34933:6;34921:10;34918:22;34897:18;34885:10;34882:34;34879:62;34876:88;;;34944:18;;:::i;:::-;34876:88;34984:10;34980:2;34973:22;34763:238;34720:281;;:::o;35007:233::-;35046:3;35069:24;35087:5;35069:24;:::i;:::-;35060:33;;35115:66;35108:5;35105:77;35102:103;;;35185:18;;:::i;:::-;35102:103;35232:1;35225:5;35221:13;35214:20;;35007:233;;;:::o;35246:180::-;35294:77;35291:1;35284:88;35391:4;35388:1;35381:15;35415:4;35412:1;35405:15;35432:180;35480:77;35477:1;35470:88;35577:4;35574:1;35567:15;35601:4;35598:1;35591:15;35618:180;35666:77;35663:1;35656:88;35763:4;35760:1;35753:15;35787:4;35784:1;35777:15;35804:180;35852:77;35849:1;35842:88;35949:4;35946:1;35939:15;35973:4;35970:1;35963:15;35990:180;36038:77;36035:1;36028:88;36135:4;36132:1;36125:15;36159:4;36156:1;36149:15;36176:117;36285:1;36282;36275:12;36299:117;36408:1;36405;36398:12;36422:117;36531:1;36528;36521:12;36545:117;36654:1;36651;36644:12;36668:102;36709:6;36760:2;36756:7;36751:2;36744:5;36740:14;36736:28;36726:38;;36668:102;;;:::o;36776:169::-;36916:21;36912:1;36904:6;36900:14;36893:45;36776:169;:::o;36951:231::-;37091:34;37087:1;37079:6;37075:14;37068:58;37160:14;37155:2;37147:6;37143:15;37136:39;36951:231;:::o;37188:180::-;37328:32;37324:1;37316:6;37312:14;37305:56;37188:180;:::o;37374:::-;37514:32;37510:1;37502:6;37498:14;37491:56;37374:180;:::o;37560:225::-;37700:34;37696:1;37688:6;37684:14;37677:58;37769:8;37764:2;37756:6;37752:15;37745:33;37560:225;:::o;37791:221::-;37931:34;37927:1;37919:6;37915:14;37908:58;38000:4;37995:2;37987:6;37983:15;37976:29;37791:221;:::o;38018:180::-;38158:32;38154:1;38146:6;38142:14;38135:56;38018:180;:::o;38204:178::-;38344:30;38340:1;38332:6;38328:14;38321:54;38204:178;:::o;38388:179::-;38528:31;38524:1;38516:6;38512:14;38505:55;38388:179;:::o;38573:174::-;38713:26;38709:1;38701:6;38697:14;38690:50;38573:174;:::o;38753:181::-;38893:33;38889:1;38881:6;38877:14;38870:57;38753:181;:::o;38940:182::-;39080:34;39076:1;39068:6;39064:14;39057:58;38940:182;:::o;39128:231::-;39268:34;39264:1;39256:6;39252:14;39245:58;39337:14;39332:2;39324:6;39320:15;39313:39;39128:231;:::o;39365:181::-;39505:33;39501:1;39493:6;39489:14;39482:57;39365:181;:::o;39552:220::-;39692:34;39688:1;39680:6;39676:14;39669:58;39761:3;39756:2;39748:6;39744:15;39737:28;39552:220;:::o;39778:230::-;39918:34;39914:1;39906:6;39902:14;39895:58;39987:13;39982:2;39974:6;39970:15;39963:38;39778:230;:::o;40014:175::-;40154:27;40150:1;40142:6;40138:14;40131:51;40014:175;:::o;40195:182::-;40335:34;40331:1;40323:6;40319:14;40312:58;40195:182;:::o;40383:178::-;40523:30;40519:1;40511:6;40507:14;40500:54;40383:178;:::o;40567:223::-;40707:34;40703:1;40695:6;40691:14;40684:58;40776:6;40771:2;40763:6;40759:15;40752:31;40567:223;:::o;40796:224::-;40936:34;40932:1;40924:6;40920:14;40913:58;41005:7;41000:2;40992:6;40988:15;40981:32;40796:224;:::o;41026:122::-;41099:24;41117:5;41099:24;:::i;:::-;41092:5;41089:35;41079:63;;41138:1;41135;41128:12;41079:63;41026:122;:::o;41154:138::-;41235:32;41261:5;41235:32;:::i;:::-;41228:5;41225:43;41215:71;;41282:1;41279;41272:12;41215:71;41154:138;:::o;41298:116::-;41368:21;41383:5;41368:21;:::i;:::-;41361:5;41358:32;41348:60;;41404:1;41401;41394:12;41348:60;41298:116;:::o;41420:122::-;41493:24;41511:5;41493:24;:::i;:::-;41486:5;41483:35;41473:63;;41532:1;41529;41522:12;41473:63;41420:122;:::o

Swarm Source

ipfs://6bd688adb90a4eb1c6c6f30c880c0e854f96241f024fd42bb420c44a452d0566
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.