ETH Price: $3,471.31 (+4.12%)

Token

Bunny AI (BUNAI)
 

Overview

Max Total Supply

23,000,000 BUNAI

Holders

179

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
23,527 BUNAI

Value
$0.00
0x9cf43d2be0d6329d183d00db65fa5db2926a7a4f
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:
BunnyAI

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-01
*/

/**
 *  SourceUnit: /Users/jmf/dev/bunnyAi/contracts/BunnyAiToken.sol
 */

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

/**
 *  SourceUnit: /Users/jmf/dev/bunnyAi/contracts/BunnyAiToken.sol
 */

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

/**
 *  SourceUnit: /Users/jmf/dev/bunnyAi/contracts/BunnyAiToken.sol
 */

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

////import "../IERC20.sol";

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

/**
 *  SourceUnit: /Users/jmf/dev/bunnyAi/contracts/BunnyAiToken.sol
 */

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
pragma solidity 0.8.19;

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 *  SourceUnit: /Users/jmf/dev/bunnyAi/contracts/BunnyAiToken.sol
 */

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

////import "../utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}

/**
 *  SourceUnit: /Users/jmf/dev/bunnyAi/contracts/BunnyAiToken.sol
 */

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

////import "./IERC20.sol";
////import "./extensions/IERC20Metadata.sol";
////import "../../utils/Context.sol";

/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

/**
 *  SourceUnit: /Users/jmf/dev/bunnyAi/contracts/BunnyAiToken.sol
 */

//  SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

////import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
////import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
////import "@openzeppelin/contracts/access/Ownable.sol";
////import "./interfaces/IUniswap.sol";

