BNB Price: $619.95 (+2.72%)
 

Overview

Max Total Supply

3,303,462,493,884,597.055353LOVE

Holders

83,959 ( -0.001%)

Market

Price

$0.0002 @ 0.000000 BNB

Onchain Market Cap

$602,122,108,760.35

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
44,550,000 LOVE

Value
$8,120.13 ( ~13.0981 BNB) [0.0000%]
0xd05bac41c2346e4f1ff82e01c8d360c426517f51
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The LovePot is developing no-loss “jackpot” pool, built on binance Smart Chain technology specifically dedicated to decentralized financial applications.

Market

Volume (24H):$89.92
Market Capitalization:$0.00
Circulating Supply:0.00 LOVE
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information

Contract Source Code Verified (Exact Match)

Contract Name:
LovePot

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2021-09-13
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;


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

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: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol
 

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-periphery/contracts/interfaces/IUniswapV2Router01.sol

 

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

 

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: @openzeppelin/contracts/utils/Address.sol
 
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

 

interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor (){
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

 
 
contract BEP20 is Context, IBEP20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) private _balances;

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

    uint256 public _totalSupply;

    string public _name;
    string public _symbol;
    uint8 public _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory Name, string memory Symbol){
        _name = Name;
        _symbol = Symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external override view returns (address) {
        return owner();
    }

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

    /**
     * @dev Returns the token decimals.
     */
    function decimals() public override view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the token symbol.
     */
    function symbol() public override view returns (string memory) {
        return _symbol;
    }

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

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

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

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

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

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

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

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {BEP20-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 returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero")
        );
        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing
     * the total supply.
     *
     * Requirements
     *
     * - `msg.sender` must be the token owner
     */
    function mint(uint256 amount) public onlyOwner returns (bool) {
        _mint(_msgSender(), amount);
        return true;
    }

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

        _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "BEP20: mint to the zero address");

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

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

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

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

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

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(
            account,
            _msgSender(),
            _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance")
        );
    }
}

 




