ETH Price: $3,427.25 (+3.22%)
Gas: 9.34 Gwei

Token

Dapps AI (DAPPSAI)
 

Overview

Max Total Supply

100,000,000 DAPPSAI

Holders

68

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
7,998.081112616550937756 DAPPSAI

Value
$0.00
0x17a6276783b2e4c5137f7d728e49edc46aef6817
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:
dAppsAI

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-10
*/

/**
 *  SourceUnit: /Users/jmf/dev/dappsAI/contracts/dappsAI.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/dappsAI/contracts/dappsAI.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/dappsAI/contracts/dappsAI.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/dappsAI/contracts/dappsAI.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/dappsAI/contracts/dappsAI.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/dappsAI/contracts/dappsAI.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/dappsAI/contracts/dappsAI.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 dAppsAI 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("Dapps AI", "DAPPSAI") {
        require(_mkt != address(0) && _stk != address(0), "Invalid address");
        marketing = _mkt;
        stakingPool = _stk;
        // 100 million tokens
        _mint(msg.sender, 100_000_000 ether);
        // max Tx amount is 1% of total supply
        maxTxAmount = 100_000_000 ether / 100;
        maxBuyTxAmount = maxTxAmount;
        maxSellTxAmount = maxTxAmount;
        // max wallet amount is 3% 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"}]

6080604052678ac7230489e80000601b55601e805462ffffff191690553480156200002957600080fd5b50604051620035a6380380620035a68339810160408190526200004c91620008a0565b60405180604001604052806008815260200167446170707320414960c01b815250604051806040016040528060078152602001664441505053414960c81b81525081600390816200009e91906200097c565b506004620000ad82826200097c565b505050620000ca620000c4620005fe60201b60201c565b62000602565b6001600160a01b03821615801590620000eb57506001600160a01b03811615155b6200012f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600d80546001600160a01b038085166001600160a01b031992831617909255600e80549284169290911691909117905562000176336a52b7d2dcc80cd2e400000062000654565b69d3c21bcecceda10000006012819055601381905560148190556200019d90600362000a5e565b601155601c80546201020562ffffff19918216811792839055601d805490921617905560ff620100008204811691620001df9161010090910416600562000a7e565b620001eb919062000a7e565b60ff908116600f55601d54620100008104821691620002139161010081048216911662000a7e565b6200021f919062000a7e565b60ff16601055466001036200025a57601f80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055620002d9565b4661a4b1036200029057601f80546001600160a01b03191673e54ca86531e17ef3616d22ca28b0d458b6c89106179055620002d9565b60405162461bcd60e51b815260206004820152601360248201527f436861696e206e6f7420737570706f7274656400000000000000000000000000604482015260640162000126565b601f546040805163c45a015560e01b815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801562000324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034a919062000a9a565b9050806001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d6919062000a9a565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044a919062000a9a565b601e80546001600160a01b03929092166301000000026301000000600160b81b03199092169190911790556200048230600162000717565b620004a1620004996005546001600160a01b031690565b600162000717565b620004ae3060016200074c565b620004cd620004c56005546001600160a01b031690565b60016200074c565b620004da30600162000781565b620004f9620004f16005546001600160a01b031690565b600162000781565b600d5462000512906001600160a01b0316600162000781565b601e546200053290630100000090046001600160a01b0316600162000781565b601f546200054b906001600160a01b0316600162000781565b62000558306001620007b6565b620005776200056f6005546001600160a01b031690565b6001620007b6565b600d5462000590906001600160a01b03166001620007b6565b601e54620005b090630100000090046001600160a01b03166001620007b6565b601f54620005c9906001600160a01b03166001620007b6565b620005d6306001620007eb565b620005f5620005ed6005546001600160a01b031690565b6001620007eb565b50505062000ad5565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620006ac5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000126565b8060026000828254620006c0919062000abf565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6200072162000825565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6200075662000825565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6200078b62000825565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b620007c062000825565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b620007f562000825565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b505050565b6005546001600160a01b03163314620008815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000126565b565b80516001600160a01b03811681146200089b57600080fd5b919050565b60008060408385031215620008b457600080fd5b620008bf8362000883565b9150620008cf6020840162000883565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200090357607f821691505b6020821081036200092457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200082057600081815260208120601f850160051c81016020861015620009535750805b601f850160051c820191505b8181101562000974578281556001016200095f565b505050505050565b81516001600160401b03811115620009985762000998620008d8565b620009b081620009a98454620008ee565b846200092a565b602080601f831160018114620009e85760008415620009cf5750858301515b600019600386901b1c1916600185901b17855562000974565b600085815260208120601f198616915b8281101562000a1957888601518255948401946001909101908401620009f8565b508582101562000a385787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000a785762000a7862000a48565b92915050565b60ff818116838216019081111562000a785762000a7862000a48565b60006020828403121562000aad57600080fd5b62000ab88262000883565b9392505050565b8082018082111562000a785762000a7862000a48565b612ac18062000ae56000396000f3fe6080604052600436106103d25760003560e01c80638c0b5e22116101fd578063d3b895e511610118578063ec342ad0116100ab578063f53bc8351161007a578063f53bc83514610b19578063f887ea4014610b39578063f9f92be414610b59578063fb201b1d14610b89578063ffb54a9914610b9e57600080fd5b8063ec342ad014610aa4578063ec40643414610ab9578063ef998cf014610ad9578063f2fde38b14610af957600080fd5b8063dd62ed3e116100e7578063dd62ed3e14610a2e578063e22b62de14610a4e578063e388d53714610a6e578063ec28438a14610a8457600080fd5b8063d3b895e5146109d7578063d84bf7a8146109ed578063d851fd0d14610a03578063db05e5cb14610a1957600080fd5b8063a01c348311610190578063a9059cbb1161015f578063a9059cbb1461095c578063aa4bde281461097c578063b29ad50a14610992578063b9cb911f146109a757600080fd5b8063a01c3483146108e9578063a457c2d7146108ff578063a87e5da41461091f578063a8aa1b311461093557600080fd5b806395d89b41116101cc57806395d89b411461087e5780639be65a60146108935780639d0014b1146108b35780639d9241ec146108d357600080fd5b80638c0b5e22146107fa5780638da5cb5b146108105780638ebfc7961461082e578063918437971461084e57600080fd5b806335066960116102ed57806359b107b911610280578063715018a61161024f578063715018a6146107855780637537ccb61461079a57806379cc6790146107ba5780637d7d3aaf146107da57600080fd5b806359b107b9146107035780635d098b38146107195780636dca7e7b1461073957806370a082311461074f57600080fd5b806342966c68116102bc57806342966c6814610673578063494f6752146106935780634f0aad4e146106b357806350be7cdb146106e357600080fd5b806335066960146105ed57806339307e161461060d5780633950935114610623578063398daa851461064357600080fd5b806318160ddd116103655780632947c419116103345780632947c419146105725780632d3e474a146105995780633028f63a146105b9578063313ce567146105d957600080fd5b806318160ddd146104fe5780631d6f96551461051357806323b872dd1461053257806327a14fc21461055257600080fd5b80630c56ae3b116103a15780630c56ae3b146104705780630c7d08d3146104a8578063113a8b7b146104be578063153b0d1e146104de57600080fd5b80630445b667146103de5780630614117a1461040757806306fdde031461041e578063095ea7b31461044057600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f4601b5481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b5061041c610bb8565b005b34801561042a57600080fd5b50610433610c52565b6040516103fe91906126e0565b34801561044c57600080fd5b5061046061045b366004612743565b610ce4565b60405190151581526020016103fe565b34801561047c57600080fd5b50600e54610490906001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b3480156104b457600080fd5b506103f460195481565b3480156104ca57600080fd5b5061041c6104d936600461277d565b610cfe565b3480156104ea57600080fd5b5061041c6104f936600461277d565b610d31565b34801561050a57600080fd5b506002546103f4565b34801561051f57600080fd5b50601e5461046090610100900460ff1681565b34801561053e57600080fd5b5061046061054d3660046127b6565b610d64565b34801561055e57600080fd5b5061041c61056d3660046127f7565b610d88565b34801561057e57600080fd5b50610587600581565b60405160ff90911681526020016103fe565b3480156105a557600080fd5b50600d54610490906001600160a01b031681565b3480156105c557600080fd5b5061041c6105d4366004612810565b610df9565b3480156105e557600080fd5b506012610587565b3480156105f957600080fd5b506105876106083660046127f7565b610e87565b34801561061957600080fd5b506103f460155481565b34801561062f57600080fd5b5061046061063e366004612743565b610eb1565b34801561064f57600080fd5b5061046061065e366004612810565b60076020526000908152604090205460ff1681565b34801561067f57600080fd5b5061041c61068e3660046127f7565b610ed3565b34801561069f57600080fd5b5061041c6106ae36600461277d565b610edd565b3480156106bf57600080fd5b506104606106ce366004612810565b600c6020526000908152604090205460ff1681565b3480156106ef57600080fd5b5061041c6106fe36600461284a565b610f10565b34801561070f57600080fd5b506103f4600f5481565b34801561072557600080fd5b5061041c610734366004612810565b610fbb565b34801561074557600080fd5b506103f460165481565b34801561075b57600080fd5b506103f461076a366004612810565b6001600160a01b031660009081526020819052604090205490565b34801561079157600080fd5b5061041c611049565b3480156107a657600080fd5b5061041c6107b536600461277d565b61105d565b3480156107c657600080fd5b5061041c6107d5366004612743565b611090565b3480156107e657600080fd5b5061041c6107f536600461277d565b61111c565b34801561080657600080fd5b506103f460125481565b34801561081c57600080fd5b506005546001600160a01b0316610490565b34801561083a57600080fd5b5061041c61084936600461277d565b61114f565b34801561085a57600080fd5b50610460610869366004612810565b60086020526000908152604090205460ff1681565b34801561088a57600080fd5b50610433611182565b34801561089f57600080fd5b5061041c6108ae366004612810565b611191565b3480156108bf57600080fd5b5061041c6108ce3660046127f7565b6112c8565b3480156108df57600080fd5b506103f460105481565b3480156108f557600080fd5b5061049061dead81565b34801561090b57600080fd5b5061046061091a366004612743565b6112d5565b34801561092b57600080fd5b506103f460135481565b34801561094157600080fd5b50601e5461049090630100000090046001600160a01b031681565b34801561096857600080fd5b50610460610977366004612743565b611350565b34801561098857600080fd5b506103f460115481565b34801561099e57600080fd5b5061041c61135e565b3480156109b357600080fd5b506104606109c2366004612810565b600b6020526000908152604090205460ff1681565b3480156109e357600080fd5b506103f4601a5481565b3480156109f957600080fd5b506103f460185481565b348015610a0f57600080fd5b506103f460145481565b348015610a2557600080fd5b5061041c6113ee565b348015610a3a57600080fd5b506103f4610a4936600461288d565b611407565b348015610a5a57600080fd5b5061041c610a6936600461284a565b611432565b348015610a7a57600080fd5b506103f460175481565b348015610a9057600080fd5b5061041c610a9f3660046127f7565b6114d7565b348015610ab057600080fd5b506103f4606481565b348015610ac557600080fd5b50610587610ad43660046127f7565b611540565b348015610ae557600080fd5b5061041c610af43660046127f7565b611550565b348015610b0557600080fd5b5061041c610b14366004612810565b6115af565b348015610b2557600080fd5b5061041c610b343660046127f7565b611625565b348015610b4557600080fd5b50601f54610490906001600160a01b031681565b348015610b6557600080fd5b50610460610b74366004612810565b60066020526000908152604090205460ff1681565b348015610b9557600080fd5b5061041c61167d565b348015610baa57600080fd5b50601e546104609060ff1681565b610bc0611694565b604051600090339047908381818185875af1925050503d8060008114610c02576040519150601f19603f3d011682016040523d82523d6000602084013e610c07565b606091505b5050905080610c4f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064015b60405180910390fd5b50565b606060038054610c61906128bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8d906128bb565b8015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050905090565b600033610cf28185856116ee565b60019150505b92915050565b610d06611694565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610d39611694565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600033610d72858285611812565b610d7d858585611886565b506001949350505050565b610d90611694565b6064610d9b60025490565b610da5919061290b565b811015610df45760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964204d61782057616c6c657420416d6f756e74000000000000006044820152606401610c46565b601155565b610e01611694565b6001600160a01b03811615801590610e275750600e546001600160a01b03828116911614155b610e655760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b601d8160038110610e9757600080fd5b60209182820401919006915054906101000a900460ff1681565b600033610cf2818585610ec48383611407565b610ece919061292d565b6116ee565b610c4f33826119d3565b610ee5611694565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b610f18611694565b80610f238385612940565b610f2d9190612940565b60ff16600f81905560191015610f855760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601c906003612638565b50505050565b610fc3611694565b6001600160a01b03811615801590610fe95750600d546001600160a01b03828116911614155b6110275760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611051611694565b61105b6000611b05565b565b611065611694565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b61109a8233611407565b8111156110e95760405162461bcd60e51b815260206004820152601b60248201527f42554e41493a204e6f7420656e6f75676820616c6c6f77616e636500000000006044820152606401610c46565b6000816110f68433611407565b6111009190612959565b905061110d8333836116ee565b61111783836119d3565b505050565b611124611694565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b611157611694565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b606060048054610c61906128bb565b611199611694565b306001600160a01b038216036111e95760405162461bcd60e51b815260206004820152601560248201527443616e6e6f742077697468647261772042554e414960581b6044820152606401610c46565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611230573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611254919061296c565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111179190612985565b6112d0611694565b601b55565b600033816112e38286611407565b9050838110156113435760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c46565b610d7d82868684036116ee565b600033610cf2818585611886565b601e805462ff00001916620100001790553060009081526020819052604090205460175410156113d05760405162461bcd60e51b815260206004820152601860248201527f42554e41493a204e6f7420656e6f75676820746f6b656e7300000000000000006044820152606401610c46565b6113db601754611b57565b6000601755601e805462ff000019169055565b6113f6611694565b601e805461ff001916610100179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61143a611694565b806114458385612940565b61144f9190612940565b60ff166010819055601910156114a75760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601d906003612638565b6114df611694565b60646114ea60025490565b6114f4919061290b565b81101561153b5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590813585e08151e08105b5bdd5b9d605a1b6044820152606401610c46565b601255565b601c8160038110610e9757600080fd5b611558611694565b6012548110156115aa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204d61782053656c6c20416d6f756e740000000000000000006044820152606401610c46565b601455565b6115b7611694565b6001600160a01b03811661161c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b610c4f81611b05565b61162d611694565b6012548110156116785760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590813585e08109d5e48105b5bdd5b9d60521b6044820152606401610c46565b601355565b611685611694565b601e805460ff19166001179055565b6005546001600160a01b0316331461105b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c46565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c46565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061181e8484611407565b90506000198114610fb557818110156118795760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c46565b610fb584848484036116ee565b611891838383611c9d565b601e5462010000900460ff166119c85730600090815260208190526040902054601b5481108015906118d85750601e546001600160a01b0385811663010000009092041614155b80156118f25750601f546001600160a01b03858116911614155b156119005761190081612029565b601e546001600160a01b0385811663010000009092041614801561193d57506001600160a01b03831660009081526007602052604090205460ff16155b806119805750601e546001600160a01b0384811663010000009092041614801561198057506001600160a01b03841660009081526007602052604090205460ff16155b156119c657601e546000906119ab9084906001600160a01b0388811663010000009092041614612242565b90506119b885308361233a565b6119c28184612959565b9250505b505b61111783838361233a565b6001600160a01b038216611a335760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c46565b6001600160a01b03821660009081526020819052604090205481811015611aa75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c46565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b6460028361290b565b90506000611b728284612959565b905047611b7e836124de565b6000611b8a8247612959565b601f54909150611ba59030906001600160a01b0316856116ee565b601f5460405163f305d71960e01b8152306004820152602481018590526000604482018190526064820181905261dead60848301524260a4830152916001600160a01b03169063f305d71990849060c40160606040518083038185885af1158015611c14573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c3991906129a2565b9250505080601a6000828254611c4f919061292d565b909155505060408051868152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050565b601e54610100900460ff1680611cba57506001600160a01b038316155b80611ccc57506001600160a01b038216155b80611cdf5750601e5462010000900460ff165b15611ce957505050565b6001600160a01b03831660009081526006602052604090205460ff16158015611d2b57506001600160a01b03821660009081526006602052604090205460ff16155b611d775760405162461bcd60e51b815260206004820152601a60248201527f42554e41493a20426c61636b6c697374656420616464726573730000000000006044820152606401610c46565b601e5460ff16611de2576001600160a01b0383166000908152600b602052604090205460ff16611de25760405162461bcd60e51b815260206004820152601660248201527510955390524e88151c98591a5b99c8189b1bd8dad95960521b6044820152606401610c46565b6001600160a01b03831660009081526008602052604090205460ff16611ee557601e546001600160a01b036301000000909104811690841603611e7657601354811115611e715760405162461bcd60e51b815260206004820152601e60248201527f42554e41493a204d61782062757920616d6f756e7420657863656564656400006044820152606401610c46565b611ee5565b601e546001600160a01b036301000000909104811690831603611ee557601454811115611ee55760405162461bcd60e51b815260206004820152601f60248201527f42554e41493a204d61782073656c6c20616d6f756e74206578636565646564006044820152606401610c46565b6001600160a01b0382166000908152600c602052604090205460ff16611f8a5760115481611f28846001600160a01b031660009081526020819052604090205490565b611f32919061292d565b1115611f8a5760405162461bcd60e51b815260206004820152602160248201527f42554e41493a204d61782077616c6c657420616d6f756e7420657863656564656044820152601960fa1b6064820152608401610c46565b6001600160a01b0383166000908152600a602052604090205460ff16611117576001600160a01b0383166000908152600960205260409020544310156120005760405162461bcd60e51b815260206004820152600b60248201526a42554e41493a20426f743f60a81b6044820152606401610c46565b61200b60054361292d565b6001600160a01b038416600090815260096020526040902055505050565b601e805462ff0000191662010000179055601754601654601554600092916120509161292d565b61205a919061292d565b60155460165460175492935090918484146120bd57838560155461207e91906129d0565b612088919061290b565b9250838560165461209991906129d0565b6120a3919061290b565b9150816120b08487612959565b6120ba9190612959565b90505b80156120cc576120cc81611b57565b60006120d8838561292d565b1115612220576120f06120eb838561292d565b6124de565b476000841561219257612103848661292d565b61210d83876129d0565b612117919061290b565b600d546040519196506001600160a01b0316908690600081818185875af1925050503d8060008114612165576040519150601f19603f3d011682016040523d82523d6000602084013e61216a565b606091505b5050809150508061217a57600080fd5b846018600082825461218c919061292d565b90915550505b831561221d576121a28583612959565b600e546040519195506001600160a01b0316908590600081818185875af1925050503d80600081146121f0576040519150601f19603f3d011682016040523d82523d6000602084013e6121f5565b606091505b5050809150508061220557600080fd5b8360196000828254612217919061292d565b90915550505b50505b50506000601581905560168190556017555050601e805462ff00001916905550565b6000808261225257601054612256565b600f545b9050606461226485836129d0565b61226e919061290b565b915060008361227e57601d612281565b601c5b8054909150600090839061229990869060ff166129d0565b6122a3919061290b565b825490915060009084906122c0908790610100900460ff166129d0565b6122ca919061290b565b90506000816122d98488612959565b6122e39190612959565b905082601560008282546122f7919061292d565b925050819055508160166000828254612310919061292d565b925050819055508060176000828254612329919061292d565b909155509598975050505050505050565b6001600160a01b03831661239e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c46565b6001600160a01b0382166124005760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c46565b6001600160a01b038316600090815260208190526040902054818110156124785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c46565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610fb5565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612513576125136129e7565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561256c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259091906129fd565b816001815181106125a3576125a36129e7565b6001600160a01b039283166020918202929092010152601f546125c991309116846116ee565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612602908590600090869030904290600401612a1a565b600060405180830381600087803b15801561261c57600080fd5b505af1158015612630573d6000803e3d6000fd5b505050505050565b6001830191839082156126bb5791602002820160005b8382111561268c57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261264e565b80156126b95782816101000a81549060ff021916905560010160208160000104928301926001030261268c565b505b506126c79291506126cb565b5090565b5b808211156126c757600081556001016126cc565b600060208083528351808285015260005b8181101561270d578581018301518582016040015282016126f1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c4f57600080fd5b6000806040838503121561275657600080fd5b82356127618161272e565b946020939093013593505050565b8015158114610c4f57600080fd5b6000806040838503121561279057600080fd5b823561279b8161272e565b915060208301356127ab8161276f565b809150509250929050565b6000806000606084860312156127cb57600080fd5b83356127d68161272e565b925060208401356127e68161272e565b929592945050506040919091013590565b60006020828403121561280957600080fd5b5035919050565b60006020828403121561282257600080fd5b813561282d8161272e565b9392505050565b803560ff8116811461284557600080fd5b919050565b60008060006060848603121561285f57600080fd5b61286884612834565b925061287660208501612834565b915061288460408501612834565b90509250925092565b600080604083850312156128a057600080fd5b82356128ab8161272e565b915060208301356127ab8161272e565b600181811c908216806128cf57607f821691505b6020821081036128ef57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008261292857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610cf857610cf86128f5565b60ff8181168382160190811115610cf857610cf86128f5565b81810381811115610cf857610cf86128f5565b60006020828403121561297e57600080fd5b5051919050565b60006020828403121561299757600080fd5b815161282d8161276f565b6000806000606084860312156129b757600080fd5b8351925060208401519150604084015190509250925092565b8082028115828204841417610cf857610cf86128f5565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a0f57600080fd5b815161282d8161272e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a6a5784516001600160a01b031683529383019391830191600101612a45565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220bcd1043d335ddbfb4289d2ff62901b4be35a7b0484da035fe70a8b8fc89a67e464736f6c63430008130033000000000000000000000000d545457f5ba33bd21ceb51fdfc1e0036527e00f8000000000000000000000000d545457f5ba33bd21ceb51fdfc1e0036527e00f8

Deployed Bytecode

0x6080604052600436106103d25760003560e01c80638c0b5e22116101fd578063d3b895e511610118578063ec342ad0116100ab578063f53bc8351161007a578063f53bc83514610b19578063f887ea4014610b39578063f9f92be414610b59578063fb201b1d14610b89578063ffb54a9914610b9e57600080fd5b8063ec342ad014610aa4578063ec40643414610ab9578063ef998cf014610ad9578063f2fde38b14610af957600080fd5b8063dd62ed3e116100e7578063dd62ed3e14610a2e578063e22b62de14610a4e578063e388d53714610a6e578063ec28438a14610a8457600080fd5b8063d3b895e5146109d7578063d84bf7a8146109ed578063d851fd0d14610a03578063db05e5cb14610a1957600080fd5b8063a01c348311610190578063a9059cbb1161015f578063a9059cbb1461095c578063aa4bde281461097c578063b29ad50a14610992578063b9cb911f146109a757600080fd5b8063a01c3483146108e9578063a457c2d7146108ff578063a87e5da41461091f578063a8aa1b311461093557600080fd5b806395d89b41116101cc57806395d89b411461087e5780639be65a60146108935780639d0014b1146108b35780639d9241ec146108d357600080fd5b80638c0b5e22146107fa5780638da5cb5b146108105780638ebfc7961461082e578063918437971461084e57600080fd5b806335066960116102ed57806359b107b911610280578063715018a61161024f578063715018a6146107855780637537ccb61461079a57806379cc6790146107ba5780637d7d3aaf146107da57600080fd5b806359b107b9146107035780635d098b38146107195780636dca7e7b1461073957806370a082311461074f57600080fd5b806342966c68116102bc57806342966c6814610673578063494f6752146106935780634f0aad4e146106b357806350be7cdb146106e357600080fd5b806335066960146105ed57806339307e161461060d5780633950935114610623578063398daa851461064357600080fd5b806318160ddd116103655780632947c419116103345780632947c419146105725780632d3e474a146105995780633028f63a146105b9578063313ce567146105d957600080fd5b806318160ddd146104fe5780631d6f96551461051357806323b872dd1461053257806327a14fc21461055257600080fd5b80630c56ae3b116103a15780630c56ae3b146104705780630c7d08d3146104a8578063113a8b7b146104be578063153b0d1e146104de57600080fd5b80630445b667146103de5780630614117a1461040757806306fdde031461041e578063095ea7b31461044057600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f4601b5481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b5061041c610bb8565b005b34801561042a57600080fd5b50610433610c52565b6040516103fe91906126e0565b34801561044c57600080fd5b5061046061045b366004612743565b610ce4565b60405190151581526020016103fe565b34801561047c57600080fd5b50600e54610490906001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b3480156104b457600080fd5b506103f460195481565b3480156104ca57600080fd5b5061041c6104d936600461277d565b610cfe565b3480156104ea57600080fd5b5061041c6104f936600461277d565b610d31565b34801561050a57600080fd5b506002546103f4565b34801561051f57600080fd5b50601e5461046090610100900460ff1681565b34801561053e57600080fd5b5061046061054d3660046127b6565b610d64565b34801561055e57600080fd5b5061041c61056d3660046127f7565b610d88565b34801561057e57600080fd5b50610587600581565b60405160ff90911681526020016103fe565b3480156105a557600080fd5b50600d54610490906001600160a01b031681565b3480156105c557600080fd5b5061041c6105d4366004612810565b610df9565b3480156105e557600080fd5b506012610587565b3480156105f957600080fd5b506105876106083660046127f7565b610e87565b34801561061957600080fd5b506103f460155481565b34801561062f57600080fd5b5061046061063e366004612743565b610eb1565b34801561064f57600080fd5b5061046061065e366004612810565b60076020526000908152604090205460ff1681565b34801561067f57600080fd5b5061041c61068e3660046127f7565b610ed3565b34801561069f57600080fd5b5061041c6106ae36600461277d565b610edd565b3480156106bf57600080fd5b506104606106ce366004612810565b600c6020526000908152604090205460ff1681565b3480156106ef57600080fd5b5061041c6106fe36600461284a565b610f10565b34801561070f57600080fd5b506103f4600f5481565b34801561072557600080fd5b5061041c610734366004612810565b610fbb565b34801561074557600080fd5b506103f460165481565b34801561075b57600080fd5b506103f461076a366004612810565b6001600160a01b031660009081526020819052604090205490565b34801561079157600080fd5b5061041c611049565b3480156107a657600080fd5b5061041c6107b536600461277d565b61105d565b3480156107c657600080fd5b5061041c6107d5366004612743565b611090565b3480156107e657600080fd5b5061041c6107f536600461277d565b61111c565b34801561080657600080fd5b506103f460125481565b34801561081c57600080fd5b506005546001600160a01b0316610490565b34801561083a57600080fd5b5061041c61084936600461277d565b61114f565b34801561085a57600080fd5b50610460610869366004612810565b60086020526000908152604090205460ff1681565b34801561088a57600080fd5b50610433611182565b34801561089f57600080fd5b5061041c6108ae366004612810565b611191565b3480156108bf57600080fd5b5061041c6108ce3660046127f7565b6112c8565b3480156108df57600080fd5b506103f460105481565b3480156108f557600080fd5b5061049061dead81565b34801561090b57600080fd5b5061046061091a366004612743565b6112d5565b34801561092b57600080fd5b506103f460135481565b34801561094157600080fd5b50601e5461049090630100000090046001600160a01b031681565b34801561096857600080fd5b50610460610977366004612743565b611350565b34801561098857600080fd5b506103f460115481565b34801561099e57600080fd5b5061041c61135e565b3480156109b357600080fd5b506104606109c2366004612810565b600b6020526000908152604090205460ff1681565b3480156109e357600080fd5b506103f4601a5481565b3480156109f957600080fd5b506103f460185481565b348015610a0f57600080fd5b506103f460145481565b348015610a2557600080fd5b5061041c6113ee565b348015610a3a57600080fd5b506103f4610a4936600461288d565b611407565b348015610a5a57600080fd5b5061041c610a6936600461284a565b611432565b348015610a7a57600080fd5b506103f460175481565b348015610a9057600080fd5b5061041c610a9f3660046127f7565b6114d7565b348015610ab057600080fd5b506103f4606481565b348015610ac557600080fd5b50610587610ad43660046127f7565b611540565b348015610ae557600080fd5b5061041c610af43660046127f7565b611550565b348015610b0557600080fd5b5061041c610b14366004612810565b6115af565b348015610b2557600080fd5b5061041c610b343660046127f7565b611625565b348015610b4557600080fd5b50601f54610490906001600160a01b031681565b348015610b6557600080fd5b50610460610b74366004612810565b60066020526000908152604090205460ff1681565b348015610b9557600080fd5b5061041c61167d565b348015610baa57600080fd5b50601e546104609060ff1681565b610bc0611694565b604051600090339047908381818185875af1925050503d8060008114610c02576040519150601f19603f3d011682016040523d82523d6000602084013e610c07565b606091505b5050905080610c4f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064015b60405180910390fd5b50565b606060038054610c61906128bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8d906128bb565b8015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050905090565b600033610cf28185856116ee565b60019150505b92915050565b610d06611694565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610d39611694565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600033610d72858285611812565b610d7d858585611886565b506001949350505050565b610d90611694565b6064610d9b60025490565b610da5919061290b565b811015610df45760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964204d61782057616c6c657420416d6f756e74000000000000006044820152606401610c46565b601155565b610e01611694565b6001600160a01b03811615801590610e275750600e546001600160a01b03828116911614155b610e655760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b601d8160038110610e9757600080fd5b60209182820401919006915054906101000a900460ff1681565b600033610cf2818585610ec48383611407565b610ece919061292d565b6116ee565b610c4f33826119d3565b610ee5611694565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b610f18611694565b80610f238385612940565b610f2d9190612940565b60ff16600f81905560191015610f855760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601c906003612638565b50505050565b610fc3611694565b6001600160a01b03811615801590610fe95750600d546001600160a01b03828116911614155b6110275760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c46565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611051611694565b61105b6000611b05565b565b611065611694565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b61109a8233611407565b8111156110e95760405162461bcd60e51b815260206004820152601b60248201527f42554e41493a204e6f7420656e6f75676820616c6c6f77616e636500000000006044820152606401610c46565b6000816110f68433611407565b6111009190612959565b905061110d8333836116ee565b61111783836119d3565b505050565b611124611694565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b611157611694565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b606060048054610c61906128bb565b611199611694565b306001600160a01b038216036111e95760405162461bcd60e51b815260206004820152601560248201527443616e6e6f742077697468647261772042554e414960581b6044820152606401610c46565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611230573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611254919061296c565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111179190612985565b6112d0611694565b601b55565b600033816112e38286611407565b9050838110156113435760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c46565b610d7d82868684036116ee565b600033610cf2818585611886565b601e805462ff00001916620100001790553060009081526020819052604090205460175410156113d05760405162461bcd60e51b815260206004820152601860248201527f42554e41493a204e6f7420656e6f75676820746f6b656e7300000000000000006044820152606401610c46565b6113db601754611b57565b6000601755601e805462ff000019169055565b6113f6611694565b601e805461ff001916610100179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61143a611694565b806114458385612940565b61144f9190612940565b60ff166010819055601910156114a75760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20323525000000006044820152606401610c46565b6040805160608101825260ff80861682528481166020830152831691810191909152610fb590601d906003612638565b6114df611694565b60646114ea60025490565b6114f4919061290b565b81101561153b5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a590813585e08151e08105b5bdd5b9d605a1b6044820152606401610c46565b601255565b601c8160038110610e9757600080fd5b611558611694565b6012548110156115aa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204d61782053656c6c20416d6f756e740000000000000000006044820152606401610c46565b601455565b6115b7611694565b6001600160a01b03811661161c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b610c4f81611b05565b61162d611694565b6012548110156116785760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590813585e08109d5e48105b5bdd5b9d60521b6044820152606401610c46565b601355565b611685611694565b601e805460ff19166001179055565b6005546001600160a01b0316331461105b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c46565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c46565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061181e8484611407565b90506000198114610fb557818110156118795760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c46565b610fb584848484036116ee565b611891838383611c9d565b601e5462010000900460ff166119c85730600090815260208190526040902054601b5481108015906118d85750601e546001600160a01b0385811663010000009092041614155b80156118f25750601f546001600160a01b03858116911614155b156119005761190081612029565b601e546001600160a01b0385811663010000009092041614801561193d57506001600160a01b03831660009081526007602052604090205460ff16155b806119805750601e546001600160a01b0384811663010000009092041614801561198057506001600160a01b03841660009081526007602052604090205460ff16155b156119c657601e546000906119ab9084906001600160a01b0388811663010000009092041614612242565b90506119b885308361233a565b6119c28184612959565b9250505b505b61111783838361233a565b6001600160a01b038216611a335760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c46565b6001600160a01b03821660009081526020819052604090205481811015611aa75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c46565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b6460028361290b565b90506000611b728284612959565b905047611b7e836124de565b6000611b8a8247612959565b601f54909150611ba59030906001600160a01b0316856116ee565b601f5460405163f305d71960e01b8152306004820152602481018590526000604482018190526064820181905261dead60848301524260a4830152916001600160a01b03169063f305d71990849060c40160606040518083038185885af1158015611c14573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611c3991906129a2565b9250505080601a6000828254611c4f919061292d565b909155505060408051868152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050565b601e54610100900460ff1680611cba57506001600160a01b038316155b80611ccc57506001600160a01b038216155b80611cdf5750601e5462010000900460ff165b15611ce957505050565b6001600160a01b03831660009081526006602052604090205460ff16158015611d2b57506001600160a01b03821660009081526006602052604090205460ff16155b611d775760405162461bcd60e51b815260206004820152601a60248201527f42554e41493a20426c61636b6c697374656420616464726573730000000000006044820152606401610c46565b601e5460ff16611de2576001600160a01b0383166000908152600b602052604090205460ff16611de25760405162461bcd60e51b815260206004820152601660248201527510955390524e88151c98591a5b99c8189b1bd8dad95960521b6044820152606401610c46565b6001600160a01b03831660009081526008602052604090205460ff16611ee557601e546001600160a01b036301000000909104811690841603611e7657601354811115611e715760405162461bcd60e51b815260206004820152601e60248201527f42554e41493a204d61782062757920616d6f756e7420657863656564656400006044820152606401610c46565b611ee5565b601e546001600160a01b036301000000909104811690831603611ee557601454811115611ee55760405162461bcd60e51b815260206004820152601f60248201527f42554e41493a204d61782073656c6c20616d6f756e74206578636565646564006044820152606401610c46565b6001600160a01b0382166000908152600c602052604090205460ff16611f8a5760115481611f28846001600160a01b031660009081526020819052604090205490565b611f32919061292d565b1115611f8a5760405162461bcd60e51b815260206004820152602160248201527f42554e41493a204d61782077616c6c657420616d6f756e7420657863656564656044820152601960fa1b6064820152608401610c46565b6001600160a01b0383166000908152600a602052604090205460ff16611117576001600160a01b0383166000908152600960205260409020544310156120005760405162461bcd60e51b815260206004820152600b60248201526a42554e41493a20426f743f60a81b6044820152606401610c46565b61200b60054361292d565b6001600160a01b038416600090815260096020526040902055505050565b601e805462ff0000191662010000179055601754601654601554600092916120509161292d565b61205a919061292d565b60155460165460175492935090918484146120bd57838560155461207e91906129d0565b612088919061290b565b9250838560165461209991906129d0565b6120a3919061290b565b9150816120b08487612959565b6120ba9190612959565b90505b80156120cc576120cc81611b57565b60006120d8838561292d565b1115612220576120f06120eb838561292d565b6124de565b476000841561219257612103848661292d565b61210d83876129d0565b612117919061290b565b600d546040519196506001600160a01b0316908690600081818185875af1925050503d8060008114612165576040519150601f19603f3d011682016040523d82523d6000602084013e61216a565b606091505b5050809150508061217a57600080fd5b846018600082825461218c919061292d565b90915550505b831561221d576121a28583612959565b600e546040519195506001600160a01b0316908590600081818185875af1925050503d80600081146121f0576040519150601f19603f3d011682016040523d82523d6000602084013e6121f5565b606091505b5050809150508061220557600080fd5b8360196000828254612217919061292d565b90915550505b50505b50506000601581905560168190556017555050601e805462ff00001916905550565b6000808261225257601054612256565b600f545b9050606461226485836129d0565b61226e919061290b565b915060008361227e57601d612281565b601c5b8054909150600090839061229990869060ff166129d0565b6122a3919061290b565b825490915060009084906122c0908790610100900460ff166129d0565b6122ca919061290b565b90506000816122d98488612959565b6122e39190612959565b905082601560008282546122f7919061292d565b925050819055508160166000828254612310919061292d565b925050819055508060176000828254612329919061292d565b909155509598975050505050505050565b6001600160a01b03831661239e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c46565b6001600160a01b0382166124005760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c46565b6001600160a01b038316600090815260208190526040902054818110156124785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c46565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610fb5565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612513576125136129e7565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561256c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259091906129fd565b816001815181106125a3576125a36129e7565b6001600160a01b039283166020918202929092010152601f546125c991309116846116ee565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612602908590600090869030904290600401612a1a565b600060405180830381600087803b15801561261c57600080fd5b505af1158015612630573d6000803e3d6000fd5b505050505050565b6001830191839082156126bb5791602002820160005b8382111561268c57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261264e565b80156126b95782816101000a81549060ff021916905560010160208160000104928301926001030261268c565b505b506126c79291506126cb565b5090565b5b808211156126c757600081556001016126cc565b600060208083528351808285015260005b8181101561270d578581018301518582016040015282016126f1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c4f57600080fd5b6000806040838503121561275657600080fd5b82356127618161272e565b946020939093013593505050565b8015158114610c4f57600080fd5b6000806040838503121561279057600080fd5b823561279b8161272e565b915060208301356127ab8161276f565b809150509250929050565b6000806000606084860312156127cb57600080fd5b83356127d68161272e565b925060208401356127e68161272e565b929592945050506040919091013590565b60006020828403121561280957600080fd5b5035919050565b60006020828403121561282257600080fd5b813561282d8161272e565b9392505050565b803560ff8116811461284557600080fd5b919050565b60008060006060848603121561285f57600080fd5b61286884612834565b925061287660208501612834565b915061288460408501612834565b90509250925092565b600080604083850312156128a057600080fd5b82356128ab8161272e565b915060208301356127ab8161272e565b600181811c908216806128cf57607f821691505b6020821081036128ef57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008261292857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610cf857610cf86128f5565b60ff8181168382160190811115610cf857610cf86128f5565b81810381811115610cf857610cf86128f5565b60006020828403121561297e57600080fd5b5051919050565b60006020828403121561299757600080fd5b815161282d8161276f565b6000806000606084860312156129b757600080fd5b8351925060208401519150604084015190509250925092565b8082028115828204841417610cf857610cf86128f5565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a0f57600080fd5b815161282d8161272e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a6a5784516001600160a01b031683529383019391830191600101612a45565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220bcd1043d335ddbfb4289d2ff62901b4be35a7b0484da035fe70a8b8fc89a67e464736f6c63430008130033

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

000000000000000000000000d545457f5ba33bd21ceb51fdfc1e0036527e00f8000000000000000000000000d545457f5ba33bd21ceb51fdfc1e0036527e00f8

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

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


Deployed Bytecode Sourcemap

31048:16591:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31963:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;31963:36:0;;;;;;;;44804:201;;;;;;;;;;;;;:::i;:::-;;19237:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21654:226::-;;;;;;;;;;-1:-1:-1;21654:226:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;21654:226:0;1205:187:1;31525:26:0;;;;;;;;;;-1:-1:-1;31525:26:0;;;;-1:-1:-1;;;;;31525:26:0;;;;;;-1:-1:-1;;;;;1561:32:1;;;1543:51;;1531:2;1516:18;31525:26:0;1397:203:1;31889:28:0;;;;;;;;;;;;;;;;47080:166;;;;;;;;;;-1:-1:-1;47080:166:0;;;;;:::i;:::-;;:::i;44080:152::-;;;;;;;;;;-1:-1:-1;44080:152:0;;;;;:::i;:::-;;:::i;20357:108::-;;;;;;;;;;-1:-1:-1;20445:12:0;;20357:108;;32246:33;;;;;;;;;;-1:-1:-1;32246:33:0;;;;;;;;;;;22460:295;;;;;;;;;;-1:-1:-1;22460:295:0;;;;;:::i;:::-;;:::i;46708:187::-;;;;;;;;;;-1:-1:-1;46708:187:0;;;;;:::i;:::-;;:::i;31446:39::-;;;;;;;;;;;;31484:1;31446:39;;;;;2933:4:1;2921:17;;;2903:36;;2891:2;2876:18;31446:39:0;2761:184:1;31494:24:0;;;;;;;;;;-1:-1:-1;31494:24:0;;;;-1:-1:-1;;;;;31494:24:0;;;45648:243;;;;;;;;;;-1:-1:-1;45648:243:0;;;;;:::i;:::-;;:::i;20199:93::-;;;;;;;;;;-1:-1:-1;20282:2:0;20199:93;;32038:24;;;;;;;;;;-1:-1:-1;32038:24:0;;;;;:::i;:::-;;:::i;31756:25::-;;;;;;;;;;;;;;;;23164:263;;;;;;;;;;-1:-1:-1;23164:263:0;;;;;:::i;:::-;;:::i;31138:41::-;;;;;;;;;;-1:-1:-1;31138:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36720:83;;;;;;;;;;-1:-1:-1;36720:83:0;;;;;:::i;:::-;;:::i;47254:125::-;;;;;;;;;;-1:-1:-1;47254:125:0;;;;;:::i;:::-;;:::i;31390:47::-;;;;;;;;;;-1:-1:-1;31390:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42865:289;;;;;;;;;;-1:-1:-1;42865:289:0;;;;;:::i;:::-;;:::i;31560:23::-;;;;;;;;;;;;;;;;45216:235;;;;;;;;;;-1:-1:-1;45216:235:0;;;;;:::i;:::-;;:::i;31788:23::-;;;;;;;;;;;;;;;;20528:143;;;;;;;;;;-1:-1:-1;20528:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;20645:18:0;20618:7;20645:18;;;;;;;;;;;;20528:143;16053:103;;;;;;;;;;;;;:::i;47387:156::-;;;;;;;;;;-1:-1:-1;47387:156:0;;;;;:::i;:::-;;:::i;36973:368::-;;;;;;;;;;-1:-1:-1;36973:368:0;;;;;:::i;:::-;;:::i;46045:121::-;;;;;;;;;;-1:-1:-1;46045:121:0;;;;;:::i;:::-;;:::i;31657:23::-;;;;;;;;;;;;;;;;15405:87;;;;;;;;;;-1:-1:-1;15478:6:0;;-1:-1:-1;;;;;15478:6:0;15405:87;;43819:117;;;;;;;;;;-1:-1:-1;43819:117:0;;;;;:::i;:::-;;:::i;31186:43::-;;;;;;;;;;-1:-1:-1;31186:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19456:104;;;;;;;;;;;;;:::i;44490:256::-;;;;;;;;;;-1:-1:-1;44490:256:0;;;;;:::i;:::-;;:::i;46903:169::-;;;;;;;;;;-1:-1:-1;46903:169:0;;;;;:::i;:::-;;:::i;31590:24::-;;;;;;;;;;;;;;;;32110:89;;;;;;;;;;;;32157:42;32110:89;;23930:498;;;;;;;;;;-1:-1:-1;23930:498:0;;;;;:::i;:::-;;:::i;31687:26::-;;;;;;;;;;;;;;;;32324;;;;;;;;;;-1:-1:-1;32324:26:0;;;;;;;-1:-1:-1;;;;;32324:26:0;;;20877:218;;;;;;;;;;-1:-1:-1;20877:218:0;;;;;:::i;:::-;;:::i;31623:27::-;;;;;;;;;;;;;;;;41069:250;;;;;;;;;;;;;:::i;31339:44::-;;;;;;;;;;-1:-1:-1;31339:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31924:30;;;;;;;;;;;;;;;;31852;;;;;;;;;;;;;;;;31720:27;;;;;;;;;;;;;;;;47551:85;;;;;;;;;;;;;:::i;21158:176::-;;;;;;;;;;-1:-1:-1;21158:176:0;;;;;:::i;:::-;;:::i;43386:293::-;;;;;;;;;;-1:-1:-1;43386:293:0;;;;;:::i;:::-;;:::i;31818:25::-;;;;;;;;;;;;;;;;46525:175;;;;;;;;;;-1:-1:-1;46525:175:0;;;;;:::i;:::-;;:::i;32069:34::-;;;;;;;;;;;;32100:3;32069:34;;32008:23;;;;;;;;;;-1:-1:-1;32008:23:0;;;;;:::i;:::-;;:::i;46348:169::-;;;;;;;;;;-1:-1:-1;46348:169:0;;;;;:::i;:::-;;:::i;16311:238::-;;;;;;;;;;-1:-1:-1;16311:238:0;;;;;:::i;:::-;;:::i;46174:166::-;;;;;;;;;;-1:-1:-1;46174:166:0;;;;;:::i;:::-;;:::i;32357:32::-;;;;;;;;;;-1:-1:-1;32357:32:0;;;;-1:-1:-1;;;;;32357:32:0;;;31090:41;;;;;;;;;;-1:-1:-1;31090:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44285:77;;;;;;;;;;;;;:::i;32208:31::-;;;;;;;;;;-1:-1:-1;32208:31:0;;;;;;;;44804:201;15291:13;:11;:13::i;:::-;44872:82:::1;::::0;44857:9:::1;::::0;44880:10:::1;::::0;44904:21:::1;::::0;44857:9;44872:82;44857:9;44872:82;44904:21;44880:10;44872:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44856:98;;;44973:4;44965:32;;;::::0;-1:-1:-1;;;44965:32:0;;4959:2:1;44965: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;;44965:32:0::1;;;;;;;;;44845:160;44804:201::o:0;19237:100::-;19291:13;19324:5;19317:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19237:100;:::o;21654:226::-;21762:4;839:10;21818:32;839:10;21834:7;21843:6;21818:8;:32::i;:::-;21868:4;21861:11;;;21654:226;;;;;:::o;47080:166::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;47198:27:0;;;::::1;;::::0;;;:17:::1;:27;::::0;;;;:40;;-1:-1:-1;;47198:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47080:166::o;44080:152::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;44192:19:0;;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:32;;-1:-1:-1;;44192:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44080:152::o;22460:295::-;22591:4;839:10;22649:38;22665:4;839:10;22680:6;22649:15;:38::i;:::-;22698:27;22708:4;22714:2;22718:6;22698:9;:27::i;:::-;-1:-1:-1;22743:4:0;;22460:295;-1:-1:-1;;;;22460:295:0:o;46708:187::-;15291:13;:11;:13::i;:::-;46818:3:::1;46802:13;20445:12:::0;;;20357:108;46802:13:::1;:19;;;;:::i;:::-;46791:7;:30;;46783:68;;;::::0;-1:-1:-1;;;46783:68:0;;6042:2:1;46783:68:0::1;::::0;::::1;6024:21:1::0;6081:2;6061:18;;;6054:30;6120:27;6100:18;;;6093:55;6165:18;;46783:68:0::1;5840:349:1::0;46783:68:0::1;46862:15;:25:::0;46708:187::o;45648:243::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;45746:26:0;::::1;::::0;;::::1;::::0;:57:::1;;-1:-1:-1::0;45792:11:0::1;::::0;-1:-1:-1;;;;;45776:27:0;;::::1;45792:11:::0;::::1;45776:27;;45746:57;45724:122;;;::::0;-1:-1:-1;;;45724:122:0;;6396:2:1;45724: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;;45724:122:0::1;6194:339:1::0;45724:122:0::1;45857:11;:26:::0;;-1:-1:-1;;;;;;45857:26:0::1;-1:-1:-1::0;;;;;45857:26:0;;;::::1;::::0;;;::::1;::::0;;45648:243::o;32038:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23164:263::-;23277:4;839:10;23333:64;839:10;23349:7;23386:10;23358:25;839:10;23349:7;23358:9;:25::i;:::-;:38;;;;:::i;:::-;23333:8;:64::i;36720:83::-;36770:25;36776:10;36788:6;36770:5;:25::i;47254:125::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;47339:22:0;;;::::1;;::::0;;;:12:::1;:22;::::0;;;;:32;;-1:-1:-1;;47339:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47254:125::o;42865:289::-;15291:13;:11;:13::i;:::-;43027:4;43006:18:::1;43019:5:::0;43006:10;:18:::1;:::i;:::-;:25;;;;:::i;:::-;42992:39;;:11;:39:::0;;;43065:2:::1;-1:-1:-1::0;43050:17:0::1;43042:58;;;::::0;-1:-1:-1;;;43042:58:0;;7023:2:1;43042:58:0::1;::::0;::::1;7005:21:1::0;7062:2;7042:18;;;7035:30;7101;7081:18;;;7074:58;7149:18;;43042:58:0::1;6821:352:1::0;43042:58:0::1;43111:35;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;:7:::1;::::0;:35:::1;;:::i;:::-;;42865:289:::0;;;:::o;45216:235::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;45316:24:0;::::1;::::0;;::::1;::::0;:51:::1;;-1:-1:-1::0;45358:9:0::1;::::0;-1:-1:-1;;;;;45344:23:0;;::::1;45358:9:::0;::::1;45344:23;;45316:51;45294:116;;;::::0;-1:-1:-1;;;45294:116:0;;6396:2:1;45294: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;;45294:116:0::1;6194:339:1::0;45294:116:0::1;45421:9;:22:::0;;-1:-1:-1;;;;;;45421:22:0::1;-1:-1:-1::0;;;;;45421:22:0;;;::::1;::::0;;;::::1;::::0;;45216:235::o;16053:103::-;15291:13;:11;:13::i;:::-;16118:30:::1;16145:1;16118:18;:30::i;:::-;16053:103::o:0;47387:156::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;47500:25:0;;;::::1;;::::0;;;:15:::1;:25;::::0;;;;:35;;-1:-1:-1;;47500:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47387:156::o;36973:368::-;37076:30;37086:7;37095:10;37076:9;:30::i;:::-;37066:6;:40;;37044:117;;;;-1:-1:-1;;;37044:117:0;;7380:2:1;37044:117:0;;;7362:21:1;7419:2;7399:18;;;7392:30;7458:29;7438:18;;;7431:57;7505:18;;37044:117:0;7178:351:1;37044:117:0;37172:26;37234:6;37201:30;37211:7;37220:10;37201:9;:30::i;:::-;:39;;;;:::i;:::-;37172:68;;37251:49;37260:7;37269:10;37281:18;37251:8;:49::i;:::-;37311:22;37317:7;37326:6;37311:5;:22::i;:::-;37033:308;36973:368;;:::o;46045:121::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;46128:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:30;;-1:-1:-1;;46128:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46045:121::o;43819:117::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;43900:19:0;;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:28;;-1:-1:-1;;43900:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43819:117::o;19456:104::-;19512:13;19545:7;19538:14;;;;;:::i;44490:256::-;15291:13;:11;:13::i;:::-;44584:4:::1;-1:-1:-1::0;;;;;44566:23:0;::::1;::::0;44558:57:::1;;;::::0;-1:-1:-1;;;44558:57:0;;7869:2:1;44558: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;;44558:57:0::1;7667:345:1::0;44558:57:0::1;44644:39;::::0;-1:-1:-1;;;44644:39:0;;44677:4:::1;44644:39;::::0;::::1;1543:51:1::0;44626:15:0::1;::::0;-1:-1:-1;;;;;44644:24:0;::::1;::::0;::::1;::::0;1516:18:1;;44644:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44694:44;::::0;-1:-1:-1;;;44694:44:0;;44718:10:::1;44694:44;::::0;::::1;8380:51:1::0;8447:18;;;8440:34;;;44626:57:0;;-1:-1:-1;;;;;;44694:23:0;::::1;::::0;::::1;::::0;8353:18:1;;44694:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46903:169::-:0;15291:13;:11;:13::i;:::-;47041::::1;:23:::0;46903:169::o;23930:498::-;24048:4;839:10;24048:4;24131:25;839:10;24148:7;24131:9;:25::i;:::-;24104:52;;24209:15;24189:16;:35;;24167:122;;;;-1:-1:-1;;;24167:122:0;;9295:2:1;24167: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;;24167:122:0;9093:401:1;24167:122:0;24325:60;24334:5;24341:7;24369:15;24350:16;:34;24325:8;:60::i;20877:218::-;20981:4;839:10;21037:28;839:10;21054:2;21058:6;21037:9;:28::i;41069:250::-;32632:8;:15;;-1:-1:-1;;32632:15:0;;;;;41184:4:::1;-1:-1:-1::0;20645:18:0;;;;;;;;;;;41149:13:::1;;:41;;41127:115;;;::::0;-1:-1:-1;;;41127:115:0;;9701:2:1;41127:115:0::1;::::0;::::1;9683:21:1::0;9740:2;9720:18;;;9713:30;9779:26;9759:18;;;9752:54;9823:18;;41127:115:0::1;9499:348:1::0;41127:115:0::1;41253:30;41269:13;;41253:15;:30::i;:::-;41310:1;41294:13;:17:::0;32670:8;:16;;-1:-1:-1;;32670:16:0;;;41069:250::o;47551:85::-;15291:13;:11;:13::i;:::-;47608::::1;:20:::0;;-1:-1:-1;;47608:20:0::1;;;::::0;;47551:85::o;21158:176::-;-1:-1:-1;;;;;21299:18:0;;;21272:7;21299:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21158:176::o;43386:293::-;15291:13;:11;:13::i;:::-;43550:4;43529:18:::1;43542:5:::0;43529:10;:18:::1;:::i;:::-;:25;;;;:::i;:::-;43514:40;;:12;:40:::0;;;43589:2:::1;-1:-1:-1::0;43573:18:0::1;43565:59;;;::::0;-1:-1:-1;;;43565:59:0;;7023:2:1;43565:59:0::1;::::0;::::1;7005:21:1::0;7062:2;7042:18;;;7035:30;7101;7081:18;;;7074:58;7149:18;;43565:59:0::1;6821:352:1::0;43565:59:0::1;43635:36;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;:8:::1;::::0;:36:::1;;:::i;46525:175::-:0;15291:13;:11;:13::i;:::-;46631:3:::1;46615:13;20445:12:::0;;;20357:108;46615:13:::1;:19;;;;:::i;:::-;46604:7;:30;;46596:64;;;::::0;-1:-1:-1;;;46596:64:0;;10054:2:1;46596: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;;46596:64:0::1;9852:345:1::0;46596:64:0::1;46671:11;:21:::0;46525:175::o;32008:23::-;;;;;;;;;;;46348:169;15291:13;:11;:13::i;:::-;46434:11:::1;;46423:7;:22;;46415:58;;;::::0;-1:-1:-1;;;46415:58:0;;10404:2:1;46415:58:0::1;::::0;::::1;10386:21:1::0;10443:2;10423:18;;;10416:30;10482:25;10462:18;;;10455:53;10525:18;;46415:58:0::1;10202:347:1::0;46415:58:0::1;46484:15;:25:::0;46348:169::o;16311:238::-;15291:13;:11;:13::i;:::-;-1:-1:-1;;;;;16414:22:0;::::1;16392:110;;;::::0;-1:-1:-1;;;16392:110:0;;10756:2:1;16392: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;;16392:110:0::1;10554:402:1::0;16392:110:0::1;16513:28;16532:8;16513:18;:28::i;46174:166::-:0;15291:13;:11;:13::i;:::-;46259:11:::1;;46248:7;:22;;46240:57;;;::::0;-1:-1:-1;;;46240:57:0;;11163:2:1;46240: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;;46240:57:0::1;10961:346:1::0;46240:57:0::1;46308:14;:24:::0;46174:166::o;44285:77::-;15291:13;:11;:13::i;:::-;44336:11:::1;:18:::0;;-1:-1:-1;;44336:18:0::1;44350:4;44336:18;::::0;;44285:77::o;15570:132::-;15478:6;;-1:-1:-1;;;;;15478:6:0;839:10;15634:23;15626:68;;;;-1:-1:-1;;;15626:68:0;;11514:2:1;15626:68:0;;;11496:21:1;;;11533:18;;;11526:30;11592:34;11572:18;;;11565:62;11644:18;;15626:68:0;11312:356:1;28056:380:0;-1:-1:-1;;;;;28192:19:0;;28184:68;;;;-1:-1:-1;;;28184:68:0;;11875:2:1;28184: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;;28184:68:0;11673:400:1;28184:68:0;-1:-1:-1;;;;;28271:21:0;;28263:68;;;;-1:-1:-1;;;28263:68:0;;12280:2:1;28263: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;;28263:68:0;12078:398:1;28263:68:0;-1:-1:-1;;;;;28344:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28396:32;;160:25:1;;;28396:32:0;;133:18:1;28396:32:0;;;;;;;28056:380;;;:::o;28727:502::-;28862:24;28889:25;28899:5;28906:7;28889:9;:25::i;:::-;28862:52;;-1:-1:-1;;28929:16:0;:37;28925:297;;29029:6;29009:16;:26;;28983:117;;;;-1:-1:-1;;;28983:117:0;;12683:2:1;28983:117:0;;;12665:21:1;12722:2;12702:18;;;12695:30;12761:31;12741:18;;;12734:59;12810:18;;28983:117:0;12481:353:1;28983:117:0;29144:51;29153:5;29160:7;29188:6;29169:16;:25;29144:8;:51::i;37609:969::-;37742:42;37758:6;37766:9;37777:6;37742:15;:42::i;:::-;37800:8;;;;;;;37795:721;;37868:4;37825:22;20645:18;;;;;;;;;;;37932:13;;37911:34;;;;;:78;;-1:-1:-1;37984:4:0;;-1:-1:-1;;;;;37966:23:0;;;37984:4;;;;;37966:23;;37911:78;:124;;;;-1:-1:-1;38028:6:0;;-1:-1:-1;;;;;38010:25:0;;;38028:6;;38010:25;;37911:124;37889:240;;;38070:43;38095:17;38070:24;:43::i;:::-;38187:4;;-1:-1:-1;;;;;38169:23:0;;;38187:4;;;;;38169:23;:48;;;;-1:-1:-1;;;;;;38197:20:0;;;;;;:9;:20;;;;;;;;38196:21;38169:48;38168:125;;;-1:-1:-1;38265:4:0;;-1:-1:-1;;;;;38244:26:0;;;38265:4;;;;;38244:26;:48;;;;-1:-1:-1;;;;;;38275:17:0;;;;;;:9;:17;;;;;;;;38274:18;38244:48;38145:360;;;38379:4;;38329:13;;38345:40;;38353:6;;-1:-1:-1;;;;;38361:23:0;;;38379:4;;;;;38361:23;38345:7;:40::i;:::-;38329:56;;38404:48;38420:6;38436:4;38443:8;38404:15;:48::i;:::-;38471:18;38481:8;38471:18;;:::i;:::-;;;38310:195;38145:360;37810:706;37795:721;38528:42;38544:6;38552:9;38563:6;38528:15;:42::i;26943:675::-;-1:-1:-1;;;;;27027:21:0;;27019:67;;;;-1:-1:-1;;;27019:67:0;;13041:2:1;27019: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;;27019:67:0;12839:397:1;27019:67:0;-1:-1:-1;;;;;27186:18:0;;27161:22;27186:18;;;;;;;;;;;27223:24;;;;27215:71;;;;-1:-1:-1;;;27215:71:0;;13443:2:1;27215: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;;27215:71:0;13241:398:1;27215:71:0;-1:-1:-1;;;;;27322:18:0;;:9;:18;;;;;;;;;;;27343:23;;;27322:44;;27461:12;:22;;;;;;;27512:37;160:25:1;;;27322:9:0;;:18;27512:37;;133:18:1;27512:37:0;;;;;;;37033:308;36973:368;;:::o;16709:191::-;16802:6;;;-1:-1:-1;;;;;16819:17:0;;;-1:-1:-1;;;;;;16819:17:0;;;;;;;16852:40;;16802:6;;;16819:17;16802:6;;16852:40;;16783:16;;16852:40;16772:128;16709:191;:::o;41449:683::-;41506:9;41518:10;41527:1;41518:6;:10;:::i;:::-;41506:22;-1:-1:-1;41539:14:0;41556:13;41506:22;41556:6;:13;:::i;:::-;41539:30;-1:-1:-1;41604:21:0;41638:22;41655:4;41638:16;:22::i;:::-;41673:15;41691:38;41715:14;41691:21;:38;:::i;:::-;41774:6;;41673:56;;-1:-1:-1;41742:51:0;;41759:4;;-1:-1:-1;;;;;41774:6:0;41783:9;41742:8;:51::i;:::-;41827:6;;:192;;-1:-1:-1;;;41827:192:0;;41891:4;41827:192;;;13985:34:1;14035:18;;;14028:34;;;41809:14:0;14078:18:1;;;14071:34;;;14121:18;;;14114:34;;;32157:42:0;14164:19:1;;;14157:44;41993:15:0;14217:19:1;;;14210:35;41809:14:0;-1:-1:-1;;;;;41827:6:0;;:22;;41857:10;;13919:19:1;;41827:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41804:215;;;;42054:9;42032:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;42081:43:0;;;14769:25:1;;;14825:2;14810:18;;14803:34;;;14853:18;;;14846:34;;;42081:43:0;;14757:2:1;14742:18;42081:43:0;;;;;;;41495:637;;;;;41449:683;:::o;35301:1314::-;35426:13;;;;;;;;:35;;-1:-1:-1;;;;;;35443:18:0;;;35426:35;:55;;;-1:-1:-1;;;;;;35465:16:0;;;35426:55;:67;;;-1:-1:-1;35485:8:0;;;;;;;35426:67;35422:93;;;35301:1314;;;:::o;35422:93::-;-1:-1:-1;;;;;35548:15:0;;;;;;:9;:15;;;;;;;;35547:16;:34;;;;-1:-1:-1;;;;;;35568:13:0;;;;;;:9;:13;;;;;;;;35567:14;35547:34;35525:110;;;;-1:-1:-1;;;35525:110:0;;15093:2:1;35525:110:0;;;15075:21:1;15132:2;15112:18;;;15105:30;15171:28;15151:18;;;15144:56;15217:18;;35525:110:0;14891:350:1;35525:110:0;35717:11;;;;35712:71;;-1:-1:-1;;;;;35738:18:0;;;;;;:12;:18;;;;;;;;35730:53;;;;-1:-1:-1;;;35730:53:0;;15448:2:1;35730:53:0;;;15430:21:1;15487:2;15467:18;;;15460:30;-1:-1:-1;;;15506:18:1;;;15499:52;15568:18;;35730:53:0;15246:346:1;35730:53:0;-1:-1:-1;;;;;35801:17:0;;;;;;:11;:17;;;;;;;;35796:436;;35855:4;;-1:-1:-1;;;;;35855:4:0;;;;;;35839:21;;;;35835:386;;35921:14;;35911:6;:24;;35881:128;;;;-1:-1:-1;;;35881:128:0;;15799:2:1;35881:128:0;;;15781:21:1;15838:2;15818:18;;;15811:30;15877:32;15857:18;;;15850:60;15927:18;;35881:128:0;15597:354:1;35881:128:0;35835:386;;;36049:4;;-1:-1:-1;;;;;36049:4:0;;;;;;36035:19;;;;36031:190;;36115:15;;36105:6;:25;;36075:130;;;;-1:-1:-1;;;36075:130:0;;16158:2:1;36075:130:0;;;16140:21:1;16197:2;16177:18;;;16170:30;16236:33;16216:18;;;16209:61;16287:18;;36075:130:0;15956:355:1;36075:130:0;-1:-1:-1;;;;;36247:19:0;;;;;;:15;:19;;;;;;;;36242:189;;36335:15;;36325:6;36309:13;36319:2;-1:-1:-1;;;;;20645:18:0;20618:7;20645:18;;;;;;;;;;;;20528:143;36309:13;:22;;;;:::i;:::-;:41;;36283:136;;;;-1:-1:-1;;;36283:136:0;;16518:2:1;36283: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;;36283:136:0;16316:397:1;36283:136:0;-1:-1:-1;;;;;36446:23:0;;;;;;:17;:23;;;;;;;;36441:167;;-1:-1:-1;;;;;36494:12:0;;;;;;:6;:12;;;;;;36510;-1:-1:-1;36494:28:0;36486:52;;;;-1:-1:-1;;;36486:52:0;;16920:2:1;36486:52:0;;;16902:21:1;16959:2;16939:18;;;16932:30;-1:-1:-1;;;16978:18:1;;;16971:41;17029:18;;36486:52:0;16718:335:1;36486:52:0;36568:28;31484:1;36568:12;:28;:::i;:::-;-1:-1:-1;;;;;36553:12:0;;;;;;:6;:12;;;;;:43;35301:1314;;;:::o;39737:1236::-;32632:8;:15;;-1:-1:-1;;32632:15:0;;;;;39868:13:::1;::::0;39854:11:::1;::::0;39838:13:::1;::::0;32632:15;;39868:13;39838:27:::1;::::0;::::1;:::i;:::-;:43;;;;:::i;:::-;39905:13;::::0;39940:11:::1;::::0;39973:13:::1;::::0;39821:60;;-1:-1:-1;39905:13:0;;40003:23;;::::1;39999:204;;40080:9;40066:10;40050:13;;:26;;;;:::i;:::-;40049:40;;;;:::i;:::-;40043:46;;40139:9;40125:10;40111:11;;:24;;;;:::i;:::-;40110:38;;;;:::i;:::-;40104:44:::0;-1:-1:-1;40104:44:0;40169:16:::1;40182:3:::0;40169:10;:16:::1;:::i;:::-;:22;;;;:::i;:::-;40163:28;;39999:204;40217:7:::0;;40213:33:::1;;40226:20;40242:3;40226:15;:20::i;:::-;40275:1;40263:9;40269:3:::0;40263;:9:::1;:::i;:::-;:13;40259:625;;;40293:27;40310:9;40316:3:::0;40310;:9:::1;:::i;:::-;40293:16;:27::i;:::-;40353:21;40335:15;40417:7:::0;;40413:231:::1;;40473:9;40479:3:::0;40473;:9:::1;:::i;:::-;40452:16;40458:10:::0;40452:3;:16:::1;:::i;:::-;40451:32;;;;:::i;:::-;40521:9;::::0;40513:39:::1;::::0;40445:38;;-1:-1:-1;;;;;;40521:9:0::1;::::0;40445:38;;40513:39:::1;::::0;;;40445:38;40521:9;40513:39:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40502:50;;;;;40579:4;40571:13;;;::::0;::::1;;40625:3;40603:18;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40413:231:0::1;40662:7:::0;;40658:215:::1;;40696:16;40709:3:::0;40696:10;:16:::1;:::i;:::-;40750:11;::::0;40742:41:::1;::::0;40690:22;;-1:-1:-1;;;;;;40750:11:0::1;::::0;40690:22;;40742:41:::1;::::0;;;40690:22;40750:11;40742:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40731:52;;;;;40810:4;40802:13;;;::::0;::::1;;40854:3;40834:16;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40658:215:0::1;40278:606;;40259:625;-1:-1:-1::0;;40910:1:0::1;40894:13;:17:::0;;;40922:11:::1;:15:::0;;;40948:13:::1;:17:::0;-1:-1:-1;;32670:8:0;:16;;-1:-1:-1;;32670:16:0;;;-1:-1:-1;39737:1236:0:o;38837:586::-;38925:16;38954;38973:5;:34;;38995:12;;38973:34;;;38981:11;;38973:34;38954:53;-1:-1:-1;32100:3:0;39030:20;39044:6;38954:53;39030:20;:::i;:::-;39029:29;;;;:::i;:::-;39018:40;;39071:21;39095:5;:26;;39113:8;39095:26;;;39103:7;39095:26;39155:7;;39071:50;;-1:-1:-1;39134:17:0;;39177:11;;39155:18;;39165:8;;39155:7;;:18;:::i;:::-;39154:34;;;;:::i;:::-;39215:7;;39134:54;;-1:-1:-1;39199:12:0;;39237:11;;39215:18;;39225:8;;39215:7;;;;;:18;:::i;:::-;39214:34;;;;:::i;:::-;39199:49;-1:-1:-1;39259:11:0;39199:49;39273:23;39284:12;39273:8;:23;:::i;:::-;:33;;;;:::i;:::-;39259:47;;39336:12;39319:13;;:29;;;;;;;:::i;:::-;;;;;;;;39374:7;39359:11;;:22;;;;;;;:::i;:::-;;;;;;;;39409:6;39392:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;38837:586:0;;;-1:-1:-1;;;;;;;;38837:586:0:o;24898:877::-;-1:-1:-1;;;;;25029:18:0;;25021:68;;;;-1:-1:-1;;;25021:68:0;;17565:2:1;25021: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;;25021:68:0;17363:401:1;25021:68:0;-1:-1:-1;;;;;25108:16:0;;25100:64;;;;-1:-1:-1;;;25100:64:0;;17971:2:1;25100: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;;25100:64:0;17769:399:1;25100:64:0;-1:-1:-1;;;;;25250:15:0;;25228:19;25250:15;;;;;;;;;;;25298:21;;;;25276:109;;;;-1:-1:-1;;;25276:109:0;;18375:2:1;25276: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;;25276:109:0;18173:402:1;25276:109:0;-1:-1:-1;;;;;25421:15:0;;;:9;:15;;;;;;;;;;;25439:20;;;25421:38;;25639:13;;;;;;;;;;:23;;;;;;25691:26;;160:25:1;;;25639:13:0;;25691:26;;133:18:1;25691:26:0;;;;;;;25730:37;36973:368;42177:430;42259:16;;;42273:1;42259:16;;;;;;;;42235:21;;42259:16;;;;;;;;;;-1:-1:-1;42259:16:0;42235:40;;42304:4;42286;42291:1;42286:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42286:23:0;;;:7;;;;;;;;;;:23;;;;42330:6;;:13;;;-1:-1:-1;;;42330:13:0;;;;:6;;;;;:11;;:13;;;;;42286:7;;42330:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42320:4;42325:1;42320:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42320:23:0;;;:7;;;;;;;;;:23;42388:6;;42356:48;;42373:4;;42388:6;42397;42356:8;:48::i;:::-;42417:6;;:182;;-1:-1:-1;;;42417:182:0;;-1:-1:-1;;;;;42417:6:0;;;;:57;;:182;;42489:6;;42417;;42526:4;;42553;;42573:15;;42417:182;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42224:383;42177: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://bcd1043d335ddbfb4289d2ff62901b4be35a7b0484da035fe70a8b8fc89a67e4
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.