contract BunnyAI is ERC20, Ownable {
    mapping(address => bool) public blacklist;
    mapping(address => bool) public feeExempt;
    mapping(address => bool) public maxTxExempt;
    mapping(address => uint) private lastTx;
    mapping(address => bool) private cooldownWhitelist;
    mapping(address => bool) public preExemption;
    mapping(address => bool) public maxWalletExempt;

    uint8 public constant blockCooldown = 5;

    address public marketing;
    address public stakingPool;

    uint public totalBuyFee;
    uint public totalSellFee;

    uint public maxWalletAmount;
    uint public maxTxAmount;
    uint public maxBuyTxAmount;
    uint public maxSellTxAmount;

    uint public marketingFees;
    uint public stakingFees;
    uint public liquidityFees;

    uint public totalMarketingFees;
    uint public totalStakingFees;
    uint public totalLiquidityFees;

    uint public swapThreshold = 10 ether;

    uint8[3] public buyFees;
    uint8[3] public sellFees;
    uint256 public constant BASE = 100;
    address public constant DEAD_WALLET =
        0x000000000000000000000000000000000000dEaD;

    bool public tradingOpen = false;
    bool public limitsRemoved = false;
    bool private swapping = false;

    IUniswapV2Pair public pair;
    IUniswapV2Router02 public router;

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    /// @notice Modifier to check if this is an internal swap
    modifier swapExecuting() {
        swapping = true;
        _;
        swapping = false;
    }

    constructor(address _mkt, address _stk) ERC20("Bunny AI", "BUNAI") {
        require(_mkt != address(0) && _stk != address(0), "Invalid address");
        marketing = _mkt;
        stakingPool = _stk;
        // 23 million tokens
        _mint(msg.sender, 23_000_000 ether);
        // max Tx amount is 1% of total supply
        maxTxAmount = 23_000_000 ether / 100;
        maxBuyTxAmount = maxTxAmount;
        maxSellTxAmount = maxTxAmount;
        // max wallet amount is 2% of total supply
        maxWalletAmount = maxTxAmount * 3;

        buyFees[0] = 5;
        buyFees[1] = 2;
        buyFees[2] = 1;
        sellFees[0] = 5;
        sellFees[1] = 2;
        sellFees[2] = 1;

        totalBuyFee = buyFees[0] + buyFees[1] + buyFees[2];
        totalSellFee = sellFees[0] + sellFees[1] + sellFees[2];

        // Set Uniswap V2 Router for both ETH and ARBITRUM
        if (block.chainid == 1) {
            router = IUniswapV2Router02(
                0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
            );
        } else if (block.chainid == 42161) {
            // need to double check this address on ARBITRUM
            router = IUniswapV2Router02(
                0xE54Ca86531e17Ef3616d22Ca28b0D458b6C89106
            );
        } else revert("Chain not supported");

        IUniswapV2Factory factory = IUniswapV2Factory(router.factory());
        pair = IUniswapV2Pair(factory.createPair(address(this), router.WETH()));

        setFeeExempt(address(this), true);
        setFeeExempt(owner(), true);
        setMaxTxExempt(address(this), true);
        setMaxTxExempt(owner(), true);
        setCooldownWhitelist(address(this), true);
        setCooldownWhitelist(owner(), true);
        setCooldownWhitelist(marketing, true);
        setCooldownWhitelist(address(pair), true);
        setCooldownWhitelist(address(router), true);
        setMaxWalletExempt(address(this), true);
        setMaxWalletExempt(owner(), true);
        setMaxWalletExempt(marketing, true);
        setMaxWalletExempt(address(pair), true);
        setMaxWalletExempt(address(router), true);
        setPreExemption(address(this), true);
        setPreExemption(owner(), true);
    }

    /// @notice Allowed to receive ETH
    receive() external payable {}

    /// @notice Checks before Token Transfer
    /// @param from Address of sender
    /// @param to Address of receiver
    /// @param amount Amount of tokens to transfer
    /// @dev Checks if the sender and receiver are blacklisted or if amounts are within limits
    function _beforeTransfer(
        address from,
        address to,
        uint256 amount
    ) internal {
        if (limitsRemoved || from == address(0) || to == address(0) || swapping)
            return;
        require(
            !blacklist[from] && !blacklist[to],
            "BUNAI: Blacklisted address"
        );
        // Only Owner can transfer tokens before trading is open
        if (!tradingOpen) require(preExemption[from], "BUNAI: Trading blocked");

        if (!maxTxExempt[from]) {
            if (from == address(pair)) {
                require(
                    amount <= maxBuyTxAmount,
                    "BUNAI: Max buy amount exceeded"
                );
            } else if (to == address(pair)) {
                require(
                    amount <= maxSellTxAmount,
                    "BUNAI: Max sell amount exceeded"
                );
            }
        }
        if (!maxWalletExempt[to]) {
            require(
                balanceOf(to) + amount <= maxWalletAmount,
                "BUNAI: Max wallet amount exceeded"
            );
        }
        if (!cooldownWhitelist[from]) {
            require(lastTx[from] <= block.number, "BUNAI: Bot?");
            lastTx[from] = block.number + blockCooldown;
        }
    }

    /// @notice Burn tokens from sender address
    /// @param amount Amount of tokens to burn
    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    /// @notice Burn tokens from other owners as long as it is approved
    /// @param account Address of owner
    /// @param amount Amount of tokens to burn
    function burnFrom(address account, uint256 amount) external {
        require(
            amount <= allowance(account, msg.sender),
            "BUNAI: Not enough allowance"
        );
        uint256 decreasedAllowance = allowance(account, msg.sender) - amount;
        _approve(account, msg.sender, decreasedAllowance);
        _burn(account, amount);
    }

    /// @notice Internal transfer tokens
    /// @param sender Address of receiver
    /// @param recipient Address of receiver
    /// @param amount Amount of tokens to transfer
    /// @dev calls _beforeTokenTransfer, manages taxes and transfers tokens
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        _beforeTransfer(sender, recipient, amount);
        if (!swapping) {
            uint currentTokensHeld = balanceOf(address(this));
            if (
                currentTokensHeld >= swapThreshold &&
                sender != address(pair) &&
                sender != address(router)
            ) {
                _handleSwapAndDistribute(currentTokensHeld);
            }

            if (
                ((sender == address(pair) && !feeExempt[recipient]) ||
                    (recipient == address(pair) && !feeExempt[sender]))
            ) {
                uint totalFee = takeFee(amount, sender == address(pair));
                super._transfer(sender, address(this), totalFee);
                amount -= totalFee;
            }
        }

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

    /// @notice Set the fee for a specific transaction type
    /// @param amount Amount of transaction
    /// @param isBuy True if transaction is a buy, false if transaction is a sell
    /// @return totalFee Total fee taken in this transaction
    function takeFee(
        uint256 amount,
        bool isBuy
    ) internal returns (uint256 totalFee) {
        uint selectedFee = isBuy ? totalBuyFee : totalSellFee;
        totalFee = (selectedFee * amount) / BASE;

        uint8[3] storage fees = isBuy ? buyFees : sellFees;

        uint marketingFee = (fees[0] * totalFee) / selectedFee;
        uint poolFee = (fees[1] * totalFee) / selectedFee;
        uint liqFee = totalFee - marketingFee - poolFee;

        marketingFees += marketingFee;
        stakingFees += poolFee;
        liquidityFees += liqFee;
    }

    /// @notice Swap tokens for ETH and distribute to marketing, liquidity and staking
    /// @param tokensHeld Amount of tokens held in contract to swap
    /// @dev to make the most out of the liquidity that is added, the contract will swap and add liquidity before swapping the amount to distribute
    function _handleSwapAndDistribute(uint tokensHeld) private swapExecuting {
        uint totalFees = marketingFees + stakingFees + liquidityFees;

        uint mkt = marketingFees;
        uint stk = stakingFees;
        uint liq = liquidityFees;

        if (totalFees != tokensHeld) {
            mkt = (marketingFees * tokensHeld) / totalFees;
            stk = (stakingFees * tokensHeld) / totalFees;
            liq = tokensHeld - mkt - stk;
        }
        if (liq > 0) _swapAndLiquify(liq);

        if (mkt + stk > 0) {
            swapTokensForEth(mkt + stk);
            uint ethBalance = address(this).balance;
            bool succ;
            if (mkt > 0) {
                mkt = (mkt * ethBalance) / (mkt + stk);
                (succ, ) = payable(marketing).call{value: mkt}("");
                require(succ);
                totalMarketingFees += mkt;
            }
            if (stk > 0) {
                stk = ethBalance - mkt;
                (succ, ) = payable(stakingPool).call{value: stk}("");
                require(succ);
                totalStakingFees += stk;
            }
        }
        marketingFees = 0;
        stakingFees = 0;
        liquidityFees = 0;
    }

    /// @notice Swap half of tokens for ETH and create liquidity from an external call
    function swapAndLiquify() public swapExecuting {
        require(
            liquidityFees >= balanceOf(address(this)),
            "BUNAI: Not enough tokens"
        );
        _swapAndLiquify(liquidityFees);
        liquidityFees = 0;
    }

    /// @notice Swap half tokens for ETH and create liquidity internally
    /// @param tokens Amount of tokens to swap
    function _swapAndLiquify(uint tokens) private {
        uint half = tokens / 2;
        uint otherHalf = tokens - half;

        uint initialBalance = address(this).balance;

        swapTokensForEth(half);

        uint newBalance = address(this).balance - initialBalance;

        _approve(address(this), address(router), otherHalf);
        (, , uint liquidity) = router.addLiquidityETH{value: newBalance}(
            address(this),
            otherHalf,
            0,
            0,
            DEAD_WALLET,
            block.timestamp
        );

        totalLiquidityFees += liquidity;

        emit SwapAndLiquify(half, newBalance, liquidity);
    }

    /// @notice Swap tokens for ETH
    function swapTokensForEth(uint tokens) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        _approve(address(this), address(router), tokens);

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokens,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    // Only Owner section
    ///@notice Set the fee for buy transactions
    ///@param _marketing Marketing fee
    ///@param _pool Staking Pool fee
    ///@param _liq Liquidity fee
    ///@dev Fees are in percentage and cant be more than 25%
    function setBuyFees(
        uint8 _marketing,
        uint8 _pool,
        uint8 _liq
    ) external onlyOwner {
        totalBuyFee = _marketing + _pool + _liq;
        require(totalBuyFee <= 25, "Fees cannot be more than 25%");
        buyFees = [_marketing, _pool, _liq];
    }

    ///@notice Set the fee for sell transactions
    ///@param _marketing Marketing fee
    ///@param _pool Staking Pool fee
    ///@param _liq Liquidity fee
    ///@dev Fees are in percentage and cant be more than 25%
    function setSellFees(
        uint8 _marketing,
        uint8 _pool,
        uint8 _liq
    ) external onlyOwner {
        totalSellFee = _marketing + _pool + _liq;
        require(totalSellFee <= 25, "Fees cannot be more than 25%");
        sellFees = [_marketing, _pool, _liq];
    }

    ///@notice set address to be exempt from fees
    ///@param _address Address to be exempt
    ///@param exempt true or false
    function setFeeExempt(address _address, bool exempt) public onlyOwner {
        feeExempt[_address] = exempt;
    }

    ///@notice set address to be blacklisted
    ///@param _address Address to be blacklisted
    ///@param _blacklist true or false
    function setBlacklist(
        address _address,
        bool _blacklist
    ) external onlyOwner {
        blacklist[_address] = _blacklist;
    }

    ///@notice allow token trading to start
    function openTrade() external onlyOwner {
        tradingOpen = true;
    }

    ///@notice get tokens sent "mistakenly" to the contract
    ///@param _token Address of the token to be recovered
    function recoverToken(address _token) external onlyOwner {
        require(_token != address(this), "Cannot withdraw BUNAI");
        uint256 balance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(msg.sender, balance);
    }

    /// @notice recover ETH sent to the contract
    function recoverETH() external onlyOwner {
        (bool succ, ) = payable(msg.sender).call{value: address(this).balance}(
            ""
        );
        require(succ, "Transfer failed");
    }

    ///@notice set the marketing wallet address
    ///@param _marketing Address of the new marketing wallet
    ///@dev Marketing wallet address cannot be 0x0 or the current marketing wallet address
    function setMarketingWallet(address _marketing) external onlyOwner {
        require(
            _marketing != address(0) && _marketing != marketing,
            "Invalid address"
        );
        marketing = _marketing;
    }

    ///@notice set the staking pool address
    ///@param _stakingPool Address of the new staking pool
    ///@dev Staking pool address cannot be 0x0 or the current staking pool address
    function setStakingPool(address _stakingPool) external onlyOwner {
        require(
            _stakingPool != address(0) && _stakingPool != stakingPool,
            "Invalid address"
        );
        stakingPool = _stakingPool;
    }

    ///@notice set address to be exempt from max buys and sells
    ///@param _address Address to be exempt
    ///@param exempt true or false
    function setMaxTxExempt(address _address, bool exempt) public onlyOwner {
        maxTxExempt[_address] = exempt;
    }

    function setMaxBuy(uint256 _amount) external onlyOwner {
        require(_amount >= maxTxAmount, "Invalid Max Buy Amount");
        maxBuyTxAmount = _amount;
    }

    function setMaxSell(uint256 _amount) external onlyOwner {
        require(_amount >= maxTxAmount, "Invalid Max Sell Amount");
        maxSellTxAmount = _amount;
    }

    function setMaxTxAmount(uint256 _amount) external onlyOwner {
        require(_amount >= totalSupply() / 100, "Invalid Max Tx Amount");
        maxTxAmount = _amount;
    }

    function setMaxWalletAmount(uint256 _amount) external onlyOwner {
        require(_amount >= totalSupply() / 100, "Invalid Max Wallet Amount");
        maxWalletAmount = _amount;
    }

    function setSwapThreshold(uint256 _amount) external onlyOwner {
        require(_amount >= 0, "Invalid Min Token Swap Amount");
        swapThreshold = _amount;
    }

    function setCooldownWhitelist(
        address _address,
        bool _whitelist
    ) public onlyOwner {
        cooldownWhitelist[_address] = _whitelist;
    }

    function setPreExemption(address _address, bool _exempt) public onlyOwner {
        preExemption[_address] = _exempt;
    }

    function setMaxWalletExempt(
        address _address,
        bool _exempt
    ) public onlyOwner {
        maxWalletExempt[_address] = _exempt;
    }

    function removeAllLimits() external onlyOwner {
        limitsRemoved = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_mkt","type":"address"},{"internalType":"address","name":"_stk","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEAD_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockCooldown","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsRemoved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxTxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxWalletExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preExemption","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAllLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_blacklist","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_marketing","type":"uint8"},{"internalType":"uint8","name":"_pool","type":"uint8"},{"internalType":"uint8","name":"_liq","type":"uint8"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelist","type":"bool"}],"name":"setCooldownWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setMaxTxExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"setMaxWalletExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"setPreExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_marketing","type":"uint8"},{"internalType":"uint8","name":"_pool","type":"uint8"},{"internalType":"uint8","name":"_liq","type":"uint8"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingPool","type":"address"}],"name":"setStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLiquidityFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052678ac7230489e80000601b55601e805462ffffff191690553480156200002957600080fd5b50604051620035a4380380620035a48339810160408190526200004c916200089e565b6040518060400160405280600881526020016742756e6e7920414960c01b8152506040518060400160405280600581526020016442554e414960d81b81525081600390816200009c91906200097a565b506004620000ab82826200097a565b505050620000c8620000c2620005fc60201b60201c565b62000600565b6001600160a01b03821615801590620000e957506001600160a01b03811615155b6200012d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600d80546001600160a01b038085166001600160a01b031992831617909255600e80549284169290911691909117905562000174336a1306707f9469597700000062000652565b6930b453321fc603c000006012819055601381905560148190556200019b90600362000a5c565b601155601c80546201020562ffffff19918216811792839055601d805490921617905560ff620100008204811691620001dd9161010090910416600562000a7c565b620001e9919062000a7c565b60ff908116600f55601d54620100008104821691620002119161010081048216911662000a7c565b6200021d919062000a7c565b60ff16601055466001036200025857601f80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055620002d7565b4661a4b1036200028e57601f80546001600160a01b03191673e54ca86531e17ef3616d22ca28b0d458b6c89106179055620002d7565b60405162461bcd60e51b815260206004820152601360248201527f436861696e206e6f7420737570706f7274656400000000000000000000000000604482015260640162000124565b601f546040805163c45a015560e01b815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000348919062000a98565b9050806001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d4919062000a98565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000422573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000448919062000a98565b601e80546001600160a01b03929092166301000000026301000000600160b81b03199092169190911790556200048030600162000715565b6200049f620004976005546001600160a01b031690565b600162000715565b620004ac3060016200074a565b620004cb620004c36005546001600160a01b031690565b60016200074a565b620004d83060016200077f565b620004f7620004ef6005546001600160a01b031690565b60016200077f565b600d5462000510906001600160a01b031660016200077f565b601e546200053090630100000090046001600160a01b031660016200077f565b601f5462000549906001600160a01b031660016200077f565b62000556306001620007b4565b620005756200056d6005546001600160a01b031690565b6001620007b4565b600d546200058e906001600160a01b03166001620007b4565b601e54620005ae90630100000090046001600160a01b03166001620007b4565b601f54620005c7906001600160a01b03166001620007b4565b620005d4306001620007e9565b620005f3620005eb6005546001600160a01b031690565b6001620007e9565b50505062000ad3565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620006aa5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000124565b8060026000828254620006be919062000abd565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6200071f62000823565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6200075462000823565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6200078962000823565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b620007be62000823565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b620007f362000823565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b505050565b6005546001600160a01b031633146200087f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000124565b565b80516001600160a01b03811681146200089957600080fd5b919050565b60008060408385031215620008b257600080fd5b620008bd8362000881565b9150620008cd6020840162000881565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200090157607f821691505b6020821081036200092257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200081e57600081815260208120601f850160051c81016020861015620009515750805b601f850160051c820191505b8181101562000972578281556001016200095d565b505050505050565b81516001600160401b03811115620009965762000996620008d6565b620009ae81620009a78454620008ec565b8462000928565b602080601f831160018114620009e65760008415620009cd5750858301515b600019600386901b1c1916600185901b17855562000972565b600085815260208120601f198616915b8281101562000a1757888601518255948401946001909101908401620009f6565b508582101562000a365787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000a765762000a7662000a46565b92915050565b60ff818116838216019081111562000a765762000a7662000a46565b60006020828403121562000aab57600080fd5b62000ab68262000881565b9392505050565b8082018082111562000a765762000a7662000a46565b612ac18062000ae36000396000f3fe6080604052600436106103d25760003560e01c80638c0b5e22116101fd578063d3b895e511610118578063ec342ad0116100ab578063f53bc8351161007a578063f53bc83514610b19578063f887ea4014610b39578063f9f92be414610b59578063fb201b1d14610b89578063ffb54a9914610b9e57600080fd5b8063ec342ad014610aa4578063ec40643414610ab9578063ef998cf014610ad9578063f2fde38b14610af957600080fd5b8063dd62ed3e116100e7578063dd62ed3e14610a2e578063e22b62de14610a4e578063e388d53714610a6e578063ec28438a14610a8457600080fd5b8063d3b895e5146109d7578063d84bf7a8146109ed578063d851fd0d14610a03578063db05e5cb14610a1957600080fd5b8063a01c348311610190578063a9059cbb1161015f578063a9059cbb1461095c578063aa4bde281461097c578063b29ad50a14610992578063b9cb911f146109a757600080fd5b8063a01c3483146108e9578063a457c2d7146108ff578063a87e5da41461091f578063a8aa1b311461093557600080fd5b806395d89b41116101cc57806395d89b411461087e5780639be65a60146108935780639d0014b1146108b35780639d9241ec146108d357600080fd5b80638c0b5e22146107fa5780638da5cb5b146108105780638ebfc7961461082e578063918437971461084e57600080fd5b806335066960116102ed57806359b107b911610280578063715018a61161024f578063715018a6146107855780637537ccb61461079a57806379cc6790146107ba5780637d7d3aaf146107da57600080fd5b806359b107b9146107035780635d098b38146107195780636dca7e7b1461073957806370a082311461074f57600080fd5b806342966c68116102bc57806342966c6814610673578063494f6752146106935780634f0aad4e146106b357806350be7cdb146106e357600080fd5b806335066960146105ed57806339307e161461060d5780633950935114610623578063398daa851461064357600080fd5b806318160ddd116103655780632947c419116103345780632947c419146105725780632d3e474a146105995780633028f63a146105b9578063313ce567146105d957600080fd5b806318160ddd146104fe5780631d6f96551461051357806323b872dd1461053257806327a14fc21461055257600080fd5b80630c56ae3b116103a15780630c56ae3b146104705780630c7d08d3146104a8578063113a8b7b146104be578063153b0d1e146104de57600080fd5b80630445b667146103de5780630614117a1461040757806306fdde031461041e578063095ea7b31461044057600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f4601b5481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b5061041c610bb8565b005b34801561042a57600080fd5b50610433610c52565b6040516103fe91906126e0565b34801561044c57600080fd5b5061046061045b366004612743565b610ce4565b60405190151581526020016103fe565b34801561047c57600080fd5b50600e54610490906001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b3480156104b457600080fd5b506103f460195481565b3480156104ca57600080fd5b5061041c6104d936600461277d565b610cfe565b3480156104ea57600080fd5b5061041c6104f936600461277d565b610d31565b34801561050a57600080fd5b506002546103f4565b34801561051f57600080fd5b50601e5461046090610100900460ff1681565b34801561053e57600080fd5b5061046061054d3660046127b6565b610d64565b34801561055e57600080fd5b5061041c61056d3660046127f7565b610d88565b34801561057e57600080fd5b50610587600581565b60405160ff90911681526020016103fe565b3480156105a557600080fd5b50600d54610490906001600160a01b031681565b3480156105c557600080fd5b5061041c6105d4366004612810565b610df9565b3480156105e557600080fd5b506012610587565b3480156105f957600080fd5b506105876106083660046127f7565b610e87565b34801561061957600080fd5b506103f460155481565b34801561062f57600080fd5b5061046061063e366004612743565b610eb1565b34801561064f57600080fd5b5061046061065e366004612810565b60076020526000908152604090205460ff1681565b34801561067f57600080fd5b5061041c61068e3660046127f7565b610ed3565b34801561069f57600080fd5b5061041c6106ae36600461277d565b610edd565b3480156106bf57600080fd5b506104606106ce366004612810565b600c6020526000908152604090205460ff1681565b3480156106ef57600080fd5b5061041c6106fe36600461284a565b610f10565b34801561070f57600080fd5b506103f4600f5481565b34801561072557600080fd5b5061041c610734366004612810565b610fbb565b34801561074557600080fd5b506103f460165481565b34801561075b57600080fd5b506103f461076a366004612810565b6001600160a01b031660009081526020819052604090205490565b34801561079157600080fd5b5061041c611049565b3480156107a657600080fd5b5061041c6107b536600461277d565b61105d565b3480156107c657600080fd5b5061041c6107d5366004612743565b611090565b3480156107e657600080fd5b5061041c6107f536600461277d565b61111c565b34801561080657600080fd5b506103f460125481565b34801561081c57600080fd5b506005546001600160a01b0316610490565b34801561083a57600080fd5b5061041c61084936600461277d565b61114f565b34801561085a57600080fd5b50610460610869366004612810565b60086020526000908152604090205460ff1681565b34801561088a57600080fd5b50610433611182565b34801561089f57600080fd5b5061041c6108ae366004612810565b611191565b3480156108bf57600080fd5b5061041c6108ce3660046127f7565b6112c8565b3480156108df57600080fd5b506103f460105481565b3480156108f557600080fd5b5061049061dead81565b34801561090b57600080fd5b5061046061091a366004612743565b6112d5565b34801561092b57600080fd5b506103f460135481565b34801561094157600080fd5b50601e5461049090630100000090046001600160a01b031681565b34801561096857600080fd5b50610460610977366004612743565b611350565b34801561098857600080fd5b506103f460115481565b34801561099e57600080fd5b5061041c61135e565b3480156109b357600080fd5b506104606109c2366004612810565b600b6020526000908152604090205460ff1681565b3480156109e357600080fd5b506103f4601a5481565b3480156109f957600080fd5b506103f460185481565b348015610a0f57600080fd5b506103f460145481565b348015610a2557600080fd5b5061041c6113ee565b348015610a3a57600080fd5b506103f4610a4936600461288d565b611407565b348015610a5a57600080fd5b5061041c610a6936600461284a565b611432565b348015610a7a57600080fd5b506103f460175481565b348015610a9057600080fd5b5061041c610a9f3660046127f7565b6114d7565b348015610ab057600080fd5b506103f4606481565b348015610ac557600080fd5b50610587610ad43660046127f7565b611540565b348015610ae557600080fd5b5061041c610af43660046127f7565b611550565b348015610b0557600080fd5b5061041c610b14366004612810565b6115af565b348015610b2557600080fd5b5061041c610b343660046127f7565b611625565b348015610b4557600080fd5b50601f54610490906001600160a01b031681565b348015610b6557600080fd5b50610460610b74366004612810565b60066020526000908152604090205460ff1681565b348015610b9557600080fd5b5061041c61167d565b348015610baa57600080fd5b50601e546104609060ff1681565b610bc0611694565b604051600090339047908381818185875af1925050503d8060008114610c02576040519150601f19603f3d011682016040523d82523d6000602084013e610c07565b606091505b5050905080610c4f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064015b60405180910390fd5b50565b606060038054610c61906128bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8d906128bb565b8015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050905090565b600033610cf28185856116ee565b60019150505b92915050565b610d06611694565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610d39611694565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600033610d72858285611812565b610d7d858585611886565b506001949350505050565b610d90611694565b6064610d9b60025490565b610da5919061290b565b811015610df45760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964204d61782057616c6c657420416d6f756e74000000000000006044820152606401610c46565b601155565b610e01611694565b6001600160a01b03811615801590610e275750600e546001600160a01b03828116911614155b610e655760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b601d8160038110610e9757600080fd5b60209182820401919006915054906101000a900460ff1681565b600033610cf2818585610ec48383611407565b610ece919061292d565b6116ee565b610c4f33826119d3565b610ee5611694565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b610f18611694565b80610f238385612940565b610f2d9190612940565b60ff16600f81905560191015610f855760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601c906003612638565b50505050565b610fc3611694565b6001600160a01b03811615801590610fe95750600d546001600160a01b03828116911614155b6110275760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611051611694565b61105b6000611b05565b565b611065611694565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b61109a8233611407565b8111156110e95760405162461bcd60e51b815260206004820152601b60248201527f42554e41493a204e6f7420656e6f75676820616c6c6f77616e636500000000006044820152606401610c46565b6000816110f68433611407565b6111009190612959565b905061110d8333836116ee565b61111783836119d3565b505050565b611124611694565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b611157611694565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b606060048054610c61906128bb565b611199611694565b306001600160a01b038216036111e95760405162461bcd60e51b815260206004820152601560248201527443616e6e6f742077697468647261772042554e414960581b6044820152606401610c46565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611230573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611254919061296c565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111179190612985565b6112d0611694565b601b55565b600033816112e38286611407565b9050838110156113435760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c46565b610d7d82868684036116ee565b600033610cf2818585611886565b601e805462ff00001916620100001790553060009081526020819052604090205460175410156113d05760405162461bcd60e51b815260206004820152601860248201527f42554e41493a204e6f7420656e6f75676820746f6b656e7300000000000000006044820152606401610c46565b6113db601754611b57565b6000601755601e805462ff000019169055565b6113f6611694565b601e805461ff001916610100179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61143a611694565b806114458385612940565b61144f9190612940565b60ff166010819055601910156114a75760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601d906003612638565b6114df611694565b60646114ea60025490565b6114f4919061290b565b81101561153b5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590813585e08151e08105b5bdd5b9d605a1b6044820152606401610c46565b601255565b601c8160038110610e9757600080fd5b611558611694565b6012548110156115aa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204d61782053656c6c20416d6f756e740000000000000000006044820152606401610c46565b601455565b6115b7611694565b6001600160a01b03811661161c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b610c4f81611b05565b61162d611694565b6012548110156116785760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590813585e08109d5e48105b5bdd5b9d60521b6044820152606401610c46565b601355565b611685611694565b601e805460ff19166001179055565b6005546001600160a01b0316331461105b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c46565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c46565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061181e8484611407565b90506000198114610fb557818110156118795760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c46565b610fb584848484036116ee565b611891838383611c9d565b601e5462010000900460ff166119c85730600090815260208190526040902054601b5481108015906118d85750601e546001600160a01b0385811663010000009092041614155b80156118f25750601f546001600160a01b03858116911614155b156119005761190081612029565b601e546001600160a01b0385811663010000009092041614801561193d57506001600160a01b03831660009081526007602052604090205460ff16155b806119805750601e546001600160a01b0384811663010000009092041614801561198057506001600160a01b03841660009081526007602052604090205460ff16155b156119c657601e546000906119ab9084906001600160a01b0388811663010000009092041614612242565b90506119b885308361233a565b6119c28184612959565b9250505b505b61111783838361233a565b6001600160a01b038216611a335760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c46565b6001600160a01b03821660009081526020819052604090205481811015611aa75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c46565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b6460028361290b565b90506000611b728284612959565b905047611b7e836124de565b6000611b8a8247612959565b601f54909150611ba59030906001600160a01b0316856116ee565b601f5460405163f305d71960e01b8152306004820152602481018590526000604482018190526064820181905261dead60848301524260a4830152916001600160a01b03169063f305d71990849060c40160606040518083038185885af1158015611c14573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c3991906129a2565b9250505080601a6000828254611c4f919061292d565b909155505060408051868152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050565b601e54610100900460ff1680611cba57506001600160a01b038316155b80611ccc57506001600160a01b038216155b80611cdf5750601e5462010000900460ff165b15611ce957505050565b6001600160a01b03831660009081526006602052604090205460ff16158015611d2b57506001600160a01b03821660009081526006602052604090205460ff16155b611d775760405162461bcd60e51b815260206004820152601a60248201527f42554e41493a20426c61636b6c697374656420616464726573730000000000006044820152606401610c46565b601e5460ff16611de2576001600160a01b0383166000908152600b602052604090205460ff16611de25760405162461bcd60e51b815260206004820152601660248201527510955390524e88151c98591a5b99c8189b1bd8dad95960521b6044820152606401610c46565b6001600160a01b03831660009081526008602052604090205460ff16611ee557601e546001600160a01b036301000000909104811690841603611e7657601354811115611e715760405162461bcd60e51b815260206004820152601e60248201527f42554e41493a204d61782062757920616d6f756e7420657863656564656400006044820152606401610c46565b611ee5565b601e546001600160a01b036301000000909104811690831603611ee557601454811115611ee55760405162461bcd60e51b815260206004820152601f60248201527f42554e41493a204d61782073656c6c20616d6f756e74206578636565646564006044820152606401610c46565b6001600160a01b0382166000908152600c602052604090205460ff16611f8a5760115481611f28846001600160a01b031660009081526020819052604090205490565b611f32919061292d565b1115611f8a5760405162461bcd60e51b815260206004820152602160248201527f42554e41493a204d61782077616c6c657420616d6f756e7420657863656564656044820152601960fa1b6064820152608401610c46565b6001600160a01b0383166000908152600a602052604090205460ff16611117576001600160a01b0383166000908152600960205260409020544310156120005760405162461bcd60e51b815260206004820152600b60248201526a42554e41493a20426f743f60a81b6044820152606401610c46565b61200b60054361292d565b6001600160a01b038416600090815260096020526040902055505050565b601e805462ff0000191662010000179055601754601654601554600092916120509161292d565b61205a919061292d565b60155460165460175492935090918484146120bd57838560155461207e91906129d0565b612088919061290b565b9250838560165461209991906129d0565b6120a3919061290b565b9150816120b08487612959565b6120ba9190612959565b90505b80156120cc576120cc81611b57565b60006120d8838561292d565b1115612220576120f06120eb838561292d565b6124de565b476000841561219257612103848661292d565b61210d83876129d0565b612117919061290b565b600d546040519196506001600160a01b0316908690600081818185875af1925050503d8060008114612165576040519150601f19603f3d011682016040523d82523d6000602084013e61216a565b606091505b5050809150508061217a57600080fd5b846018600082825461218c919061292d565b90915550505b831561221d576121a28583612959565b600e546040519195506001600160a01b0316908590600081818185875af1925050503d80600081146121f0576040519150601f19603f3d011682016040523d82523d6000602084013e6121f5565b606091505b5050809150508061220557600080fd5b8360196000828254612217919061292d565b90915550505b50505b50506000601581905560168190556017555050601e805462ff00001916905550565b6000808261225257601054612256565b600f545b9050606461226485836129d0565b61226e919061290b565b915060008361227e57601d612281565b601c5b8054909150600090839061229990869060ff166129d0565b6122a3919061290b565b825490915060009084906122c0908790610100900460ff166129d0565b6122ca919061290b565b90506000816122d98488612959565b6122e39190612959565b905082601560008282546122f7919061292d565b925050819055508160166000828254612310919061292d565b925050819055508060176000828254612329919061292d565b909155509598975050505050505050565b6001600160a01b03831661239e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c46565b6001600160a01b0382166124005760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c46565b6001600160a01b038316600090815260208190526040902054818110156124785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c46565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610fb5565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612513576125136129e7565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561256c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259091906129fd565b816001815181106125a3576125a36129e7565b6001600160a01b039283166020918202929092010152601f546125c991309116846116ee565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612602908590600090869030904290600401612a1a565b600060405180830381600087803b15801561261c57600080fd5b505af1158015612630573d6000803e3d6000fd5b505050505050565b6001830191839082156126bb5791602002820160005b8382111561268c57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261264e565b80156126b95782816101000a81549060ff021916905560010160208160000104928301926001030261268c565b505b506126c79291506126cb565b5090565b5b808211156126c757600081556001016126cc565b600060208083528351808285015260005b8181101561270d578581018301518582016040015282016126f1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c4f57600080fd5b6000806040838503121561275657600080fd5b82356127618161272e565b946020939093013593505050565b8015158114610c4f57600080fd5b6000806040838503121561279057600080fd5b823561279b8161272e565b915060208301356127ab8161276f565b809150509250929050565b6000806000606084860312156127cb57600080fd5b83356127d68161272e565b925060208401356127e68161272e565b929592945050506040919091013590565b60006020828403121561280957600080fd5b5035919050565b60006020828403121561282257600080fd5b813561282d8161272e565b9392505050565b803560ff8116811461284557600080fd5b919050565b60008060006060848603121561285f57600080fd5b61286884612834565b925061287660208501612834565b915061288460408501612834565b90509250925092565b600080604083850312156128a057600080fd5b82356128ab8161272e565b915060208301356127ab8161272e565b600181811c908216806128cf57607f821691505b6020821081036128ef57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008261292857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610cf857610cf86128f5565b60ff8181168382160190811115610cf857610cf86128f5565b81810381811115610cf857610cf86128f5565b60006020828403121561297e57600080fd5b5051919050565b60006020828403121561299757600080fd5b815161282d8161276f565b6000806000606084860312156129b757600080fd5b8351925060208401519150604084015190509250925092565b8082028115828204841417610cf857610cf86128f5565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a0f57600080fd5b815161282d8161272e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a6a5784516001600160a01b031683529383019391830191600101612a45565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212203cb493b166667cf7ff7258367d4fb3706d1bbe8127c690206c29b9abf1c8170564736f6c63430008130033000000000000000000000000e1ad8a22eaab2c9dfc6be3b21cfff65e27f9a31a000000000000000000000000e1ad8a22eaab2c9dfc6be3b21cfff65e27f9a31a

Deployed Bytecode

0x6080604052600436106103d25760003560e01c80638c0b5e22116101fd578063d3b895e511610118578063ec342ad0116100ab578063f53bc8351161007a578063f53bc83514610b19578063f887ea4014610b39578063f9f92be414610b59578063fb201b1d14610b89578063ffb54a9914610b9e57600080fd5b8063ec342ad014610aa4578063ec40643414610ab9578063ef998cf014610ad9578063f2fde38b14610af957600080fd5b8063dd62ed3e116100e7578063dd62ed3e14610a2e578063e22b62de14610a4e578063e388d53714610a6e578063ec28438a14610a8457600080fd5b8063d3b895e5146109d7578063d84bf7a8146109ed578063d851fd0d14610a03578063db05e5cb14610a1957600080fd5b8063a01c348311610190578063a9059cbb1161015f578063a9059cbb1461095c578063aa4bde281461097c578063b29ad50a14610992578063b9cb911f146109a757600080fd5b8063a01c3483146108e9578063a457c2d7146108ff578063a87e5da41461091f578063a8aa1b311461093557600080fd5b806395d89b41116101cc57806395d89b411461087e5780639be65a60146108935780639d0014b1146108b35780639d9241ec146108d357600080fd5b80638c0b5e22146107fa5780638da5cb5b146108105780638ebfc7961461082e578063918437971461084e57600080fd5b806335066960116102ed57806359b107b911610280578063715018a61161024f578063715018a6146107855780637537ccb61461079a57806379cc6790146107ba5780637d7d3aaf146107da57600080fd5b806359b107b9146107035780635d098b38146107195780636dca7e7b1461073957806370a082311461074f57600080fd5b806342966c68116102bc57806342966c6814610673578063494f6752146106935780634f0aad4e146106b357806350be7cdb146106e357600080fd5b806335066960146105ed57806339307e161461060d5780633950935114610623578063398daa851461064357600080fd5b806318160ddd116103655780632947c419116103345780632947c419146105725780632d3e474a146105995780633028f63a146105b9578063313ce567146105d957600080fd5b806318160ddd146104fe5780631d6f96551461051357806323b872dd1461053257806327a14fc21461055257600080fd5b80630c56ae3b116103a15780630c56ae3b146104705780630c7d08d3146104a8578063113a8b7b146104be578063153b0d1e146104de57600080fd5b80630445b667146103de5780630614117a1461040757806306fdde031461041e578063095ea7b31461044057600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f4601b5481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b5061041c610bb8565b005b34801561042a57600080fd5b50610433610c52565b6040516103fe91906126e0565b34801561044c57600080fd5b5061046061045b366004612743565b610ce4565b60405190151581526020016103fe565b34801561047c57600080fd5b50600e54610490906001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b3480156104b457600080fd5b506103f460195481565b3480156104ca57600080fd5b5061041c6104d936600461277d565b610cfe565b3480156104ea57600080fd5b5061041c6104f936600461277d565b610d31565b34801561050a57600080fd5b506002546103f4565b34801561051f57600080fd5b50601e5461046090610100900460ff1681565b34801561053e57600080fd5b5061046061054d3660046127b6565b610d64565b34801561055e57600080fd5b5061041c61056d3660046127f7565b610d88565b34801561057e57600080fd5b50610587600581565b60405160ff90911681526020016103fe565b3480156105a557600080fd5b50600d54610490906001600160a01b031681565b3480156105c557600080fd5b5061041c6105d4366004612810565b610df9565b3480156105e557600080fd5b506012610587565b3480156105f957600080fd5b506105876106083660046127f7565b610e87565b34801561061957600080fd5b506103f460155481565b34801561062f57600080fd5b5061046061063e366004612743565b610eb1565b34801561064f57600080fd5b5061046061065e366004612810565b60076020526000908152604090205460ff1681565b34801561067f57600080fd5b5061041c61068e3660046127f7565b610ed3565b34801561069f57600080fd5b5061041c6106ae36600461277d565b610edd565b3480156106bf57600080fd5b506104606106ce366004612810565b600c6020526000908152604090205460ff1681565b3480156106ef57600080fd5b5061041c6106fe36600461284a565b610f10565b34801561070f57600080fd5b506103f4600f5481565b34801561072557600080fd5b5061041c610734366004612810565b610fbb565b34801561074557600080fd5b506103f460165481565b34801561075b57600080fd5b506103f461076a366004612810565b6001600160a01b031660009081526020819052604090205490565b34801561079157600080fd5b5061041c611049565b3480156107a657600080fd5b5061041c6107b536600461277d565b61105d565b3480156107c657600080fd5b5061041c6107d5366004612743565b611090565b3480156107e657600080fd5b5061041c6107f536600461277d565b61111c565b34801561080657600080fd5b506103f460125481565b34801561081c57600080fd5b506005546001600160a01b0316610490565b34801561083a57600080fd5b5061041c61084936600461277d565b61114f565b34801561085a57600080fd5b50610460610869366004612810565b60086020526000908152604090205460ff1681565b34801561088a57600080fd5b50610433611182565b34801561089f57600080fd5b5061041c6108ae366004612810565b611191565b3480156108bf57600080fd5b5061041c6108ce3660046127f7565b6112c8565b3480156108df57600080fd5b506103f460105481565b3480156108f557600080fd5b5061049061dead81565b34801561090b57600080fd5b5061046061091a366004612743565b6112d5565b34801561092b57600080fd5b506103f460135481565b34801561094157600080fd5b50601e5461049090630100000090046001600160a01b031681565b34801561096857600080fd5b50610460610977366004612743565b611350565b34801561098857600080fd5b506103f460115481565b34801561099e57600080fd5b5061041c61135e565b3480156109b357600080fd5b506104606109c2366004612810565b600b6020526000908152604090205460ff1681565b3480156109e357600080fd5b506103f4601a5481565b3480156109f957600080fd5b506103f460185481565b348015610a0f57600080fd5b506103f460145481565b348015610a2557600080fd5b5061041c6113ee565b348015610a3a57600080fd5b506103f4610a4936600461288d565b611407565b348015610a5a57600080fd5b5061041c610a6936600461284a565b611432565b348015610a7a57600080fd5b506103f460175481565b348015610a9057600080fd5b5061041c610a9f3660046127f7565b6114d7565b348015610ab057600080fd5b506103f4606481565b348015610ac557600080fd5b50610587610ad43660046127f7565b611540565b348015610ae557600080fd5b5061041c610af43660046127f7565b611550565b348015610b0557600080fd5b5061041c610b14366004612810565b6115af565b348015610b2557600080fd5b5061041c610b343660046127f7565b611625565b348015610b4557600080fd5b50601f54610490906001600160a01b031681565b348015610b6557600080fd5b50610460610b74366004612810565b60066020526000908152604090205460ff1681565b348015610b9557600080fd5b5061041c61167d565b348015610baa57600080fd5b50601e546104609060ff1681565b610bc0611694565b604051600090339047908381818185875af1925050503d8060008114610c02576040519150601f19603f3d011682016040523d82523d6000602084013e610c07565b606091505b5050905080610c4f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064015b60405180910390fd5b50565b606060038054610c61906128bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8d906128bb565b8015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050905090565b600033610cf28185856116ee565b60019150505b92915050565b610d06611694565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610d39611694565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600033610d72858285611812565b610d7d858585611886565b506001949350505050565b610d90611694565b6064610d9b60025490565b610da5919061290b565b811015610df45760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964204d61782057616c6c657420416d6f756e74000000000000006044820152606401610c46565b601155565b610e01611694565b6001600160a01b03811615801590610e275750600e546001600160a01b03828116911614155b610e655760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b601d8160038110610e9757600080fd5b60209182820401919006915054906101000a900460ff1681565b600033610cf2818585610ec48383611407565b610ece919061292d565b6116ee565b610c4f33826119d3565b610ee5611694565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b610f18611694565b80610f238385612940565b610f2d9190612940565b60ff16600f81905560191015610f855760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601c906003612638565b50505050565b610fc3611694565b6001600160a01b03811615801590610fe95750600d546001600160a01b03828116911614155b6110275760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611051611694565b61105b6000611b05565b565b611065611694565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b61109a8233611407565b8111156110e95760405162461bcd60e51b815260206004820152601b60248201527f42554e41493a204e6f7420656e6f75676820616c6c6f77616e636500000000006044820152606401610c46565b6000816110f68433611407565b6111009190612959565b905061110d8333836116ee565b61111783836119d3565b505050565b611124611694565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b611157611694565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b606060048054610c61906128bb565b611199611694565b306001600160a01b038216036111e95760405162461bcd60e51b815260206004820152601560248201527443616e6e6f742077697468647261772042554e414960581b6044820152606401610c46565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611230573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611254919061296c565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111179190612985565b6112d0611694565b601b55565b600033816112e38286611407565b9050838110156113435760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c46565b610d7d82868684036116ee565b600033610cf2818585611886565b601e805462ff00001916620100001790553060009081526020819052604090205460175410156113d05760405162461bcd60e51b815260206004820152601860248201527f42554e41493a204e6f7420656e6f75676820746f6b656e7300000000000000006044820152606401610c46565b6113db601754611b57565b6000601755601e805462ff000019169055565b6113f6611694565b601e805461ff001916610100179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61143a611694565b806114458385612940565b61144f9190612940565b60ff166010819055601910156114a75760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601d906003612638565b6114df611694565b60646114ea60025490565b6114f4919061290b565b81101561153b5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590813585e08151e08105b5bdd5b9d605a1b6044820152606401610c46565b601255565b601c8160038110610e9757600080fd5b611558611694565b6012548110156115aa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204d61782053656c6c20416d6f756e740000000000000000006044820152606401610c46565b601455565b6115b7611694565b6001600160a01b03811661161c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b610c4f81611b05565b61162d611694565b6012548110156116785760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590813585e08109d5e48105b5bdd5b9d60521b6044820152606401610c46565b601355565b611685611694565b601e805460ff19166001179055565b6005546001600160a01b0316331461105b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c46565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c46565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061181e8484611407565b90506000198114610fb557818110156118795760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c46565b610fb584848484036116ee565b611891838383611c9d565b601e5462010000900460ff166119c85730600090815260208190526040902054601b5481108015906118d85750601e546001600160a01b0385811663010000009092041614155b80156118f25750601f546001600160a01b03858116911614155b156119005761190081612029565b601e546001600160a01b0385811663010000009092041614801561193d57506001600160a01b03831660009081526007602052604090205460ff16155b806119805750601e546001600160a01b0384811663010000009092041614801561198057506001600160a01b03841660009081526007602052604090205460ff16155b156119c657601e546000906119ab9084906001600160a01b0388811663010000009092041614612242565b90506119b885308361233a565b6119c28184612959565b9250505b505b61111783838361233a565b6001600160a01b038216611a335760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c46565b6001600160a01b03821660009081526020819052604090205481811015611aa75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c46565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b6460028361290b565b90506000611b728284612959565b905047611b7e836124de565b6000611b8a8247612959565b601f54909150611ba59030906001600160a01b0316856116ee565b601f5460405163f305d71960e01b8152306004820152602481018590526000604482018190526064820181905261dead60848301524260a4830152916001600160a01b03169063f305d71990849060c40160606040518083038185885af1158015611c14573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c3991906129a2565b9250505080601a6000828254611c4f919061292d565b909155505060408051868152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050565b601e54610100900460ff1680611cba57506001600160a01b038316155b80611ccc57506001600160a01b038216155b80611cdf5750601e5462010000900460ff165b15611ce957505050565b6001600160a01b03831660009081526006602052604090205460ff16158015611d2b57506001600160a01b03821660009081526006602052604090205460ff16155b611d775760405162461bcd60e51b815260206004820152601a60248201527f42554e41493a20426c61636b6c697374656420616464726573730000000000006044820152606401610c46565b601e5460ff16611de2576001600160a01b0383166000908152600b602052604090205460ff16611de25760405162461bcd60e51b815260206004820152601660248201527510955390524e88151c98591a5b99c8189b1bd8dad95960521b6044820152606401610c46565b6001600160a01b03831660009081526008602052604090205460ff16611ee557601e546001600160a01b036301000000909104811690841603611e7657601354811115611e715760405162461bcd60e51b815260206004820152601e60248201527f42554e41493a204d61782062757920616d6f756e7420657863656564656400006044820152606401610c46565b611ee5565b601e546001600160a01b036301000000909104811690831603611ee557601454811115611ee55760405162461bcd60e51b815260206004820152601f60248201527f42554e41493a204d61782073656c6c20616d6f756e74206578636565646564006044820152606401610c46565b6001600160a01b0382166000908152600c602052604090205460ff16611f8a5760115481611f28846001600160a01b031660009081526020819052604090205490565b611f32919061292d565b1115611f8a5760405162461bcd60e51b815260206004820152602160248201527f42554e41493a204d61782077616c6c657420616d6f756e7420657863656564656044820152601960fa1b6064820152608401610c46565b6001600160a01b0383166000908152600a602052604090205460ff16611117576001600160a01b0383166000908152600960205260409020544310156120005760405162461bcd60e51b815260206004820152600b60248201526a42554e41493a20426f743f60a81b6044820152606401610c46565b61200b60054361292d565b6001600160a01b038416600090815260096020526040902055505050565b601e805462ff0000191662010000179055601754601654601554600092916120509161292d565b61205a919061292d565b60155460165460175492935090918484146120bd57838560155461207e91906129d0565b612088919061290b565b9250838560165461209991906129d0565b6120a3919061290b565b9150816120b08487612959565b6120ba9190612959565b90505b80156120cc576120cc81611b57565b60006120d8838561292d565b1115612220576120f06120eb838561292d565b6124de565b476000841561219257612103848661292d565b61210d83876129d0565b612117919061290b565b600d546040519196506001600160a01b0316908690600081818185875af1925050503d8060008114612165576040519150601f19603f3d011682016040523d82523d6000602084013e61216a565b606091505b5050809150508061217a57600080fd5b846018600082825461218c919061292d565b90915550505b831561221d576121a28583612959565b600e546040519195506001600160a01b0316908590600081818185875af1925050503d80600081146121f0576040519150601f19603f3d011682016040523d82523d6000602084013e6121f5565b606091505b5050809150508061220557600080fd5b8360196000828254612217919061292d565b90915550505b50505b50506000601581905560168190556017555050601e805462ff00001916905550565b6000808261225257601054612256565b600f545b9050606461226485836129d0565b61226e919061290b565b915060008361227e57601d612281565b601c5b8054909150600090839061229990869060ff166129d0565b6122a3919061290b565b825490915060009084906122c0908790610100900460ff166129d0565b6122ca919061290b565b90506000816122d98488612959565b6122e39190612959565b905082601560008282546122f7919061292d565b925050819055508160166000828254612310919061292d565b925050819055508060176000828254612329919061292d565b909155509598975050505050505050565b6001600160a01b03831661239e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c46565b6001600160a01b0382166124005760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c46565b6001600160a01b038316600090815260208190526040902054818110156124785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c46565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610fb5565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612513576125136129e7565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561256c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259091906129fd565b816001815181106125a3576125a36129e7565b6001600160a01b039283166020918202929092010152601f546125c991309116846116ee565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612602908590600090869030904290600401612a1a565b600060405180830381600087803b15801561261c57600080fd5b505af1158015612630573d6000803e3d6000fd5b505050505050565b6001830191839082156126bb5791602002820160005b8382111561268c57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261264e565b80156126b95782816101000a81549060ff021916905560010160208160000104928301926001030261268c565b505b506126c79291506126cb565b5090565b5b808211156126c757600081556001016126cc565b600060208083528351808285015260005b8181101561270d578581018301518582016040015282016126f1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c4f57600080fd5b6000806040838503121561275657600080fd5b82356127618161272e565b946020939093013593505050565b8015158114610c4f57600080fd5b6000806040838503121561279057600080fd5b823561279b8161272e565b915060208301356127ab8161276f565b809150509250929050565b6000806000606084860312156127cb57600080fd5b83356127d68161272e565b925060208401356127e68161272e565b929592945050506040919091013590565b60006020828403121561280957600080fd5b5035919050565b60006020828403121561282257600080fd5b813561282d8161272e565b9392505050565b803560ff8116811461284557600080fd5b919050565b60008060006060848603121561285f57600080fd5b61286884612834565b925061287660208501612834565b915061288460408501612834565b90509250925092565b600080604083850312156128a057600080fd5b82356128ab8161272e565b915060208301356127ab8161272e565b600181811c908216806128cf57607f821691505b6020821081036128ef57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008261292857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610cf857610cf86128f5565b60ff8181168382160190811115610cf857610cf86128f5565b81810381811115610cf857610cf86128f5565b60006020828403121561297e57600080fd5b5051919050565b60006020828403121561299757600080fd5b815161282d8161276f565b6000806000606084860312156129b757600080fd5b8351925060208401519150604084015190509250925092565b8082028115828204841417610cf857610cf86128f5565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a0f57600080fd5b815161282d8161272e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a6a5784516001600160a01b031683529383019391830191600101612a45565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212203cb493b166667cf7ff7258367d4fb3706d1bbe8127c690206c29b9abf1c8170564736f6c63430008130033

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

000000000000000000000000e1ad8a22eaab2c9dfc6be3b21cfff65e27f9a31a000000000000000000000000e1ad8a22eaab2c9dfc6be3b21cfff65e27f9a31a

-----Decoded View---------------
Arg [0] : _mkt (address): 0xe1AD8A22eaAB2c9DfC6Be3b21CFFF65E27f9A31A
Arg [1] : _stk (address): 0xe1AD8A22eaAB2c9DfC6Be3b21CFFF65E27f9A31A

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e1ad8a22eaab2c9dfc6be3b21cfff65e27f9a31a
Arg [1] : 000000000000000000000000e1ad8a22eaab2c9dfc6be3b21cfff65e27f9a31a


Deployed Bytecode Sourcemap

31083:16586:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31998:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;31998:36:0;;;;;;;;44834:201;;;;;;;;;;;;;:::i;:::-;;19267:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21684:226::-;;;;;;;;;;-1:-1:-1;21684:226:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;21684:226:0;1205:187:1;31560:26:0;;;;;;;;;;-1:-1:-1;31560:26:0;;;;-1:-1:-1;;;;;31560:26:0;;;;;;-1:-1:-1;;;;;1561:32:1;;;1543:51;;1531:2;1516:18;31560:26:0;1397:203:1;31924:28:0;;;;;;;;;;;;;;;;47110:166;;;;;;;;;;-1:-1:-1;47110:166:0;;;;;:::i;:::-;;:::i;44110:152::-;;;;;;;;;;-1:-1:-1;44110:152:0;;;;;:::i;:::-;;:::i;20387:108::-;;;;;;;;;;-1:-1:-1;20475:12:0;;20387:108;;32281:33;;;;;;;;;;-1:-1:-1;32281:33:0;;;;;;;;;;;22490:295;;;;;;;;;;-1:-1:-1;22490:295:0;;;;;:::i;:::-;;:::i;46738:187::-;;;;;;;;;;-1:-1:-1;46738:187:0;;;;;:::i;:::-;;:::i;31481:39::-;;;;;;;;;;;;31519:1;31481:39;;;;;2933:4:1;2921:17;;;2903:36;;2891:2;2876:18;31481:39:0;2761:184:1;31529:24:0;;;;;;;;;;-1:-1:-1;31529:24:0;;;;-1:-1:-1;;;;;31529:24:0;;;45678:243;;;;;;;;;;-1:-1:-1;45678:243:0;;;;;:::i;:::-;;:::i;20229:93::-;;;;;;;;;;-1:-1:-1;20312:2:0;20229:93;;32073:24;;;;;;;;;;-1:-1:-1;32073:24:0;;;;;:::i;:::-;;:::i;31791:25::-;;;;;;;;;;;;;;;;23194:263;;;;;;;;;;-1:-1:-1;23194:263:0;;;;;:::i;:::-;;:::i;31173:41::-;;;;;;;;;;-1:-1:-1;31173:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36750:83;;;;;;;;;;-1:-1:-1;36750:83:0;;;;;:::i;:::-;;:::i;47284:125::-;;;;;;;;;;-1:-1:-1;47284:125:0;;;;;:::i;:::-;;:::i;31425:47::-;;;;;;;;;;-1:-1:-1;31425:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42895:289;;;;;;;;;;-1:-1:-1;42895:289:0;;;;;:::i;:::-;;:::i;31595:23::-;;;;;;;;;;;;;;;;45246:235;;;;;;;;;;-1:-1:-1;45246:235:0;;;;;:::i;:::-;;:::i;31823:23::-;;;;;;;;;;;;;;;;20558:143;;;;;;;;;;-1:-1:-1;20558:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;20675:18:0;20648:7;20675:18;;;;;;;;;;;;20558:143;16078:103;;;;;;;;;;;;;:::i;47417:156::-;;;;;;;;;;-1:-1:-1;47417:156:0;;;;;:::i;:::-;;:::i;37003:368::-;;;;;;;;;;-1:-1:-1;37003:368:0;;;;;:::i;:::-;;:::i;46075:121::-;;;;;;;;;;-1:-1:-1;46075:121:0;;;;;:::i;:::-;;:::i;31692:23::-;;;;;;;;;;;;;;;;15430:87;;;;;;;;;;-1:-1:-1;15503:6:0;;-1:-1:-1;;;;;15503:6:0;15430:87;;43849:117;;;;;;;;;;-1:-1:-1;43849:117:0;;;;;:::i;:::-;;:::i;31221:43::-;;;;;;;;;;-1:-1:-1;31221:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19486:104;;;;;;;;;;;;;:::i;44520:256::-;;;;;;;;;;-1:-1:-1;44520:256:0;;;;;:::i;:::-;;:::i;46933:169::-;;;;;;;;;;-1:-1:-1;46933:169:0;;;;;:::i;:::-;;:::i;31625:24::-;;;;;;;;;;;;;;;;32145:89;;;;;;;;;;;;32192:42;32145:89;;23960:498;;;;;;;;;;-1:-1:-1;23960:498:0;;;;;:::i;:::-;;:::i;31722:26::-;;;;;;;;;;;;;;;;32359;;;;;;;;;;-1:-1:-1;32359:26:0;;;;;;;-1:-1:-1;;;;;32359:26:0;;;20907:218;;;;;;;;;;-1:-1:-1;20907:218:0;;;;;:::i;:::-;;:::i;31658:27::-;;;;;;;;;;;;;;;;41099:250;;;;;;;;;;;;;:::i;31374:44::-;;;;;;;;;;-1:-1:-1;31374:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31959:30;;;;;;;;;;;;;;;;31887;;;;;;;;;;;;;;;;31755:27;;;;;;;;;;;;;;;;47581:85;;;;;;;;;;;;;:::i;21188:176::-;;;;;;;;;;-1:-1:-1;21188:176:0;;;;;:::i;:::-;;:::i;43416:293::-;;;;;;;;;;-1:-1:-1;43416:293:0;;;;;:::i;:::-;;:::i;31853:25::-;;;;;;;;;;;;;;;;46555:175;;;;;;;;;;-1:-1:-1;46555:175:0;;;;;:::i;:::-;;:::i;32104:34::-;;;;;;;;;;;;32135:3;32104:34;;32043:23;;;;;;;;;;-1:-1:-1;32043:23:0;;;;;:::i;:::-;;:::i;46378:169::-;;;;;;;;;;-1:-1:-1;46378:169:0;;;;;:::i;:::-;;:::i;16336:238::-;;;;;;;;;;-1:-1:-1;16336:238:0;;;;;:::i;:::-;;:::i;46204:166::-;;;;;;;;;;-1:-1:-1;46204:166:0;;;;;:::i;:::-;;:::i;32392:32::-;;;;;;;;;;-1:-1:-1;32392:32:0;;;;-1:-1:-1;;;;;32392:32:0;;;31125:41;;;;;;;;;;-1:-1:-1;31125:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44315:77;;;;;;;;;;;;;:::i;32243:31::-;;;;;;;;;;-1:-1:-1;32243:31:0;;;;;;;;44834:201;15316:13;:11;:13::i;:::-;44902:82:::1;::::0;44887:9:::1;::::0;44910:10:::1;::::0;44934:21:::1;::::0;44887:9;44902:82;44887:9;44902:82;44934:21;44910:10;44902:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44886:98;;;45003:4;44995:32;;;::::0;-1:-1:-1;;;44995:32:0;;4959:2:1;44995:32:0::1;::::0;::::1;4941:21:1::0;4998:2;4978:18;;;4971:30;-1:-1:-1;;;5017:18:1;;;5010:45;5072:18;;44995:32:0::1;;;;;;;;;44875:160;44834:201::o:0;19267:100::-;19321:13;19354:5;19347:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19267:100;:::o;21684:226::-;21792:4;844:10;21848:32;844:10;21864:7;21873:6;21848:8;:32::i;:::-;21898:4;21891:11;;;21684:226;;;;;:::o;47110:166::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;47228:27:0;;;::::1;;::::0;;;:17:::1;:27;::::0;;;;:40;;-1:-1:-1;;47228:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47110:166::o;44110:152::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;44222:19:0;;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:32;;-1:-1:-1;;44222:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44110:152::o;22490:295::-;22621:4;844:10;22679:38;22695:4;844:10;22710:6;22679:15;:38::i;:::-;22728:27;22738:4;22744:2;22748:6;22728:9;:27::i;:::-;-1:-1:-1;22773:4:0;;22490:295;-1:-1:-1;;;;22490:295:0:o;46738:187::-;15316:13;:11;:13::i;:::-;46848:3:::1;46832:13;20475:12:::0;;;20387:108;46832:13:::1;:19;;;;:::i;:::-;46821:7;:30;;46813:68;;;::::0;-1:-1:-1;;;46813:68:0;;6042:2:1;46813:68:0::1;::::0;::::1;6024:21:1::0;6081:2;6061:18;;;6054:30;6120:27;6100:18;;;6093:55;6165:18;;46813:68:0::1;5840:349:1::0;46813:68:0::1;46892:15;:25:::0;46738:187::o;45678:243::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;45776:26:0;::::1;::::0;;::::1;::::0;:57:::1;;-1:-1:-1::0;45822:11:0::1;::::0;-1:-1:-1;;;;;45806:27:0;;::::1;45822:11:::0;::::1;45806:27;;45776:57;45754:122;;;::::0;-1:-1:-1;;;45754:122:0;;6396:2:1;45754:122:0::1;::::0;::::1;6378:21:1::0;6435:2;6415:18;;;6408:30;-1:-1:-1;;;6454:18:1;;;6447:45;6509:18;;45754:122:0::1;6194:339:1::0;45754:122:0::1;45887:11;:26:::0;;-1:-1:-1;;;;;;45887:26:0::1;-1:-1:-1::0;;;;;45887:26:0;;;::::1;::::0;;;::::1;::::0;;45678:243::o;32073:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23194:263::-;23307:4;844:10;23363:64;844:10;23379:7;23416:10;23388:25;844:10;23379:7;23388:9;:25::i;:::-;:38;;;;:::i;:::-;23363:8;:64::i;36750:83::-;36800:25;36806:10;36818:6;36800:5;:25::i;47284:125::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;47369:22:0;;;::::1;;::::0;;;:12:::1;:22;::::0;;;;:32;;-1:-1:-1;;47369:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47284:125::o;42895:289::-;15316:13;:11;:13::i;:::-;43057:4;43036:18:::1;43049:5:::0;43036:10;:18:::1;:::i;:::-;:25;;;;:::i;:::-;43022:39;;:11;:39:::0;;;43095:2:::1;-1:-1:-1::0;43080:17:0::1;43072:58;;;::::0;-1:-1:-1;;;43072:58:0;;7023:2:1;43072:58:0::1;::::0;::::1;7005:21:1::0;7062:2;7042:18;;;7035:30;7101;7081:18;;;7074:58;7149:18;;43072:58:0::1;6821:352:1::0;43072:58:0::1;43141:35;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;:7:::1;::::0;:35:::1;;:::i;:::-;;42895:289:::0;;;:::o;45246:235::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;45346:24:0;::::1;::::0;;::::1;::::0;:51:::1;;-1:-1:-1::0;45388:9:0::1;::::0;-1:-1:-1;;;;;45374:23:0;;::::1;45388:9:::0;::::1;45374:23;;45346:51;45324:116;;;::::0;-1:-1:-1;;;45324:116:0;;6396:2:1;45324:116:0::1;::::0;::::1;6378:21:1::0;6435:2;6415:18;;;6408:30;-1:-1:-1;;;6454:18:1;;;6447:45;6509:18;;45324:116:0::1;6194:339:1::0;45324:116:0::1;45451:9;:22:::0;;-1:-1:-1;;;;;;45451:22:0::1;-1:-1:-1::0;;;;;45451:22:0;;;::::1;::::0;;;::::1;::::0;;45246:235::o;16078:103::-;15316:13;:11;:13::i;:::-;16143:30:::1;16170:1;16143:18;:30::i;:::-;16078:103::o:0;47417:156::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;47530:25:0;;;::::1;;::::0;;;:15:::1;:25;::::0;;;;:35;;-1:-1:-1;;47530:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47417:156::o;37003:368::-;37106:30;37116:7;37125:10;37106:9;:30::i;:::-;37096:6;:40;;37074:117;;;;-1:-1:-1;;;37074:117:0;;7380:2:1;37074:117:0;;;7362:21:1;7419:2;7399:18;;;7392:30;7458:29;7438:18;;;7431:57;7505:18;;37074:117:0;7178:351:1;37074:117:0;37202:26;37264:6;37231:30;37241:7;37250:10;37231:9;:30::i;:::-;:39;;;;:::i;:::-;37202:68;;37281:49;37290:7;37299:10;37311:18;37281:8;:49::i;:::-;37341:22;37347:7;37356:6;37341:5;:22::i;:::-;37063:308;37003:368;;:::o;46075:121::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;46158:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:30;;-1:-1:-1;;46158:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46075:121::o;43849:117::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;43930:19:0;;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:28;;-1:-1:-1;;43930:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43849:117::o;19486:104::-;19542:13;19575:7;19568:14;;;;;:::i;44520:256::-;15316:13;:11;:13::i;:::-;44614:4:::1;-1:-1:-1::0;;;;;44596:23:0;::::1;::::0;44588:57:::1;;;::::0;-1:-1:-1;;;44588:57:0;;7869:2:1;44588:57:0::1;::::0;::::1;7851:21:1::0;7908:2;7888:18;;;7881:30;-1:-1:-1;;;7927:18:1;;;7920:51;7988:18;;44588:57:0::1;7667:345:1::0;44588:57:0::1;44674:39;::::0;-1:-1:-1;;;44674:39:0;;44707:4:::1;44674:39;::::0;::::1;1543:51:1::0;44656:15:0::1;::::0;-1:-1:-1;;;;;44674:24:0;::::1;::::0;::::1;::::0;1516:18:1;;44674:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44724:44;::::0;-1:-1:-1;;;44724:44:0;;44748:10:::1;44724:44;::::0;::::1;8380:51:1::0;8447:18;;;8440:34;;;44656:57:0;;-1:-1:-1;;;;;;44724:23:0;::::1;::::0;::::1;::::0;8353:18:1;;44724:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46933:169::-:0;15316:13;:11;:13::i;:::-;47071::::1;:23:::0;46933:169::o;23960:498::-;24078:4;844:10;24078:4;24161:25;844:10;24178:7;24161:9;:25::i;:::-;24134:52;;24239:15;24219:16;:35;;24197:122;;;;-1:-1:-1;;;24197:122:0;;9295:2:1;24197:122:0;;;9277:21:1;9334:2;9314:18;;;9307:30;9373:34;9353:18;;;9346:62;-1:-1:-1;;;9424:18:1;;;9417:35;9469:19;;24197:122:0;9093:401:1;24197:122:0;24355:60;24364:5;24371:7;24399:15;24380:16;:34;24355:8;:60::i;20907:218::-;21011:4;844:10;21067:28;844:10;21084:2;21088:6;21067:9;:28::i;41099:250::-;32667:8;:15;;-1:-1:-1;;32667:15:0;;;;;41214:4:::1;-1:-1:-1::0;20675:18:0;;;;;;;;;;;41179:13:::1;;:41;;41157:115;;;::::0;-1:-1:-1;;;41157:115:0;;9701:2:1;41157:115:0::1;::::0;::::1;9683:21:1::0;9740:2;9720:18;;;9713:30;9779:26;9759:18;;;9752:54;9823:18;;41157:115:0::1;9499:348:1::0;41157:115:0::1;41283:30;41299:13;;41283:15;:30::i;:::-;41340:1;41324:13;:17:::0;32705:8;:16;;-1:-1:-1;;32705:16:0;;;41099:250::o;47581:85::-;15316:13;:11;:13::i;:::-;47638::::1;:20:::0;;-1:-1:-1;;47638:20:0::1;;;::::0;;47581:85::o;21188:176::-;-1:-1:-1;;;;;21329:18:0;;;21302:7;21329:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21188:176::o;43416:293::-;15316:13;:11;:13::i;:::-;43580:4;43559:18:::1;43572:5:::0;43559:10;:18:::1;:::i;:::-;:25;;;;:::i;:::-;43544:40;;:12;:40:::0;;;43619:2:::1;-1:-1:-1::0;43603:18:0::1;43595:59;;;::::0;-1:-1:-1;;;43595:59:0;;7023:2:1;43595:59:0::1;::::0;::::1;7005:21:1::0;7062:2;7042:18;;;7035:30;7101;7081:18;;;7074:58;7149:18;;43595:59:0::1;6821:352:1::0;43595:59:0::1;43665:36;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;:8:::1;::::0;:36:::1;;:::i;46555:175::-:0;15316:13;:11;:13::i;:::-;46661:3:::1;46645:13;20475:12:::0;;;20387:108;46645:13:::1;:19;;;;:::i;:::-;46634:7;:30;;46626:64;;;::::0;-1:-1:-1;;;46626:64:0;;10054:2:1;46626:64:0::1;::::0;::::1;10036:21:1::0;10093:2;10073:18;;;10066:30;-1:-1:-1;;;10112:18:1;;;10105:51;10173:18;;46626:64:0::1;9852:345:1::0;46626:64:0::1;46701:11;:21:::0;46555:175::o;32043:23::-;;;;;;;;;;;46378:169;15316:13;:11;:13::i;:::-;46464:11:::1;;46453:7;:22;;46445:58;;;::::0;-1:-1:-1;;;46445:58:0;;10404:2:1;46445:58:0::1;::::0;::::1;10386:21:1::0;10443:2;10423:18;;;10416:30;10482:25;10462:18;;;10455:53;10525:18;;46445:58:0::1;10202:347:1::0;46445:58:0::1;46514:15;:25:::0;46378:169::o;16336:238::-;15316:13;:11;:13::i;:::-;-1:-1:-1;;;;;16439:22:0;::::1;16417:110;;;::::0;-1:-1:-1;;;16417:110:0;;10756:2:1;16417:110:0::1;::::0;::::1;10738:21:1::0;10795:2;10775:18;;;10768:30;10834:34;10814:18;;;10807:62;-1:-1:-1;;;10885:18:1;;;10878:36;10931:19;;16417:110:0::1;10554:402:1::0;16417:110:0::1;16538:28;16557:8;16538:18;:28::i;46204:166::-:0;15316:13;:11;:13::i;:::-;46289:11:::1;;46278:7;:22;;46270:57;;;::::0;-1:-1:-1;;;46270:57:0;;11163:2:1;46270:57:0::1;::::0;::::1;11145:21:1::0;11202:2;11182:18;;;11175:30;-1:-1:-1;;;11221:18:1;;;11214:52;11283:18;;46270:57:0::1;10961:346:1::0;46270:57:0::1;46338:14;:24:::0;46204:166::o;44315:77::-;15316:13;:11;:13::i;:::-;44366:11:::1;:18:::0;;-1:-1:-1;;44366:18:0::1;44380:4;44366:18;::::0;;44315:77::o;15595:132::-;15503:6;;-1:-1:-1;;;;;15503:6:0;844:10;15659:23;15651:68;;;;-1:-1:-1;;;15651:68:0;;11514:2:1;15651:68:0;;;11496:21:1;;;11533:18;;;11526:30;11592:34;11572:18;;;11565:62;11644:18;;15651:68:0;11312:356:1;28086:380:0;-1:-1:-1;;;;;28222:19:0;;28214:68;;;;-1:-1:-1;;;28214:68:0;;11875:2:1;28214:68:0;;;11857:21:1;11914:2;11894:18;;;11887:30;11953:34;11933:18;;;11926:62;-1:-1:-1;;;12004:18:1;;;11997:34;12048:19;;28214:68:0;11673:400:1;28214:68:0;-1:-1:-1;;;;;28301:21:0;;28293:68;;;;-1:-1:-1;;;28293:68:0;;12280:2:1;28293:68:0;;;12262:21:1;12319:2;12299:18;;;12292:30;12358:34;12338:18;;;12331:62;-1:-1:-1;;;12409:18:1;;;12402:32;12451:19;;28293:68:0;12078:398:1;28293:68:0;-1:-1:-1;;;;;28374:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28426:32;;160:25:1;;;28426:32:0;;133:18:1;28426:32:0;;;;;;;28086:380;;;:::o;28757:502::-;28892:24;28919:25;28929:5;28936:7;28919:9;:25::i;:::-;28892:52;;-1:-1:-1;;28959:16:0;:37;28955:297;;29059:6;29039:16;:26;;29013:117;;;;-1:-1:-1;;;29013:117:0;;12683:2:1;29013:117:0;;;12665:21:1;12722:2;12702:18;;;12695:30;12761:31;12741:18;;;12734:59;12810:18;;29013:117:0;12481:353:1;29013:117:0;29174:51;29183:5;29190:7;29218:6;29199:16;:25;29174:8;:51::i;37639:969::-;37772:42;37788:6;37796:9;37807:6;37772:15;:42::i;:::-;37830:8;;;;;;;37825:721;;37898:4;37855:22;20675:18;;;;;;;;;;;37962:13;;37941:34;;;;;:78;;-1:-1:-1;38014:4:0;;-1:-1:-1;;;;;37996:23:0;;;38014:4;;;;;37996:23;;37941:78;:124;;;;-1:-1:-1;38058:6:0;;-1:-1:-1;;;;;38040:25:0;;;38058:6;;38040:25;;37941:124;37919:240;;;38100:43;38125:17;38100:24;:43::i;:::-;38217:4;;-1:-1:-1;;;;;38199:23:0;;;38217:4;;;;;38199:23;:48;;;;-1:-1:-1;;;;;;38227:20:0;;;;;;:9;:20;;;;;;;;38226:21;38199:48;38198:125;;;-1:-1:-1;38295:4:0;;-1:-1:-1;;;;;38274:26:0;;;38295:4;;;;;38274:26;:48;;;;-1:-1:-1;;;;;;38305:17:0;;;;;;:9;:17;;;;;;;;38304:18;38274:48;38175:360;;;38409:4;;38359:13;;38375:40;;38383:6;;-1:-1:-1;;;;;38391:23:0;;;38409:4;;;;;38391:23;38375:7;:40::i;:::-;38359:56;;38434:48;38450:6;38466:4;38473:8;38434:15;:48::i;:::-;38501:18;38511:8;38501:18;;:::i;:::-;;;38340:195;38175:360;37840:706;37825:721;38558:42;38574:6;38582:9;38593:6;38558:15;:42::i;26973:675::-;-1:-1:-1;;;;;27057:21:0;;27049:67;;;;-1:-1:-1;;;27049:67:0;;13041:2:1;27049:67:0;;;13023:21:1;13080:2;13060:18;;;13053:30;13119:34;13099:18;;;13092:62;-1:-1:-1;;;13170:18:1;;;13163:31;13211:19;;27049:67:0;12839:397:1;27049:67:0;-1:-1:-1;;;;;27216:18:0;;27191:22;27216:18;;;;;;;;;;;27253:24;;;;27245:71;;;;-1:-1:-1;;;27245:71:0;;13443:2:1;27245:71:0;;;13425:21:1;13482:2;13462:18;;;13455:30;13521:34;13501:18;;;13494:62;-1:-1:-1;;;13572:18:1;;;13565:32;13614:19;;27245:71:0;13241:398:1;27245:71:0;-1:-1:-1;;;;;27352:18:0;;:9;:18;;;;;;;;;;;27373:23;;;27352:44;;27491:12;:22;;;;;;;27542:37;160:25:1;;;27352:9:0;;:18;27542:37;;133:18:1;27542:37:0;;;;;;;37063:308;37003:368;;:::o;16734:191::-;16827:6;;;-1:-1:-1;;;;;16844:17:0;;;-1:-1:-1;;;;;;16844:17:0;;;;;;;16877:40;;16827:6;;;16844:17;16827:6;;16877:40;;16808:16;;16877:40;16797:128;16734:191;:::o;41479:683::-;41536:9;41548:10;41557:1;41548:6;:10;:::i;:::-;41536:22;-1:-1:-1;41569:14:0;41586:13;41536:22;41586:6;:13;:::i;:::-;41569:30;-1:-1:-1;41634:21:0;41668:22;41685:4;41668:16;:22::i;:::-;41703:15;41721:38;41745:14;41721:21;:38;:::i;:::-;41804:6;;41703:56;;-1:-1:-1;41772:51:0;;41789:4;;-1:-1:-1;;;;;41804:6:0;41813:9;41772:8;:51::i;:::-;41857:6;;:192;;-1:-1:-1;;;41857:192:0;;41921:4;41857:192;;;13985:34:1;14035:18;;;14028:34;;;41839:14:0;14078:18:1;;;14071:34;;;14121:18;;;14114:34;;;32192:42:0;14164:19:1;;;14157:44;42023:15:0;14217:19:1;;;14210:35;41839:14:0;-1:-1:-1;;;;;41857:6:0;;:22;;41887:10;;13919:19:1;;41857:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41834:215;;;;42084:9;42062:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;42111:43:0;;;14769:25:1;;;14825:2;14810:18;;14803:34;;;14853:18;;;14846:34;;;42111:43:0;;14757:2:1;14742:18;42111:43:0;;;;;;;41525:637;;;;;41479:683;:::o;35331:1314::-;35456:13;;;;;;;;:35;;-1:-1:-1;;;;;;35473:18:0;;;35456:35;:55;;;-1:-1:-1;;;;;;35495:16:0;;;35456:55;:67;;;-1:-1:-1;35515:8:0;;;;;;;35456:67;35452:93;;;35331:1314;;;:::o;35452:93::-;-1:-1:-1;;;;;35578:15:0;;;;;;:9;:15;;;;;;;;35577:16;:34;;;;-1:-1:-1;;;;;;35598:13:0;;;;;;:9;:13;;;;;;;;35597:14;35577:34;35555:110;;;;-1:-1:-1;;;35555:110:0;;15093:2:1;35555:110:0;;;15075:21:1;15132:2;15112:18;;;15105:30;15171:28;15151:18;;;15144:56;15217:18;;35555:110:0;14891:350:1;35555:110:0;35747:11;;;;35742:71;;-1:-1:-1;;;;;35768:18:0;;;;;;:12;:18;;;;;;;;35760:53;;;;-1:-1:-1;;;35760:53:0;;15448:2:1;35760:53:0;;;15430:21:1;15487:2;15467:18;;;15460:30;-1:-1:-1;;;15506:18:1;;;15499:52;15568:18;;35760:53:0;15246:346:1;35760:53:0;-1:-1:-1;;;;;35831:17:0;;;;;;:11;:17;;;;;;;;35826:436;;35885:4;;-1:-1:-1;;;;;35885:4:0;;;;;;35869:21;;;;35865:386;;35951:14;;35941:6;:24;;35911:128;;;;-1:-1:-1;;;35911:128:0;;15799:2:1;35911:128:0;;;15781:21:1;15838:2;15818:18;;;15811:30;15877:32;15857:18;;;15850:60;15927:18;;35911:128:0;15597:354:1;35911:128:0;35865:386;;;36079:4;;-1:-1:-1;;;;;36079:4:0;;;;;;36065:19;;;;36061:190;;36145:15;;36135:6;:25;;36105:130;;;;-1:-1:-1;;;36105:130:0;;16158:2:1;36105:130:0;;;16140:21:1;16197:2;16177:18;;;16170:30;16236:33;16216:18;;;16209:61;16287:18;;36105:130:0;15956:355:1;36105:130:0;-1:-1:-1;;;;;36277:19:0;;;;;;:15;:19;;;;;;;;36272:189;;36365:15;;36355:6;36339:13;36349:2;-1:-1:-1;;;;;20675:18:0;20648:7;20675:18;;;;;;;;;;;;20558:143;36339:13;:22;;;;:::i;:::-;:41;;36313:136;;;;-1:-1:-1;;;36313:136:0;;16518:2:1;36313:136:0;;;16500:21:1;16557:2;16537:18;;;16530:30;16596:34;16576:18;;;16569:62;-1:-1:-1;;;16647:18:1;;;16640:31;16688:19;;36313:136:0;16316:397:1;36313:136:0;-1:-1:-1;;;;;36476:23:0;;;;;;:17;:23;;;;;;;;36471:167;;-1:-1:-1;;;;;36524:12:0;;;;;;:6;:12;;;;;;36540;-1:-1:-1;36524:28:0;36516:52;;;;-1:-1:-1;;;36516:52:0;;16920:2:1;36516:52:0;;;16902:21:1;16959:2;16939:18;;;16932:30;-1:-1:-1;;;16978:18:1;;;16971:41;17029:18;;36516:52:0;16718:335:1;36516:52:0;36598:28;31519:1;36598:12;:28;:::i;:::-;-1:-1:-1;;;;;36583:12:0;;;;;;:6;:12;;;;;:43;35331:1314;;;:::o;39767:1236::-;32667:8;:15;;-1:-1:-1;;32667:15:0;;;;;39898:13:::1;::::0;39884:11:::1;::::0;39868:13:::1;::::0;32667:15;;39898:13;39868:27:::1;::::0;::::1;:::i;:::-;:43;;;;:::i;:::-;39935:13;::::0;39970:11:::1;::::0;40003:13:::1;::::0;39851:60;;-1:-1:-1;39935:13:0;;40033:23;;::::1;40029:204;;40110:9;40096:10;40080:13;;:26;;;;:::i;:::-;40079:40;;;;:::i;:::-;40073:46;;40169:9;40155:10;40141:11;;:24;;;;:::i;:::-;40140:38;;;;:::i;:::-;40134:44:::0;-1:-1:-1;40134:44:0;40199:16:::1;40212:3:::0;40199:10;:16:::1;:::i;:::-;:22;;;;:::i;:::-;40193:28;;40029:204;40247:7:::0;;40243:33:::1;;40256:20;40272:3;40256:15;:20::i;:::-;40305:1;40293:9;40299:3:::0;40293;:9:::1;:::i;:::-;:13;40289:625;;;40323:27;40340:9;40346:3:::0;40340;:9:::1;:::i;:::-;40323:16;:27::i;:::-;40383:21;40365:15;40447:7:::0;;40443:231:::1;;40503:9;40509:3:::0;40503;:9:::1;:::i;:::-;40482:16;40488:10:::0;40482:3;:16:::1;:::i;:::-;40481:32;;;;:::i;:::-;40551:9;::::0;40543:39:::1;::::0;40475:38;;-1:-1:-1;;;;;;40551:9:0::1;::::0;40475:38;;40543:39:::1;::::0;;;40475:38;40551:9;40543:39:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40532:50;;;;;40609:4;40601:13;;;::::0;::::1;;40655:3;40633:18;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40443:231:0::1;40692:7:::0;;40688:215:::1;;40726:16;40739:3:::0;40726:10;:16:::1;:::i;:::-;40780:11;::::0;40772:41:::1;::::0;40720:22;;-1:-1:-1;;;;;;40780:11:0::1;::::0;40720:22;;40772:41:::1;::::0;;;40720:22;40780:11;40772:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40761:52;;;;;40840:4;40832:13;;;::::0;::::1;;40884:3;40864:16;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40688:215:0::1;40308:606;;40289:625;-1:-1:-1::0;;40940:1:0::1;40924:13;:17:::0;;;40952:11:::1;:15:::0;;;40978:13:::1;:17:::0;-1:-1:-1;;32705:8:0;:16;;-1:-1:-1;;32705:16:0;;;-1:-1:-1;39767:1236:0:o;38867:586::-;38955:16;38984;39003:5;:34;;39025:12;;39003:34;;;39011:11;;39003:34;38984:53;-1:-1:-1;32135:3:0;39060:20;39074:6;38984:53;39060:20;:::i;:::-;39059:29;;;;:::i;:::-;39048:40;;39101:21;39125:5;:26;;39143:8;39125:26;;;39133:7;39125:26;39185:7;;39101:50;;-1:-1:-1;39164:17:0;;39207:11;;39185:18;;39195:8;;39185:7;;:18;:::i;:::-;39184:34;;;;:::i;:::-;39245:7;;39164:54;;-1:-1:-1;39229:12:0;;39267:11;;39245:18;;39255:8;;39245:7;;;;;:18;:::i;:::-;39244:34;;;;:::i;:::-;39229:49;-1:-1:-1;39289:11:0;39229:49;39303:23;39314:12;39303:8;:23;:::i;:::-;:33;;;;:::i;:::-;39289:47;;39366:12;39349:13;;:29;;;;;;;:::i;:::-;;;;;;;;39404:7;39389:11;;:22;;;;;;;:::i;:::-;;;;;;;;39439:6;39422:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;38867:586:0;;;-1:-1:-1;;;;;;;;38867:586:0:o;24928:877::-;-1:-1:-1;;;;;25059:18:0;;25051:68;;;;-1:-1:-1;;;25051:68:0;;17565:2:1;25051:68:0;;;17547:21:1;17604:2;17584:18;;;17577:30;17643:34;17623:18;;;17616:62;-1:-1:-1;;;17694:18:1;;;17687:35;17739:19;;25051:68:0;17363:401:1;25051:68:0;-1:-1:-1;;;;;25138:16:0;;25130:64;;;;-1:-1:-1;;;25130:64:0;;17971:2:1;25130:64:0;;;17953:21:1;18010:2;17990:18;;;17983:30;18049:34;18029:18;;;18022:62;-1:-1:-1;;;18100:18:1;;;18093:33;18143:19;;25130:64:0;17769:399:1;25130:64:0;-1:-1:-1;;;;;25280:15:0;;25258:19;25280:15;;;;;;;;;;;25328:21;;;;25306:109;;;;-1:-1:-1;;;25306:109:0;;18375:2:1;25306:109:0;;;18357:21:1;18414:2;18394:18;;;18387:30;18453:34;18433:18;;;18426:62;-1:-1:-1;;;18504:18:1;;;18497:36;18550:19;;25306:109:0;18173:402:1;25306:109:0;-1:-1:-1;;;;;25451:15:0;;;:9;:15;;;;;;;;;;;25469:20;;;25451:38;;25669:13;;;;;;;;;;:23;;;;;;25721:26;;160:25:1;;;25669:13:0;;25721:26;;133:18:1;25721:26:0;;;;;;;25760:37;37003:368;42207:430;42289:16;;;42303:1;42289:16;;;;;;;;42265:21;;42289:16;;;;;;;;;;-1:-1:-1;42289:16:0;42265:40;;42334:4;42316;42321:1;42316:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42316:23:0;;;:7;;;;;;;;;;:23;;;;42360:6;;:13;;;-1:-1:-1;;;42360:13:0;;;;:6;;;;;:11;;:13;;;;;42316:7;;42360:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42350:4;42355:1;42350:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42350:23:0;;;:7;;;;;;;;;:23;42418:6;;42386:48;;42403:4;;42418:6;42427;42386:8;:48::i;:::-;42447:6;;:182;;-1:-1:-1;;;42447:182:0;;-1:-1:-1;;;;;42447:6:0;;;;:57;;:182;;42519:6;;42447;;42556:4;;42583;;42603:15;;42447:182;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42254:383;42207:430;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:548:1;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1605:118::-;1691:5;1684:13;1677:21;1670:5;1667:32;1657:60;;1713:1;1710;1703:12;1728:382;1793:6;1801;1854:2;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;1909:9;1896:23;1928:31;1953:5;1928:31;:::i;:::-;1978:5;-1:-1:-1;2035:2:1;2020:18;;2007:32;2048:30;2007:32;2048:30;:::i;:::-;2097:7;2087:17;;;1728:382;;;;;:::o;2115:456::-;2192:6;2200;2208;2261:2;2249:9;2240:7;2236:23;2232:32;2229:52;;;2277:1;2274;2267:12;2229:52;2316:9;2303:23;2335:31;2360:5;2335:31;:::i;:::-;2385:5;-1:-1:-1;2442:2:1;2427:18;;2414:32;2455:33;2414:32;2455:33;:::i;:::-;2115:456;;2507:7;;-1:-1:-1;;;2561:2:1;2546:18;;;;2533:32;;2115:456::o;2576:180::-;2635:6;2688:2;2676:9;2667:7;2663:23;2659:32;2656:52;;;2704:1;2701;2694:12;2656:52;-1:-1:-1;2727:23:1;;2576:180;-1:-1:-1;2576:180:1:o;2950:247::-;3009:6;3062:2;3050:9;3041:7;3037:23;3033:32;3030:52;;;3078:1;3075;3068:12;3030:52;3117:9;3104:23;3136:31;3161:5;3136:31;:::i;:::-;3186:5;2950:247;-1:-1:-1;;;2950:247:1:o;3202:156::-;3268:20;;3328:4;3317:16;;3307:27;;3297:55;;3348:1;3345;3338:12;3297:55;3202:156;;;:::o;3363:322::-;3434:6;3442;3450;3503:2;3491:9;3482:7;3478:23;3474:32;3471:52;;;3519:1;3516;3509:12;3471:52;3542:27;3559:9;3542:27;:::i;:::-;3532:37;;3588:36;3620:2;3609:9;3605:18;3588:36;:::i;:::-;3578:46;;3643:36;3675:2;3664:9;3660:18;3643:36;:::i;:::-;3633:46;;3363:322;;;;;:::o;3920:388::-;3988:6;3996;4049:2;4037:9;4028:7;4024:23;4020:32;4017:52;;;4065:1;4062;4055:12;4017:52;4104:9;4091:23;4123:31;4148:5;4123:31;:::i;:::-;4173:5;-1:-1:-1;4230:2:1;4215:18;;4202:32;4243:33;4202:32;4243:33;:::i;5101:380::-;5180:1;5176:12;;;;5223;;;5244:61;;5298:4;5290:6;5286:17;5276:27;;5244:61;5351:2;5343:6;5340:14;5320:18;5317:38;5314:161;;5397:10;5392:3;5388:20;5385:1;5378:31;5432:4;5429:1;5422:15;5460:4;5457:1;5450:15;5314:161;;5101:380;;;:::o;5486:127::-;5547:10;5542:3;5538:20;5535:1;5528:31;5578:4;5575:1;5568:15;5602:4;5599:1;5592:15;5618:217;5658:1;5684;5674:132;;5728:10;5723:3;5719:20;5716:1;5709:31;5763:4;5760:1;5753:15;5791:4;5788:1;5781:15;5674:132;-1:-1:-1;5820:9:1;;5618:217::o;6538:125::-;6603:9;;;6624:10;;;6621:36;;;6637:18;;:::i;6668:148::-;6756:4;6735:12;;;6749;;;6731:31;;6774:13;;6771:39;;;6790:18;;:::i;7534:128::-;7601:9;;;7622:11;;;7619:37;;;7636:18;;:::i;8017:184::-;8087:6;8140:2;8128:9;8119:7;8115:23;8111:32;8108:52;;;8156:1;8153;8146:12;8108:52;-1:-1:-1;8179:16:1;;8017:184;-1:-1:-1;8017:184:1:o;8485:245::-;8552:6;8605:2;8593:9;8584:7;8580:23;8576:32;8573:52;;;8621:1;8618;8611:12;8573:52;8653:9;8647:16;8672:28;8694:5;8672:28;:::i;14256:306::-;14344:6;14352;14360;14413:2;14401:9;14392:7;14388:23;14384:32;14381:52;;;14429:1;14426;14419:12;14381:52;14458:9;14452:16;14442:26;;14508:2;14497:9;14493:18;14487:25;14477:35;;14552:2;14541:9;14537:18;14531:25;14521:35;;14256:306;;;;;:::o;17058:168::-;17131:9;;;17162;;17179:15;;;17173:22;;17159:37;17149:71;;17200:18;;:::i;17231:127::-;17292:10;17287:3;17283:20;17280:1;17273:31;17323:4;17320:1;17313:15;17347:4;17344:1;17337:15;18712:251;18782:6;18835:2;18823:9;18814:7;18810:23;18806:32;18803:52;;;18851:1;18848;18841:12;18803:52;18883:9;18877:16;18902:31;18927:5;18902:31;:::i;18968:980::-;19230:4;19278:3;19267:9;19263:19;19309:6;19298:9;19291:25;19335:2;19373:6;19368:2;19357:9;19353:18;19346:34;19416:3;19411:2;19400:9;19396:18;19389:31;19440:6;19475;19469:13;19506:6;19498;19491:22;19544:3;19533:9;19529:19;19522:26;;19583:2;19575:6;19571:15;19557:29;;19604:1;19614:195;19628:6;19625:1;19622:13;19614:195;;;19693:13;;-1:-1:-1;;;;;19689:39:1;19677:52;;19784:15;;;;19749:12;;;;19725:1;19643:9;19614:195;;;-1:-1:-1;;;;;;;19865:32:1;;;;19860:2;19845:18;;19838:60;-1:-1:-1;;;19929:3:1;19914:19;19907:35;19826:3;18968:980;-1:-1:-1;;;18968:980:1:o

Swarm Source

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