ETH Price: $3,684.06 (-2.55%)
Gas: 10 Gwei

Token

Akatsuki (AKATSUKI)
 

Overview

Max Total Supply

10,000,000 AKATSUKI

Holders

200

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Akatsuki

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-23
*/

// SPDX-License-Identifier: UNLICENSED
/**
https://akatsukitoken.ninja
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣛⡯⠭⠶⠶⠶⠶⠭⢍⡛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢛⡵⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⢌⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⣛⣛⣛⣡⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢣⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⡩⠖⠋⠉⠁⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠷⠿⠭⢭⣝⡻⢿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢣⠞⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠲⣝⢻⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢃⡏⠀⠀⠀⠀⠀⠀⠀⠸⣧⠀⠀⠀⠀⠀⠀⠀⠀⣸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢣⡹⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠷⣤⣀⠀⠀⠀⢀⣴⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢣⠹⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢟⣛⣁⡞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠛⠓⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⣿
⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⢟⡥⠞⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣷⢹
⣷⠠⣍⡻⢿⣿⣿⠿⣋⡴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠄⠉⠓⠂⠀⠀⠀⠀⠀⠀⠀⠀⣿⢸
⣿⣇⢻⠈⠓⠲⠒⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣾
⣿⣿⡌⢇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡸⢱⣿
⣿⣿⣿⡜⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠚⠉⠀⠀⠀⠉⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⢡⣿⣿
⣿⣿⣿⣿⣌⢦⡀⠀⠀⠀⠀⠀⠀⠀⣼⠁⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢦⡀⠀⠀⠀⠀⠀⠀⣀⡴⢊⣴⣿⣿⣿
⣿⣿⣿⣿⣿⣷⣝⠦⣀⡀⠀⠀⠀⠀⢻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢑⠒⠶⢒⣒⣫⣥⣾⣿⢿⣿⡏⣿
⣿⣿⣿⣿⣿⣿⣿⣷⣦⣭⣍⣒⣒⣪⡜⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠎⣾⣿⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣿⣿⣽⣿⣌⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⡘⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡴⣫⣾⣿⣿⣇⣿⣿⣧⣿⣿⣾⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣝⠢⠤⣤⣤⣤⠤⠴⣚⣥⣾⣿⣶⣭⣓⡒⠤⠤⠤⠔⣒⣫⣵⣾⣿⡏⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⡿⣿⣶⡶⣶⡾⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⡏⣿⣿⡿⣿⣿⢹⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣷⣿⣿⣷⣿⣷⣿⣿⣟⣹⣿⣹⣿⣿⣿⣿⣷⣿⣿⣧⣿⣿⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
 */
pragma solidity 0.8.19;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

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

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

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

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

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

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

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

interface IUniswapV2Router02 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface IUniswapV2Factory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address UNISWAP_V2_PAIR);
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

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

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