// LOVPTToken with Governance.
contract LovePot is BEP20 {
    using SafeMath for uint256;
    // Transfer tax rate in basis points. (default 1%)
    uint16 public transferTaxRate = 100;
    // Burn rate % of transfer tax. (default 20% x 5% = 1% of total amount).
    uint16 public burnRate = 25;
    // Max transfer tax rate: 10%.
    uint16 public constant MAXIMUM_TRANSFER_TAX_RATE = 1000;
    // Burn address
    address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    // Max transfer amount rate in basis points. (default is 0.5% of total supply)
    uint16 public maxTransferAmountRate = 50;
    // Addresses that excluded from antiWhale
    mapping(address => bool) private _excludedFromAntiWhale;
    // Automatic swap and liquify enabled
    bool public swapAndLiquifyEnabled = false;
    // Min amount to liquify. (default 500 LOVPTs)
    uint256 public minAmountToLiquify = 500 ether;
    // The swap router, modifiable. Will be changed to LOVPTSwap's router when our own AMM release
    IUniswapV2Router02 public LOVPTSwapRouter;
    // The trading pair
    address public LOVPTSwapPair;
    // In swap and liquify
    bool private _inSwapAndLiquify;
    // to control selling
    bool public selling;
    // to control buying
    bool public buying;

    // The operator can only update the transfer tax rate
    address private _operator;

    // Events
    event OperatorTransferred(address indexed previousOperator, address indexed newOperator);
    event TransferTaxRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate);
    event BurnRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate);
    event MaxTransferAmountRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate);
    event SwapAndLiquifyEnabledUpdated(address indexed operator, bool enabled);
    event MinAmountToLiquifyUpdated(address indexed operator, uint256 previousAmount, uint256 newAmount);
    event LOVPTSwapRouterUpdated(address indexed operator, address indexed router, address indexed pair);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);

    modifier onlyOperator() {
        require(_operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    modifier antiWhale(address sender, address recipient, uint256 amount) {
        if (maxTransferAmount() > 0) {
            if (
                _excludedFromAntiWhale[sender] == false
                && _excludedFromAntiWhale[recipient] == false
            ) {
                require(amount <= maxTransferAmount(), "LOVPT::antiWhale: Transfer amount exceeds the maxTransferAmount");
            }
        }
        _;
    }

    modifier lockTheSwap {
        _inSwapAndLiquify = true;
        _;
        _inSwapAndLiquify = false;
    }

    modifier transferTaxFree {
        uint16 _transferTaxRate = transferTaxRate;
        transferTaxRate = 0;
        _;
        transferTaxRate = _transferTaxRate;
    }

    /**
     * @notice Constructs the LOVPTToken contract.
     */
    constructor()  BEP20("LovePot Token", "LOVE") {
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);

        _excludedFromAntiWhale[msg.sender] = true;
        _excludedFromAntiWhale[address(0)] = true;
        _excludedFromAntiWhale[address(this)] = true;
        _excludedFromAntiWhale[BURN_ADDRESS] = true;
    }

    /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef).
    function mint(address _to, uint256 _amount) public onlyOwner {
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }
    
    /// @notice Burns `_amount` token to `_to`. Must only be called by the operator.
    function burn(address _to, uint256 _amount) public onlyOperator {
        _burn(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }
    
    /// @notice to enable or disable selling. Must only be called by the operator.
    function setSelling(bool _state) public onlyOperator {
        selling = _state;
    }
    
    /// @notice to enable or disable buying. Must only be called by the operator.
    function setBuying(bool _state) public onlyOperator {
        buying = _state;
    }

    /// @dev overrides transfer function to meet tokenomics of LOVPT
    function _transfer(address sender, address recipient, uint256 amount) internal virtual override antiWhale(sender, recipient, amount) {
        if(!selling && sender != owner()){
            require(recipient != LOVPTSwapPair,"Selling disabled");
        }
        if(!buying && sender != owner()){
            require(sender != LOVPTSwapPair,"Buying disabled");
        }
        
        // swap and liquify
        if (
            swapAndLiquifyEnabled == true
            && _inSwapAndLiquify == false
            && address(LOVPTSwapRouter) != address(0)
            && LOVPTSwapPair != address(0)
            && sender != LOVPTSwapPair
            && sender != owner()
        ) {
            swapAndLiquify();
        }

        if (recipient == BURN_ADDRESS || transferTaxRate == 0) {
            super._transfer(sender, recipient, amount);
        } else {
            // default tax is 1% of every transfer
            uint256 taxAmount = amount.mul(transferTaxRate).div(10000);
            uint256 burnAmount = taxAmount.mul(burnRate).div(100);
            uint256 liquidityAmount = taxAmount.sub(burnAmount);
            require(taxAmount == burnAmount + liquidityAmount, "LOVPT::transfer: Burn value invalid");

            // default 99% of transfer sent to recipient
            uint256 sendAmount = amount.sub(taxAmount);
            require(amount == sendAmount + taxAmount, "LOVPT::transfer: Tax value invalid");

            super._transfer(sender, BURN_ADDRESS, burnAmount);
            super._transfer(sender, address(this), liquidityAmount);
            super._transfer(sender, recipient, sendAmount);
            amount = sendAmount;
        }
    }

    /// @dev Swap and liquify
    function swapAndLiquify() private lockTheSwap transferTaxFree {
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 _maxTransferAmount = maxTransferAmount();
        contractTokenBalance = contractTokenBalance > _maxTransferAmount ? _maxTransferAmount : contractTokenBalance;

        if (contractTokenBalance >= minAmountToLiquify) {
            // only min amount to liquify
            uint256 liquifyAmount = minAmountToLiquify;

            // split the liquify amount into halves
            uint256 half = liquifyAmount.div(2);
            uint256 otherHalf = liquifyAmount.sub(half);

            // capture the contract's current ETH balance.
            // this is so that we can capture exactly the amount of ETH that the
            // swap creates, and not make the liquidity event include any ETH that
            // has been manually sent to the contract
            uint256 initialBalance = address(this).balance;

            // swap tokens for ETH
            swapTokensForEth(half);

            // how much ETH did we just swap into?
            uint256 newBalance = address(this).balance.sub(initialBalance);

            // add liquidity
            addLiquidity(otherHalf, newBalance);

            emit SwapAndLiquify(half, newBalance, otherHalf);
        }
    }

    /// @dev Swap tokens for eth
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the LOVPTSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = LOVPTSwapRouter.WETH();

        _approve(address(this), address(LOVPTSwapRouter), tokenAmount);

        // make the swap
        LOVPTSwapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    /// @dev Add liquidity
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(LOVPTSwapRouter), tokenAmount);

        // add the liquidity
        LOVPTSwapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            operator(),
            block.timestamp
        );
    }

    /**
     * @dev Returns the max transfer amount.
     */
    function maxTransferAmount() public view returns (uint256) {
        return totalSupply().mul(maxTransferAmountRate).div(10000);
    }

    /**
     * @dev Returns the address is excluded from antiWhale or not.
     */
    function isExcludedFromAntiWhale(address _account) public view returns (bool) {
        return _excludedFromAntiWhale[_account];
    }

    // To receive BNB from LOVPTSwapRouter when swapping
    receive() external payable {}

    /**
     * @dev Update the transfer tax rate.
     * Can only be called by the current operator.
     */
    function updateTransferTaxRate(uint16 _transferTaxRate) public onlyOperator {
        require(_transferTaxRate <= MAXIMUM_TRANSFER_TAX_RATE, "LOVPT::updateTransferTaxRate: Transfer tax rate must not exceed the maximum rate.");
        emit TransferTaxRateUpdated(msg.sender, transferTaxRate, _transferTaxRate);
        transferTaxRate = _transferTaxRate;
    }

    /**
     * @dev Update the burn rate.
     * Can only be called by the current operator.
     */
    function updateBurnRate(uint16 _burnRate) public onlyOperator {
        require(_burnRate <= 100, "LOVPT::updateBurnRate: Burn rate must not exceed the maximum rate.");
        emit BurnRateUpdated(msg.sender, burnRate, _burnRate);
        burnRate = _burnRate;
    }

    /**
     * @dev Update the max transfer amount rate.
     * Can only be called by the current operator.
     */
    function updateMaxTransferAmountRate(uint16 _maxTransferAmountRate) public onlyOperator {
        require(_maxTransferAmountRate <= 10000, "LOVPT::updateMaxTransferAmountRate: Max transfer amount rate must not exceed the maximum rate.");
        emit MaxTransferAmountRateUpdated(msg.sender, maxTransferAmountRate, _maxTransferAmountRate);
        maxTransferAmountRate = _maxTransferAmountRate;
    }

    /**
     * @dev Update the min amount to liquify.
     * Can only be called by the current operator.
     */
    function updateMinAmountToLiquify(uint256 _minAmount) public onlyOperator {
        emit MinAmountToLiquifyUpdated(msg.sender, minAmountToLiquify, _minAmount);
        minAmountToLiquify = _minAmount;
    }

    /**
     * @dev Exclude or include an address from antiWhale.
     * Can only be called by the current operator.
     */
    function setExcludedFromAntiWhale(address _account, bool _excluded) public onlyOperator {
        _excludedFromAntiWhale[_account] = _excluded;
    }

    /**
     * @dev Update the swapAndLiquifyEnabled.
     * Can only be called by the current operator.
     */
    function updateSwapAndLiquifyEnabled(bool _enabled) public onlyOperator {
        emit SwapAndLiquifyEnabledUpdated(msg.sender, _enabled);
        swapAndLiquifyEnabled = _enabled;
    }

    /**
     * @dev Update the swap router.
     * Can only be called by the current operator.
     */
    function updateLOVPTSwapRouter(address _router) public onlyOperator {
        LOVPTSwapRouter = IUniswapV2Router02(_router);
        LOVPTSwapPair = IUniswapV2Factory(LOVPTSwapRouter.factory()).getPair(address(this), LOVPTSwapRouter.WETH());
        require(LOVPTSwapPair != address(0), "LOVPT::updateLOVPTSwapRouter: Invalid pair address.");
        emit LOVPTSwapRouterUpdated(msg.sender, address(LOVPTSwapRouter), LOVPTSwapPair);
    }

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

    /**
     * @dev Transfers operator of the contract to a new account (`newOperator`).
     * Can only be called by the current operator.
     */
    function transferOperator(address newOperator) public onlyOperator {
        require(newOperator != address(0), "LOVPT::transferOperator: new operator is the zero address");
        emit OperatorTransferred(_operator, newOperator);
        _operator = newOperator;
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

    /// @dev A record of each accounts delegate
    mapping (address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

      /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator)
        external
        view
        returns (address)
    {
        return _delegates[delegator];
    }

   /**
    * @notice Delegate votes from `msg.sender` to `delegatee`
    * @param delegatee The address to delegate votes to
    */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
    {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                DELEGATION_TYPEHASH,
                delegatee,
                nonce,
                expiry
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                structHash
            )
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "LOVPT::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "LOVPT::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "LOVPT::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account)
        external
        view
        returns (uint256)
    {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "LOVPT::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee)
        internal
    {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying LOVPTs (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    )
        internal
    {
        uint32 blockNumber = safe32(block.number, "LOVPT::_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function getChainId() internal view returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"BurnRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"LOVPTSwapRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"MaxTransferAmountRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"MinAmountToLiquifyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"TransferTaxRateUpdated","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOVPTSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOVPTSwapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TRANSFER_TAX_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buying","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","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":"isExcludedFromAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmountRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToLiquify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBuying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludedFromAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_burnRate","type":"uint16"}],"name":"updateBurnRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateLOVPTSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxTransferAmountRate","type":"uint16"}],"name":"updateMaxTransferAmountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmount","type":"uint256"}],"name":"updateMinAmountToLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_transferTaxRate","type":"uint16"}],"name":"updateTransferTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526006805466ffffffffffff001916653200190064001790556008805460ff19169055681b1ae4d6e2ef5000006009553480156200004057600080fd5b506040518060400160405280600d81526020016c2637bb32a837ba102a37b5b2b760991b815250604051806040016040528060048152602001634c4f564560e01b815250600062000096620001fa60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000f5906004906020850190620001fe565b5080516200010b906005906020840190620001fe565b50506006805460ff1916601217905550620001233390565b600c80546001600160a01b0319166001600160a01b039290921691821790556040516000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3336000908152600760205260408082208054600160ff1991821681179092557f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df8054821683179055308452918320805483168217905561dead9092527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80549091169091179055620002e1565b3390565b8280546200020c90620002a4565b90600052602060002090601f0160209004810192826200023057600085556200027b565b82601f106200024b57805160ff19168380011785556200027b565b828001600101855582156200027b579182015b828111156200027b5782518255916020019190600101906200025e565b50620002899291506200028d565b5090565b5b808211156200028957600081556001016200028e565b600181811c90821680620002b957607f821691505b60208210811415620002db57634e487b7160e01b600052602260045260246000fd5b50919050565b6135f880620002f16000396000f3fe60806040526004361061036f5760003560e01c8063893d20e8116101c6578063bed99850116100f7578063f1127ed811610095578063f62228071161006f578063f622280714610ad4578063fb37ef5714610af4578063fccc281314610b14578063fce3bbb514610b2a57600080fd5b8063f1127ed814610a30578063f2fde38b14610a94578063f607f2b414610ab457600080fd5b8063d28d8852116100d1578063d28d88521461098b578063d8248358146109a0578063dd62ed3e146109b6578063e7a324dc146109fc57600080fd5b8063bed9985014610929578063c3cda5201461094b578063c7f59a671461096b57600080fd5b8063a392e67411610164578063a9e757231161013e578063a9e75723146108bf578063b09f1266146108d4578063b4b5ea57146108e9578063b65d08b01461090957600080fd5b8063a392e6741461085f578063a457c2d71461087f578063a9059cbb1461089f57600080fd5b806395d89b41116101a057806395d89b41146107ea5780639dc29fac146107ff5780639f9a4e7f1461081f578063a0712d681461083f57600080fd5b8063893d20e8146107ab5780638da5cb5b146107ab578063928bc6a0146107c957600080fd5b80633ff8bf2e116102a05780636a141e2c1161023e578063715018a611610218578063715018a614610729578063782d6fe11461073e5780637b895dfc1461075e5780637ecebe001461077e57600080fd5b80636a141e2c1461068b5780636fcfff45146106ab57806370a08231146106f357600080fd5b8063570ca7351161027a578063570ca735146105e0578063587cde1e146106125780635c19a95c1461064b5780635d2a4fdd1461066b57600080fd5b80633ff8bf2e1461058457806340c10f19146105a65780634a74bb02146105c657600080fd5b8063269f534c1161030d57806332424aa3116102e757806332424aa314610514578063376c23911461052e578063395093511461054e5780633eaaf86b1461056e57600080fd5b8063269f534c1461049357806329605e77146104cc578063313ce567146104ee57600080fd5b80631ad9339a116103495780631ad9339a146103f557806320606b701461041e57806323aed2281461045257806323b872dd1461047357600080fd5b806306fdde031461037b578063095ea7b3146103a657806318160ddd146103d657600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610b4a565b60405161039d919061323a565b60405180910390f35b3480156103b257600080fd5b506103c66103c13660046130ef565b610bdc565b604051901515815260200161039d565b3480156103e257600080fd5b506003545b60405190815260200161039d565b34801561040157600080fd5b5061040b6103e881565b60405161ffff909116815260200161039d565b34801561042a57600080fd5b506103e77f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561045e57600080fd5b50600b546103c690600160a81b900460ff1681565b34801561047f57600080fd5b506103c661048e366004613079565b610bf3565b34801561049f57600080fd5b506103c66104ae366004613006565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156104d857600080fd5b506104ec6104e7366004613006565b610c5c565b005b3480156104fa57600080fd5b5060065460ff165b60405160ff909116815260200161039d565b34801561052057600080fd5b506006546105029060ff1681565b34801561053a57600080fd5b506104ec6105493660046131cf565b610d67565b34801561055a57600080fd5b506103c66105693660046130ef565b610e8e565b34801561057a57600080fd5b506103e760035481565b34801561059057600080fd5b5060065461040b90600160281b900461ffff1681565b3480156105b257600080fd5b506104ec6105c13660046130ef565b610ec4565b3480156105d257600080fd5b506008546103c69060ff1681565b3480156105ec57600080fd5b50600c546001600160a01b03165b6040516001600160a01b03909116815260200161039d565b34801561061e57600080fd5b506105fa61062d366004613006565b6001600160a01b039081166000908152600d60205260409020541690565b34801561065757600080fd5b506104ec610666366004613006565b610f21565b34801561067757600080fd5b50600b546105fa906001600160a01b031681565b34801561069757600080fd5b506104ec6106a63660046131cf565b610f2e565b3480156106b757600080fd5b506106de6106c6366004613006565b600f6020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161039d565b3480156106ff57600080fd5b506103e761070e366004613006565b6001600160a01b031660009081526001602052604090205490565b34801561073557600080fd5b506104ec611069565b34801561074a57600080fd5b506103e76107593660046130ef565b6110dd565b34801561076a57600080fd5b50600a546105fa906001600160a01b031681565b34801561078a57600080fd5b506103e7610799366004613006565b60106020526000908152604090205481565b3480156107b757600080fd5b506000546001600160a01b03166105fa565b3480156107d557600080fd5b50600b546103c690600160b01b900460ff1681565b3480156107f657600080fd5b50610390611348565b34801561080b57600080fd5b506104ec61081a3660046130ef565b611357565b34801561082b57600080fd5b506104ec61083a3660046131b4565b61138b565b34801561084b57600080fd5b506103c661085a3660046131f3565b6113ff565b34801561086b57600080fd5b506104ec61087a3660046131f3565b61143d565b34801561088b57600080fd5b506103c661089a3660046130ef565b6114aa565b3480156108ab57600080fd5b506103c66108ba3660046130ef565b6114f9565b3480156108cb57600080fd5b506103e7611506565b3480156108e057600080fd5b50610390611539565b3480156108f557600080fd5b506103e7610904366004613006565b6115c7565b34801561091557600080fd5b5060065461040b90610100900461ffff1681565b34801561093557600080fd5b5060065461040b906301000000900461ffff1681565b34801561095757600080fd5b506104ec61096636600461311b565b61163c565b34801561097757600080fd5b506104ec6109863660046130ba565b61190d565b34801561099757600080fd5b50610390611962565b3480156109ac57600080fd5b506103e760095481565b3480156109c257600080fd5b506103e76109d1366004613040565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a0857600080fd5b506103e77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610a3c57600080fd5b50610a78610a4b36600461317d565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161039d565b348015610aa057600080fd5b506104ec610aaf366004613006565b61196f565b348015610ac057600080fd5b506104ec610acf3660046131cf565b611a59565b348015610ae057600080fd5b506104ec610aef3660046131b4565b611b76565b348015610b0057600080fd5b506104ec610b0f366004613006565b611bbe565b348015610b2057600080fd5b506105fa61dead81565b348015610b3657600080fd5b506104ec610b453660046131b4565b611e52565b606060048054610b599061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b859061344b565b8015610bd25780601f10610ba757610100808354040283529160200191610bd2565b820191906000526020600020905b815481529060010190602001808311610bb557829003601f168201915b5050505050905090565b6000610be9338484611e9a565b5060015b92915050565b6000610c00848484611fbf565b610c528433610c4d856040518060600160405280602881526020016134f9602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906123a6565b611e9a565b5060019392505050565b600c546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610c86906132c4565b60405180910390fd5b6001600160a01b038116610d0b5760405162461bcd60e51b815260206004820152603960248201527f4c4f5650543a3a7472616e736665724f70657261746f723a206e6577206f706560448201527f7261746f7220697320746865207a65726f2061646472657373000000000000006064820152608401610c86565b600c546040516001600160a01b038084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314610d915760405162461bcd60e51b8152600401610c86906132c4565b6103e861ffff82161115610e275760405162461bcd60e51b815260206004820152605160248201527f4c4f5650543a3a7570646174655472616e73666572546178526174653a20547260448201527f616e73666572207461782072617465206d757374206e6f7420657863656564206064820152703a34329036b0bc34b6bab6903930ba329760791b608482015260a401610c86565b6006546040805161010090920461ffff90811683528316602083015233917fe9d5c8ee2a65d4fb859c680669d8f902172d53e3f15f9f11108a31bbada4b70b910160405180910390a26006805461ffff9092166101000262ffff0019909216919091179055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610be9918590610c4d90866123dd565b6000546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610c869061328f565b610ef8828261243c565b6001600160a01b038083166000908152600d6020526040812054610f1d921683612522565b5050565b610f2b3382612686565b50565b600c546001600160a01b03163314610f585760405162461bcd60e51b8152600401610c86906132c4565b6127108161ffff161115610ffa5760405162461bcd60e51b815260206004820152605e60248201527f4c4f5650543a3a7570646174654d61785472616e73666572416d6f756e74526160448201527f74653a204d6178207472616e7366657220616d6f756e742072617465206d757360648201527f74206e6f742065786365656420746865206d6178696d756d20726174652e0000608482015260a401610c86565b60065460408051600160281b90920461ffff90811683528316602083015233917fb62a50fc861a770636e85357becb3b82a32e911106609d4985871eaf29011e08910160405180910390a26006805461ffff909216600160281b0266ffff000000000019909216919091179055565b6000546001600160a01b031633146110935760405162461bcd60e51b8152600401610c869061328f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600043821061113f5760405162461bcd60e51b815260206004820152602860248201527f4c4f5650543a3a6765745072696f72566f7465733a206e6f74207965742064656044820152671d195c9b5a5b995960c21b6064820152608401610c86565b6001600160a01b0383166000908152600f602052604090205463ffffffff168061116d576000915050610bed565b6001600160a01b0384166000908152600e602052604081208491611192600185613426565b63ffffffff908116825260208201929092526040016000205416116111fb576001600160a01b0384166000908152600e60205260408120906111d5600184613426565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bed565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205463ffffffff16831015611236576000915050610bed565b600080611244600184613426565b90505b8163ffffffff168163ffffffff16111561130c57600060026112698484613426565b61127391906133cd565b61127d9083613426565b6001600160a01b0388166000908152600e6020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156112e057602001519450610bed9350505050565b805163ffffffff168711156112f757819350611305565b611302600183613426565b92505b5050611247565b506001600160a01b0385166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b905090565b606060058054610b599061344b565b600c546001600160a01b031633146113815760405162461bcd60e51b8152600401610c86906132c4565b610ef88282612706565b600c546001600160a01b031633146113b55760405162461bcd60e51b8152600401610c86906132c4565b604051811515815233907f3ca65588b29182880283bc8778fea5f01b351e01d874839a39a99e1c281a21139060200160405180910390a26008805460ff1916911515919091179055565b600080546001600160a01b0316331461142a5760405162461bcd60e51b8152600401610c869061328f565b611434338361243c565b5060015b919050565b600c546001600160a01b031633146114675760405162461bcd60e51b8152600401610c86906132c4565b600954604080519182526020820183905233917f54c7a13ff01698e4ed3550a23216585f8472c7b1515a932eac98c9a6d48990c5910160405180910390a2600955565b6000610be93384610c4d8560405180606001604052806025815260200161357c602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906123a6565b6000610be9338484611fbf565b60065460009061134390612710906115339061ffff600160281b9091041661152d60035490565b9061280a565b90612889565b600580546115469061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546115729061344b565b80156115bf5780601f10611594576101008083540402835291602001916115bf565b820191906000526020600020905b8154815290600101906020018083116115a257829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604081205463ffffffff16806115f2576000611635565b6001600160a01b0383166000908152600e6020526040812090611616600184613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611667610b4a565b805190602001206116754690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156117a1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118145760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964207369604482015266676e617475726560c81b6064820152608401610c86565b6001600160a01b038116600090815260106020526040812080549161183883613486565b9190505589146118965760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964206e6f6044820152626e636560e81b6064820152608401610c86565b874211156118f65760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a207369676e617475726520604482015266195e1c1a5c995960ca1b6064820152608401610c86565b611900818b612686565b505050505b505050505050565b600c546001600160a01b031633146119375760405162461bcd60e51b8152600401610c86906132c4565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b600480546115469061344b565b6000546001600160a01b031633146119995760405162461bcd60e51b8152600401610c869061328f565b6001600160a01b0381166119fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c86565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314611a835760405162461bcd60e51b8152600401610c86906132c4565b60648161ffff161115611b095760405162461bcd60e51b815260206004820152604260248201527f4c4f5650543a3a7570646174654275726e526174653a204275726e207261746560448201527f206d757374206e6f742065786365656420746865206d6178696d756d20726174606482015261329760f11b608482015260a401610c86565b60065460408051630100000090920461ffff90811683528316602083015233917f3eec69630b6f49d4e10eec296fce4baddec5f34c5430fb2cd72f8c4218f63fd0910160405180910390a26006805461ffff90921663010000000264ffff00000019909216919091179055565b600c546001600160a01b03163314611ba05760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b600c546001600160a01b03163314611be85760405162461bcd60e51b8152600401610c86906132c4565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190613023565b6001600160a01b031663e6a4390530600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd157600080fd5b505afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d099190613023565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611d4f57600080fd5b505afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190613023565b600b80546001600160a01b0319166001600160a01b03929092169182179055611e0e5760405162461bcd60e51b815260206004820152603360248201527f4c4f5650543a3a7570646174654c4f56505453776170526f757465723a20496e6044820152723b30b634b2103830b4b91030b2323932b9b99760691b6064820152608401610c86565b600b54600a546040516001600160a01b03928316929091169033907f75709e8ce9f0a0e0171733889f70ea73353173af8478036a28b898bff335e8e690600090a450565b600c546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b038316611efc5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c86565b6001600160a01b038216611f5d5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c86565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b8282826000611fcc611506565b1115612096576001600160a01b03831660009081526007602052604090205460ff1615801561201457506001600160a01b03821660009081526007602052604090205460ff16155b1561209657612021611506565b8111156120965760405162461bcd60e51b815260206004820152603f60248201527f4c4f5650543a3a616e74695768616c653a205472616e7366657220616d6f756e60448201527f74206578636565647320746865206d61785472616e73666572416d6f756e74006064820152608401610c86565b600b54600160a81b900460ff161580156120be57506000546001600160a01b03878116911614155b1561211457600b546001600160a01b03868116911614156121145760405162461bcd60e51b815260206004820152601060248201526f14d95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610c86565b600b54600160b01b900460ff1615801561213c57506000546001600160a01b03878116911614155b1561219157600b546001600160a01b03878116911614156121915760405162461bcd60e51b815260206004820152600f60248201526e109d5e5a5b99c8191a5cd8589b1959608a1b6044820152606401610c86565b60085460ff16151560011480156121b25750600b54600160a01b900460ff16155b80156121c85750600a546001600160a01b031615155b80156121de5750600b546001600160a01b031615155b80156121f85750600b546001600160a01b03878116911614155b801561221257506000546001600160a01b03878116911614155b1561221f5761221f6128e4565b6001600160a01b03851661dead14806122415750600654610100900461ffff16155b15612256576122518686866129fd565b611905565b6006546000906122789061271090611533908890610100900461ffff1661280a565b60065490915060009061229e906064906115339085906301000000900461ffff1661280a565b905060006122ac8383612b83565b90506122b88183613379565b83146123125760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a7472616e736665723a204275726e2076616c756520696e76616044820152621b1a5960ea1b6064820152608401610c86565b600061231e8885612b83565b905061232a8482613379565b88146123835760405162461bcd60e51b815260206004820152602260248201527f4c4f5650543a3a7472616e736665723a205461782076616c756520696e76616c6044820152611a5960f21b6064820152608401610c86565b6123908a61dead856129fd565b61239b8a30846129fd565b6119008a8a836129fd565b600081848411156123ca5760405162461bcd60e51b8152600401610c86919061323a565b506123d5838561340f565b949350505050565b6000806123ea8385613379565b9050838110156116355760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c86565b6001600160a01b0382166124925760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c86565b60035461249f90826123dd565b6003556001600160a01b0382166000908152600160205260409020546124c590826123dd565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125169085815260200190565b60405180910390a35050565b816001600160a01b0316836001600160a01b0316141580156125445750600081115b15612681576001600160a01b038316156125e7576001600160a01b0383166000908152600f602052604081205463ffffffff1690816125845760006125c7565b6001600160a01b0385166000908152600e60205260408120906125a8600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006125d58285612b83565b90506125e386848484612bdf565b5050505b6001600160a01b03821615612681576001600160a01b0382166000908152600f602052604081205463ffffffff169081612622576000612665565b6001600160a01b0384166000908152600e6020526040812090612646600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061267382856123dd565b905061190585848484612bdf565b505050565b6001600160a01b038281166000818152600d6020818152604080842080546001845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612700828483612522565b50505050565b6001600160a01b0382166127665760405162461bcd60e51b815260206004820152602160248201527f42455032303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c86565b6127a3816040518060600160405280602281526020016135a1602291396001600160a01b03851660009081526001602052604090205491906123a6565b6001600160a01b0383166000908152600160205260409020556003546127c99082612b83565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612516565b60008261281957506000610bed565b600061282583856133f0565b90508261283285836133b9565b146116355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c86565b60008082116128da5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c86565b61163582846133b9565b600b8054600160a01b60ff60a01b199091161790556006805462ffff001981169091553060009081526001602052604081205461010090920461ffff16919061292b611506565b905080821161293a578161293c565b805b915060095482106129d0576009546000612957826002612889565b905060006129658383612b83565b90504761297183612d81565b600061297d4783612b83565b90506129898382612ee2565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505050505b50506006805461ffff9092166101000262ffff0019909216919091179055600b805460ff60a01b19169055565b6001600160a01b038316612a615760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c86565b6001600160a01b038216612ac35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c86565b612b0081604051806060016040528060268152602001613556602691396001600160a01b03861660009081526001602052604090205491906123a6565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612b2f90826123dd565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fb29085815260200190565b600082821115612bd55760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c86565b611635828461340f565b6000612c034360405180606001604052806035815260200161352160359139612fc6565b905060008463ffffffff16118015612c5d57506001600160a01b0385166000908152600e6020526040812063ffffffff831691612c41600188613426565b63ffffffff908116825260208201929092526040016000205416145b15612ca6576001600160a01b0385166000908152600e602052604081208391612c87600188613426565b63ffffffff168152602081019190915260400160002060010155612d36565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600e83528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612d05908590613391565b6001600160a01b0386166000908152600f60205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612db657612db66134cd565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e0a57600080fd5b505afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e429190613023565b81600181518110612e5557612e556134cd565b6001600160a01b039283166020918202929092010152600a54612e7b9130911684611e9a565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612eb4908590600090869030904290600401613308565b600060405180830381600087803b158015612ece57600080fd5b505af1158015611905573d6000803e3d6000fd5b600a54612efa9030906001600160a01b031684611e9a565b600a546001600160a01b031663f305d719823085600080612f23600c546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612fbf919061320c565b5050505050565b6000816401000000008410612fee5760405162461bcd60e51b8152600401610c86919061323a565b509192915050565b8035801515811461143857600080fd5b60006020828403121561301857600080fd5b8135611635816134e3565b60006020828403121561303557600080fd5b8151611635816134e3565b6000806040838503121561305357600080fd5b823561305e816134e3565b9150602083013561306e816134e3565b809150509250929050565b60008060006060848603121561308e57600080fd5b8335613099816134e3565b925060208401356130a9816134e3565b929592945050506040919091013590565b600080604083850312156130cd57600080fd5b82356130d8816134e3565b91506130e660208401612ff6565b90509250929050565b6000806040838503121561310257600080fd5b823561310d816134e3565b946020939093013593505050565b60008060008060008060c0878903121561313457600080fd5b863561313f816134e3565b95506020870135945060408701359350606087013560ff8116811461316357600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561319057600080fd5b823561319b816134e3565b9150602083013563ffffffff8116811461306e57600080fd5b6000602082840312156131c657600080fd5b61163582612ff6565b6000602082840312156131e157600080fd5b813561ffff8116811461163557600080fd5b60006020828403121561320557600080fd5b5035919050565b60008060006060848603121561322157600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156132675785810183015185820160400152820161324b565b81811115613279576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133585784516001600160a01b031683529383019391830191600101613333565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561338c5761338c6134a1565b500190565b600063ffffffff8083168185168083038211156133b0576133b06134a1565b01949350505050565b6000826133c8576133c86134b7565b500490565b600063ffffffff808416806133e4576133e46134b7565b92169190910492915050565b600081600019048311821515161561340a5761340a6134a1565b500290565b600082821015613421576134216134a1565b500390565b600063ffffffff83811690831681811015613443576134436134a1565b039392505050565b600181811c9082168061345f57607f821691505b6020821081141561348057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349a5761349a6134a1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610f2b57600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654c4f5650543a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e20616d6f756e7420657863656564732062616c616e6365a2646970667358221220c9c18ded56748ea31b690985ee4282628fa481e89772cc8f6472753e14adb06464736f6c63430008070033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c8063893d20e8116101c6578063bed99850116100f7578063f1127ed811610095578063f62228071161006f578063f622280714610ad4578063fb37ef5714610af4578063fccc281314610b14578063fce3bbb514610b2a57600080fd5b8063f1127ed814610a30578063f2fde38b14610a94578063f607f2b414610ab457600080fd5b8063d28d8852116100d1578063d28d88521461098b578063d8248358146109a0578063dd62ed3e146109b6578063e7a324dc146109fc57600080fd5b8063bed9985014610929578063c3cda5201461094b578063c7f59a671461096b57600080fd5b8063a392e67411610164578063a9e757231161013e578063a9e75723146108bf578063b09f1266146108d4578063b4b5ea57146108e9578063b65d08b01461090957600080fd5b8063a392e6741461085f578063a457c2d71461087f578063a9059cbb1461089f57600080fd5b806395d89b41116101a057806395d89b41146107ea5780639dc29fac146107ff5780639f9a4e7f1461081f578063a0712d681461083f57600080fd5b8063893d20e8146107ab5780638da5cb5b146107ab578063928bc6a0146107c957600080fd5b80633ff8bf2e116102a05780636a141e2c1161023e578063715018a611610218578063715018a614610729578063782d6fe11461073e5780637b895dfc1461075e5780637ecebe001461077e57600080fd5b80636a141e2c1461068b5780636fcfff45146106ab57806370a08231146106f357600080fd5b8063570ca7351161027a578063570ca735146105e0578063587cde1e146106125780635c19a95c1461064b5780635d2a4fdd1461066b57600080fd5b80633ff8bf2e1461058457806340c10f19146105a65780634a74bb02146105c657600080fd5b8063269f534c1161030d57806332424aa3116102e757806332424aa314610514578063376c23911461052e578063395093511461054e5780633eaaf86b1461056e57600080fd5b8063269f534c1461049357806329605e77146104cc578063313ce567146104ee57600080fd5b80631ad9339a116103495780631ad9339a146103f557806320606b701461041e57806323aed2281461045257806323b872dd1461047357600080fd5b806306fdde031461037b578063095ea7b3146103a657806318160ddd146103d657600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610b4a565b60405161039d919061323a565b60405180910390f35b3480156103b257600080fd5b506103c66103c13660046130ef565b610bdc565b604051901515815260200161039d565b3480156103e257600080fd5b506003545b60405190815260200161039d565b34801561040157600080fd5b5061040b6103e881565b60405161ffff909116815260200161039d565b34801561042a57600080fd5b506103e77f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561045e57600080fd5b50600b546103c690600160a81b900460ff1681565b34801561047f57600080fd5b506103c661048e366004613079565b610bf3565b34801561049f57600080fd5b506103c66104ae366004613006565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156104d857600080fd5b506104ec6104e7366004613006565b610c5c565b005b3480156104fa57600080fd5b5060065460ff165b60405160ff909116815260200161039d565b34801561052057600080fd5b506006546105029060ff1681565b34801561053a57600080fd5b506104ec6105493660046131cf565b610d67565b34801561055a57600080fd5b506103c66105693660046130ef565b610e8e565b34801561057a57600080fd5b506103e760035481565b34801561059057600080fd5b5060065461040b90600160281b900461ffff1681565b3480156105b257600080fd5b506104ec6105c13660046130ef565b610ec4565b3480156105d257600080fd5b506008546103c69060ff1681565b3480156105ec57600080fd5b50600c546001600160a01b03165b6040516001600160a01b03909116815260200161039d565b34801561061e57600080fd5b506105fa61062d366004613006565b6001600160a01b039081166000908152600d60205260409020541690565b34801561065757600080fd5b506104ec610666366004613006565b610f21565b34801561067757600080fd5b50600b546105fa906001600160a01b031681565b34801561069757600080fd5b506104ec6106a63660046131cf565b610f2e565b3480156106b757600080fd5b506106de6106c6366004613006565b600f6020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161039d565b3480156106ff57600080fd5b506103e761070e366004613006565b6001600160a01b031660009081526001602052604090205490565b34801561073557600080fd5b506104ec611069565b34801561074a57600080fd5b506103e76107593660046130ef565b6110dd565b34801561076a57600080fd5b50600a546105fa906001600160a01b031681565b34801561078a57600080fd5b506103e7610799366004613006565b60106020526000908152604090205481565b3480156107b757600080fd5b506000546001600160a01b03166105fa565b3480156107d557600080fd5b50600b546103c690600160b01b900460ff1681565b3480156107f657600080fd5b50610390611348565b34801561080b57600080fd5b506104ec61081a3660046130ef565b611357565b34801561082b57600080fd5b506104ec61083a3660046131b4565b61138b565b34801561084b57600080fd5b506103c661085a3660046131f3565b6113ff565b34801561086b57600080fd5b506104ec61087a3660046131f3565b61143d565b34801561088b57600080fd5b506103c661089a3660046130ef565b6114aa565b3480156108ab57600080fd5b506103c66108ba3660046130ef565b6114f9565b3480156108cb57600080fd5b506103e7611506565b3480156108e057600080fd5b50610390611539565b3480156108f557600080fd5b506103e7610904366004613006565b6115c7565b34801561091557600080fd5b5060065461040b90610100900461ffff1681565b34801561093557600080fd5b5060065461040b906301000000900461ffff1681565b34801561095757600080fd5b506104ec61096636600461311b565b61163c565b34801561097757600080fd5b506104ec6109863660046130ba565b61190d565b34801561099757600080fd5b50610390611962565b3480156109ac57600080fd5b506103e760095481565b3480156109c257600080fd5b506103e76109d1366004613040565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a0857600080fd5b506103e77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610a3c57600080fd5b50610a78610a4b36600461317d565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161039d565b348015610aa057600080fd5b506104ec610aaf366004613006565b61196f565b348015610ac057600080fd5b506104ec610acf3660046131cf565b611a59565b348015610ae057600080fd5b506104ec610aef3660046131b4565b611b76565b348015610b0057600080fd5b506104ec610b0f366004613006565b611bbe565b348015610b2057600080fd5b506105fa61dead81565b348015610b3657600080fd5b506104ec610b453660046131b4565b611e52565b606060048054610b599061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b859061344b565b8015610bd25780601f10610ba757610100808354040283529160200191610bd2565b820191906000526020600020905b815481529060010190602001808311610bb557829003601f168201915b5050505050905090565b6000610be9338484611e9a565b5060015b92915050565b6000610c00848484611fbf565b610c528433610c4d856040518060600160405280602881526020016134f9602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906123a6565b611e9a565b5060019392505050565b600c546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610c86906132c4565b60405180910390fd5b6001600160a01b038116610d0b5760405162461bcd60e51b815260206004820152603960248201527f4c4f5650543a3a7472616e736665724f70657261746f723a206e6577206f706560448201527f7261746f7220697320746865207a65726f2061646472657373000000000000006064820152608401610c86565b600c546040516001600160a01b038084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314610d915760405162461bcd60e51b8152600401610c86906132c4565b6103e861ffff82161115610e275760405162461bcd60e51b815260206004820152605160248201527f4c4f5650543a3a7570646174655472616e73666572546178526174653a20547260448201527f616e73666572207461782072617465206d757374206e6f7420657863656564206064820152703a34329036b0bc34b6bab6903930ba329760791b608482015260a401610c86565b6006546040805161010090920461ffff90811683528316602083015233917fe9d5c8ee2a65d4fb859c680669d8f902172d53e3f15f9f11108a31bbada4b70b910160405180910390a26006805461ffff9092166101000262ffff0019909216919091179055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610be9918590610c4d90866123dd565b6000546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610c869061328f565b610ef8828261243c565b6001600160a01b038083166000908152600d6020526040812054610f1d921683612522565b5050565b610f2b3382612686565b50565b600c546001600160a01b03163314610f585760405162461bcd60e51b8152600401610c86906132c4565b6127108161ffff161115610ffa5760405162461bcd60e51b815260206004820152605e60248201527f4c4f5650543a3a7570646174654d61785472616e73666572416d6f756e74526160448201527f74653a204d6178207472616e7366657220616d6f756e742072617465206d757360648201527f74206e6f742065786365656420746865206d6178696d756d20726174652e0000608482015260a401610c86565b60065460408051600160281b90920461ffff90811683528316602083015233917fb62a50fc861a770636e85357becb3b82a32e911106609d4985871eaf29011e08910160405180910390a26006805461ffff909216600160281b0266ffff000000000019909216919091179055565b6000546001600160a01b031633146110935760405162461bcd60e51b8152600401610c869061328f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600043821061113f5760405162461bcd60e51b815260206004820152602860248201527f4c4f5650543a3a6765745072696f72566f7465733a206e6f74207965742064656044820152671d195c9b5a5b995960c21b6064820152608401610c86565b6001600160a01b0383166000908152600f602052604090205463ffffffff168061116d576000915050610bed565b6001600160a01b0384166000908152600e602052604081208491611192600185613426565b63ffffffff908116825260208201929092526040016000205416116111fb576001600160a01b0384166000908152600e60205260408120906111d5600184613426565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bed565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205463ffffffff16831015611236576000915050610bed565b600080611244600184613426565b90505b8163ffffffff168163ffffffff16111561130c57600060026112698484613426565b61127391906133cd565b61127d9083613426565b6001600160a01b0388166000908152600e6020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156112e057602001519450610bed9350505050565b805163ffffffff168711156112f757819350611305565b611302600183613426565b92505b5050611247565b506001600160a01b0385166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b905090565b606060058054610b599061344b565b600c546001600160a01b031633146113815760405162461bcd60e51b8152600401610c86906132c4565b610ef88282612706565b600c546001600160a01b031633146113b55760405162461bcd60e51b8152600401610c86906132c4565b604051811515815233907f3ca65588b29182880283bc8778fea5f01b351e01d874839a39a99e1c281a21139060200160405180910390a26008805460ff1916911515919091179055565b600080546001600160a01b0316331461142a5760405162461bcd60e51b8152600401610c869061328f565b611434338361243c565b5060015b919050565b600c546001600160a01b031633146114675760405162461bcd60e51b8152600401610c86906132c4565b600954604080519182526020820183905233917f54c7a13ff01698e4ed3550a23216585f8472c7b1515a932eac98c9a6d48990c5910160405180910390a2600955565b6000610be93384610c4d8560405180606001604052806025815260200161357c602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906123a6565b6000610be9338484611fbf565b60065460009061134390612710906115339061ffff600160281b9091041661152d60035490565b9061280a565b90612889565b600580546115469061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546115729061344b565b80156115bf5780601f10611594576101008083540402835291602001916115bf565b820191906000526020600020905b8154815290600101906020018083116115a257829003601f168201915b505050505081565b6001600160a01b0381166000908152600f602052604081205463ffffffff16806115f2576000611635565b6001600160a01b0383166000908152600e6020526040812090611616600184613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611667610b4a565b805190602001206116754690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156117a1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118145760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964207369604482015266676e617475726560c81b6064820152608401610c86565b6001600160a01b038116600090815260106020526040812080549161183883613486565b9190505589146118965760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a64656c656761746542795369673a20696e76616c6964206e6f6044820152626e636560e81b6064820152608401610c86565b874211156118f65760405162461bcd60e51b815260206004820152602760248201527f4c4f5650543a3a64656c656761746542795369673a207369676e617475726520604482015266195e1c1a5c995960ca1b6064820152608401610c86565b611900818b612686565b505050505b505050505050565b600c546001600160a01b031633146119375760405162461bcd60e51b8152600401610c86906132c4565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b600480546115469061344b565b6000546001600160a01b031633146119995760405162461bcd60e51b8152600401610c869061328f565b6001600160a01b0381166119fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c86565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03163314611a835760405162461bcd60e51b8152600401610c86906132c4565b60648161ffff161115611b095760405162461bcd60e51b815260206004820152604260248201527f4c4f5650543a3a7570646174654275726e526174653a204275726e207261746560448201527f206d757374206e6f742065786365656420746865206d6178696d756d20726174606482015261329760f11b608482015260a401610c86565b60065460408051630100000090920461ffff90811683528316602083015233917f3eec69630b6f49d4e10eec296fce4baddec5f34c5430fb2cd72f8c4218f63fd0910160405180910390a26006805461ffff90921663010000000264ffff00000019909216919091179055565b600c546001600160a01b03163314611ba05760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b600c546001600160a01b03163314611be85760405162461bcd60e51b8152600401610c86906132c4565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c749190613023565b6001600160a01b031663e6a4390530600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd157600080fd5b505afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d099190613023565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611d4f57600080fd5b505afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d879190613023565b600b80546001600160a01b0319166001600160a01b03929092169182179055611e0e5760405162461bcd60e51b815260206004820152603360248201527f4c4f5650543a3a7570646174654c4f56505453776170526f757465723a20496e6044820152723b30b634b2103830b4b91030b2323932b9b99760691b6064820152608401610c86565b600b54600a546040516001600160a01b03928316929091169033907f75709e8ce9f0a0e0171733889f70ea73353173af8478036a28b898bff335e8e690600090a450565b600c546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610c86906132c4565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b038316611efc5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c86565b6001600160a01b038216611f5d5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c86565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b8282826000611fcc611506565b1115612096576001600160a01b03831660009081526007602052604090205460ff1615801561201457506001600160a01b03821660009081526007602052604090205460ff16155b1561209657612021611506565b8111156120965760405162461bcd60e51b815260206004820152603f60248201527f4c4f5650543a3a616e74695768616c653a205472616e7366657220616d6f756e60448201527f74206578636565647320746865206d61785472616e73666572416d6f756e74006064820152608401610c86565b600b54600160a81b900460ff161580156120be57506000546001600160a01b03878116911614155b1561211457600b546001600160a01b03868116911614156121145760405162461bcd60e51b815260206004820152601060248201526f14d95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610c86565b600b54600160b01b900460ff1615801561213c57506000546001600160a01b03878116911614155b1561219157600b546001600160a01b03878116911614156121915760405162461bcd60e51b815260206004820152600f60248201526e109d5e5a5b99c8191a5cd8589b1959608a1b6044820152606401610c86565b60085460ff16151560011480156121b25750600b54600160a01b900460ff16155b80156121c85750600a546001600160a01b031615155b80156121de5750600b546001600160a01b031615155b80156121f85750600b546001600160a01b03878116911614155b801561221257506000546001600160a01b03878116911614155b1561221f5761221f6128e4565b6001600160a01b03851661dead14806122415750600654610100900461ffff16155b15612256576122518686866129fd565b611905565b6006546000906122789061271090611533908890610100900461ffff1661280a565b60065490915060009061229e906064906115339085906301000000900461ffff1661280a565b905060006122ac8383612b83565b90506122b88183613379565b83146123125760405162461bcd60e51b815260206004820152602360248201527f4c4f5650543a3a7472616e736665723a204275726e2076616c756520696e76616044820152621b1a5960ea1b6064820152608401610c86565b600061231e8885612b83565b905061232a8482613379565b88146123835760405162461bcd60e51b815260206004820152602260248201527f4c4f5650543a3a7472616e736665723a205461782076616c756520696e76616c6044820152611a5960f21b6064820152608401610c86565b6123908a61dead856129fd565b61239b8a30846129fd565b6119008a8a836129fd565b600081848411156123ca5760405162461bcd60e51b8152600401610c86919061323a565b506123d5838561340f565b949350505050565b6000806123ea8385613379565b9050838110156116355760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c86565b6001600160a01b0382166124925760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c86565b60035461249f90826123dd565b6003556001600160a01b0382166000908152600160205260409020546124c590826123dd565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125169085815260200190565b60405180910390a35050565b816001600160a01b0316836001600160a01b0316141580156125445750600081115b15612681576001600160a01b038316156125e7576001600160a01b0383166000908152600f602052604081205463ffffffff1690816125845760006125c7565b6001600160a01b0385166000908152600e60205260408120906125a8600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006125d58285612b83565b90506125e386848484612bdf565b5050505b6001600160a01b03821615612681576001600160a01b0382166000908152600f602052604081205463ffffffff169081612622576000612665565b6001600160a01b0384166000908152600e6020526040812090612646600185613426565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061267382856123dd565b905061190585848484612bdf565b505050565b6001600160a01b038281166000818152600d6020818152604080842080546001845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612700828483612522565b50505050565b6001600160a01b0382166127665760405162461bcd60e51b815260206004820152602160248201527f42455032303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c86565b6127a3816040518060600160405280602281526020016135a1602291396001600160a01b03851660009081526001602052604090205491906123a6565b6001600160a01b0383166000908152600160205260409020556003546127c99082612b83565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612516565b60008261281957506000610bed565b600061282583856133f0565b90508261283285836133b9565b146116355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c86565b60008082116128da5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c86565b61163582846133b9565b600b8054600160a01b60ff60a01b199091161790556006805462ffff001981169091553060009081526001602052604081205461010090920461ffff16919061292b611506565b905080821161293a578161293c565b805b915060095482106129d0576009546000612957826002612889565b905060006129658383612b83565b90504761297183612d81565b600061297d4783612b83565b90506129898382612ee2565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505050505b50506006805461ffff9092166101000262ffff0019909216919091179055600b805460ff60a01b19169055565b6001600160a01b038316612a615760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c86565b6001600160a01b038216612ac35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c86565b612b0081604051806060016040528060268152602001613556602691396001600160a01b03861660009081526001602052604090205491906123a6565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612b2f90826123dd565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fb29085815260200190565b600082821115612bd55760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c86565b611635828461340f565b6000612c034360405180606001604052806035815260200161352160359139612fc6565b905060008463ffffffff16118015612c5d57506001600160a01b0385166000908152600e6020526040812063ffffffff831691612c41600188613426565b63ffffffff908116825260208201929092526040016000205416145b15612ca6576001600160a01b0385166000908152600e602052604081208391612c87600188613426565b63ffffffff168152602081019190915260400160002060010155612d36565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600e83528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612d05908590613391565b6001600160a01b0386166000908152600f60205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612db657612db66134cd565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e0a57600080fd5b505afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e429190613023565b81600181518110612e5557612e556134cd565b6001600160a01b039283166020918202929092010152600a54612e7b9130911684611e9a565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612eb4908590600090869030904290600401613308565b600060405180830381600087803b158015612ece57600080fd5b505af1158015611905573d6000803e3d6000fd5b600a54612efa9030906001600160a01b031684611e9a565b600a546001600160a01b031663f305d719823085600080612f23600c546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612fbf919061320c565b5050505050565b6000816401000000008410612fee5760405162461bcd60e51b8152600401610c86919061323a565b509192915050565b8035801515811461143857600080fd5b60006020828403121561301857600080fd5b8135611635816134e3565b60006020828403121561303557600080fd5b8151611635816134e3565b6000806040838503121561305357600080fd5b823561305e816134e3565b9150602083013561306e816134e3565b809150509250929050565b60008060006060848603121561308e57600080fd5b8335613099816134e3565b925060208401356130a9816134e3565b929592945050506040919091013590565b600080604083850312156130cd57600080fd5b82356130d8816134e3565b91506130e660208401612ff6565b90509250929050565b6000806040838503121561310257600080fd5b823561310d816134e3565b946020939093013593505050565b60008060008060008060c0878903121561313457600080fd5b863561313f816134e3565b95506020870135945060408701359350606087013560ff8116811461316357600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561319057600080fd5b823561319b816134e3565b9150602083013563ffffffff8116811461306e57600080fd5b6000602082840312156131c657600080fd5b61163582612ff6565b6000602082840312156131e157600080fd5b813561ffff8116811461163557600080fd5b60006020828403121561320557600080fd5b5035919050565b60008060006060848603121561322157600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156132675785810183015185820160400152820161324b565b81811115613279576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133585784516001600160a01b031683529383019391830191600101613333565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561338c5761338c6134a1565b500190565b600063ffffffff8083168185168083038211156133b0576133b06134a1565b01949350505050565b6000826133c8576133c86134b7565b500490565b600063ffffffff808416806133e4576133e46134b7565b92169190910492915050565b600081600019048311821515161561340a5761340a6134a1565b500290565b600082821015613421576134216134a1565b500390565b600063ffffffff83811690831681811015613443576134436134a1565b039392505050565b600181811c9082168061345f57607f821691505b6020821081141561348057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349a5761349a6134a1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610f2b57600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654c4f5650543a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e20616d6f756e7420657863656564732062616c616e6365a2646970667358221220c9c18ded56748ea31b690985ee4282628fa481e89772cc8f6472753e14adb06464736f6c63430008070033

Deployed Bytecode Sourcemap

39102:21404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31205:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32692:161;;;;;;;;;;-1:-1:-1;32692:161:0;;;;;:::i;:::-;;:::i;:::-;;;5946:14:1;;5939:22;5921:41;;5909:2;5894:18;32692:161:0;5781:187:1;31681:100:0;;;;;;;;;;-1:-1:-1;31761:12:0;;31681:100;;;6119:25:1;;;6107:2;6092:18;31681:100:0;5973:177:1;39414:55:0;;;;;;;;;;;;39465:4;39414:55;;;;;19308:6:1;19296:19;;;19278:38;;19266:2;19251:18;39414:55:0;19134:188:1;52910:122:0;;;;;;;;;;;;52952:80;52910:122;;40322:19;;;;;;;;;;-1:-1:-1;40322:19:0;;;;-1:-1:-1;;;40322:19:0;;;;;;33324:397;;;;;;;;;;-1:-1:-1;33324:397:0;;;;;:::i;:::-;;:::i;48165:136::-;;;;;;;;;;-1:-1:-1;48165:136:0;;;;;:::i;:::-;-1:-1:-1;;;;;48261:32:0;48237:4;48261:32;;;:22;:32;;;;;;;;;48165:136;51621:274;;;;;;;;;;-1:-1:-1;51621:274:0;;;;;:::i;:::-;;:::i;:::-;;31364:92;;;;;;;;;;-1:-1:-1;31439:9:0;;;;31364:92;;;22002:4:1;21990:17;;;21972:36;;21960:2;21945:18;31364:92:0;21830:184:1;30488:22:0;;;;;;;;;;-1:-1:-1;30488:22:0;;;;;;;;48517:364;;;;;;;;;;-1:-1:-1;48517:364:0;;;;;:::i;:::-;;:::i;34129:210::-;;;;;;;;;;-1:-1:-1;34129:210:0;;;;;:::i;:::-;;:::i;30398:27::-;;;;;;;;;;;;;;;;39671:40;;;;;;;;;;-1:-1:-1;39671:40:0;;;;-1:-1:-1;;;39671:40:0;;;;;;42715:162;;;;;;;;;;-1:-1:-1;42715:162:0;;;;;:::i;:::-;;:::i;39870:41::-;;;;;;;;;;-1:-1:-1;39870:41:0;;;;;;;;51376:85;;;;;;;;;;-1:-1:-1;51444:9:0;;-1:-1:-1;;;;;51444:9:0;51376:85;;;-1:-1:-1;;;;;4816:32:1;;;4798:51;;4786:2;4771:18;51376:85:0;4652:203:1;53893:149:0;;;;;;;;;;-1:-1:-1;53893:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;54013:21:0;;;53981:7;54013:21;;;:10;:21;;;;;;;;53893:149;54186:104;;;;;;;;;;-1:-1:-1;54186:104:0;;;;;:::i;:::-;;:::i;40195:28::-;;;;;;;;;;-1:-1:-1;40195:28:0;;;;-1:-1:-1;;;;;40195:28:0;;;49393:405;;;;;;;;;;-1:-1:-1;49393:405:0;;;;;:::i;:::-;;:::i;52788:49::-;;;;;;;;;;-1:-1:-1;52788:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21539:10:1;21527:23;;;21509:42;;21497:2;21482:18;52788:49:0;21365:192:1;31843:119:0;;;;;;;;;;-1:-1:-1;31843:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;31936:18:0;31909:7;31936:18;;;:9;:18;;;;;;;31843:119;29591:148;;;;;;;;;;;;;:::i;56804:1254::-;;;;;;;;;;-1:-1:-1;56804:1254:0;;;;;:::i;:::-;;:::i;40122:41::-;;;;;;;;;;-1:-1:-1;40122:41:0;;;;-1:-1:-1;;;;;40122:41:0;;;53324:39;;;;;;;;;;-1:-1:-1;53324:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;31048:94;;;;;;;;;;-1:-1:-1;31100:7:0;29013:6;-1:-1:-1;;;;;29013:6:0;31048:94;;40374:18;;;;;;;;;;-1:-1:-1;40374:18:0;;;;-1:-1:-1;;;40374:18:0;;;;;;31521:96;;;;;;;;;;;;;:::i;42975:165::-;;;;;;;;;;-1:-1:-1;42975:165:0;;;;;:::i;:::-;;:::i;50545:189::-;;;;;;;;;;-1:-1:-1;50545:189:0;;;;;:::i;:::-;;:::i;35370:130::-;;;;;;;;;;-1:-1:-1;35370:130:0;;;;;:::i;:::-;;:::i;49923:209::-;;;;;;;;;;-1:-1:-1;49923:209:0;;;;;:::i;:::-;;:::i;34841:311::-;;;;;;;;;;-1:-1:-1;34841:311:0;;;;;:::i;:::-;;:::i;32174:167::-;;;;;;;;;;-1:-1:-1;32174:167:0;;;;;:::i;:::-;;:::i;47935:136::-;;;;;;;;;;;;;:::i;30460:21::-;;;;;;;;;;;;;:::i;56118:255::-;;;;;;;;;;-1:-1:-1;56118:255:0;;;;;:::i;:::-;;:::i;39224:35::-;;;;;;;;;;-1:-1:-1;39224:35:0;;;;;;;;;;;39344:27;;;;;;;;;;-1:-1:-1;39344:27:0;;;;;;;;;;;54724:1193;;;;;;;;;;-1:-1:-1;54724:1193:0;;;;;:::i;:::-;;:::i;50269:151::-;;;;;;;;;;-1:-1:-1;50269:151:0;;;;;:::i;:::-;;:::i;30434:19::-;;;;;;;;;;;;;:::i;39970:45::-;;;;;;;;;;;;;;;;32403:143;;;;;;;;;;-1:-1:-1;32403:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;32511:18:0;;;32484:7;32511:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32403:143;53126:117;;;;;;;;;;;;53172:71;53126:117;;52649:70;;;;;;;;;;-1:-1:-1;52649:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21764:10:1;21752:23;;;21734:42;;21807:2;21792:18;;21785:34;;;;21707:18;52649:70:0;21562:263:1;29894:244:0;;;;;;;;;;-1:-1:-1;29894:244:0;;;;;:::i;:::-;;:::i;48994:271::-;;;;;;;;;;-1:-1:-1;48994:271:0;;;;;:::i;:::-;;:::i;43419:86::-;;;;;;;;;;-1:-1:-1;43419:86:0;;;;;:::i;:::-;;:::i;50849:443::-;;;;;;;;;;-1:-1:-1;50849:443:0;;;;;:::i;:::-;;:::i;39497:81::-;;;;;;;;;;;;39536:42;39497:81;;43236:88;;;;;;;;;;-1:-1:-1;43236:88:0;;;;;:::i;:::-;;:::i;31205:92::-;31251:13;31284:5;31277:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31205:92;:::o;32692:161::-;32767:4;32784:39;27608:10;32807:7;32816:6;32784:8;:39::i;:::-;-1:-1:-1;32841:4:0;32692:161;;;;;:::o;33324:397::-;33456:4;33473:36;33483:6;33491:9;33502:6;33473:9;:36::i;:::-;33520:171;33543:6;27608:10;33591:89;33629:6;33591:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33591:19:0;;;;;;:11;:19;;;;;;;;27608:10;33591:33;;;;;;;;;;:37;:89::i;:::-;33520:8;:171::i;:::-;-1:-1:-1;33709:4:0;33324:397;;;;;:::o;51621:274::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;51707:25:0;::::1;51699:95;;;::::0;-1:-1:-1;;;51699:95:0;;17755:2:1;51699:95:0::1;::::0;::::1;17737:21:1::0;17794:2;17774:18;;;17767:30;17833:34;17813:18;;;17806:62;17904:27;17884:18;;;17877:55;17949:19;;51699:95:0::1;17553:421:1::0;51699:95:0::1;51830:9;::::0;51810:43:::1;::::0;-1:-1:-1;;;;;51810:43:0;;::::1;::::0;51830:9:::1;::::0;51810:43:::1;::::0;51830:9:::1;::::0;51810:43:::1;51864:9;:23:::0;;-1:-1:-1;;;;;;51864:23:0::1;-1:-1:-1::0;;;;;51864:23:0;;;::::1;::::0;;;::::1;::::0;;51621:274::o;48517:364::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;39465:4:::1;48612:45;::::0;::::1;;;48604:139;;;::::0;-1:-1:-1;;;48604:139:0;;12470:2:1;48604:139:0::1;::::0;::::1;12452:21:1::0;12509:2;12489:18;;;12482:30;12548:34;12528:18;;;12521:62;12619:34;12599:18;;;12592:62;-1:-1:-1;;;12670:19:1;;;12663:48;12728:19;;48604:139:0::1;12268:485:1::0;48604:139:0::1;48794:15;::::0;48759:69:::1;::::0;;48794:15:::1;::::0;;::::1;;::::0;;::::1;19524:34:1::0;;19594:15;;19589:2;19574:18;;19567:43;48782:10:0::1;::::0;48759:69:::1;::::0;19472:18:1;48759:69:0::1;;;;;;;48839:15;:34:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;48839:34:0;;::::1;::::0;;;::::1;::::0;;48517:364::o;34129:210::-;27608:10;34209:4;34258:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;34258:34:0;;;;;;;;;;34209:4;;34226:83;;34249:7;;34258:50;;34297:10;34258:38;:50::i;42715:162::-;28986:7;29013:6;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;42787:19:::1;42793:3;42798:7;42787:5;:19::i;:::-;-1:-1:-1::0;;;;;42844:15:0;;::::1;42840:1;42844:15:::0;;;:10:::1;:15;::::0;;;;;42817:52:::1;::::0;42844:15:::1;42861:7:::0;42817:14:::1;:52::i;:::-;42715:162:::0;;:::o;54186:104::-;54250:32;54260:10;54272:9;54250;:32::i;:::-;54186:104;:::o;49393:405::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;49526:5:::1;49500:22;:31;;;;49492:138;;;::::0;-1:-1:-1;;;49492:138:0;;13319:2:1;49492:138:0::1;::::0;::::1;13301:21:1::0;13358:2;13338:18;;;13331:30;13397:34;13377:18;;;13370:62;13468:34;13448:18;;;13441:62;13540:32;13519:19;;;13512:61;13590:19;;49492:138:0::1;13117:498:1::0;49492:138:0::1;49687:21;::::0;49646:87:::1;::::0;;-1:-1:-1;;;49687:21:0;;::::1;;::::0;;::::1;19524:34:1::0;;19594:15;;19589:2;19574:18;;19567:43;49675:10:0::1;::::0;49646:87:::1;::::0;19472:18:1;49646:87:0::1;;;;;;;49744:21;:46:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;49744:46:0::1;-1:-1:-1::0;;49744:46:0;;::::1;::::0;;;::::1;::::0;;49393:405::o;29591:148::-;28986:7;29013:6;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;29698:1:::1;29682:6:::0;;29661:40:::1;::::0;-1:-1:-1;;;;;29682:6:0;;::::1;::::0;29661:40:::1;::::0;29698:1;;29661:40:::1;29729:1;29712:19:::0;;-1:-1:-1;;;;;;29712:19:0::1;::::0;;29591:148::o;56804:1254::-;56912:7;56959:12;56945:11;:26;56937:79;;;;-1:-1:-1;;;56937:79:0;;11360:2:1;56937:79:0;;;11342:21:1;11399:2;11379:18;;;11372:30;11438:34;11418:18;;;11411:62;-1:-1:-1;;;11489:18:1;;;11482:38;11537:19;;56937:79:0;11158:404:1;56937:79:0;-1:-1:-1;;;;;57051:23:0;;57029:19;57051:23;;;:14;:23;;;;;;;;57089:17;57085:58;;57130:1;57123:8;;;;;57085:58;-1:-1:-1;;;;;57203:20:0;;;;;;:11;:20;;;;;57255:11;;57224:16;57239:1;57224:12;:16;:::i;:::-;57203:38;;;;;;;;;;;;;;;-1:-1:-1;57203:38:0;:48;;:63;57199:147;;-1:-1:-1;;;;;57290:20:0;;;;;;:11;:20;;;;;;57311:16;57326:1;57311:12;:16;:::i;:::-;57290:38;;;;;;;;;;;;;;;:44;;;57283:51;;;;;57199:147;-1:-1:-1;;;;;57407:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;57403:88:0;;;57478:1;57471:8;;;;;57403:88;57503:12;;57545:16;57560:1;57545:12;:16;:::i;:::-;57530:31;;57572:428;57587:5;57579:13;;:5;:13;;;57572:428;;;57609:13;57651:1;57634:13;57642:5;57634;:13;:::i;:::-;57633:19;;;;:::i;:::-;57625:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;57717:20:0;;57694;57717;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;57694:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;57609:43;;-1:-1:-1;57764:27:0;;57760:229;;;57819:8;;;;-1:-1:-1;57812:15:0;;-1:-1:-1;;;;57812:15:0;57760:229;57853:12;;:26;;;-1:-1:-1;57849:140:0;;;57908:6;57900:14;;57849:140;;;57963:10;57972:1;57963:6;:10;:::i;:::-;57955:18;;57849:140;57594:406;;57572:428;;;-1:-1:-1;;;;;;58017:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;56804:1254:0;;;;:::o;31127:7::-;31120:14;;31048:94;:::o;31521:96::-;31569:13;31602:7;31595:14;;;;;:::i;42975:165::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;43050:19:::1;43056:3;43061:7;43050:5;:19::i;50545:189::-:0;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;50633:50:::1;::::0;5946:14:1;;5939:22;5921:41;;50662:10:0::1;::::0;50633:50:::1;::::0;5909:2:1;5894:18;50633:50:0::1;;;;;;;50694:21;:32:::0;;-1:-1:-1;;50694:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50545:189::o;35370:130::-;35426:4;29013:6;;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;35443:27:::1;27608:10:::0;35463:6:::1;35443:5;:27::i;:::-;-1:-1:-1::0;35488:4:0::1;29231:1;35370:130:::0;;;:::o;49923:209::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;50051:18:::1;::::0;50013:69:::1;::::0;;20962:25:1;;;21018:2;21003:18;;20996:34;;;50039:10:0::1;::::0;50013:69:::1;::::0;20935:18:1;50013:69:0::1;;;;;;;50093:18;:31:::0;49923:209::o;34841:311::-;34926:4;34943:179;27608:10;34993:7;35015:96;35054:15;35015:96;;;;;;;;;;;;;;;;;27608:10;35015:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;35015:34:0;;;;;;;;;;;;:38;:96::i;32174:167::-;32252:4;32269:42;27608:10;32293:9;32304:6;32269:9;:42::i;47935:136::-;48030:21;;47985:7;;48012:51;;48057:5;;48012:40;;48030:21;-1:-1:-1;;;48030:21:0;;;;48012:13;31761:12;;;31681:100;48012:13;:17;;:40::i;:::-;:44;;:51::i;30460:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56118:255::-;-1:-1:-1;;;;;56257:23:0;;56210:7;56257:23;;;:14;:23;;;;;;;;56298:16;:67;;56364:1;56298:67;;;-1:-1:-1;;;;;56317:20:0;;;;;;:11;:20;;;;;;56338:16;56353:1;56338:12;:16;:::i;:::-;56317:38;;;;;;;;;;;;;;;:44;;;56298:67;56291:74;56118:255;-1:-1:-1;;;56118:255:0:o;54724:1193::-;54917:23;52952:80;55046:6;:4;:6::i;:::-;55030:24;;;;;;55073:12;60460:9;;60350:153;55073:12;54967:165;;;;;;;6808:25:1;;;;6849:18;;;6842:34;;;;6892:18;;;6885:34;;;;55112:4:0;6935:18:1;;;;6928:60;;;;54967:165:0;;;;;;;;;;6780:19:1;;;54967:165:0;;54943:200;;;;;;53172:71;55201:140;;;6386:25:1;-1:-1:-1;;;;;6447:32:1;;6427:18;;;6420:60;6496:18;;;6489:34;;;6539:18;;;;6532:34;;;55201:140:0;;;;;;;;;;6358:19:1;;;55201:140:0;;;55177:175;;;;;;;-1:-1:-1;;;55406:123:0;;;4513:27:1;4556:11;;;4549:27;;;4592:12;;;4585:28;;;54943:200:0;;-1:-1:-1;;;4629:12:1;;55406:123:0;;;-1:-1:-1;;55406:123:0;;;;;;;;;55382:158;;55406:123;55382:158;;;;55553:17;55573:26;;;;;;;;;7226:25:1;;;7299:4;7287:17;;7267:18;;;7260:45;;;;7321:18;;;7314:34;;;7364:18;;;7357:34;;;55382:158:0;;-1:-1:-1;55553:17:0;55573:26;;7198:19:1;;55573:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55573:26:0;;-1:-1:-1;;55573:26:0;;;-1:-1:-1;;;;;;;55618:23:0;;55610:75;;;;-1:-1:-1;;;55610:75:0;;14581:2:1;55610:75:0;;;14563:21:1;14620:2;14600:18;;;14593:30;14659:34;14639:18;;;14632:62;-1:-1:-1;;;14710:18:1;;;14703:37;14757:19;;55610:75:0;14379:403:1;55610:75:0;-1:-1:-1;;;;;55713:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;55704:5;:28;55696:76;;;;-1:-1:-1;;;55696:76:0;;8915:2:1;55696:76:0;;;8897:21:1;8954:2;8934:18;;;8927:30;8993:34;8973:18;;;8966:62;-1:-1:-1;;;9044:18:1;;;9037:33;9087:19;;55696:76:0;8713:399:1;55696:76:0;55810:6;55791:15;:25;;55783:77;;;;-1:-1:-1;;;55783:77:0;;18181:2:1;55783:77:0;;;18163:21:1;18220:2;18200:18;;;18193:30;18259:34;18239:18;;;18232:62;-1:-1:-1;;;18310:18:1;;;18303:37;18357:19;;55783:77:0;17979:403:1;55783:77:0;55878:31;55888:9;55899;55878;:31::i;:::-;55871:38;;;;54724:1193;;;;;;;:::o;50269:151::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50368:32:0;;;::::1;;::::0;;;:22:::1;:32;::::0;;;;:44;;-1:-1:-1;;50368:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50269:151::o;30434:19::-;;;;;;;:::i;29894:244::-;28986:7;29013:6;-1:-1:-1;;;;;29013:6:0;27608:10;29160:23;29152:68;;;;-1:-1:-1;;;29152:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29983:22:0;::::1;29975:73;;;::::0;-1:-1:-1;;;29975:73:0;;10533:2:1;29975:73:0::1;::::0;::::1;10515:21:1::0;10572:2;10552:18;;;10545:30;10611:34;10591:18;;;10584:62;-1:-1:-1;;;10662:18:1;;;10655:36;10708:19;;29975:73:0::1;10331:402:1::0;29975:73:0::1;30085:6;::::0;;30064:38:::1;::::0;-1:-1:-1;;;;;30064:38:0;;::::1;::::0;30085:6;::::1;::::0;30064:38:::1;::::0;::::1;30113:6;:17:::0;;-1:-1:-1;;;;;;30113:17:0::1;-1:-1:-1::0;;;;;30113:17:0;;;::::1;::::0;;;::::1;::::0;;29894:244::o;48994:271::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;49088:3:::1;49075:9;:16;;;;49067:95;;;::::0;-1:-1:-1;;;49067:95:0;;8440:2:1;49067:95:0::1;::::0;::::1;8422:21:1::0;8479:2;8459:18;;;8452:30;8518:34;8498:18;;;8491:62;8589:34;8569:18;;;8562:62;-1:-1:-1;;;8640:19:1;;;8633:33;8683:19;;49067:95:0::1;8238:470:1::0;49067:95:0::1;49206:8;::::0;49178:48:::1;::::0;;49206:8;;;::::1;;::::0;;::::1;19524:34:1::0;;19594:15;;19589:2;19574:18;;19567:43;49194:10:0::1;::::0;49178:48:::1;::::0;19472:18:1;49178:48:0::1;;;;;;;49237:8;:20:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;49237:20:0;;::::1;::::0;;;::::1;::::0;;48994:271::o;43419:86::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;43482:6:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;43482:15:0::1;-1:-1:-1::0;;;;43482:15:0;;::::1;::::0;;;::::1;::::0;;43419:86::o;50849:443::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;50928:15:::1;:45:::0;;-1:-1:-1;;;;;;50928:45:0::1;-1:-1:-1::0;;;;;50928:45:0;::::1;::::0;;::::1;::::0;;;51018:25:::1;::::0;;-1:-1:-1;;;51018:25:0;;;;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;50928:45;51018:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51000:52:0::1;;51061:4;51068:15;;;;;;;;;-1:-1:-1::0;;;;;51068:15:0::1;-1:-1:-1::0;;;;;51068:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51000:91;::::0;-1:-1:-1;;;;;;51000:91:0::1;::::0;;;;;;-1:-1:-1;;;;;5090:15:1;;;51000:91:0::1;::::0;::::1;5072:34:1::0;5142:15;;5122:18;;;5115:43;5007:18;;51000:91:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50984:13;:107:::0;;-1:-1:-1;;;;;;50984:107:0::1;-1:-1:-1::0;;;;;50984:107:0;;;::::1;::::0;;::::1;::::0;;51102:91:::1;;;::::0;-1:-1:-1;;;51102:91:0;;10940:2:1;51102:91:0::1;::::0;::::1;10922:21:1::0;10979:2;10959:18;;;10952:30;11018:34;10998:18;;;10991:62;-1:-1:-1;;;11069:18:1;;;11062:49;11128:19;;51102:91:0::1;10738:415:1::0;51102:91:0::1;51270:13;::::0;51252:15:::1;::::0;51209:75:::1;::::0;-1:-1:-1;;;;;51270:13:0;;::::1;::::0;51252:15;;::::1;::::0;51232:10:::1;::::0;51209:75:::1;::::0;51270:13:::1;::::0;51209:75:::1;50849:443:::0;:::o;43236:88::-;41342:9;;-1:-1:-1;;;;;41342:9:0;41355:10;41342:23;41334:72;;;;-1:-1:-1;;;41334:72:0;;;;;;;:::i;:::-;43300:7:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;43300:16:0::1;-1:-1:-1::0;;;;43300:16:0;;::::1;::::0;;;::::1;::::0;;43236:88::o;38212:372::-;-1:-1:-1;;;;;38340:19:0;;38332:68;;;;-1:-1:-1;;;38332:68:0;;10128:2:1;38332:68:0;;;10110:21:1;10167:2;10147:18;;;10140:30;10206:34;10186:18;;;10179:62;-1:-1:-1;;;10257:18:1;;;10250:34;10301:19;;38332:68:0;9926:400:1;38332:68:0;-1:-1:-1;;;;;38419:21:0;;38411:68;;;;-1:-1:-1;;;38411:68:0;;18589:2:1;38411:68:0;;;18571:21:1;18628:2;18608:18;;;18601:30;18667:34;18647:18;;;18640:62;-1:-1:-1;;;18718:18:1;;;18711:32;18760:19;;38411:68:0;18387:398:1;38411:68:0;-1:-1:-1;;;;;38492:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;38544:32;;6119:25:1;;;38544:32:0;;6092:18:1;38544:32:0;;;;;;;;38212:372;;;:::o;43583:1710::-;43689:6;43697:9;43708:6;41541:1;41519:19;:17;:19::i;:::-;:23;41515:335;;;-1:-1:-1;;;;;41581:30:0;;;;;;:22;:30;;;;;;;;:39;;;:102;;-1:-1:-1;;;;;;41641:33:0;;;;;;:22;:33;;;;;;;;:42;41581:102;41559:280;;;41736:19;:17;:19::i;:::-;41726:6;:29;;41718:105;;;;-1:-1:-1;;;41718:105:0;;14989:2:1;41718:105:0;;;14971:21:1;15028:2;15008:18;;;15001:30;15067:34;15047:18;;;15040:62;15138:33;15118:18;;;15111:61;15189:19;;41718:105:0;14787:427:1;41718:105:0;43731:7:::1;::::0;-1:-1:-1;;;43731:7:0;::::1;;;43730:8;:29:::0;::::1;;;-1:-1:-1::0;28986:7:0;29013:6;-1:-1:-1;;;;;43742:17:0;;::::1;29013:6:::0;;43742:17:::1;;43730:29;43727:114;;;43796:13;::::0;-1:-1:-1;;;;;43783:26:0;;::::1;43796:13:::0;::::1;43783:26;;43775:54;;;::::0;-1:-1:-1;;;43775:54:0;;12125:2:1;43775:54:0::1;::::0;::::1;12107:21:1::0;12164:2;12144:18;;;12137:30;-1:-1:-1;;;12183:18:1;;;12176:46;12239:18;;43775:54:0::1;11923:340:1::0;43775:54:0::1;43855:6;::::0;-1:-1:-1;;;43855:6:0;::::1;;;43854:7;:28:::0;::::1;;;-1:-1:-1::0;28986:7:0;29013:6;-1:-1:-1;;;;;43865:17:0;;::::1;29013:6:::0;;43865:17:::1;;43854:28;43851:109;;;43916:13;::::0;-1:-1:-1;;;;;43906:23:0;;::::1;43916:13:::0;::::1;43906:23;;43898:50;;;::::0;-1:-1:-1;;;43898:50:0;;18992:2:1;43898:50:0::1;::::0;::::1;18974:21:1::0;19031:2;19011:18;;;19004:30;-1:-1:-1;;;19050:18:1;;;19043:45;19105:18;;43898:50:0::1;18790:339:1::0;43898:50:0::1;44027:21;::::0;::::1;;:29;;:21:::0;:29:::1;:72:::0;::::1;;;-1:-1:-1::0;44073:17:0::1;::::0;-1:-1:-1;;;44073:17:0;::::1;;;:26;44027:72;:127;;;;-1:-1:-1::0;44124:15:0::1;::::0;-1:-1:-1;;;;;44124:15:0::1;44116:38:::0;::::1;44027:127;:171;;;;-1:-1:-1::0;44171:13:0::1;::::0;-1:-1:-1;;;;;44171:13:0::1;:27:::0;::::1;44027:171;:211;;;;-1:-1:-1::0;44225:13:0::1;::::0;-1:-1:-1;;;;;44215:23:0;;::::1;44225:13:::0;::::1;44215:23;;44027:211;:245;;;;-1:-1:-1::0;28986:7:0;29013:6;-1:-1:-1;;;;;44255:17:0;;::::1;29013:6:::0;;44255:17:::1;;44027:245;44009:318;;;44299:16;:14;:16::i;:::-;-1:-1:-1::0;;;;;44343:25:0;::::1;39536:42;44343:25;::::0;:49:::1;;-1:-1:-1::0;44372:15:0::1;::::0;::::1;::::0;::::1;;;:20:::0;44343:49:::1;44339:947;;;44409:42;44425:6;44433:9;44444:6;44409:15;:42::i;:::-;44339:947;;;44567:15;::::0;44536:17:::1;::::0;44556:38:::1;::::0;44588:5:::1;::::0;44556:27:::1;::::0;:6;;44567:15:::1;::::0;::::1;;;44556:10;:27::i;:38::-;44644:8;::::0;44536:58;;-1:-1:-1;44609:18:0::1;::::0;44630:32:::1;::::0;44658:3:::1;::::0;44630:23:::1;::::0;44536:58;;44644:8;;::::1;;;44630:13;:23::i;:32::-;44609:53:::0;-1:-1:-1;44677:23:0::1;44703:25;:9:::0;44609:53;44703:13:::1;:25::i;:::-;44677:51:::0;-1:-1:-1;44764:28:0::1;44677:51:::0;44764:10;:28:::1;:::i;:::-;44751:9;:41;44743:89;;;::::0;-1:-1:-1;;;44743:89:0;;13822:2:1;44743:89:0::1;::::0;::::1;13804:21:1::0;13861:2;13841:18;;;13834:30;13900:34;13880:18;;;13873:62;-1:-1:-1;;;13951:18:1;;;13944:33;13994:19;;44743:89:0::1;13620:399:1::0;44743:89:0::1;44907:18;44928:21;:6:::0;44939:9;44928:10:::1;:21::i;:::-;44907:42:::0;-1:-1:-1;44982:22:0::1;44995:9:::0;44907:42;44982:22:::1;:::i;:::-;44972:6;:32;44964:79;;;::::0;-1:-1:-1;;;44964:79:0;;9725:2:1;44964:79:0::1;::::0;::::1;9707:21:1::0;9764:2;9744:18;;;9737:30;9803:34;9783:18;;;9776:62;-1:-1:-1;;;9854:18:1;;;9847:32;9896:19;;44964:79:0::1;9523:398:1::0;44964:79:0::1;45060:49;45076:6;39536:42;45098:10;45060:15;:49::i;:::-;45124:55;45140:6;45156:4;45163:15;45124;:55::i;:::-;45194:46;45210:6;45218:9;45229:10;45194:15;:46::i;21920:166::-:0;22006:7;22042:12;22034:6;;;;22026:29;;;;-1:-1:-1;;;22026:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22073:5:0;22077:1;22073;:5;:::i;:::-;22066:12;21920:166;-1:-1:-1;;;;21920:166:0:o;19093:179::-;19151:7;;19183:5;19187:1;19183;:5;:::i;:::-;19171:17;;19212:1;19207;:6;;19199:46;;;;-1:-1:-1;;;19199:46:0;;11769:2:1;19199:46:0;;;11751:21:1;11808:2;11788:18;;;11781:30;11847:29;11827:18;;;11820:57;11894:18;;19199:46:0;11567:351:1;36784:308:0;-1:-1:-1;;;;;36860:21:0;;36852:65;;;;-1:-1:-1;;;36852:65:0;;15823:2:1;36852:65:0;;;15805:21:1;15862:2;15842:18;;;15835:30;15901:33;15881:18;;;15874:61;15952:18;;36852:65:0;15621:355:1;36852:65:0;36945:12;;:24;;36962:6;36945:16;:24::i;:::-;36930:12;:39;-1:-1:-1;;;;;37001:18:0;;;;;;:9;:18;;;;;;:30;;37024:6;37001:22;:30::i;:::-;-1:-1:-1;;;;;36980:18:0;;;;;;:9;:18;;;;;;:51;;;;37047:37;;36980:18;;;37047:37;;;;37077:6;6119:25:1;;6107:2;6092:18;;5973:177;37047:37:0;;;;;;;;36784:308;;:::o;58513:947::-;58619:6;-1:-1:-1;;;;;58609:16:0;:6;-1:-1:-1;;;;;58609:16:0;;;:30;;;;;58638:1;58629:6;:10;58609:30;58605:848;;;-1:-1:-1;;;;;58660:20:0;;;58656:385;;-1:-1:-1;;;;;58768:22:0;;58749:16;58768:22;;;:14;:22;;;;;;;;;58829:13;:60;;58888:1;58829:60;;;-1:-1:-1;;;;;58845:19:0;;;;;;:11;:19;;;;;;58865:13;58877:1;58865:9;:13;:::i;:::-;58845:34;;;;;;;;;;;;;;;:40;;;58829:60;58809:80;-1:-1:-1;58908:17:0;58928:21;58809:80;58942:6;58928:13;:21::i;:::-;58908:41;;58968:57;58985:6;58993:9;59004;59015;58968:16;:57::i;:::-;58682:359;;;58656:385;-1:-1:-1;;;;;59061:20:0;;;59057:385;;-1:-1:-1;;;;;59169:22:0;;59150:16;59169:22;;;:14;:22;;;;;;;;;59230:13;:60;;59289:1;59230:60;;;-1:-1:-1;;;;;59246:19:0;;;;;;:11;:19;;;;;;59266:13;59278:1;59266:9;:13;:::i;:::-;59246:34;;;;;;;;;;;;;;;:40;;;59230:60;59210:80;-1:-1:-1;59309:17:0;59329:21;59210:80;59343:6;59329:13;:21::i;:::-;59309:41;;59369:57;59386:6;59394:9;59405;59416;59369:16;:57::i;59057:385::-;58513:947;;;:::o;58066:439::-;-1:-1:-1;;;;;58183:21:0;;;58157:23;58183:21;;;:10;:21;;;;;;;;;;31936:9;:18;;;;;;58319:21;;;;:33;;;-1:-1:-1;;;;;;58319:33:0;;;;;;;58370:54;;58183:21;;;;;31936:18;;58319:33;;58183:21;;;58370:54;;58157:23;58370:54;58437:60;58452:15;58469:9;58480:16;58437:14;:60::i;:::-;58146:359;;58066:439;;:::o;37424:348::-;-1:-1:-1;;;;;37500:21:0;;37492:67;;;;-1:-1:-1;;;37492:67:0;;17353:2:1;37492:67:0;;;17335:21:1;17392:2;17372:18;;;17365:30;17431:34;17411:18;;;17404:62;-1:-1:-1;;;17482:18:1;;;17475:31;17523:19;;37492:67:0;17151:397:1;37492:67:0;37593:68;37616:6;37593:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37593:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;37572:18:0;;;;;;:9;:18;;;;;:89;37687:12;;:24;;37704:6;37687:16;:24::i;:::-;37672:12;:39;37727:37;;6119:25:1;;;37753:1:0;;-1:-1:-1;;;;;37727:37:0;;;;;6107:2:1;6092:18;37727:37:0;5973:177:1;19972:220:0;20030:7;20054:6;20050:20;;-1:-1:-1;20069:1:0;20062:8;;20050:20;20081:9;20093:5;20097:1;20093;:5;:::i;:::-;20081:17;-1:-1:-1;20126:1:0;20117:5;20121:1;20081:17;20117:5;:::i;:::-;:10;20109:56;;;;-1:-1:-1;;;20109:56:0;;15421:2:1;20109:56:0;;;15403:21:1;15460:2;15440:18;;;15433:30;15499:34;15479:18;;;15472:62;-1:-1:-1;;;15550:18:1;;;15543:31;15591:19;;20109:56:0;15219:397:1;20670:153:0;20728:7;20760:1;20756;:5;20748:44;;;;-1:-1:-1;;;20748:44:0;;14226:2:1;20748:44:0;;;14208:21:1;14265:2;14245:18;;;14238:30;14304:28;14284:18;;;14277:56;14350:18;;20748:44:0;14024:350:1;20748:44:0;20810:5;20814:1;20810;:5;:::i;45332:1346::-;41909:17;:24;;-1:-1:-1;;;;;;;41909:24:0;;;;;;42059:15:::1;::::0;;-1:-1:-1;;42085:19:0;::::1;::::0;;;45454:4:::2;-1:-1:-1::0;31936:18:0;;;-1:-1:-1;31936:18:0;;;;;;41909:24;42059:15;;::::1;;;::::0;31936:18;45500:19:::2;:17;:19::i;:::-;45471:48;;45576:18;45553:20;:41;:85;;45618:20;45553:85;;;45597:18;45553:85;45530:108;;45679:18;;45655:20;:42;45651:1020;;45781:18;::::0;45757:21:::2;45884:20;45781:18:::0;45902:1:::2;45884:17;:20::i;:::-;45869:35:::0;-1:-1:-1;45919:17:0::2;45939:23;:13:::0;45869:35;45939:17:::2;:23::i;:::-;45919:43:::0;-1:-1:-1;46285:21:0::2;46359:22;46376:4:::0;46359:16:::2;:22::i;:::-;46450:18;46471:41;:21;46497:14:::0;46471:25:::2;:41::i;:::-;46450:62;;46559:35;46572:9;46583:10;46559:12;:35::i;:::-;46616:43;::::0;;21243:25:1;;;21299:2;21284:18;;21277:34;;;21327:18;;;21320:34;;;46616:43:0::2;::::0;21231:2:1;21216:18;46616:43:0::2;;;;;;;45699:972;;;;;45651:1020;-1:-1:-1::0;;42127:15:0::1;:34:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;42127:34:0;;::::1;::::0;;;::::1;::::0;;41956:17;:25;;-1:-1:-1;;;;41956:25:0;;;45332:1346::o;35990:513::-;-1:-1:-1;;;;;36130:20:0;;36122:70;;;;-1:-1:-1;;;36122:70:0;;9319:2:1;36122:70:0;;;9301:21:1;9358:2;9338:18;;;9331:30;9397:34;9377:18;;;9370:62;-1:-1:-1;;;9448:18:1;;;9441:35;9493:19;;36122:70:0;9117:401:1;36122:70:0;-1:-1:-1;;;;;36211:23:0;;36203:71;;;;-1:-1:-1;;;36203:71:0;;16949:2:1;36203:71:0;;;16931:21:1;16988:2;16968:18;;;16961:30;17027:34;17007:18;;;17000:62;-1:-1:-1;;;17078:18:1;;;17071:33;17121:19;;36203:71:0;16747:399:1;36203:71:0;36307;36329:6;36307:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36307:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;36287:17:0;;;;;;;:9;:17;;;;;;:91;;;;36412:20;;;;;;;:32;;36437:6;36412:24;:32::i;:::-;-1:-1:-1;;;;;36389:20:0;;;;;;;:9;:20;;;;;;;:55;;;;36460:35;;;;;;;;;;36488:6;6119:25:1;;6107:2;6092:18;;5973:177;19555:158:0;19613:7;19646:1;19641;:6;;19633:49;;;;-1:-1:-1;;;19633:49:0;;12960:2:1;19633:49:0;;;12942:21:1;12999:2;12979:18;;;12972:30;13038:32;13018:18;;;13011:60;13088:18;;19633:49:0;12758:354:1;19633:49:0;19700:5;19704:1;19700;:5;:::i;59468:705::-;59647:18;59668:77;59675:12;59668:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;59647:98;;59777:1;59762:12;:16;;;:85;;;;-1:-1:-1;;;;;;59782:22:0;;;;;;:11;:22;;;;;:65;;;;59805:16;59820:1;59805:12;:16;:::i;:::-;59782:40;;;;;;;;;;;;;;;-1:-1:-1;59782:40:0;:50;;:65;59762:85;59758:339;;;-1:-1:-1;;;;;59864:22:0;;;;;;:11;:22;;;;;59913:8;;59887:16;59902:1;59887:12;:16;:::i;:::-;59864:40;;;;;;;;;;;;;-1:-1:-1;59864:40:0;:46;;:57;59758:339;;;59993:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59954:22:0;;-1:-1:-1;59954:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;59954:72:0;;;;;;;;-1:-1:-1;59954:72:0;;;;60069:16;;59954:36;;60069:16;:::i;:::-;-1:-1:-1;;;;;60041:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;60041:44:0;;;;;;;;;;;;59758:339;60114:51;;;20962:25:1;;;21018:2;21003:18;;20996:34;;;-1:-1:-1;;;;;60114:51:0;;;;;20935:18:1;60114:51:0;;;;;;;59636:537;59468:705;;;;:::o;46720:591::-;46872:16;;;46886:1;46872:16;;;;;;;;46848:21;;46872:16;;;;;;;;;;-1:-1:-1;46872:16:0;46848:40;;46917:4;46899;46904:1;46899:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46899:23:0;;;:7;;;;;;;;;;:23;;;;46943:15;;:22;;;-1:-1:-1;;;46943:22:0;;;;:15;;;;;:20;;:22;;;;;46899:7;;46943:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46933:4;46938:1;46933:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46933:32:0;;;:7;;;;;;;;;:32;47010:15;;46978:62;;46995:4;;47010:15;47028:11;46978:8;:62::i;:::-;47079:15;;:224;;-1:-1:-1;;;47079:224:0;;-1:-1:-1;;;;;47079:15:0;;;;:66;;:224;;47160:11;;47079:15;;47230:4;;47257;;47277:15;;47079:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47347:516;47527:15;;47495:62;;47512:4;;-1:-1:-1;;;;;47527:15:0;47545:11;47495:8;:62::i;:::-;47600:15;;-1:-1:-1;;;;;47600:15:0;:31;47639:9;47672:4;47692:11;47600:15;;47804:10;51444:9;;-1:-1:-1;;;;;51444:9:0;;51376:85;47804:10;47600:255;;;;;;-1:-1:-1;;;;;;47600:255:0;;;-1:-1:-1;;;;;5528:15:1;;;47600:255:0;;;5510:34:1;5560:18;;;5553:34;;;;5603:18;;;5596:34;;;;5646:18;;;5639:34;5710:15;;;5689:19;;;5682:44;47829:15:0;5742:19:1;;;5735:35;5444:19;;47600:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;47347:516;;:::o;60181:161::-;60256:6;60294:12;60287:5;60283:9;;60275:32;;;;-1:-1:-1;;;60275:32:0;;;;;;;;:::i;:::-;-1:-1:-1;60332:1:0;;60181:161;-1:-1:-1;;60181:161:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;179:247;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:52;;;570:1;567;560:12;522:52;602:9;596:16;621:31;646:5;621:31;:::i;687:388::-;755:6;763;816:2;804:9;795:7;791:23;787:32;784:52;;;832:1;829;822:12;784:52;871:9;858:23;890:31;915:5;890:31;:::i;:::-;940:5;-1:-1:-1;997:2:1;982:18;;969:32;1010:33;969:32;1010:33;:::i;:::-;1062:7;1052:17;;;687:388;;;;;:::o;1080:456::-;1157:6;1165;1173;1226:2;1214:9;1205:7;1201:23;1197:32;1194:52;;;1242:1;1239;1232:12;1194:52;1281:9;1268:23;1300:31;1325:5;1300:31;:::i;:::-;1350:5;-1:-1:-1;1407:2:1;1392:18;;1379:32;1420:33;1379:32;1420:33;:::i;:::-;1080:456;;1472:7;;-1:-1:-1;;;1526:2:1;1511:18;;;;1498:32;;1080:456::o;1541:315::-;1606:6;1614;1667:2;1655:9;1646:7;1642:23;1638:32;1635:52;;;1683:1;1680;1673:12;1635:52;1722:9;1709:23;1741:31;1766:5;1741:31;:::i;:::-;1791:5;-1:-1:-1;1815:35:1;1846:2;1831:18;;1815:35;:::i;:::-;1805:45;;1541:315;;;;;:::o;1861:::-;1929:6;1937;1990:2;1978:9;1969:7;1965:23;1961:32;1958:52;;;2006:1;2003;1996:12;1958:52;2045:9;2032:23;2064:31;2089:5;2064:31;:::i;:::-;2114:5;2166:2;2151:18;;;;2138:32;;-1:-1:-1;;;1861:315:1:o;2181:687::-;2283:6;2291;2299;2307;2315;2323;2376:3;2364:9;2355:7;2351:23;2347:33;2344:53;;;2393:1;2390;2383:12;2344:53;2432:9;2419:23;2451:31;2476:5;2451:31;:::i;:::-;2501:5;-1:-1:-1;2553:2:1;2538:18;;2525:32;;-1:-1:-1;2604:2:1;2589:18;;2576:32;;-1:-1:-1;2660:2:1;2645:18;;2632:32;2708:4;2695:18;;2683:31;;2673:59;;2728:1;2725;2718:12;2673:59;2181:687;;;;-1:-1:-1;2181:687:1;;2805:3;2790:19;;2777:33;;2857:3;2842:19;;;2829:33;;-1:-1:-1;2181:687:1;-1:-1:-1;;2181:687:1:o;2873:419::-;2940:6;2948;3001:2;2989:9;2980:7;2976:23;2972:32;2969:52;;;3017:1;3014;3007:12;2969:52;3056:9;3043:23;3075:31;3100:5;3075:31;:::i;:::-;3125:5;-1:-1:-1;3182:2:1;3167:18;;3154:32;3230:10;3217:24;;3205:37;;3195:65;;3256:1;3253;3246:12;3297:180;3353:6;3406:2;3394:9;3385:7;3381:23;3377:32;3374:52;;;3422:1;3419;3412:12;3374:52;3445:26;3461:9;3445:26;:::i;3482:272::-;3540:6;3593:2;3581:9;3572:7;3568:23;3564:32;3561:52;;;3609:1;3606;3599:12;3561:52;3648:9;3635:23;3698:6;3691:5;3687:18;3680:5;3677:29;3667:57;;3720:1;3717;3710:12;3759:180;3818:6;3871:2;3859:9;3850:7;3846:23;3842:32;3839:52;;;3887:1;3884;3877:12;3839:52;-1:-1:-1;3910:23:1;;3759:180;-1:-1:-1;3759:180:1:o;3944:306::-;4032:6;4040;4048;4101:2;4089:9;4080:7;4076:23;4072:32;4069:52;;;4117:1;4114;4107:12;4069:52;4146:9;4140:16;4130:26;;4196:2;4185:9;4181:18;4175:25;4165:35;;4240:2;4229:9;4225:18;4219:25;4209:35;;3944:306;;;;;:::o;7636:597::-;7748:4;7777:2;7806;7795:9;7788:21;7838:6;7832:13;7881:6;7876:2;7865:9;7861:18;7854:34;7906:1;7916:140;7930:6;7927:1;7924:13;7916:140;;;8025:14;;;8021:23;;8015:30;7991:17;;;8010:2;7987:26;7980:66;7945:10;;7916:140;;;8074:6;8071:1;8068:13;8065:91;;;8144:1;8139:2;8130:6;8119:9;8115:22;8111:31;8104:42;8065:91;-1:-1:-1;8217:2:1;8196:15;-1:-1:-1;;8192:29:1;8177:45;;;;8224:2;8173:54;;7636:597;-1:-1:-1;;;7636:597:1:o;15981:356::-;16183:2;16165:21;;;16202:18;;;16195:30;16261:34;16256:2;16241:18;;16234:62;16328:2;16313:18;;15981:356::o;16342:400::-;16544:2;16526:21;;;16583:2;16563:18;;;16556:30;16622:34;16617:2;16602:18;;16595:62;-1:-1:-1;;;16688:2:1;16673:18;;16666:34;16732:3;16717:19;;16342:400::o;19803:980::-;20065:4;20113:3;20102:9;20098:19;20144:6;20133:9;20126:25;20170:2;20208:6;20203:2;20192:9;20188:18;20181:34;20251:3;20246:2;20235:9;20231:18;20224:31;20275:6;20310;20304:13;20341:6;20333;20326:22;20379:3;20368:9;20364:19;20357:26;;20418:2;20410:6;20406:15;20392:29;;20439:1;20449:195;20463:6;20460:1;20457:13;20449:195;;;20528:13;;-1:-1:-1;;;;;20524:39:1;20512:52;;20619:15;;;;20584:12;;;;20560:1;20478:9;20449:195;;;-1:-1:-1;;;;;;;20700:32:1;;;;20695:2;20680:18;;20673:60;-1:-1:-1;;;20764:3:1;20749:19;20742:35;20661:3;19803:980;-1:-1:-1;;;19803:980:1:o;22019:128::-;22059:3;22090:1;22086:6;22083:1;22080:13;22077:39;;;22096:18;;:::i;:::-;-1:-1:-1;22132:9:1;;22019:128::o;22152:228::-;22191:3;22219:10;22256:2;22253:1;22249:10;22286:2;22283:1;22279:10;22317:3;22313:2;22309:12;22304:3;22301:21;22298:47;;;22325:18;;:::i;:::-;22361:13;;22152:228;-1:-1:-1;;;;22152:228:1:o;22385:120::-;22425:1;22451;22441:35;;22456:18;;:::i;:::-;-1:-1:-1;22490:9:1;;22385:120::o;22510:191::-;22549:1;22575:10;22612:2;22609:1;22605:10;22634:3;22624:37;;22641:18;;:::i;:::-;22679:10;;22675:20;;;;;22510:191;-1:-1:-1;;22510:191:1:o;22706:168::-;22746:7;22812:1;22808;22804:6;22800:14;22797:1;22794:21;22789:1;22782:9;22775:17;22771:45;22768:71;;;22819:18;;:::i;:::-;-1:-1:-1;22859:9:1;;22706:168::o;22879:125::-;22919:4;22947:1;22944;22941:8;22938:34;;;22952:18;;:::i;:::-;-1:-1:-1;22989:9:1;;22879:125::o;23009:221::-;23048:4;23077:10;23137;;;;23107;;23159:12;;;23156:38;;;23174:18;;:::i;:::-;23211:13;;23009:221;-1:-1:-1;;;23009:221:1:o;23235:380::-;23314:1;23310:12;;;;23357;;;23378:61;;23432:4;23424:6;23420:17;23410:27;;23378:61;23485:2;23477:6;23474:14;23454:18;23451:38;23448:161;;;23531:10;23526:3;23522:20;23519:1;23512:31;23566:4;23563:1;23556:15;23594:4;23591:1;23584:15;23448:161;;23235:380;;;:::o;23620:135::-;23659:3;-1:-1:-1;;23680:17:1;;23677:43;;;23700:18;;:::i;:::-;-1:-1:-1;23747:1:1;23736:13;;23620:135::o;23760:127::-;23821:10;23816:3;23812:20;23809:1;23802:31;23852:4;23849:1;23842:15;23876:4;23873:1;23866:15;23892:127;23953:10;23948:3;23944:20;23941:1;23934:31;23984:4;23981:1;23974:15;24008:4;24005:1;23998:15;24024:127;24085:10;24080:3;24076:20;24073:1;24066:31;24116:4;24113:1;24106:15;24140:4;24137:1;24130:15;24288:131;-1:-1:-1;;;;;24363:31:1;;24353:42;;24343:70;;24409:1;24406;24399:12

Swarm Source

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