contract Akatsuki is IERC20, Ownable {
    using SafeMath for uint256;
    /* -------------------------------------------------------------------------- */
    /*                                   events                                   */
    /* -------------------------------------------------------------------------- */
    event Reflect(uint256 amountReflected, uint256 newTotalProportion);

    /* -------------------------------------------------------------------------- */
    /*                                  constants                                 */
    /* -------------------------------------------------------------------------- */
    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = 0x0000000000000000000000000000000000000000;

    /* -------------------------------------------------------------------------- */
    /*                                  lpAutoBurn                                */
    /* -------------------------------------------------------------------------- */
    uint256 public percentForLPBurn = 15;
    bool public lpBurnEnabled = true;
    uint256 public lpBurnFrequency = 3600 seconds;
    uint256 public lastLpBurnTime;

    /* -------------------------------------------------------------------------- */
    /*                                  AutoReflection                            */
    /* -------------------------------------------------------------------------- */
    uint256 public percentForReflection = 10;
    bool public autoReflectionEnabled = true;
    uint256 public ReflectionFrequency = 4400 seconds;
    uint256 public lastReflectionTime;

    /* -------------------------------------------------------------------------- */
    /*                                   states                                   */
    /* -------------------------------------------------------------------------- */
    IUniswapV2Router02 public constant UNISWAP_V2_ROUTER =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public immutable UNISWAP_V2_PAIR;

    string _name = "Akatsuki";
    string _symbol = "AKATSUKI";

    uint256 _totalSupply = 10_000_000 ether;

    /* rOwned = ratio of tokens owned relative to circulating supply (NOT total supply, since circulating <= total) */
    mapping(address => uint256) public _rOwned;
    uint256 public _totalProportion = _totalSupply;

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

    mapping(address => bool) isFeeExempt;

    uint256 public buyFee = 2;
    uint256 public sellFee = 2 ;

    address private marketingFeeReceiver;

    bool public claimingFees = true;
    uint256 public swapThreshold = (_totalSupply * 4) / 10000;
    bool inSwap;
    /* -------------------------------------------------------------------------- */
    /*                                  modifiers                                 */
    /* -------------------------------------------------------------------------- */
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    /* -------------------------------------------------------------------------- */
    /*                                   events                                   */
    /* -------------------------------------------------------------------------- */

    event SetFeeExempt(address holder, bool exempt);
    event BuyFeeChanged( uint8 marketing);
    event SellFeeChanged( uint8 marketing);
    event MarketingWalletChanged(address newWallet);

    /* -------------------------------------------------------------------------- */
    /*                                 constructor                                */
    /* -------------------------------------------------------------------------- */
    constructor() {
        // create uniswap pair
        address _uniswapPair = IUniswapV2Factory(UNISWAP_V2_ROUTER.factory())
            .createPair(address(this), UNISWAP_V2_ROUTER.WETH());
        UNISWAP_V2_PAIR = _uniswapPair;

        _allowances[address(this)][address(UNISWAP_V2_ROUTER)] = type(uint256)
            .max;
        _allowances[address(this)][tx.origin] = type(uint256).max;

        isFeeExempt[tx.origin] = true;

        marketingFeeReceiver = msg.sender;

        isFeeExempt[marketingFeeReceiver] = true;

        _rOwned[tx.origin] = _totalSupply;
        emit Transfer(address(0), tx.origin, _totalSupply);
    }

    receive() external payable {}

    /* -------------------------------------------------------------------------- */
    /*                                    ERC20                                   */
    /* -------------------------------------------------------------------------- */
    function approve(
        address spender,
        uint256 amount
    ) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function transfer(
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            require(
                _allowances[sender][msg.sender] >= amount,
                "ERC20: insufficient allowance"
            );
            _allowances[sender][msg.sender] =
                _allowances[sender][msg.sender] -
                amount;
        }

        return _transferFrom(sender, recipient, amount);
    }

    /* -------------------------------------------------------------------------- */
    /*                                    views                                   */
    /* -------------------------------------------------------------------------- */
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function decimals() external pure returns (uint8) {
        return 18;
    }

    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

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

    function allowance(
        address holder,
        address spender
    ) external view override returns (uint256) {
        return _allowances[holder][spender];
    }

    function tokensToProportion(uint256 tokens) public view returns (uint256) {
        return (tokens * _totalProportion) / _totalSupply;
    }

    function tokenFromReflection(
        uint256 proportion
    ) public view returns (uint256) {
        return (proportion * _totalSupply) / _totalProportion;
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /* -------------------------------------------------------------------------- */
    /*                                   owners                                   */
    /* -------------------------------------------------------------------------- */

    function setIsFeeExempt(address holder, bool exempt)
        external
        onlyOwner
        returns (bool)
    {
        isFeeExempt[holder] = exempt;
        emit SetFeeExempt(holder, exempt);
        return true;
    }

    function setBuyFees(
        uint8 fee
    ) external onlyOwner returns (bool) {
        require(
            fee <= 2,
            "Total fees cannot exceed 2%"
        );
        buyFee = fee;
        emit BuyFeeChanged(fee);
        return true;
    }

    function setSellFees(
        uint8 fee
    ) external onlyOwner returns (bool) {
        require(
            fee <= 2,
            "Total fees cannot exceed 2%"
        );
        sellFee = fee;
        emit SellFeeChanged(fee);
        return true;
    }

    function setMarketingWallet(address newWallet)
        external
        onlyOwner
        returns (bool)
    {
        marketingFeeReceiver = newWallet;
        emit MarketingWalletChanged(newWallet);
        return true;
    }

    /* -------------------------------------------------------------------------- */
    /*                                   private                                  */
    /* -------------------------------------------------------------------------- */
    function _transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        if (inSwap) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (_shouldSwapBack()) {
            _swapBack();
        }

        if (
            !inSwap &&
            recipient == UNISWAP_V2_PAIR &&
            lpBurnEnabled &&
            block.timestamp >= lastLpBurnTime + lpBurnFrequency &&
            !isFeeExempt[sender]
        ) {
            autoBurnLiquidityPairTokens();
        }

        if (
            !inSwap &&
            recipient == UNISWAP_V2_PAIR &&
            autoReflectionEnabled &&
            block.timestamp >= lastReflectionTime + ReflectionFrequency &&
            !isFeeExempt[sender]
        ) {
            reflectTokens();
        }

        uint256 proportionAmount = tokensToProportion(amount);
        require(_rOwned[sender] >= proportionAmount, "Insufficient Balance");
        _rOwned[sender] = _rOwned[sender] - proportionAmount;

        uint256 proportionReceived = _shouldTakeFee(sender, recipient)
            ? _takeFeeInProportions(
                sender == UNISWAP_V2_PAIR ? true : false,
                sender,
                proportionAmount
            )
            : proportionAmount;
        _rOwned[recipient] = _rOwned[recipient] + proportionReceived;

        emit Transfer(
            sender,
            recipient,
            tokenFromReflection(proportionReceived)
        );
        return true;
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        uint256 proportionAmount = tokensToProportion(amount);
        require(_rOwned[sender] >= proportionAmount, "Insufficient Balance");
        _rOwned[sender] = _rOwned[sender] - proportionAmount;
        _rOwned[recipient] = _rOwned[recipient] + proportionAmount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function _takeFeeInProportions(
        bool buying,
        address sender,
        uint256 proportionAmount
    ) internal returns (uint256) {
        uint256 __buyFee = buyFee;
        uint256 __sellFee = sellFee;

        uint256 proportionFeeAmount = buying == true
            ? (proportionAmount * __buyFee) / 100
            : (proportionAmount * __sellFee) / 100;


        // take fees
        uint256 _proportionToContract = proportionFeeAmount;

        if (_proportionToContract > 0) {
            _rOwned[address(this)] =
                _rOwned[address(this)] +
                _proportionToContract;

            emit Transfer(
                sender,
                address(this),
                tokenFromReflection(_proportionToContract)
            );
        }
        return proportionAmount - proportionFeeAmount;
    }

    function _shouldSwapBack() internal view returns (bool) {
        return
            msg.sender != UNISWAP_V2_PAIR &&
            !inSwap &&
            claimingFees &&
            balanceOf(address(this)) >= swapThreshold;
    }

    function _swapBack() internal swapping {

        uint256 amountToSwap = balanceOf(address(this));
        approve(address(UNISWAP_V2_ROUTER), amountToSwap);

        // swap
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = UNISWAP_V2_ROUTER.WETH();

        UNISWAP_V2_ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        // send
        (bool tmpSuccess, ) = payable(marketingFeeReceiver).call{
            value: address(this).balance
        }("");
        tmpSuccess = false;
    }

    function _shouldTakeFee(
        address sender,
        address recipient
    ) internal view returns (bool) {
        bool isBuyOrSell = sender == UNISWAP_V2_PAIR ||
            recipient == UNISWAP_V2_PAIR;
        bool isExemptFromFee = isFeeExempt[sender] || isFeeExempt[recipient];
        return !isExemptFromFee && isBuyOrSell;
    }

    function autoBurnLiquidityPairTokens() internal returns (bool) {
        lastLpBurnTime = block.timestamp;

        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(UNISWAP_V2_PAIR);

        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(
            10000
        );

        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            _basicTransfer(UNISWAP_V2_PAIR, address(0xdead), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(UNISWAP_V2_PAIR);
        pair.sync();
        return true;
    }

    function reflectTokens() internal returns (bool) {
        lastReflectionTime = block.timestamp;
        uint256 liquidityPairBalance = this.balanceOf(UNISWAP_V2_PAIR);

        // calculate amount to reflect
        uint256 amountToReflect = liquidityPairBalance
            .mul(percentForReflection)
            .div(10000);

        require(
            _rOwned[address(UNISWAP_V2_PAIR)] >= amountToReflect,
            "Insufficient Balance"
        );

        _rOwned[address(UNISWAP_V2_PAIR)] =
            _rOwned[address(UNISWAP_V2_PAIR)] -
            amountToReflect;
        _totalProportion = _totalProportion - amountToReflect;

        emit Reflect(amountToReflect, _totalProportion);
        IUniswapV2Pair pair = IUniswapV2Pair(UNISWAP_V2_PAIR);
        pair.sync();
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"marketing","type":"uint8"}],"name":"BuyFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"}],"name":"MarketingWalletChanged","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":"amountReflected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalProportion","type":"uint256"}],"name":"Reflect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"marketing","type":"uint8"}],"name":"SellFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"exempt","type":"bool"}],"name":"SetFeeExempt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ReflectionFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V2_PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V2_ROUTER","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_rOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalProportion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoReflectionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimingFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReflectionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"fee","type":"uint8"}],"name":"setBuyFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fee","type":"uint8"}],"name":"setSellFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proportion","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"tokensToProportion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600f60019081556002805460ff199081168317909155610e10600355600a60055560068054909116909117905561113060075560e0604052600860a090815267416b617473756b6960c01b60c0526009906200005c908262000436565b50604080518082019091526008815267414b415453554b4960c01b6020820152600a906200008b908262000436565b506a084595161401484a000000600b819055600d819055600260108190556011556012805460ff60a01b1916600160a01b17905561271090620000d090600462000502565b620000dc91906200052e565b601355348015620000ec57600080fd5b50620000f83362000341565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200014d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000173919062000551565b6001600160a01b031663c9c6539630737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fb919062000551565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000249573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026f919062000551565b6001600160a01b038116608052306000908152600e60209081526040808320737a250d5630b4cf539739df2c5dacb4c659f2488d84528252808320600019908190553280855282852091909155600f83528184208054600160ff19918216811790925560128054336001600160a01b03199091168117909155865283862080549091169091179055600b54818552600c845282852081905591519182529394507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35062000583565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003bc57607f821691505b602082108103620003dd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200043157600081815260208120601f850160051c810160208610156200040c5750805b601f850160051c820191505b818110156200042d5782815560010162000418565b5050505b505050565b81516001600160401b0381111562000452576200045262000391565b6200046a81620004638454620003a7565b84620003e3565b602080601f831160018114620004a25760008415620004895750858301515b600019600386901b1c1916600185901b1785556200042d565b600085815260208120601f198616915b82811015620004d357888601518255948401946001909101908401620004b2565b5085821015620004f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820281158282048414176200052857634e487b7160e01b600052601160045260246000fd5b92915050565b6000826200054c57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200056457600080fd5b81516001600160a01b03811681146200057c57600080fd5b9392505050565b608051611baa620006016000396000818161066601528181610c7301528181610d1401528181610e4401528181611078015281816112fc015281816113a6015281816113d40152818161146d0152818161150c01528181611567015281816115ab0152818161162b0152818161168c01526116c70152611baa6000f3fe6080604052600436106102135760003560e01c806345ce5365116101185780638da5cb5b116100a0578063a9059cbb1161006f578063a9059cbb146105ad578063b0f7ec38146105cd578063dd62ed3e146105ee578063f2fde38b14610634578063f40acc3d1461065457600080fd5b80638da5cb5b1461052857806395d89b411461055a578063a4c82a001461056f578063a82ed9ec1461058557600080fd5b80635d098b38116100e75780635d098b3814610497578063658d4b7f146104b757806370a08231146104d7578063715018a6146104f7578063893196311461050e57600080fd5b806345ce53651461042b578063470624021461044b5780634d93ea2a14610461578063571ac8b01461047757600080fd5b80631c5872ce1161019b5780632c3e486c1161016a5780632c3e486c146103a95780632d838119146103bf5780632e82f1a0146103df578063313ce567146103f957806335eb7f171461041557600080fd5b80631c5872ce1461034857806323b872dd1461035e5780632b112e491461037e5780632b14ca561461039357600080fd5b80630b44576b116101e25780630b44576b146102ba5780630cfc15f9146102da578063178002871461030757806318160ddd1461031d578063199ffc721461033257600080fd5b80630445b6671461021f57806306fdde0314610248578063095ea7b31461026a5780630adc1d841461029a57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023560135481565b6040519081526020015b60405180910390f35b34801561025457600080fd5b5061025d610688565b60405161023f9190611845565b34801561027657600080fd5b5061028a6102853660046118a8565b61071a565b604051901515815260200161023f565b3480156102a657600080fd5b5061028a6102b53660046118d4565b610787565b3480156102c657600080fd5b5061028a6102d53660046118d4565b61082f565b3480156102e657600080fd5b506102356102f53660046118f7565b600c6020526000908152604090205481565b34801561031357600080fd5b50610235600d5481565b34801561032957600080fd5b50600b54610235565b34801561033e57600080fd5b5061023560015481565b34801561035457600080fd5b5061023560075481565b34801561036a57600080fd5b5061028a610379366004611914565b6108c6565b34801561038a57600080fd5b506102356109ce565b34801561039f57600080fd5b5061023560115481565b3480156103b557600080fd5b5061023560035481565b3480156103cb57600080fd5b506102356103da366004611955565b610a01565b3480156103eb57600080fd5b5060025461028a9060ff1681565b34801561040557600080fd5b506040516012815260200161023f565b34801561042157600080fd5b5061023560085481565b34801561043757600080fd5b50610235610446366004611955565b610a1e565b34801561045757600080fd5b5061023560105481565b34801561046d57600080fd5b5061023560055481565b34801561048357600080fd5b5061028a6104923660046118f7565b610a31565b3480156104a357600080fd5b5061028a6104b23660046118f7565b610a3f565b3480156104c357600080fd5b5061028a6104d236600461196e565b610a97565b3480156104e357600080fd5b506102356104f23660046118f7565b610b09565b34801561050357600080fd5b5061050c610b2b565b005b34801561051a57600080fd5b5060065461028a9060ff1681565b34801561053457600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161023f565b34801561056657600080fd5b5061025d610b3f565b34801561057b57600080fd5b5061023560045481565b34801561059157600080fd5b50610542737a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156105b957600080fd5b5061028a6105c83660046118a8565b610b4e565b3480156105d957600080fd5b5060125461028a90600160a01b900460ff1681565b3480156105fa57600080fd5b506102356106093660046119ac565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b34801561064057600080fd5b5061050c61064f3660046118f7565b610b5b565b34801561066057600080fd5b506105427f000000000000000000000000000000000000000000000000000000000000000081565b606060098054610697906119da565b80601f01602080910402602001604051908101604052809291908181526020018280546106c3906119da565b80156107105780601f106106e557610100808354040283529160200191610710565b820191906000526020600020905b8154815290600101906020018083116106f357829003601f168201915b5050505050905090565b336000818152600e602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107759086815260200190565b60405180910390a35060015b92915050565b6000610791610bd4565b60028260ff1611156107ea5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c20666565732063616e6e6f7420657863656564203225000000000060448201526064015b60405180910390fd5b60ff821660108190556040519081527f9ea4b345026a7e43ad755aab0e6ec4a5a45195992400ae4ec104f6f5e36242fc906020015b60405180910390a1506001919050565b6000610839610bd4565b60028260ff16111561088d5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c20666565732063616e6e6f7420657863656564203225000000000060448201526064016107e1565b60ff821660118190556040519081527f42f8bedebc58c5c54be62be97c31508aa74481a18765dafcb1648f26c3597e499060200161081f565b6001600160a01b0383166000908152600e60209081526040808320338452909152812054600019146109b9576001600160a01b0384166000908152600e602090815260408083203384529091529020548211156109655760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107e1565b6001600160a01b0384166000908152600e60209081526040808320338452909152902054610994908390611a2a565b6001600160a01b0385166000908152600e602090815260408083203384529091529020555b6109c4848484610c2e565b90505b9392505050565b60006109da6000610b09565b6109e561dead610b09565b600b546109f29190611a2a565b6109fc9190611a2a565b905090565b6000600d54600b5483610a149190611a3d565b6107819190611a54565b6000600b54600d5483610a149190611a3d565b60006107818260001961071a565b6000610a49610bd4565b601280546001600160a01b0319166001600160a01b0384169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b9060200161081f565b6000610aa1610bd4565b6001600160a01b0383166000818152600f6020908152604091829020805460ff19168615159081179091558251938452908301527f2f640a0ab7e2a6d9ec57f3932923908568f2984073dcebac1b9a3db32debe91d910160405180910390a150600192915050565b6001600160a01b0381166000908152600c602052604081205461078190610a01565b610b33610bd4565b610b3d6000610f19565b565b6060600a8054610697906119da565b60006109c7338484610c2e565b610b63610bd4565b6001600160a01b038116610bc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e1565b610bd181610f19565b50565b6000546001600160a01b03163314610b3d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107e1565b60145460009060ff1615610c4e57610c47848484610f69565b90506109c7565b610c5661106b565b15610c6357610c636110d8565b60145460ff16158015610ca757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b8015610cb5575060025460ff165b8015610cd05750600354600454610ccc9190611a76565b4210155b8015610cf557506001600160a01b0384166000908152600f602052604090205460ff16155b15610d0457610d026112df565b505b60145460ff16158015610d4857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b8015610d56575060065460ff165b8015610d715750600754600854610d6d9190611a76565b4210155b8015610d9657506001600160a01b0384166000908152600f602052604090205460ff16155b15610da557610da3611452565b505b6000610db083610a1e565b6001600160a01b0386166000908152600c6020526040902054909150811115610deb5760405162461bcd60e51b81526004016107e190611a89565b6001600160a01b0385166000908152600c6020526040902054610e0f908290611a2a565b6001600160a01b0386166000908152600c6020526040812091909155610e358686611687565b610e3f5781610e8c565b610e8c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614610e82576000610e85565b60015b8784611754565b6001600160a01b0386166000908152600c6020526040902054909150610eb3908290611a76565b6001600160a01b038087166000818152600c602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610efc84610a01565b60405190815260200160405180910390a350600195945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080610f7583610a1e565b6001600160a01b0386166000908152600c6020526040902054909150811115610fb05760405162461bcd60e51b81526004016107e190611a89565b6001600160a01b0385166000908152600c6020526040902054610fd4908290611a2a565b6001600160a01b038087166000908152600c60205260408082209390935590861681522054611004908290611a76565b6001600160a01b038086166000818152600c602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110589087815260200190565b60405180910390a3506001949350505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110a9575060145460ff16155b80156110be5750601254600160a01b900460ff165b80156109fc57506013546110d130610b09565b1015905090565b6014805460ff1916600117905560006110f030610b09565b9050611110737a250d5630b4cf539739df2c5dacb4c659f2488d8261071a565b50604080516002808252606082018352600092602083019080368337019050509050308160008151811061114657611146611ab7565b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dc9190611acd565b816001815181106111ef576111ef611ab7565b6001600160a01b039092166020928302919091019091015260405163791ac94760e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac94790611247908590600090869030904290600401611aea565b600060405180830381600087803b15801561126157600080fd5b505af1158015611275573d6000803e3d6000fd5b5050601254604051600093506001600160a01b03909116915047908381818185875af1925050503d80600081146112c8576040519150601f19603f3d011682016040523d82523d6000602084013e6112cd565b606091505b50506014805460ff1916905550505050565b4260049081556040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691810191909152600090819030906370a0823190602401602060405180830381865afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190611b5b565b905060006113996127106113936001548561182d90919063ffffffff16565b90611839565b905080156113d0576113ce7f000000000000000000000000000000000000000000000000000000000000000061dead83610f69565b505b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561143057600080fd5b505af1158015611444573d6000803e3d6000fd5b505050506001935050505090565b426008556040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819030906370a0823190602401602060405180830381865afa1580156114bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e39190611b5b565b905060006115026127106113936005548561182d90919063ffffffff16565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600c602052604090205490915081111561155d5760405162461bcd60e51b81526004016107e190611a89565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600c60205260409020546115a1908290611a2a565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600c6020526040902055600d546115e8908290611a2a565b600d8190556040805183815260208101929092527fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac910160405180910390a160007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561143057600080fd5b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614806116fb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b6001600160a01b0385166000908152600f60205260408120549192509060ff168061173e57506001600160a01b0384166000908152600f602052604090205460ff165b90508015801561174b5750815b95945050505050565b60105460115460009190826001871515146117845760646117758387611a3d565b61177f9190611a54565b61179a565b60646117908487611a3d565b61179a9190611a54565b905080801561181757306000908152600c60205260409020546117be908290611a76565b306000818152600c60205260409020919091556001600160a01b0388167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61180584610a01565b60405190815260200160405180910390a35b6118218287611a2a565b98975050505050505050565b60006109c78284611a3d565b60006109c78284611a54565b600060208083528351808285015260005b8181101561187257858101830151858201604001528201611856565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610bd157600080fd5b600080604083850312156118bb57600080fd5b82356118c681611893565b946020939093013593505050565b6000602082840312156118e657600080fd5b813560ff811681146109c757600080fd5b60006020828403121561190957600080fd5b81356109c781611893565b60008060006060848603121561192957600080fd5b833561193481611893565b9250602084013561194481611893565b929592945050506040919091013590565b60006020828403121561196757600080fd5b5035919050565b6000806040838503121561198157600080fd5b823561198c81611893565b9150602083013580151581146119a157600080fd5b809150509250929050565b600080604083850312156119bf57600080fd5b82356119ca81611893565b915060208301356119a181611893565b600181811c908216806119ee57607f821691505b602082108103611a0e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561078157610781611a14565b808202811582820484141761078157610781611a14565b600082611a7157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561078157610781611a14565b602080825260149082015273496e73756666696369656e742042616c616e636560601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611adf57600080fd5b81516109c781611893565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611b3a5784516001600160a01b031683529383019391830191600101611b15565b50506001600160a01b03969096166060850152505050608001529392505050565b600060208284031215611b6d57600080fd5b505191905056fea2646970667358221220eb0b023c9793613a99ff7eb46ef448d5b1a7b792e253c31a4de91a77a7dc735c64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102135760003560e01c806345ce5365116101185780638da5cb5b116100a0578063a9059cbb1161006f578063a9059cbb146105ad578063b0f7ec38146105cd578063dd62ed3e146105ee578063f2fde38b14610634578063f40acc3d1461065457600080fd5b80638da5cb5b1461052857806395d89b411461055a578063a4c82a001461056f578063a82ed9ec1461058557600080fd5b80635d098b38116100e75780635d098b3814610497578063658d4b7f146104b757806370a08231146104d7578063715018a6146104f7578063893196311461050e57600080fd5b806345ce53651461042b578063470624021461044b5780634d93ea2a14610461578063571ac8b01461047757600080fd5b80631c5872ce1161019b5780632c3e486c1161016a5780632c3e486c146103a95780632d838119146103bf5780632e82f1a0146103df578063313ce567146103f957806335eb7f171461041557600080fd5b80631c5872ce1461034857806323b872dd1461035e5780632b112e491461037e5780632b14ca561461039357600080fd5b80630b44576b116101e25780630b44576b146102ba5780630cfc15f9146102da578063178002871461030757806318160ddd1461031d578063199ffc721461033257600080fd5b80630445b6671461021f57806306fdde0314610248578063095ea7b31461026a5780630adc1d841461029a57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023560135481565b6040519081526020015b60405180910390f35b34801561025457600080fd5b5061025d610688565b60405161023f9190611845565b34801561027657600080fd5b5061028a6102853660046118a8565b61071a565b604051901515815260200161023f565b3480156102a657600080fd5b5061028a6102b53660046118d4565b610787565b3480156102c657600080fd5b5061028a6102d53660046118d4565b61082f565b3480156102e657600080fd5b506102356102f53660046118f7565b600c6020526000908152604090205481565b34801561031357600080fd5b50610235600d5481565b34801561032957600080fd5b50600b54610235565b34801561033e57600080fd5b5061023560015481565b34801561035457600080fd5b5061023560075481565b34801561036a57600080fd5b5061028a610379366004611914565b6108c6565b34801561038a57600080fd5b506102356109ce565b34801561039f57600080fd5b5061023560115481565b3480156103b557600080fd5b5061023560035481565b3480156103cb57600080fd5b506102356103da366004611955565b610a01565b3480156103eb57600080fd5b5060025461028a9060ff1681565b34801561040557600080fd5b506040516012815260200161023f565b34801561042157600080fd5b5061023560085481565b34801561043757600080fd5b50610235610446366004611955565b610a1e565b34801561045757600080fd5b5061023560105481565b34801561046d57600080fd5b5061023560055481565b34801561048357600080fd5b5061028a6104923660046118f7565b610a31565b3480156104a357600080fd5b5061028a6104b23660046118f7565b610a3f565b3480156104c357600080fd5b5061028a6104d236600461196e565b610a97565b3480156104e357600080fd5b506102356104f23660046118f7565b610b09565b34801561050357600080fd5b5061050c610b2b565b005b34801561051a57600080fd5b5060065461028a9060ff1681565b34801561053457600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161023f565b34801561056657600080fd5b5061025d610b3f565b34801561057b57600080fd5b5061023560045481565b34801561059157600080fd5b50610542737a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156105b957600080fd5b5061028a6105c83660046118a8565b610b4e565b3480156105d957600080fd5b5060125461028a90600160a01b900460ff1681565b3480156105fa57600080fd5b506102356106093660046119ac565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b34801561064057600080fd5b5061050c61064f3660046118f7565b610b5b565b34801561066057600080fd5b506105427f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e992481565b606060098054610697906119da565b80601f01602080910402602001604051908101604052809291908181526020018280546106c3906119da565b80156107105780601f106106e557610100808354040283529160200191610710565b820191906000526020600020905b8154815290600101906020018083116106f357829003601f168201915b5050505050905090565b336000818152600e602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107759086815260200190565b60405180910390a35060015b92915050565b6000610791610bd4565b60028260ff1611156107ea5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c20666565732063616e6e6f7420657863656564203225000000000060448201526064015b60405180910390fd5b60ff821660108190556040519081527f9ea4b345026a7e43ad755aab0e6ec4a5a45195992400ae4ec104f6f5e36242fc906020015b60405180910390a1506001919050565b6000610839610bd4565b60028260ff16111561088d5760405162461bcd60e51b815260206004820152601b60248201527f546f74616c20666565732063616e6e6f7420657863656564203225000000000060448201526064016107e1565b60ff821660118190556040519081527f42f8bedebc58c5c54be62be97c31508aa74481a18765dafcb1648f26c3597e499060200161081f565b6001600160a01b0383166000908152600e60209081526040808320338452909152812054600019146109b9576001600160a01b0384166000908152600e602090815260408083203384529091529020548211156109655760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107e1565b6001600160a01b0384166000908152600e60209081526040808320338452909152902054610994908390611a2a565b6001600160a01b0385166000908152600e602090815260408083203384529091529020555b6109c4848484610c2e565b90505b9392505050565b60006109da6000610b09565b6109e561dead610b09565b600b546109f29190611a2a565b6109fc9190611a2a565b905090565b6000600d54600b5483610a149190611a3d565b6107819190611a54565b6000600b54600d5483610a149190611a3d565b60006107818260001961071a565b6000610a49610bd4565b601280546001600160a01b0319166001600160a01b0384169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b9060200161081f565b6000610aa1610bd4565b6001600160a01b0383166000818152600f6020908152604091829020805460ff19168615159081179091558251938452908301527f2f640a0ab7e2a6d9ec57f3932923908568f2984073dcebac1b9a3db32debe91d910160405180910390a150600192915050565b6001600160a01b0381166000908152600c602052604081205461078190610a01565b610b33610bd4565b610b3d6000610f19565b565b6060600a8054610697906119da565b60006109c7338484610c2e565b610b63610bd4565b6001600160a01b038116610bc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e1565b610bd181610f19565b50565b6000546001600160a01b03163314610b3d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107e1565b60145460009060ff1615610c4e57610c47848484610f69565b90506109c7565b610c5661106b565b15610c6357610c636110d8565b60145460ff16158015610ca757507f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99246001600160a01b0316836001600160a01b0316145b8015610cb5575060025460ff165b8015610cd05750600354600454610ccc9190611a76565b4210155b8015610cf557506001600160a01b0384166000908152600f602052604090205460ff16155b15610d0457610d026112df565b505b60145460ff16158015610d4857507f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99246001600160a01b0316836001600160a01b0316145b8015610d56575060065460ff165b8015610d715750600754600854610d6d9190611a76565b4210155b8015610d9657506001600160a01b0384166000908152600f602052604090205460ff16155b15610da557610da3611452565b505b6000610db083610a1e565b6001600160a01b0386166000908152600c6020526040902054909150811115610deb5760405162461bcd60e51b81526004016107e190611a89565b6001600160a01b0385166000908152600c6020526040902054610e0f908290611a2a565b6001600160a01b0386166000908152600c6020526040812091909155610e358686611687565b610e3f5781610e8c565b610e8c7f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99246001600160a01b0316876001600160a01b031614610e82576000610e85565b60015b8784611754565b6001600160a01b0386166000908152600c6020526040902054909150610eb3908290611a76565b6001600160a01b038087166000818152600c602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610efc84610a01565b60405190815260200160405180910390a350600195945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080610f7583610a1e565b6001600160a01b0386166000908152600c6020526040902054909150811115610fb05760405162461bcd60e51b81526004016107e190611a89565b6001600160a01b0385166000908152600c6020526040902054610fd4908290611a2a565b6001600160a01b038087166000908152600c60205260408082209390935590861681522054611004908290611a76565b6001600160a01b038086166000818152600c602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110589087815260200190565b60405180910390a3506001949350505050565b6000336001600160a01b037f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e992416148015906110a9575060145460ff16155b80156110be5750601254600160a01b900460ff165b80156109fc57506013546110d130610b09565b1015905090565b6014805460ff1916600117905560006110f030610b09565b9050611110737a250d5630b4cf539739df2c5dacb4c659f2488d8261071a565b50604080516002808252606082018352600092602083019080368337019050509050308160008151811061114657611146611ab7565b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dc9190611acd565b816001815181106111ef576111ef611ab7565b6001600160a01b039092166020928302919091019091015260405163791ac94760e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac94790611247908590600090869030904290600401611aea565b600060405180830381600087803b15801561126157600080fd5b505af1158015611275573d6000803e3d6000fd5b5050601254604051600093506001600160a01b03909116915047908381818185875af1925050503d80600081146112c8576040519150601f19603f3d011682016040523d82523d6000602084013e6112cd565b606091505b50506014805460ff1916905550505050565b4260049081556040516370a0823160e01b81526001600160a01b037f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99241691810191909152600090819030906370a0823190602401602060405180830381865afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190611b5b565b905060006113996127106113936001548561182d90919063ffffffff16565b90611839565b905080156113d0576113ce7f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e992461dead83610f69565b505b60007f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99249050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561143057600080fd5b505af1158015611444573d6000803e3d6000fd5b505050506001935050505090565b426008556040516370a0823160e01b81526001600160a01b037f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e9924166004820152600090819030906370a0823190602401602060405180830381865afa1580156114bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e39190611b5b565b905060006115026127106113936005548561182d90919063ffffffff16565b6001600160a01b037f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e9924166000908152600c602052604090205490915081111561155d5760405162461bcd60e51b81526004016107e190611a89565b6001600160a01b037f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e9924166000908152600c60205260409020546115a1908290611a2a565b6001600160a01b037f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e9924166000908152600c6020526040902055600d546115e8908290611a2a565b600d8190556040805183815260208101929092527fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac910160405180910390a160007f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99249050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561143057600080fd5b6000807f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99246001600160a01b0316846001600160a01b031614806116fb57507f00000000000000000000000002a997b8306b9a7038d3364fc3b1c6fc419e99246001600160a01b0316836001600160a01b0316145b6001600160a01b0385166000908152600f60205260408120549192509060ff168061173e57506001600160a01b0384166000908152600f602052604090205460ff165b90508015801561174b5750815b95945050505050565b60105460115460009190826001871515146117845760646117758387611a3d565b61177f9190611a54565b61179a565b60646117908487611a3d565b61179a9190611a54565b905080801561181757306000908152600c60205260409020546117be908290611a76565b306000818152600c60205260409020919091556001600160a01b0388167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61180584610a01565b60405190815260200160405180910390a35b6118218287611a2a565b98975050505050505050565b60006109c78284611a3d565b60006109c78284611a54565b600060208083528351808285015260005b8181101561187257858101830151858201604001528201611856565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610bd157600080fd5b600080604083850312156118bb57600080fd5b82356118c681611893565b946020939093013593505050565b6000602082840312156118e657600080fd5b813560ff811681146109c757600080fd5b60006020828403121561190957600080fd5b81356109c781611893565b60008060006060848603121561192957600080fd5b833561193481611893565b9250602084013561194481611893565b929592945050506040919091013590565b60006020828403121561196757600080fd5b5035919050565b6000806040838503121561198157600080fd5b823561198c81611893565b9150602083013580151581146119a157600080fd5b809150509250929050565b600080604083850312156119bf57600080fd5b82356119ca81611893565b915060208301356119a181611893565b600181811c908216806119ee57607f821691505b602082108103611a0e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561078157610781611a14565b808202811582820484141761078157610781611a14565b600082611a7157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561078157610781611a14565b602080825260149082015273496e73756666696369656e742042616c616e636560601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611adf57600080fd5b81516109c781611893565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611b3a5784516001600160a01b031683529383019391830191600101611b15565b50506001600160a01b03969096166060850152505050608001529392505050565b600060208284031215611b6d57600080fd5b505191905056fea2646970667358221220eb0b023c9793613a99ff7eb46ef448d5b1a7b792e253c31a4de91a77a7dc735c64736f6c63430008130033

Deployed Bytecode Sourcemap

18703:14876:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21443:57;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;21443:57:0;;;;;;;;25146:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23558:241::-;;;;;;;;;;-1:-1:-1;23558:241:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;23558:241:0;1205:187:1;26631:264:0;;;;;;;;;;-1:-1:-1;26631:264:0;;;;;:::i;:::-;;:::i;26903:267::-;;;;;;;;;;-1:-1:-1;26903:267:0;;;;;:::i;:::-;;:::i;21075:42::-;;;;;;;;;;-1:-1:-1;21075:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;21124:46;;;;;;;;;;;;;;;;24950:102;;;;;;;;;;-1:-1:-1;25032:12:0;;24950:102;;19777:36;;;;;;;;;;;;;;;;20301:49;;;;;;;;;;;;;;;;24126:558;;;;;;;;;;-1:-1:-1;24126:558:0;;;;;:::i;:::-;;:::i;25987:136::-;;;;;;;;;;;;;:::i;21324:26::-;;;;;;;;;;;;;;;;19859:45;;;;;;;;;;;;;;;;25812:167;;;;;;;;;;-1:-1:-1;25812:167:0;;;;;:::i;:::-;;:::i;19820:32::-;;;;;;;;;;-1:-1:-1;19820:32:0;;;;;;;;25060:78;;;;;;;;;;-1:-1:-1;25060:78:0;;25128:2;2711:36:1;;2699:2;2684:18;25060:78:0;2569:184:1;20357:33:0;;;;;;;;;;;;;;;;25662:142;;;;;;;;;;-1:-1:-1;25662:142:0;;;;;:::i;:::-;;:::i;21292:25::-;;;;;;;;;;;;;;;;20207:40;;;;;;;;;;;;;;;;23807:122;;;;;;;;;;-1:-1:-1;23807:122:0;;;;;:::i;:::-;;:::i;27178:235::-;;;;;;;;;;-1:-1:-1;27178:235:0;;;;;:::i;:::-;;:::i;26391:232::-;;;;;;;;;;-1:-1:-1;26391:232:0;;;;;:::i;:::-;;:::i;25336:138::-;;;;;;;;;;-1:-1:-1;25336:138:0;;;;;:::i;:::-;;:::i;14447:103::-;;;;;;;;;;;;;:::i;:::-;;20254:40;;;;;;;;;;-1:-1:-1;20254:40:0;;;;;;;;13799:87;;;;;;;;;;-1:-1:-1;13845:7:0;13872:6;-1:-1:-1;;;;;13872:6:0;13799:87;;;-1:-1:-1;;;;;3343:32:1;;;3325:51;;3313:2;3298:18;13799:87:0;3179:203:1;25239:89:0;;;;;;;;;;;;;:::i;19911:29::-;;;;;;;;;;;;;;;;20657:126;;;;;;;;;;;;20740:42;20657:126;;23937:181;;;;;;;;;;-1:-1:-1;23937:181:0;;;;;:::i;:::-;;:::i;21405:31::-;;;;;;;;;;-1:-1:-1;21405:31:0;;;;-1:-1:-1;;;21405:31:0;;;;;;25482:172;;;;;;;;;;-1:-1:-1;25482:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;25618:19:0;;;25591:7;25618:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;25482:172;14705:238;;;;;;;;;;-1:-1:-1;14705:238:0;;;;;:::i;:::-;;:::i;20790:40::-;;;;;;;;;;;;;;;25146:85;25185:13;25218:5;25211:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25146:85;:::o;23558:241::-;23687:10;23658:4;23675:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;23675:32:0;;;;;;;;;;:41;;;23732:37;23658:4;;23675:32;;23732:37;;;;23710:6;160:25:1;;148:2;133:18;;14:177;23732:37:0;;;;;;;;-1:-1:-1;23787:4:0;23558:241;;;;;:::o;26631:264::-;26706:4;13685:13;:11;:13::i;:::-;26752:1:::1;26745:3;:8;;;;26723:85;;;::::0;-1:-1:-1;;;26723:85:0;;4601:2:1;26723:85:0::1;::::0;::::1;4583:21:1::0;4640:2;4620:18;;;4613:30;4679:29;4659:18;;;4652:57;4726:18;;26723:85:0::1;;;;;;;;;26819:12;::::0;::::1;:6;:12:::0;;;26847:18:::1;::::0;2711:36:1;;;26847:18:0::1;::::0;2699:2:1;2684:18;26847::0::1;;;;;;;;-1:-1:-1::0;26883:4:0::1;26631:264:::0;;;:::o;26903:267::-;26979:4;13685:13;:11;:13::i;:::-;27025:1:::1;27018:3;:8;;;;26996:85;;;::::0;-1:-1:-1;;;26996:85:0;;4601:2:1;26996:85:0::1;::::0;::::1;4583:21:1::0;4640:2;4620:18;;;4613:30;4679:29;4659:18;;;4652:57;4726:18;;26996:85:0::1;4399:351:1::0;26996:85:0::1;27092:13;::::0;::::1;:7;:13:::0;;;27121:19:::1;::::0;2711:36:1;;;27121:19:0::1;::::0;2699:2:1;2684:18;27121:19:0::1;2569:184:1::0;24126:558:0;-1:-1:-1;;;;;24281:19:0;;24260:4;24281:19;;;:11;:19;;;;;;;;24301:10;24281:31;;;;;;;;-1:-1:-1;;24281:52:0;24277:340;;-1:-1:-1;;;;;24376:19:0;;;;;;:11;:19;;;;;;;;24396:10;24376:31;;;;;;;;:41;-1:-1:-1;24376:41:0;24350:132;;;;-1:-1:-1;;;24350:132:0;;4957:2:1;24350:132:0;;;4939:21:1;4996:2;4976:18;;;4969:30;5035:31;5015:18;;;5008:59;5084:18;;24350:132:0;4755:353:1;24350:132:0;-1:-1:-1;;;;;24548:19:0;;;;;;:11;:19;;;;;;;;24568:10;24548:31;;;;;;;;:57;;24599:6;;24548:57;:::i;:::-;-1:-1:-1;;;;;24497:19:0;;;;;;:11;:19;;;;;;;;24517:10;24497:31;;;;;;;:108;24277:340;24636:40;24650:6;24658:9;24669:6;24636:13;:40::i;:::-;24629:47;;24126:558;;;;;;:::o;25987:136::-;26040:7;26100:15;19468:42;26100:9;:15::i;:::-;26082;19395:42;26082:9;:15::i;:::-;26067:12;;:30;;;;:::i;:::-;:48;;;;:::i;:::-;26060:55;;25987:136;:::o;25812:167::-;25898:7;25955:16;;25939:12;;25926:10;:25;;;;:::i;:::-;25925:46;;;;:::i;25662:142::-;25727:7;25784:12;;25764:16;;25755:6;:25;;;;:::i;23807:122::-;23862:4;23886:35;23894:7;-1:-1:-1;;23886:7:0;:35::i;27178:235::-;27280:4;13685:13;:11;:13::i;:::-;27302:20:::1;:32:::0;;-1:-1:-1;;;;;;27302:32:0::1;-1:-1:-1::0;;;;;27302:32:0;::::1;::::0;;::::1;::::0;;;27350:33:::1;::::0;3325:51:1;;;27350:33:0::1;::::0;3313:2:1;3298:18;27350:33:0::1;3179:203:1::0;26391:232:0;26499:4;13685:13;:11;:13::i;:::-;-1:-1:-1;;;;;26521:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;;:28;;-1:-1:-1;;26521:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26565;;5941:51:1;;;6008:18;;;6001:50;26565:28:0::1;::::0;5914:18:1;26565:28:0::1;;;;;;;-1:-1:-1::0;26611:4:0::1;26391:232:::0;;;;:::o;25336:138::-;-1:-1:-1;;;;;25449:16:0;;25402:7;25449:16;;;:7;:16;;;;;;25429:37;;:19;:37::i;14447:103::-;13685:13;:11;:13::i;:::-;14512:30:::1;14539:1;14512:18;:30::i;:::-;14447:103::o:0;25239:89::-;25280:13;25313:7;25306:14;;;;;:::i;23937:181::-;24042:4;24066:44;24080:10;24092:9;24103:6;24066:13;:44::i;14705:238::-;13685:13;:11;:13::i;:::-;-1:-1:-1;;;;;14808:22:0;::::1;14786:110;;;::::0;-1:-1:-1;;;14786:110:0;;6264:2:1;14786:110:0::1;::::0;::::1;6246:21:1::0;6303:2;6283:18;;;6276:30;6342:34;6322:18;;;6315:62;-1:-1:-1;;;6393:18:1;;;6386:36;6439:19;;14786:110:0::1;6062:402:1::0;14786:110:0::1;14907:28;14926:8;14907:18;:28::i;:::-;14705:238:::0;:::o;13964:132::-;13845:7;13872:6;-1:-1:-1;;;;;13872:6:0;3729:10;14028:23;14020:68;;;;-1:-1:-1;;;14020:68:0;;6671:2:1;14020:68:0;;;6653:21:1;;;6690:18;;;6683:30;6749:34;6729:18;;;6722:62;6801:18;;14020:68:0;6469:356:1;27679:1597:0;27826:6;;27805:4;;27826:6;;27822:87;;;27856:41;27871:6;27879:9;27890:6;27856:14;:41::i;:::-;27849:48;;;;27822:87;27925:17;:15;:17::i;:::-;27921:61;;;27959:11;:9;:11::i;:::-;28013:6;;;;28012:7;:52;;;;;28049:15;-1:-1:-1;;;;;28036:28:0;:9;-1:-1:-1;;;;;28036:28:0;;28012:52;:82;;;;-1:-1:-1;28081:13:0;;;;28012:82;:150;;;;;28147:15;;28130:14;;:32;;;;:::i;:::-;28111:15;:51;;28012:150;:187;;;;-1:-1:-1;;;;;;28180:19:0;;;;;;:11;:19;;;;;;;;28179:20;28012:187;27994:273;;;28226:29;:27;:29::i;:::-;;27994:273;28298:6;;;;28297:7;:52;;;;;28334:15;-1:-1:-1;;;;;28321:28:0;:9;-1:-1:-1;;;;;28321:28:0;;28297:52;:90;;;;-1:-1:-1;28366:21:0;;;;28297:90;:166;;;;;28444:19;;28423:18;;:40;;;;:::i;:::-;28404:15;:59;;28297:166;:203;;;;-1:-1:-1;;;;;;28481:19:0;;;;;;:11;:19;;;;;;;;28480:20;28297:203;28279:275;;;28527:15;:13;:15::i;:::-;;28279:275;28566:24;28593:26;28612:6;28593:18;:26::i;:::-;-1:-1:-1;;;;;28638:15:0;;;;;;:7;:15;;;;;;28566:53;;-1:-1:-1;28638:35:0;-1:-1:-1;28638:35:0;28630:68;;;;-1:-1:-1;;;28630:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28727:15:0;;;;;;:7;:15;;;;;;:34;;28745:16;;28727:34;:::i;:::-;-1:-1:-1;;;;;28709:15:0;;;;;;:7;:15;;;;;:52;;;;28803:33;28717:6;28826:9;28803:14;:33::i;:::-;:236;;29023:16;28803:236;;;28852:155;28902:15;-1:-1:-1;;;;;28892:25:0;:6;-1:-1:-1;;;;;28892:25:0;;:40;;28927:5;28892:40;;;28920:4;28892:40;28951:6;28976:16;28852:21;:155::i;:::-;-1:-1:-1;;;;;29071:18:0;;;;;;:7;:18;;;;;;28774:265;;-1:-1:-1;29071:39:0;;28774:265;;29071:39;:::i;:::-;-1:-1:-1;;;;;29050:18:0;;;;;;;:7;:18;;;;;:60;;;;29128:118;;;29196:39;29216:18;29196:19;:39::i;:::-;29128:118;;160:25:1;;;148:2;133:18;29128:118:0;;;;;;;-1:-1:-1;29264:4:0;;27679:1597;-1:-1:-1;;;;;27679:1597:0:o;15103:191::-;15177:16;15196:6;;-1:-1:-1;;;;;15213:17:0;;;-1:-1:-1;;;;;;15213:17:0;;;;;;15246:40;;15196:6;;;;;;;15246:40;;15177:16;15246:40;15166:128;15103:191;:::o;29284:489::-;29411:4;29428:24;29455:26;29474:6;29455:18;:26::i;:::-;-1:-1:-1;;;;;29500:15:0;;;;;;:7;:15;;;;;;29428:53;;-1:-1:-1;29500:35:0;-1:-1:-1;29500:35:0;29492:68;;;;-1:-1:-1;;;29492:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29589:15:0;;;;;;:7;:15;;;;;;:34;;29607:16;;29589:34;:::i;:::-;-1:-1:-1;;;;;29571:15:0;;;;;;;:7;:15;;;;;;:52;;;;29655:18;;;;;;;:37;;29676:16;;29655:37;:::i;:::-;-1:-1:-1;;;;;29634:18:0;;;;;;;:7;:18;;;;;;;:58;;;;29708:35;;;;;;;;;;29736:6;160:25:1;;148:2;133:18;;14:177;29708:35:0;;;;;;;;-1:-1:-1;29761:4:0;;29284:489;-1:-1:-1;;;;29284:489:0:o;30660:235::-;30710:4;30747:10;-1:-1:-1;;;;;30761:15:0;30747:29;;;;;:53;;-1:-1:-1;30794:6:0;;;;30793:7;30747:53;:82;;;;-1:-1:-1;30817:12:0;;-1:-1:-1;;;30817:12:0;;;;30747:82;:140;;;;;30874:13;;30846:24;30864:4;30846:9;:24::i;:::-;:41;;30727:160;;30660:235;:::o;30903:701::-;21814:6;:13;;-1:-1:-1;;21814:13:0;21823:4;21814:13;;;:6;30978:24:::1;30996:4;30978:9;:24::i;:::-;30955:47;;31013:49;20740:42;31049:12;31013:7;:49::i;:::-;-1:-1:-1::0;31116:16:0::1;::::0;;31130:1:::1;31116:16:::0;;;;;::::1;::::0;;31092:21:::1;::::0;31116:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;31116:16:0::1;31092:40;;31161:4;31143;31148:1;31143:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;31143:23:0::1;;;-1:-1:-1::0;;;;;31143:23:0::1;;;::::0;::::1;20740:42;-1:-1:-1::0;;;;;31187:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31177:4;31182:1;31177:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31177:34:0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:34;31224:199:::1;::::0;-1:-1:-1;;;31224:199:0;;20740:42:::1;::::0;31224:68:::1;::::0;:199:::1;::::0;31307:12;;31334:1:::1;::::0;31350:4;;31377::::1;::::0;31397:15:::1;::::0;31224:199:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31483:20:0::1;::::0;31475:92:::1;::::0;31454:15:::1;::::0;-1:-1:-1;;;;;;31483:20:0;;::::1;::::0;-1:-1:-1;31531:21:0::1;::::0;31454:15;31475:92;31454:15;31475:92;31531:21;31483:20;31475:92:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;21850:6:0;:14;;-1:-1:-1;;21850:14:0;;;-1:-1:-1;;;;30903:701:0:o;31969:765::-;32060:15;32043:14;:32;;;32161:31;;-1:-1:-1;;;32161:31:0;;-1:-1:-1;;;;;32176:15:0;3343:32:1;32161:31:0;;;3325:51:1;;;;32026:4:0;;;;32161;;:14;;3298:18:1;;32161:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32130:62;;32242:20;32265:77;32326:5;32265:42;32290:16;;32265:20;:24;;:42;;;;:::i;:::-;:46;;:77::i;:::-;32242:100;-1:-1:-1;32447:16:0;;32443:111;;32480:62;32495:15;32520:6;32529:12;32480:14;:62::i;:::-;;32443:111;32629:19;32666:15;32629:53;;32693:4;-1:-1:-1;;;;;32693:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32722:4;32715:11;;;;;31969:765;:::o;32742:834::-;32823:15;32802:18;:36;32880:31;;-1:-1:-1;;;32880:31:0;;-1:-1:-1;;;;;32895:15:0;3343:32:1;32880:31:0;;;3325:51:1;32785:4:0;;;;32880;;:14;;3298:18:1;;32880:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32849:62;;32964:23;32990:85;33069:5;32990:60;33029:20;;32990;:38;;:60;;;;:::i;:85::-;-1:-1:-1;;;;;33126:15:0;33110:33;;;;;:7;:33;;;;;;32964:111;;-1:-1:-1;33110:52:0;-1:-1:-1;33110:52:0;33088:122;;;;-1:-1:-1;;;33088:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33288:15:0;33272:33;;;;;:7;:33;;;;;;:64;;33321:15;;33272:64;:::i;:::-;-1:-1:-1;;;;;33239:15:0;33223:33;;;;;:7;:33;;;;;:113;33366:16;;:34;;33385:15;;33366:34;:::i;:::-;33347:16;:53;;;33418:42;;;9387:25:1;;;9443:2;9428:18;;9421:34;;;;33418:42:0;;9360:18:1;33418:42:0;;;;;;;33471:19;33508:15;33471:53;;33535:4;-1:-1:-1;;;;;33535:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31612:349;31719:4;31736:16;31765:15;-1:-1:-1;;;;;31755:25:0;:6;-1:-1:-1;;;;;31755:25:0;;:70;;;;31810:15;-1:-1:-1;;;;;31797:28:0;:9;-1:-1:-1;;;;;31797:28:0;;31755:70;-1:-1:-1;;;;;31859:19:0;;31836:20;31859:19;;;:11;:19;;;;;;31736:89;;-1:-1:-1;31836:20:0;31859:19;;;:45;;-1:-1:-1;;;;;;31882:22:0;;;;;;:11;:22;;;;;;;;31859:45;31836:68;;31923:15;31922:16;:31;;;;;31942:11;31922:31;31915:38;31612:349;-1:-1:-1;;;;;31612:349:0:o;29781:871::-;29958:6;;29995:7;;29919;;29958:6;29919:7;30055:4;30045:14;;;;:117;;30159:3;30127:28;30146:9;30127:16;:28;:::i;:::-;30126:36;;;;:::i;:::-;30045:117;;;30107:3;30076:27;30095:8;30076:16;:27;:::i;:::-;30075:35;;;;:::i;:::-;30015:147;-1:-1:-1;30015:147:0;30267:25;;30263:326;;30367:4;30351:22;;;;:7;:22;;;;;;:63;;30393:21;;30351:63;:::i;:::-;30325:4;30309:22;;;;:7;:22;;;;;:105;;;;-1:-1:-1;;;;;30436:141:0;;;30520:42;30540:21;30520:19;:42::i;:::-;30436:141;;160:25:1;;;148:2;133:18;30436:141:0;;;;;;;30263:326;30606:38;30625:19;30606:16;:38;:::i;:::-;30599:45;29781:871;-1:-1:-1;;;;;;;;29781:871:0:o;9777:98::-;9835:7;9862:5;9866:1;9862;:5;:::i;10176:98::-;10234:7;10261:5;10265:1;10261;:5;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:269::-;1454:6;1507:2;1495:9;1486:7;1482:23;1478:32;1475:52;;;1523:1;1520;1513:12;1475:52;1562:9;1549:23;1612:4;1605:5;1601:16;1594:5;1591:27;1581:55;;1632:1;1629;1622:12;1671:247;1730:6;1783:2;1771:9;1762:7;1758:23;1754:32;1751:52;;;1799:1;1796;1789:12;1751:52;1838:9;1825:23;1857:31;1882:5;1857:31;:::i;1923:456::-;2000:6;2008;2016;2069:2;2057:9;2048:7;2044:23;2040:32;2037:52;;;2085:1;2082;2075:12;2037:52;2124:9;2111:23;2143:31;2168:5;2143:31;:::i;:::-;2193:5;-1:-1:-1;2250:2:1;2235:18;;2222:32;2263:33;2222:32;2263:33;:::i;:::-;1923:456;;2315:7;;-1:-1:-1;;;2369:2:1;2354:18;;;;2341:32;;1923:456::o;2384:180::-;2443:6;2496:2;2484:9;2475:7;2471:23;2467:32;2464:52;;;2512:1;2509;2502:12;2464:52;-1:-1:-1;2535:23:1;;2384:180;-1:-1:-1;2384:180:1:o;2758:416::-;2823:6;2831;2884:2;2872:9;2863:7;2859:23;2855:32;2852:52;;;2900:1;2897;2890:12;2852:52;2939:9;2926:23;2958:31;2983:5;2958:31;:::i;:::-;3008:5;-1:-1:-1;3065:2:1;3050:18;;3037:32;3107:15;;3100:23;3088:36;;3078:64;;3138:1;3135;3128:12;3078:64;3161:7;3151:17;;;2758:416;;;;;:::o;3621:388::-;3689:6;3697;3750:2;3738:9;3729:7;3725:23;3721:32;3718:52;;;3766:1;3763;3756:12;3718:52;3805:9;3792:23;3824:31;3849:5;3824:31;:::i;:::-;3874:5;-1:-1:-1;3931:2:1;3916:18;;3903:32;3944:33;3903:32;3944:33;:::i;4014:380::-;4093:1;4089:12;;;;4136;;;4157:61;;4211:4;4203:6;4199:17;4189:27;;4157:61;4264:2;4256:6;4253:14;4233:18;4230:38;4227:161;;4310:10;4305:3;4301:20;4298:1;4291:31;4345:4;4342:1;4335:15;4373:4;4370:1;4363:15;4227:161;;4014:380;;;:::o;5113:127::-;5174:10;5169:3;5165:20;5162:1;5155:31;5205:4;5202:1;5195:15;5229:4;5226:1;5219:15;5245:128;5312:9;;;5333:11;;;5330:37;;;5347:18;;:::i;5378:168::-;5451:9;;;5482;;5499:15;;;5493:22;;5479:37;5469:71;;5520:18;;:::i;5551:217::-;5591:1;5617;5607:132;;5661:10;5656:3;5652:20;5649:1;5642:31;5696:4;5693:1;5686:15;5724:4;5721:1;5714:15;5607:132;-1:-1:-1;5753:9:1;;5551:217::o;6830:125::-;6895:9;;;6916:10;;;6913:36;;;6929:18;;:::i;6960:344::-;7162:2;7144:21;;;7201:2;7181:18;;;7174:30;-1:-1:-1;;;7235:2:1;7220:18;;7213:50;7295:2;7280:18;;6960:344::o;7441:127::-;7502:10;7497:3;7493:20;7490:1;7483:31;7533:4;7530:1;7523:15;7557:4;7554:1;7547:15;7573:251;7643:6;7696:2;7684:9;7675:7;7671:23;7667:32;7664:52;;;7712:1;7709;7702:12;7664:52;7744:9;7738:16;7763:31;7788:5;7763:31;:::i;7829:980::-;8091:4;8139:3;8128:9;8124:19;8170:6;8159:9;8152:25;8196:2;8234:6;8229:2;8218:9;8214:18;8207:34;8277:3;8272:2;8261:9;8257:18;8250:31;8301:6;8336;8330:13;8367:6;8359;8352:22;8405:3;8394:9;8390:19;8383:26;;8444:2;8436:6;8432:15;8418:29;;8465:1;8475:195;8489:6;8486:1;8483:13;8475:195;;;8554:13;;-1:-1:-1;;;;;8550:39:1;8538:52;;8645:15;;;;8610:12;;;;8586:1;8504:9;8475:195;;;-1:-1:-1;;;;;;;8726:32:1;;;;8721:2;8706:18;;8699:60;-1:-1:-1;;;8790:3:1;8775:19;8768:35;8687:3;7829:980;-1:-1:-1;;;7829:980:1:o;9024:184::-;9094:6;9147:2;9135:9;9126:7;9122:23;9118:32;9115:52;;;9163:1;9160;9153:12;9115:52;-1:-1:-1;9186:16:1;;9024:184;-1:-1:-1;9024:184:1:o

Swarm Source

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