ETH Price: $3,489.83 (+0.05%)
Gas: 2 Gwei

Token

Member Coin ($MEMBR)
 

Overview

Max Total Supply

1,111,111,111,111 $MEMBR

Holders

176

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
99,517,075.563947058486988848 $MEMBR

Value
$0.00
0x1c6d65c282f7cee61976f6700bfb1a33b36ffeaf
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:
MemberCoin

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-05-21
*/

/* 
                                                                                                                                      
                                                                          bbbbbbbb                                                    
MMMMMMMM               MMMMMMMM                                           b::::::b                                                    
M:::::::M             M:::::::M                                           b::::::b                                                    
M::::::::M           M::::::::M                                           b::::::b                                                    
M:::::::::M         M:::::::::M                                            b:::::b                                                    
M::::::::::M       M::::::::::M    eeeeeeeeeeee       mmmmmmm    mmmmmmm   b:::::bbbbbbbbb        eeeeeeeeeeee    rrrrr   rrrrrrrrr   
M:::::::::::M     M:::::::::::M  ee::::::::::::ee   mm:::::::m  m:::::::mm b::::::::::::::bb    ee::::::::::::ee  r::::rrr:::::::::r  
M:::::::M::::M   M::::M:::::::M e::::::eeeee:::::eem::::::::::mm::::::::::mb::::::::::::::::b  e::::::eeeee:::::eer:::::::::::::::::r 
M::::::M M::::M M::::M M::::::Me::::::e     e:::::em::::::::::::::::::::::mb:::::bbbbb:::::::be::::::e     e:::::err::::::rrrrr::::::r
M::::::M  M::::M::::M  M::::::Me:::::::eeeee::::::em:::::mmm::::::mmm:::::mb:::::b    b::::::be:::::::eeeee::::::e r:::::r     r:::::r
M::::::M   M:::::::M   M::::::Me:::::::::::::::::e m::::m   m::::m   m::::mb:::::b     b:::::be:::::::::::::::::e  r:::::r     rrrrrrr
M::::::M    M:::::M    M::::::Me::::::eeeeeeeeeee  m::::m   m::::m   m::::mb:::::b     b:::::be::::::eeeeeeeeeee   r:::::r            
M::::::M     MMMMM     M::::::Me:::::::e           m::::m   m::::m   m::::mb:::::b     b:::::be:::::::e            r:::::r            
M::::::M               M::::::Me::::::::e          m::::m   m::::m   m::::mb:::::bbbbbb::::::be::::::::e           r:::::r            
M::::::M               M::::::M e::::::::eeeeeeee  m::::m   m::::m   m::::mb::::::::::::::::b  e::::::::eeeeeeee   r:::::r            
M::::::M               M::::::M  ee:::::::::::::e  m::::m   m::::m   m::::mb:::::::::::::::b    ee:::::::::::::e   r:::::r            
MMMMMMMM               MMMMMMMM    eeeeeeeeeeeeee  mmmmmm   mmmmmm   mmmmmmbbbbbbbbbbbbbbbb       eeeeeeeeeeeeee   rrrrrrr            
                                                                                                                                                                                          
 */
 
// SPDX-License-Identifier: MIT


pragma solidity 0.8.19;

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity 0.8.19;

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity 0.8.19;


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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity 0.8.19;

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity 0.8.19;


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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity 0.8.19;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin 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;
        }
        _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;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

    /**
     * @dev 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 {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity 0.8.19;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}



pragma solidity 0.8.19;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

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

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

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


pragma solidity 0.8.19;

contract MemberCoin is ERC20, ERC20Burnable, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    bool private swapping;
    bool public swapEnabled;

    address public uniswapV2Pair;

    address public feeWallet;

    uint256 public MaxSupply = 1111111111111 ether;
    uint256 public sellFee = 100;
    uint256 public buyFee = 65;
    uint256 public feeSplit = 100; 
    uint256 public feeDivisor = 10000;

    uint256 public feesTokensToSwap;
    uint256 public swapTokensAtAmount;

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxTransactionTaxAmount;


    mapping (address => bool) private _isExcludedFromFees;

    mapping (address => bool) public automatedMarketMakerPairs;

    address[] public pairToBuy;
    
    bool public buyFromPair;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event FeesUpdated(uint256 buyFee, uint256 sellFee, bool feeUpdated);
    
    event BuyFeeUpdated(uint256 buyFee_);

    event SellFeeUpdated(uint256 sellFee_);

    event MaxBuyAmountUpdated(uint256 _amount);

    event MaxSellAmountUpdated(uint256 _amount);

    event FeeSwapBack(uint256 tokenAmount);

    event TradingEnabled(bool status);

    event UpdateSwapEnabled(bool status);

    event UpdateSwapTokenAtAmount(uint256 newAmount);

    event RouterVersionUpdated(address router);

    event FeeWalletUpdated(address feeWallet_);

    constructor() ERC20("Member Coin", "$MEMBR") {


        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 
        );
        
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);
        feeWallet = 0x62ada536F0f57C8fC4d987740603E503573c2A87;
        // exclude from paying fees 
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        _transferOwnership(0xe444C6EFc9F34A9E3ade6BDCDCc7aA24D7BC08Cf);
        _mint(owner(), MaxSupply);
        _isExcludedFromFees[owner()] = true;
    }

    receive() external payable {}



    function setFeeWallet(address account_) external onlyOwner {
        feeWallet = account_;
        emit FeeWalletUpdated(feeWallet);
    }

    function setTokenToBuy(address[] memory tokenPair) external onlyOwner {
        require(tokenPair.length == 2, "Invalid Pair");
        pairToBuy = tokenPair;
    }
 
    function setBuyFromPair(bool status) external onlyOwner {
        buyFromPair = status;
    }

    function updateBuyFee(uint256 _buyFee) external onlyOwner {
        buyFee = _buyFee;
        emit BuyFeeUpdated(buyFee);
    }

    function updateSellFee(uint256 _selFee) external onlyOwner {
        sellFee = _selFee;
        emit SellFeeUpdated(sellFee);
    }


    function updateETHSplit(uint256 _split) external onlyOwner {
        feeSplit = _split;
    }


    function updateMaxBuyAmount(uint256 _amount) external onlyOwner {
        maxBuyAmount = _amount;
        emit MaxBuyAmountUpdated(_amount);
    }

    function updateMaxSellAmount(uint256 _amount) external onlyOwner {
        maxSellAmount = _amount;
        emit MaxSellAmountUpdated(_amount);
    }

    function updateMaxTransactionTaxAmount(uint256 _amount) external onlyOwner {
        maxTransactionTaxAmount = _amount;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "The Uniswap pair cannot be removed from automatedMarketMakerPairs");
        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
  	    swapTokensAtAmount = newAmount;
        emit UpdateSwapTokenAtAmount(newAmount);
  	}

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
        emit UpdateSwapEnabled(enabled);
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if(!automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to]) {
            super._transfer(from, to, amount);
            return;
        }

		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            uint256 totalFees;
            //buy
        	if(automatedMarketMakerPairs[from]) {
                if(maxBuyAmount > 0){
                    require(amount <= maxBuyAmount, "Amount Exceed Max Buy Amount per transaction");
                }
        	    if(buyFee > 0){
                    uint256 tax = (amount.mul(buyFee)).div(feeDivisor);
                    if(maxTransactionTaxAmount > 0){
            	        totalFees = tax > maxTransactionTaxAmount ? maxTransactionTaxAmount : tax;        	    
                    } else {
                        totalFees = tax;
                    }
        	    }
            }

            //sell
            if(automatedMarketMakerPairs[to]) {
                if(maxSellAmount > 0){
                    require(amount <= maxSellAmount, "Amount Exceed Max Sell Amount per transaction");
                }
        	    if(sellFee > 0){
                    uint256 tax = (amount.mul(sellFee)).div(feeDivisor);
                    if(maxTransactionTaxAmount > 0){
            	        totalFees = tax > maxTransactionTaxAmount ? maxTransactionTaxAmount : tax;        	    
                    } else {
                        totalFees = tax;
                    }

                }
            }
            
            if(totalFees > 0){
            	amount = amount.sub(totalFees);
                uint256 splitEth = (totalFees.mul(feeSplit)).div(feeDivisor);
                feesTokensToSwap = feesTokensToSwap.add(splitEth);
                if(splitEth > 0){
                    super._transfer(from, address(this), splitEth);
                }
                if((totalFees.sub(splitEth)) > 0){
                    super._transfer(from, address(feeWallet), totalFees.sub(splitEth));
                }
            }

        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

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

        if(pairToBuy.length == 2 && buyFromPair == true){
            // Get the ETH balance
            uint256 ethBalance = address(this).balance;

            // Make the swap from ETH to token 0
            uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethBalance}(
                0, // Accept any amount of token 0
                pairToBuy,
                address(this),
                block.timestamp
            );
            uint256 tokenBalance0 = IERC20(pairToBuy[0]).balanceOf(address(this));
            if(tokenBalance0 > 0) {
                IERC20(pairToBuy[0]).transfer(feeWallet, tokenBalance0);
            }
            uint256 tokenBalance1 = IERC20(pairToBuy[1]).balanceOf(address(this));
            if(tokenBalance1 > 0) {
                IERC20(pairToBuy[1]).transfer(feeWallet, tokenBalance1);
            }
        }
        
    }

    function setRouterVersion(address _router) external onlyOwner {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_router);

        uniswapV2Router = _uniswapV2Router;

        emit RouterVersionUpdated(_router);
    }

    function swapBack() private {
        uint256 totalTokensToSwap = feesTokensToSwap;
    
        swapTokensForEth(totalTokensToSwap); 
        
        uint256 ethBalance = address(this).balance;

        feesTokensToSwap = 0;
        
        if(ethBalance > 0) {
            (bool success,) = address(feeWallet).call{value: ethBalance}("");
        
            require(success, "Failed to transfer to Fee Wallet");
        }
        emit FeeSwapBack(totalTokensToSwap);
    }

    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyFee_","type":"uint256"}],"name":"BuyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"FeeSwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeWallet_","type":"address"}],"name":"FeeWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"feeUpdated","type":"bool"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MaxBuyAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MaxSellAmountUpdated","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":"address","name":"router","type":"address"}],"name":"RouterVersionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellFee_","type":"uint256"}],"name":"SellFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateSwapEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdateSwapTokenAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"MaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFromPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeSplit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionTaxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairToBuy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setBuyFromPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouterVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenPair","type":"address[]"}],"name":"setTokenToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_split","type":"uint256"}],"name":"updateETHSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxTransactionTaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_selFee","type":"uint256"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526c0e063191caf768f40cc2bc00006009556064600a556041600b556064600c55612710600d553480156200003757600080fd5b506040518060400160405280600b81526020016a26b2b6b132b91021b7b4b760a91b815250604051806040016040528060068152602001651226a2a6a12960d11b81525081600390816200008c91906200062d565b5060046200009b82826200062d565b505050620000b8620000b26200032a60201b60201c565b6200032e565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000112573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001389190620006f9565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000186573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ac9190620006f9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620001fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002209190620006f9565b600680546001600160a01b038086166001600160a01b031992831617909255600780549284169290911691909117905590506200025f81600162000380565b600880546001600160a01b0319167362ada536f0f57c8fc4d987740603e503573c2a8717905562000292306001620003d4565b620002a161dead6001620003d4565b620002c073e444c6efc9f34a9e3ade6bdcdcc7aa24d7bc08cf6200032e565b620002e0620002d76005546001600160a01b031690565b6009546200043d565b600160136000620002f96005546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905550620007539050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620003de62000526565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620004995760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620004ad91906200072b565b90915550506001600160a01b03821660009081526020819052604081208054839290620004dc9084906200072b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620005825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000490565b565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005b457607f821691505b602082108103620005d557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200058457600081815260208120601f850160051c81016020861015620006045750805b601f850160051c820191505b81811015620006255782815560010162000610565b505050505050565b81516001600160401b0381111562000649576200064962000589565b62000661816200065a84546200059f565b84620005db565b602080601f831160018114620006995760008415620006805750858301515b600019600386901b1c1916600185901b17855562000625565b600085815260208120601f198616915b82811015620006ca57888601518255948401946001909101908401620006a9565b5085821015620006e95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200070c57600080fd5b81516001600160a01b03811681146200072457600080fd5b9392505050565b808201808211156200074d57634e487b7160e01b600052601160045260246000fd5b92915050565b61241580620007636000396000f3fe6080604052600436106102b25760003560e01c806370a0823111610175578063a9059cbb116100dc578063d653a0e911610095578063e2f456051161006f578063e2f4560514610856578063f25f4b561461086c578063f2fde38b1461088c578063f5648a4f146108ac57600080fd5b8063d653a0e9146107f6578063dc3f0d0f14610816578063dd62ed3e1461083657600080fd5b8063a9059cbb14610730578063b36c128414610750578063b62496f514610766578063c024666814610796578063c8871d3a146107b6578063d257b34f146107d657600080fd5b806390d49b9d1161012e57806390d49b9d14610685578063924de9b7146106a557806395d89b41146106c55780639a36f932146106da5780639a7a23d6146106f0578063a457c2d71461071057600080fd5b806370a08231146105cc578063715018a61461060257806379cc67901461061757806381f96f121461063757806388e765ff146106515780638da5cb5b1461066757600080fd5b8063404b4feb116102195780635a712184116101d25780635a712184146105295780636373ea691461054957806366d602ae1461055f57806369c33f0b146105755780636ddd17131461058b57806370658cd9146105ac57600080fd5b8063404b4feb1461046457806342966c681461047a578063467abe0a1461049a57806347062402146104ba57806349bd5a5e146104d05780634fbee193146104f057600080fd5b806323b872dd1161026b57806323b872dd146103b25780632b14ca56146103d25780632be32b61146103e85780632f7ab3c414610408578063313ce56714610428578063395093511461044457600080fd5b806306fdde03146102be578063095ea7b3146102e95780630ef32bd7146103195780631694505e1461033b57806318160ddd146103735780631d933a4a1461039257600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506102d36108c1565b6040516102e09190611edc565b60405180910390f35b3480156102f557600080fd5b50610309610304366004611f4f565b610953565b60405190151581526020016102e0565b34801561032557600080fd5b50610339610334366004611f7b565b61096d565b005b34801561034757600080fd5b5060065461035b906001600160a01b031681565b6040516001600160a01b0390911681526020016102e0565b34801561037f57600080fd5b506002545b6040519081526020016102e0565b34801561039e57600080fd5b506103396103ad366004611f98565b6109cd565b3480156103be57600080fd5b506103096103cd366004611fb1565b610a11565b3480156103de57600080fd5b50610384600a5481565b3480156103f457600080fd5b50610339610403366004611f98565b610a35565b34801561041457600080fd5b50610339610423366004612008565b610a72565b34801561043457600080fd5b50604051601281526020016102e0565b34801561045057600080fd5b5061030961045f366004611f4f565b610ad6565b34801561047057600080fd5b50610384600e5481565b34801561048657600080fd5b50610339610495366004611f98565b610af8565b3480156104a657600080fd5b506103396104b5366004611f98565b610b05565b3480156104c657600080fd5b50610384600b5481565b3480156104dc57600080fd5b5060075461035b906001600160a01b031681565b3480156104fc57600080fd5b5061030961050b366004611f7b565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561053557600080fd5b5061035b610544366004611f98565b610b42565b34801561055557600080fd5b50610384600c5481565b34801561056b57600080fd5b5061038460115481565b34801561058157600080fd5b5061038460125481565b34801561059757600080fd5b5060065461030990600160a81b900460ff1681565b3480156105b857600080fd5b506103396105c7366004611f98565b610b6c565b3480156105d857600080fd5b506103846105e7366004611f7b565b6001600160a01b031660009081526020819052604090205490565b34801561060e57600080fd5b50610339610b79565b34801561062357600080fd5b50610339610632366004611f4f565b610b8d565b34801561064357600080fd5b506016546103099060ff1681565b34801561065d57600080fd5b5061038460105481565b34801561067357600080fd5b506005546001600160a01b031661035b565b34801561069157600080fd5b506103396106a0366004611f7b565b610ba2565b3480156106b157600080fd5b506103396106c03660046120db565b610bf8565b3480156106d157600080fd5b506102d3610c4d565b3480156106e657600080fd5b50610384600d5481565b3480156106fc57600080fd5b5061033961070b3660046120f8565b610c5c565b34801561071c57600080fd5b5061030961072b366004611f4f565b610cfc565b34801561073c57600080fd5b5061030961074b366004611f4f565b610d77565b34801561075c57600080fd5b5061038460095481565b34801561077257600080fd5b50610309610781366004611f7b565b60146020526000908152604090205460ff1681565b3480156107a257600080fd5b506103396107b13660046120f8565b610d85565b3480156107c257600080fd5b506103396107d13660046120db565b610dec565b3480156107e257600080fd5b506103396107f1366004611f98565b610e07565b34801561080257600080fd5b50610339610811366004611f98565b610e44565b34801561082257600080fd5b50610339610831366004611f98565b610e51565b34801561084257600080fd5b50610384610851366004612131565b610e8e565b34801561086257600080fd5b50610384600f5481565b34801561087857600080fd5b5060085461035b906001600160a01b031681565b34801561089857600080fd5b506103396108a7366004611f7b565b610eb9565b3480156108b857600080fd5b50610339610f2f565b6060600380546108d09061215f565b80601f01602080910402602001604051908101604052809291908181526020018280546108fc9061215f565b80156109495780601f1061091e57610100808354040283529160200191610949565b820191906000526020600020905b81548152906001019060200180831161092c57829003601f168201915b5050505050905090565b600033610961818585610f84565b60019150505b92915050565b6109756110a8565b600680546001600160a01b0319166001600160a01b03831690811790915560405190815281907f73a9b86ca2f789b8c0b8777f15703ef9f2f328e298461680f95bf4163afabaa0906020015b60405180910390a15050565b6109d56110a8565b600a8190556040518181527f495ee53ee22006979ebc689a00ed737d7c13b6419142f82dcaea4ed95ac1e780906020015b60405180910390a150565b600033610a1f858285611102565b610a2a858585611176565b506001949350505050565b610a3d6110a8565b60108190556040518181527fd0459d371e1defb856088ceda9d33bfed2a31a105e0bae2113cdc7dcc9e77e9d90602001610a06565b610a7a6110a8565b8051600214610abf5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b60448201526064015b60405180910390fd5b8051610ad2906015906020840190611e62565b5050565b600033610961818585610ae98383610e8e565b610af391906121af565b610f84565b610b0233826115ba565b50565b610b0d6110a8565b600b8190556040518181527f7c1445c98b278c9970d007fca6048704bcb25af7cc4a04eb56565d9a9f149ca390602001610a06565b60158181548110610b5257600080fd5b6000918252602090912001546001600160a01b0316905081565b610b746110a8565b600c55565b610b816110a8565b610b8b6000611708565b565b610b98823383611102565b610ad282826115ba565b610baa6110a8565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f29acee77dafcfa0143d74a7ea236018f3a6e1fa71e27fc59bbfbc6b8ca8edccd90602001610a06565b610c006110a8565b60068054821515600160a81b0260ff60a81b199091161790556040517f92e251bc0632b9bdc264274968dfed5bbf41d3b173982b313417f1fd9c08a80890610a0690831515815260200190565b6060600480546108d09061215f565b610c646110a8565b6007546001600160a01b0390811690831603610cf25760405162461bcd60e51b815260206004820152604160248201527f54686520556e697377617020706169722063616e6e6f742062652072656d6f7660448201527f65642066726f6d206175746f6d617465644d61726b65744d616b6572506169726064820152607360f81b608482015260a401610ab6565b610ad2828261175a565b60003381610d0a8286610e8e565b905083811015610d6a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ab6565b610a2a8286868403610f84565b600033610961818585611176565b610d8d6110a8565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610df46110a8565b6016805460ff1916911515919091179055565b610e0f6110a8565b600f8190556040518181527ffbe9906c5baedbf54b9d31277d959cb23a3b4993ab65d0140b704df45ba9325f90602001610a06565b610e4c6110a8565b601255565b610e596110a8565b60118190556040518181527fa0dff8a4e8bcaa27b5a2b64bc312f8b338e362bd6cad89f5fe2ae6b8389fb38a90602001610a06565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ec16110a8565b6001600160a01b038116610f265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab6565b610b0281611708565b610f376110a8565b604051600090339047908381818185875af1925050503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b50505050565b6001600160a01b038316610fe65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab6565b6001600160a01b0382166110475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ab6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610b8b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ab6565b600061110e8484610e8e565b90506000198114610f7e57818110156111695760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ab6565b610f7e8484848403610f84565b6001600160a01b03831661119c5760405162461bcd60e51b8152600401610ab6906121c2565b6001600160a01b0382166111c25760405162461bcd60e51b8152600401610ab690612207565b6001600160a01b03831660009081526014602052604090205460ff1615801561120457506001600160a01b03821660009081526014602052604090205460ff16155b15611219576112148383836117ae565b505050565b30600090815260208190526040902054600f54811080159081906112465750600654600160a81b900460ff165b801561125c5750600654600160a01b900460ff16155b801561128157506001600160a01b03851660009081526014602052604090205460ff16155b80156112a657506001600160a01b03851660009081526013602052604090205460ff16155b80156112cb57506001600160a01b03841660009081526013602052604090205460ff16155b156112f9576006805460ff60a01b1916600160a01b1790556112eb611902565b6006805460ff60a01b191690555b6006546001600160a01b03861660009081526013602052604090205460ff600160a01b90920482161591168061134757506001600160a01b03851660009081526013602052604090205460ff165b15611350575060005b80156115a7576001600160a01b03861660009081526014602052604081205460ff161561143c57601054156113e6576010548511156113e65760405162461bcd60e51b815260206004820152602c60248201527f416d6f756e7420457863656564204d61782042757920416d6f756e742070657260448201526b103a3930b739b0b1ba34b7b760a11b6064820152608401610ab6565b600b541561143c576000611411600d5461140b600b54896119ef90919063ffffffff16565b90611a02565b6012549091501561143657601254811161142b578061142f565b6012545b915061143a565b8091505b505b6001600160a01b03861660009081526014602052604090205460ff161561151d57601154156114cd576011548511156114cd5760405162461bcd60e51b815260206004820152602d60248201527f416d6f756e7420457863656564204d61782053656c6c20416d6f756e7420706560448201526c39103a3930b739b0b1ba34b7b760991b6064820152608401610ab6565b600a541561151d5760006114f2600d5461140b600a54896119ef90919063ffffffff16565b6012549091501561151757601254811161150c5780611510565b6012545b915061151b565b8091505b505b80156115a55761152d8582611a0e565b9450600061154c600d5461140b600c54856119ef90919063ffffffff16565b600e5490915061155c9082611a1a565b600e558015611570576115708830836117ae565b600061157c8383611a0e565b11156115a3576008546115a39089906001600160a01b031661159e8585611a0e565b6117ae565b505b505b6115b28686866117ae565b505050505050565b6001600160a01b03821661161a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ab6565b6001600160a01b0382166000908152602081905260409020548181101561168e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ab6565b6001600160a01b03831660009081526020819052604081208383039055600280548492906116bd90849061224a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166117d45760405162461bcd60e51b8152600401610ab6906121c2565b6001600160a01b0382166117fa5760405162461bcd60e51b8152600401610ab690612207565b6001600160a01b038316600090815260208190526040902054818110156118725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ab6565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906118a99084906121af565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118f591815260200190565b60405180910390a3610f7e565b600e5461190e81611a26565b6000600e554780156119bf576008546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611967576040519150601f19603f3d011682016040523d82523d6000602084013e61196c565b606091505b50509050806119bd5760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f207472616e7366657220746f204665652057616c6c65746044820152606401610ab6565b505b6040518281527fbb947fe34782bf4ae8c1ead005197bb94ee61ed27a89f8ae7bfa11ac3f93c2c3906020016109c1565b60006119fb828461225d565b9392505050565b60006119fb8284612274565b60006119fb828461224a565b60006119fb82846121af565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611a5b57611a5b612296565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad891906122ac565b81600181518110611aeb57611aeb612296565b6001600160a01b039283166020918202929092010152600654611b119130911684610f84565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611b4a9085906000908690309042906004016122c9565b600060405180830381600087803b158015611b6457600080fd5b505af1158015611b78573d6000803e3d6000fd5b50506015546002149150508015611b96575060165460ff1615156001145b15610ad25760065460405163b6f9de9560e01b815247916001600160a01b03169063b6f9de95908390611bd5906000906015903090429060040161233a565b6000604051808303818588803b158015611bee57600080fd5b505af1158015611c02573d6000803e3d6000fd5b505050505060006015600081548110611c1d57611c1d612296565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9291906123a9565b90508015611d32576015600081548110611cae57611cae612296565b60009182526020909120015460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af1158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3091906123c2565b505b60006015600181548110611d4857611d48612296565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbd91906123a9565b90508015611e5b576015600181548110611dd957611dd9612296565b60009182526020909120015460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af1158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b291906123c2565b5050505050565b828054828255906000526020600020908101928215611eb7579160200282015b82811115611eb757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611e82565b50611ec3929150611ec7565b5090565b5b80821115611ec35760008155600101611ec8565b600060208083528351808285015260005b81811015611f0957858101830151858201604001528201611eed565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b0257600080fd5b8035611f4a81611f2a565b919050565b60008060408385031215611f6257600080fd5b8235611f6d81611f2a565b946020939093013593505050565b600060208284031215611f8d57600080fd5b81356119fb81611f2a565b600060208284031215611faa57600080fd5b5035919050565b600080600060608486031215611fc657600080fd5b8335611fd181611f2a565b92506020840135611fe181611f2a565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561201b57600080fd5b823567ffffffffffffffff8082111561203357600080fd5b818501915085601f83011261204757600080fd5b81358181111561205957612059611ff2565b8060051b604051601f19603f8301168101818110858211171561207e5761207e611ff2565b60405291825284820192508381018501918883111561209c57600080fd5b938501935b828510156120c1576120b285611f3f565b845293850193928501926120a1565b98975050505050505050565b8015158114610b0257600080fd5b6000602082840312156120ed57600080fd5b81356119fb816120cd565b6000806040838503121561210b57600080fd5b823561211681611f2a565b91506020830135612126816120cd565b809150509250929050565b6000806040838503121561214457600080fd5b823561214f81611f2a565b9150602083013561212681611f2a565b600181811c9082168061217357607f821691505b60208210810361219357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561096757610967612199565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561096757610967612199565b808202811582820484141761096757610967612199565b60008261229157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156122be57600080fd5b81516119fb81611f2a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123195784516001600160a01b0316835293830193918301916001016122f4565b50506001600160a01b03969096166060850152505050608001529392505050565b600060808201868352602060808185015281875480845260a0860191508860005282600020935060005b818110156123895784546001600160a01b031683526001948501949284019201612364565b50506001600160a01b039690961660408501525050506060015292915050565b6000602082840312156123bb57600080fd5b5051919050565b6000602082840312156123d457600080fd5b81516119fb816120cd56fea2646970667358221220620d8c382fc6c2dd79a94dbd37aa5e22af9abcc30b9aae44e03d75d637324c3064736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806370a0823111610175578063a9059cbb116100dc578063d653a0e911610095578063e2f456051161006f578063e2f4560514610856578063f25f4b561461086c578063f2fde38b1461088c578063f5648a4f146108ac57600080fd5b8063d653a0e9146107f6578063dc3f0d0f14610816578063dd62ed3e1461083657600080fd5b8063a9059cbb14610730578063b36c128414610750578063b62496f514610766578063c024666814610796578063c8871d3a146107b6578063d257b34f146107d657600080fd5b806390d49b9d1161012e57806390d49b9d14610685578063924de9b7146106a557806395d89b41146106c55780639a36f932146106da5780639a7a23d6146106f0578063a457c2d71461071057600080fd5b806370a08231146105cc578063715018a61461060257806379cc67901461061757806381f96f121461063757806388e765ff146106515780638da5cb5b1461066757600080fd5b8063404b4feb116102195780635a712184116101d25780635a712184146105295780636373ea691461054957806366d602ae1461055f57806369c33f0b146105755780636ddd17131461058b57806370658cd9146105ac57600080fd5b8063404b4feb1461046457806342966c681461047a578063467abe0a1461049a57806347062402146104ba57806349bd5a5e146104d05780634fbee193146104f057600080fd5b806323b872dd1161026b57806323b872dd146103b25780632b14ca56146103d25780632be32b61146103e85780632f7ab3c414610408578063313ce56714610428578063395093511461044457600080fd5b806306fdde03146102be578063095ea7b3146102e95780630ef32bd7146103195780631694505e1461033b57806318160ddd146103735780631d933a4a1461039257600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506102d36108c1565b6040516102e09190611edc565b60405180910390f35b3480156102f557600080fd5b50610309610304366004611f4f565b610953565b60405190151581526020016102e0565b34801561032557600080fd5b50610339610334366004611f7b565b61096d565b005b34801561034757600080fd5b5060065461035b906001600160a01b031681565b6040516001600160a01b0390911681526020016102e0565b34801561037f57600080fd5b506002545b6040519081526020016102e0565b34801561039e57600080fd5b506103396103ad366004611f98565b6109cd565b3480156103be57600080fd5b506103096103cd366004611fb1565b610a11565b3480156103de57600080fd5b50610384600a5481565b3480156103f457600080fd5b50610339610403366004611f98565b610a35565b34801561041457600080fd5b50610339610423366004612008565b610a72565b34801561043457600080fd5b50604051601281526020016102e0565b34801561045057600080fd5b5061030961045f366004611f4f565b610ad6565b34801561047057600080fd5b50610384600e5481565b34801561048657600080fd5b50610339610495366004611f98565b610af8565b3480156104a657600080fd5b506103396104b5366004611f98565b610b05565b3480156104c657600080fd5b50610384600b5481565b3480156104dc57600080fd5b5060075461035b906001600160a01b031681565b3480156104fc57600080fd5b5061030961050b366004611f7b565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561053557600080fd5b5061035b610544366004611f98565b610b42565b34801561055557600080fd5b50610384600c5481565b34801561056b57600080fd5b5061038460115481565b34801561058157600080fd5b5061038460125481565b34801561059757600080fd5b5060065461030990600160a81b900460ff1681565b3480156105b857600080fd5b506103396105c7366004611f98565b610b6c565b3480156105d857600080fd5b506103846105e7366004611f7b565b6001600160a01b031660009081526020819052604090205490565b34801561060e57600080fd5b50610339610b79565b34801561062357600080fd5b50610339610632366004611f4f565b610b8d565b34801561064357600080fd5b506016546103099060ff1681565b34801561065d57600080fd5b5061038460105481565b34801561067357600080fd5b506005546001600160a01b031661035b565b34801561069157600080fd5b506103396106a0366004611f7b565b610ba2565b3480156106b157600080fd5b506103396106c03660046120db565b610bf8565b3480156106d157600080fd5b506102d3610c4d565b3480156106e657600080fd5b50610384600d5481565b3480156106fc57600080fd5b5061033961070b3660046120f8565b610c5c565b34801561071c57600080fd5b5061030961072b366004611f4f565b610cfc565b34801561073c57600080fd5b5061030961074b366004611f4f565b610d77565b34801561075c57600080fd5b5061038460095481565b34801561077257600080fd5b50610309610781366004611f7b565b60146020526000908152604090205460ff1681565b3480156107a257600080fd5b506103396107b13660046120f8565b610d85565b3480156107c257600080fd5b506103396107d13660046120db565b610dec565b3480156107e257600080fd5b506103396107f1366004611f98565b610e07565b34801561080257600080fd5b50610339610811366004611f98565b610e44565b34801561082257600080fd5b50610339610831366004611f98565b610e51565b34801561084257600080fd5b50610384610851366004612131565b610e8e565b34801561086257600080fd5b50610384600f5481565b34801561087857600080fd5b5060085461035b906001600160a01b031681565b34801561089857600080fd5b506103396108a7366004611f7b565b610eb9565b3480156108b857600080fd5b50610339610f2f565b6060600380546108d09061215f565b80601f01602080910402602001604051908101604052809291908181526020018280546108fc9061215f565b80156109495780601f1061091e57610100808354040283529160200191610949565b820191906000526020600020905b81548152906001019060200180831161092c57829003601f168201915b5050505050905090565b600033610961818585610f84565b60019150505b92915050565b6109756110a8565b600680546001600160a01b0319166001600160a01b03831690811790915560405190815281907f73a9b86ca2f789b8c0b8777f15703ef9f2f328e298461680f95bf4163afabaa0906020015b60405180910390a15050565b6109d56110a8565b600a8190556040518181527f495ee53ee22006979ebc689a00ed737d7c13b6419142f82dcaea4ed95ac1e780906020015b60405180910390a150565b600033610a1f858285611102565b610a2a858585611176565b506001949350505050565b610a3d6110a8565b60108190556040518181527fd0459d371e1defb856088ceda9d33bfed2a31a105e0bae2113cdc7dcc9e77e9d90602001610a06565b610a7a6110a8565b8051600214610abf5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102830b4b960a11b60448201526064015b60405180910390fd5b8051610ad2906015906020840190611e62565b5050565b600033610961818585610ae98383610e8e565b610af391906121af565b610f84565b610b0233826115ba565b50565b610b0d6110a8565b600b8190556040518181527f7c1445c98b278c9970d007fca6048704bcb25af7cc4a04eb56565d9a9f149ca390602001610a06565b60158181548110610b5257600080fd5b6000918252602090912001546001600160a01b0316905081565b610b746110a8565b600c55565b610b816110a8565b610b8b6000611708565b565b610b98823383611102565b610ad282826115ba565b610baa6110a8565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f29acee77dafcfa0143d74a7ea236018f3a6e1fa71e27fc59bbfbc6b8ca8edccd90602001610a06565b610c006110a8565b60068054821515600160a81b0260ff60a81b199091161790556040517f92e251bc0632b9bdc264274968dfed5bbf41d3b173982b313417f1fd9c08a80890610a0690831515815260200190565b6060600480546108d09061215f565b610c646110a8565b6007546001600160a01b0390811690831603610cf25760405162461bcd60e51b815260206004820152604160248201527f54686520556e697377617020706169722063616e6e6f742062652072656d6f7660448201527f65642066726f6d206175746f6d617465644d61726b65744d616b6572506169726064820152607360f81b608482015260a401610ab6565b610ad2828261175a565b60003381610d0a8286610e8e565b905083811015610d6a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ab6565b610a2a8286868403610f84565b600033610961818585611176565b610d8d6110a8565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610df46110a8565b6016805460ff1916911515919091179055565b610e0f6110a8565b600f8190556040518181527ffbe9906c5baedbf54b9d31277d959cb23a3b4993ab65d0140b704df45ba9325f90602001610a06565b610e4c6110a8565b601255565b610e596110a8565b60118190556040518181527fa0dff8a4e8bcaa27b5a2b64bc312f8b338e362bd6cad89f5fe2ae6b8389fb38a90602001610a06565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ec16110a8565b6001600160a01b038116610f265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab6565b610b0281611708565b610f376110a8565b604051600090339047908381818185875af1925050503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b50505050565b6001600160a01b038316610fe65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab6565b6001600160a01b0382166110475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ab6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610b8b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ab6565b600061110e8484610e8e565b90506000198114610f7e57818110156111695760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ab6565b610f7e8484848403610f84565b6001600160a01b03831661119c5760405162461bcd60e51b8152600401610ab6906121c2565b6001600160a01b0382166111c25760405162461bcd60e51b8152600401610ab690612207565b6001600160a01b03831660009081526014602052604090205460ff1615801561120457506001600160a01b03821660009081526014602052604090205460ff16155b15611219576112148383836117ae565b505050565b30600090815260208190526040902054600f54811080159081906112465750600654600160a81b900460ff165b801561125c5750600654600160a01b900460ff16155b801561128157506001600160a01b03851660009081526014602052604090205460ff16155b80156112a657506001600160a01b03851660009081526013602052604090205460ff16155b80156112cb57506001600160a01b03841660009081526013602052604090205460ff16155b156112f9576006805460ff60a01b1916600160a01b1790556112eb611902565b6006805460ff60a01b191690555b6006546001600160a01b03861660009081526013602052604090205460ff600160a01b90920482161591168061134757506001600160a01b03851660009081526013602052604090205460ff165b15611350575060005b80156115a7576001600160a01b03861660009081526014602052604081205460ff161561143c57601054156113e6576010548511156113e65760405162461bcd60e51b815260206004820152602c60248201527f416d6f756e7420457863656564204d61782042757920416d6f756e742070657260448201526b103a3930b739b0b1ba34b7b760a11b6064820152608401610ab6565b600b541561143c576000611411600d5461140b600b54896119ef90919063ffffffff16565b90611a02565b6012549091501561143657601254811161142b578061142f565b6012545b915061143a565b8091505b505b6001600160a01b03861660009081526014602052604090205460ff161561151d57601154156114cd576011548511156114cd5760405162461bcd60e51b815260206004820152602d60248201527f416d6f756e7420457863656564204d61782053656c6c20416d6f756e7420706560448201526c39103a3930b739b0b1ba34b7b760991b6064820152608401610ab6565b600a541561151d5760006114f2600d5461140b600a54896119ef90919063ffffffff16565b6012549091501561151757601254811161150c5780611510565b6012545b915061151b565b8091505b505b80156115a55761152d8582611a0e565b9450600061154c600d5461140b600c54856119ef90919063ffffffff16565b600e5490915061155c9082611a1a565b600e558015611570576115708830836117ae565b600061157c8383611a0e565b11156115a3576008546115a39089906001600160a01b031661159e8585611a0e565b6117ae565b505b505b6115b28686866117ae565b505050505050565b6001600160a01b03821661161a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ab6565b6001600160a01b0382166000908152602081905260409020548181101561168e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ab6565b6001600160a01b03831660009081526020819052604081208383039055600280548492906116bd90849061224a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260146020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166117d45760405162461bcd60e51b8152600401610ab6906121c2565b6001600160a01b0382166117fa5760405162461bcd60e51b8152600401610ab690612207565b6001600160a01b038316600090815260208190526040902054818110156118725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ab6565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906118a99084906121af565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118f591815260200190565b60405180910390a3610f7e565b600e5461190e81611a26565b6000600e554780156119bf576008546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611967576040519150601f19603f3d011682016040523d82523d6000602084013e61196c565b606091505b50509050806119bd5760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f207472616e7366657220746f204665652057616c6c65746044820152606401610ab6565b505b6040518281527fbb947fe34782bf4ae8c1ead005197bb94ee61ed27a89f8ae7bfa11ac3f93c2c3906020016109c1565b60006119fb828461225d565b9392505050565b60006119fb8284612274565b60006119fb828461224a565b60006119fb82846121af565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611a5b57611a5b612296565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad891906122ac565b81600181518110611aeb57611aeb612296565b6001600160a01b039283166020918202929092010152600654611b119130911684610f84565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611b4a9085906000908690309042906004016122c9565b600060405180830381600087803b158015611b6457600080fd5b505af1158015611b78573d6000803e3d6000fd5b50506015546002149150508015611b96575060165460ff1615156001145b15610ad25760065460405163b6f9de9560e01b815247916001600160a01b03169063b6f9de95908390611bd5906000906015903090429060040161233a565b6000604051808303818588803b158015611bee57600080fd5b505af1158015611c02573d6000803e3d6000fd5b505050505060006015600081548110611c1d57611c1d612296565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9291906123a9565b90508015611d32576015600081548110611cae57611cae612296565b60009182526020909120015460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af1158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3091906123c2565b505b60006015600181548110611d4857611d48612296565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbd91906123a9565b90508015611e5b576015600181548110611dd957611dd9612296565b60009182526020909120015460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af1158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b291906123c2565b5050505050565b828054828255906000526020600020908101928215611eb7579160200282015b82811115611eb757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611e82565b50611ec3929150611ec7565b5090565b5b80821115611ec35760008155600101611ec8565b600060208083528351808285015260005b81811015611f0957858101830151858201604001528201611eed565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b0257600080fd5b8035611f4a81611f2a565b919050565b60008060408385031215611f6257600080fd5b8235611f6d81611f2a565b946020939093013593505050565b600060208284031215611f8d57600080fd5b81356119fb81611f2a565b600060208284031215611faa57600080fd5b5035919050565b600080600060608486031215611fc657600080fd5b8335611fd181611f2a565b92506020840135611fe181611f2a565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561201b57600080fd5b823567ffffffffffffffff8082111561203357600080fd5b818501915085601f83011261204757600080fd5b81358181111561205957612059611ff2565b8060051b604051601f19603f8301168101818110858211171561207e5761207e611ff2565b60405291825284820192508381018501918883111561209c57600080fd5b938501935b828510156120c1576120b285611f3f565b845293850193928501926120a1565b98975050505050505050565b8015158114610b0257600080fd5b6000602082840312156120ed57600080fd5b81356119fb816120cd565b6000806040838503121561210b57600080fd5b823561211681611f2a565b91506020830135612126816120cd565b809150509250929050565b6000806040838503121561214457600080fd5b823561214f81611f2a565b9150602083013561212681611f2a565b600181811c9082168061217357607f821691505b60208210810361219357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561096757610967612199565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561096757610967612199565b808202811582820484141761096757610967612199565b60008261229157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156122be57600080fd5b81516119fb81611f2a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123195784516001600160a01b0316835293830193918301916001016122f4565b50506001600160a01b03969096166060850152505050608001529392505050565b600060808201868352602060808185015281875480845260a0860191508860005282600020935060005b818110156123895784546001600160a01b031683526001948501949284019201612364565b50506001600160a01b039690961660408501525050506060015292915050565b6000602082840312156123bb57600080fd5b5051919050565b6000602082840312156123d457600080fd5b81516119fb816120cd56fea2646970667358221220620d8c382fc6c2dd79a94dbd37aa5e22af9abcc30b9aae44e03d75d637324c3064736f6c63430008130033

Deployed Bytecode Sourcemap

36307:10688:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18784:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21135:201;;;;;;;;;;-1:-1:-1;21135:201:0;;;;;:::i;:::-;;:::i;:::-;;;1327:14:1;;1320:22;1302:41;;1290:2;1275:18;21135:201:0;1162:187:1;46081:240:0;;;;;;;;;;-1:-1:-1;46081:240:0;;;;;:::i;:::-;;:::i;:::-;;36402:41;;;;;;;;;;-1:-1:-1;36402:41:0;;;;-1:-1:-1;;;;;36402:41:0;;;;;;-1:-1:-1;;;;;1797:32:1;;;1779:51;;1767:2;1752:18;36402:41:0;1606:230:1;19904:108:0;;;;;;;;;;-1:-1:-1;19992:12:0;;19904:108;;;1987:25:1;;;1975:2;1960:18;19904:108:0;1841:177:1;39475:134:0;;;;;;;;;;-1:-1:-1;39475:134:0;;;;;:::i;:::-;;:::i;21916:295::-;;;;;;;;;;-1:-1:-1;21916:295:0;;;;;:::i;:::-;;:::i;36635:28::-;;;;;;;;;;;;;;;;39724:149;;;;;;;;;;-1:-1:-1;39724:149:0;;;;;:::i;:::-;;:::i;39058:167::-;;;;;;;;;;-1:-1:-1;39058:167:0;;;;;:::i;:::-;;:::i;19746:93::-;;;;;;;;;;-1:-1:-1;19746:93:0;;19829:2;4069:36:1;;4057:2;4042:18;19746:93:0;3927:184:1;22620:238:0;;;;;;;;;;-1:-1:-1;22620:238:0;;;;;:::i;:::-;;:::i;36782:31::-;;;;;;;;;;;;;;;;30153:91;;;;;;;;;;-1:-1:-1;30153:91:0;;;;;:::i;:::-;;:::i;39337:130::-;;;;;;;;;;-1:-1:-1;39337:130:0;;;;;:::i;:::-;;:::i;36670:26::-;;;;;;;;;;;;;;;;36512:28;;;;;;;;;;-1:-1:-1;36512:28:0;;;;-1:-1:-1;;;;;36512:28:0;;;41299:125;;;;;;;;;;-1:-1:-1;41299:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;41388:28:0;41364:4;41388:28;;;:19;:28;;;;;;;;;41299:125;37109:26;;;;;;;;;;-1:-1:-1;37109:26:0;;;;;:::i;:::-;;:::i;36703:29::-;;;;;;;;;;;;;;;;36896:28;;;;;;;;;;;;;;;;36931:38;;;;;;;;;;;;;;;;36480:23;;;;;;;;;;-1:-1:-1;36480:23:0;;;;-1:-1:-1;;;36480:23:0;;;;;;39619:95;;;;;;;;;;-1:-1:-1;39619:95:0;;;;;:::i;:::-;;:::i;20075:127::-;;;;;;;;;;-1:-1:-1;20075:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;20176:18:0;20149:7;20176:18;;;;;;;;;;;;20075:127;12207:103;;;;;;;;;;;;;:::i;30563:164::-;;;;;;;;;;-1:-1:-1;30563:164:0;;;;;:::i;:::-;;:::i;37148:23::-;;;;;;;;;;-1:-1:-1;37148:23:0;;;;;;;;36862:27;;;;;;;;;;;;;;;;11559:87;;;;;;;;;;-1:-1:-1;11632:6:0;;-1:-1:-1;;;;;11632:6:0;11559:87;;38909:141;;;;;;;;;;-1:-1:-1;38909:141:0;;;;;:::i;:::-;;:::i;41148:143::-;;;;;;;;;;-1:-1:-1;41148:143:0;;;;;:::i;:::-;;:::i;19003:104::-;;;;;;;;;;;;;:::i;36740:33::-;;;;;;;;;;;;;;;;40176:252;;;;;;;;;;-1:-1:-1;40176:252:0;;;;;:::i;:::-;;:::i;23361:436::-;;;;;;;;;;-1:-1:-1;23361:436:0;;;;;:::i;:::-;;:::i;20408:193::-;;;;;;;;;;-1:-1:-1;20408:193:0;;;;;:::i;:::-;;:::i;36582:46::-;;;;;;;;;;;;;;;;37042:58;;;;;;;;;;-1:-1:-1;37042:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40630:182;;;;;;;;;;-1:-1:-1;40630:182:0;;;;;:::i;:::-;;:::i;39234:95::-;;;;;;;;;;-1:-1:-1;39234:95:0;;;;;:::i;:::-;;:::i;40883:169::-;;;;;;;;;;-1:-1:-1;40883:169:0;;;;;:::i;:::-;;:::i;40041:127::-;;;;;;;;;;-1:-1:-1;40041:127:0;;;;;:::i;:::-;;:::i;39881:152::-;;;;;;;;;;-1:-1:-1;39881:152:0;;;;;:::i;:::-;;:::i;20664:151::-;;;;;;;;;;-1:-1:-1;20664:151:0;;;;;:::i;:::-;;:::i;36820:33::-;;;;;;;;;;;;;;;;36549:24;;;;;;;;;;-1:-1:-1;36549:24:0;;;;-1:-1:-1;;;;;36549:24:0;;;12465:201;;;;;;;;;;-1:-1:-1;12465:201:0;;;;;:::i;:::-;;:::i;46830:160::-;;;;;;;;;;;;;:::i;18784:100::-;18838:13;18871:5;18864:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18784:100;:::o;21135:201::-;21218:4;10190:10;21274:32;10190:10;21290:7;21299:6;21274:8;:32::i;:::-;21324:4;21317:11;;;21135:201;;;;;:::o;46081:240::-;11445:13;:11;:13::i;:::-;46232:15:::1;:34:::0;;-1:-1:-1;;;;;;46232:34:0::1;-1:-1:-1::0;;;;;46232:34:0;::::1;::::0;;::::1;::::0;;;46284:29:::1;::::0;1779:51:1;;;46232:34:0;;46284:29:::1;::::0;1767:2:1;1752:18;46284:29:0::1;;;;;;;;46143:178;46081:240:::0;:::o;39475:134::-;11445:13;:11;:13::i;:::-;39545:7:::1;:17:::0;;;39578:23:::1;::::0;1987:25:1;;;39578:23:0::1;::::0;1975:2:1;1960:18;39578:23:0::1;;;;;;;;39475:134:::0;:::o;21916:295::-;22047:4;10190:10;22105:38;22121:4;10190:10;22136:6;22105:15;:38::i;:::-;22154:27;22164:4;22170:2;22174:6;22154:9;:27::i;:::-;-1:-1:-1;22199:4:0;;21916:295;-1:-1:-1;;;;21916:295:0:o;39724:149::-;11445:13;:11;:13::i;:::-;39799:12:::1;:22:::0;;;39837:28:::1;::::0;1987:25:1;;;39837:28:0::1;::::0;1975:2:1;1960:18;39837:28:0::1;1841:177:1::0;39058:167:0;11445:13;:11;:13::i;:::-;39147:9:::1;:16;39167:1;39147:21;39139:46;;;::::0;-1:-1:-1;;;39139:46:0;;6060:2:1;39139:46:0::1;::::0;::::1;6042:21:1::0;6099:2;6079:18;;;6072:30;-1:-1:-1;;;6118:18:1;;;6111:42;6170:18;;39139:46:0::1;;;;;;;;;39196:21:::0;;::::1;::::0;:9:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;39058:167:::0;:::o;22620:238::-;22708:4;10190:10;22764:64;10190:10;22780:7;22817:10;22789:25;10190:10;22780:7;22789:9;:25::i;:::-;:38;;;;:::i;:::-;22764:8;:64::i;30153:91::-;30209:27;10190:10;30229:6;30209:5;:27::i;:::-;30153:91;:::o;39337:130::-;11445:13;:11;:13::i;:::-;39406:6:::1;:16:::0;;;39438:21:::1;::::0;1987:25:1;;;39438:21:0::1;::::0;1975:2:1;1960:18;39438:21:0::1;1841:177:1::0;37109:26:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37109:26:0;;-1:-1:-1;37109:26:0;:::o;39619:95::-;11445:13;:11;:13::i;:::-;39689:8:::1;:17:::0;39619:95::o;12207:103::-;11445:13;:11;:13::i;:::-;12272:30:::1;12299:1;12272:18;:30::i;:::-;12207:103::o:0;30563:164::-;30640:46;30656:7;10190:10;30679:6;30640:15;:46::i;:::-;30697:22;30703:7;30712:6;30697:5;:22::i;38909:141::-;11445:13;:11;:13::i;:::-;38979:9:::1;:20:::0;;-1:-1:-1;;;;;;38979:20:0::1;-1:-1:-1::0;;;;;38979:20:0;::::1;::::0;;::::1;::::0;;;39015:27:::1;::::0;1779:51:1;;;39015:27:0::1;::::0;1767:2:1;1752:18;39015:27:0::1;1606:230:1::0;41148:143:0;11445:13;:11;:13::i;:::-;41220:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;41220:21:0::1;-1:-1:-1::0;;;;41220:21:0;;::::1;;::::0;;41257:26:::1;::::0;::::1;::::0;::::1;::::0;41234:7;1327:14:1;1320:22;1302:41;;1290:2;1275:18;;1162:187;19003:104:0;19059:13;19092:7;19085:14;;;;;:::i;40176:252::-;11445:13;:11;:13::i;:::-;40285::::1;::::0;-1:-1:-1;;;;;40285:13:0;;::::1;40277:21:::0;;::::1;::::0;40269:99:::1;;;::::0;-1:-1:-1;;;40269:99:0;;6663:2:1;40269:99:0::1;::::0;::::1;6645:21:1::0;6702:2;6682:18;;;6675:30;6741:34;6721:18;;;6714:62;6812:34;6792:18;;;6785:62;-1:-1:-1;;;6863:19:1;;;6856:32;6905:19;;40269:99:0::1;6461:469:1::0;40269:99:0::1;40379:41;40408:4;40414:5;40379:28;:41::i;23361:436::-:0;23454:4;10190:10;23454:4;23537:25;10190:10;23554:7;23537:9;:25::i;:::-;23510:52;;23601:15;23581:16;:35;;23573:85;;;;-1:-1:-1;;;23573:85:0;;7137:2:1;23573:85:0;;;7119:21:1;7176:2;7156:18;;;7149:30;7215:34;7195:18;;;7188:62;-1:-1:-1;;;7266:18:1;;;7259:35;7311:19;;23573:85:0;6935:401:1;23573:85:0;23694:60;23703:5;23710:7;23738:15;23719:16;:34;23694:8;:60::i;20408:193::-;20487:4;10190:10;20543:28;10190:10;20560:2;20564:6;20543:9;:28::i;40630:182::-;11445:13;:11;:13::i;:::-;-1:-1:-1;;;;;40715:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;40715:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;40770:34;;1302:41:1;;;40770:34:0::1;::::0;1275:18:1;40770:34:0::1;;;;;;;40630:182:::0;;:::o;39234:95::-;11445:13;:11;:13::i;:::-;39301:11:::1;:20:::0;;-1:-1:-1;;39301:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39234:95::o;40883:169::-;11445:13;:11;:13::i;:::-;40965:18:::1;:30:::0;;;41011:34:::1;::::0;1987:25:1;;;41011:34:0::1;::::0;1975:2:1;1960:18;41011:34:0::1;1841:177:1::0;40041:127:0;11445:13;:11;:13::i;:::-;40127:23:::1;:33:::0;40041:127::o;39881:152::-;11445:13;:11;:13::i;:::-;39957::::1;:23:::0;;;39996:29:::1;::::0;1987:25:1;;;39996:29:0::1;::::0;1975:2:1;1960:18;39996:29:0::1;1841:177:1::0;20664:151:0;-1:-1:-1;;;;;20780:18:0;;;20753:7;20780:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20664:151::o;12465:201::-;11445:13;:11;:13::i;:::-;-1:-1:-1;;;;;12554:22:0;::::1;12546:73;;;::::0;-1:-1:-1;;;12546:73:0;;7543:2:1;12546:73:0::1;::::0;::::1;7525:21:1::0;7582:2;7562:18;;;7555:30;7621:34;7601:18;;;7594:62;-1:-1:-1;;;7672:18:1;;;7665:36;7718:19;;12546:73:0::1;7341:402:1::0;12546:73:0::1;12630:28;12649:8;12630:18;:28::i;46830:160::-:0;11445:13;:11;:13::i;:::-;46924:58:::1;::::0;46888:12:::1;::::0;46932:10:::1;::::0;46956:21:::1;::::0;46888:12;46924:58;46888:12;46924:58;46956:21;46932:10;46924:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;46830:160:0:o;26986:380::-;-1:-1:-1;;;;;27122:19:0;;27114:68;;;;-1:-1:-1;;;27114:68:0;;8160:2:1;27114:68:0;;;8142:21:1;8199:2;8179:18;;;8172:30;8238:34;8218:18;;;8211:62;-1:-1:-1;;;8289:18:1;;;8282:34;8333:19;;27114:68:0;7958:400:1;27114:68:0;-1:-1:-1;;;;;27201:21:0;;27193:68;;;;-1:-1:-1;;;27193:68:0;;8565:2:1;27193:68:0;;;8547:21:1;8604:2;8584:18;;;8577:30;8643:34;8623:18;;;8616:62;-1:-1:-1;;;8694:18:1;;;8687:32;8736:19;;27193:68:0;8363:398:1;27193:68:0;-1:-1:-1;;;;;27274:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27326:32;;1987:25:1;;;27326:32:0;;1960:18:1;27326:32:0;;;;;;;26986:380;;;:::o;11724:132::-;11632:6;;-1:-1:-1;;;;;11632:6:0;10190:10;11788:23;11780:68;;;;-1:-1:-1;;;11780:68:0;;8968:2:1;11780:68:0;;;8950:21:1;;;8987:18;;;8980:30;9046:34;9026:18;;;9019:62;9098:18;;11780:68:0;8766:356:1;27657:453:0;27792:24;27819:25;27829:5;27836:7;27819:9;:25::i;:::-;27792:52;;-1:-1:-1;;27859:16:0;:37;27855:248;;27941:6;27921:16;:26;;27913:68;;;;-1:-1:-1;;;27913:68:0;;9329:2:1;27913:68:0;;;9311:21:1;9368:2;9348:18;;;9341:30;9407:31;9387:18;;;9380:59;9456:18;;27913:68:0;9127:353:1;27913:68:0;28025:51;28034:5;28041:7;28069:6;28050:16;:25;28025:8;:51::i;41432:3134::-;-1:-1:-1;;;;;41564:18:0;;41556:68;;;;-1:-1:-1;;;41556:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41643:16:0;;41635:64;;;;-1:-1:-1;;;41635:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41724:31:0;;;;;;:25;:31;;;;;;;;41723:32;:66;;;;-1:-1:-1;;;;;;41760:29:0;;;;;;:25;:29;;;;;;;;41759:30;41723:66;41720:152;;;41806:33;41822:4;41828:2;41832:6;41806:15;:33::i;:::-;41432:3134;;;:::o;41720:152::-;41927:4;41878:28;20176:18;;;;;;;;;;;41993;;41969:42;;;;;;;42042:35;;-1:-1:-1;42066:11:0;;-1:-1:-1;;;42066:11:0;;;;42042:35;:61;;;;-1:-1:-1;42095:8:0;;-1:-1:-1;;;42095:8:0;;;;42094:9;42042:61;:110;;;;-1:-1:-1;;;;;;42121:31:0;;;;;;:25;:31;;;;;;;;42120:32;42042:110;:153;;;;-1:-1:-1;;;;;;42170:25:0;;;;;;:19;:25;;;;;;;;42169:26;42042:153;:194;;;;-1:-1:-1;;;;;;42213:23:0;;;;;;:19;:23;;;;;;;;42212:24;42042:194;42024:322;;;42263:8;:15;;-1:-1:-1;;;;42263:15:0;-1:-1:-1;;;42263:15:0;;;42293:10;:8;:10::i;:::-;42318:8;:16;;-1:-1:-1;;;;42318:16:0;;;42024:322;42374:8;;-1:-1:-1;;;;;42483:25:0;;42358:12;42483:25;;;:19;:25;;;;;;42374:8;-1:-1:-1;;;42374:8:0;;;;;42373:9;;42483:25;;:52;;-1:-1:-1;;;;;;42512:23:0;;;;;;:19;:23;;;;;;;;42483:52;42480:99;;;-1:-1:-1;42562:5:0;42480:99;42668:7;42665:1848;;;-1:-1:-1;;;;;42742:31:0;;42691:17;42742:31;;;:25;:31;;;;;;;;42739:590;;;42797:12;;:16;42794:142;;42855:12;;42845:6;:22;;42837:79;;;;-1:-1:-1;;;42837:79:0;;10497:2:1;42837:79:0;;;10479:21:1;10536:2;10516:18;;;10509:30;10575:34;10555:18;;;10548:62;-1:-1:-1;;;10626:18:1;;;10619:42;10678:19;;42837:79:0;10295:408:1;42837:79:0;42954:6;;:10;42951:363;;42988:11;43002:36;43027:10;;43003:18;43014:6;;43003;:10;;:18;;;;:::i;:::-;43002:24;;:36::i;:::-;43064:23;;42988:50;;-1:-1:-1;43064:27:0;43061:237;;43134:23;;43128:3;:29;:61;;43186:3;43128:61;;;43160:23;;43128:61;43116:73;;43061:237;;;43271:3;43259:15;;43061:237;42965:349;42951:363;-1:-1:-1;;;;;43368:29:0;;;;;;:25;:29;;;;;;;;43365:598;;;43421:13;;:17;43418:145;;43480:13;;43470:6;:23;;43462:81;;;;-1:-1:-1;;;43462:81:0;;10910:2:1;43462:81:0;;;10892:21:1;10949:2;10929:18;;;10922:30;10988:34;10968:18;;;10961:62;-1:-1:-1;;;11039:18:1;;;11032:43;11092:19;;43462:81:0;10708:409:1;43462:81:0;43581:7;;:11;43578:370;;43616:11;43630:37;43656:10;;43631:19;43642:7;;43631:6;:10;;:19;;;;:::i;43630:37::-;43693:23;;43616:51;;-1:-1:-1;43693:27:0;43690:237;;43763:23;;43757:3;:29;:61;;43815:3;43757:61;;;43789:23;;43757:61;43745:73;;43690:237;;;43900:3;43888:15;;43690:237;43593:355;43578:370;43994:13;;43991:509;;44033:21;:6;44044:9;44033:10;:21::i;:::-;44024:30;;44073:16;44092:41;44122:10;;44093:23;44107:8;;44093:9;:13;;:23;;;;:::i;44092:41::-;44171:16;;44073:60;;-1:-1:-1;44171:30:0;;44073:60;44171:20;:30::i;:::-;44152:16;:49;44223:12;;44220:105;;44259:46;44275:4;44289;44296:8;44259:15;:46::i;:::-;44374:1;44347:23;:9;44361:8;44347:13;:23::i;:::-;44346:29;44343:142;;;44429:9;;44399:66;;44415:4;;-1:-1:-1;;;;;44429:9:0;44441:23;:9;44455:8;44441:13;:23::i;:::-;44399:15;:66::i;:::-;44008:492;43991:509;42676:1837;42665:1848;44525:33;44541:4;44547:2;44551:6;44525:15;:33::i;:::-;41545:3021;;;41432:3134;;;:::o;25957:591::-;-1:-1:-1;;;;;26041:21:0;;26033:67;;;;-1:-1:-1;;;26033:67:0;;11324:2:1;26033:67:0;;;11306:21:1;11363:2;11343:18;;;11336:30;11402:34;11382:18;;;11375:62;-1:-1:-1;;;11453:18:1;;;11446:31;11494:19;;26033:67:0;11122:397:1;26033:67:0;-1:-1:-1;;;;;26200:18:0;;26175:22;26200:18;;;;;;;;;;;26237:24;;;;26229:71;;;;-1:-1:-1;;;26229:71:0;;11726:2:1;26229:71:0;;;11708:21:1;11765:2;11745:18;;;11738:30;11804:34;11784:18;;;11777:62;-1:-1:-1;;;11855:18:1;;;11848:32;11897:19;;26229:71:0;11524:398:1;26229:71:0;-1:-1:-1;;;;;26336:18:0;;:9;:18;;;;;;;;;;26357:23;;;26336:44;;26402:12;:22;;26374:6;;26336:9;26402:22;;26374:6;;26402:22;:::i;:::-;;;;-1:-1:-1;;26442:37:0;;1987:25:1;;;26468:1:0;;-1:-1:-1;;;;;26442:37:0;;;;;1975:2:1;1960:18;26442:37:0;;;;;;;41432:3134;;;:::o;12826:191::-;12919:6;;;-1:-1:-1;;;;;12936:17:0;;;-1:-1:-1;;;;;;12936:17:0;;;;;;;12969:40;;12919:6;;;12936:17;12919:6;;12969:40;;12900:16;;12969:40;12889:128;12826:191;:::o;40436:186::-;-1:-1:-1;;;;;40519:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;40519:39:0;;;;;;;;;;40574:40;;40519:39;;:31;40574:40;;;40436:186;;:::o;24267:671::-;-1:-1:-1;;;;;24398:18:0;;24390:68;;;;-1:-1:-1;;;24390:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24477:16:0;;24469:64;;;;-1:-1:-1;;;24469:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24619:15:0;;24597:19;24619:15;;;;;;;;;;;24653:21;;;;24645:72;;;;-1:-1:-1;;;24645:72:0;;12262:2:1;24645:72:0;;;12244:21:1;12301:2;12281:18;;;12274:30;12340:34;12320:18;;;12313:62;-1:-1:-1;;;12391:18:1;;;12384:36;12437:19;;24645:72:0;12060:402:1;24645:72:0;-1:-1:-1;;;;;24753:15:0;;;:9;:15;;;;;;;;;;;24771:20;;;24753:38;;24813:13;;;;;;;;:23;;24785:6;;24753:9;24813:23;;24785:6;;24813:23;:::i;:::-;;;;;;;;24869:2;-1:-1:-1;;;;;24854:26:0;24863:4;-1:-1:-1;;;;;24854:26:0;;24873:6;24854:26;;;;1987:25:1;;1975:2;1960:18;;1841:177;24854:26:0;;;;;;;;24893:37;41432:3134;46329:493;46396:16;;46429:35;46396:16;46429;:35::i;:::-;46486:18;46541:16;:20;46507:21;46585:14;;46582:187;;46642:9;;46634:46;;46617:12;;-1:-1:-1;;;;;46642:9:0;;46665:10;;46617:12;46634:46;46617:12;46634:46;46665:10;46642:9;46634:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46616:64;;;46713:7;46705:52;;;;-1:-1:-1;;;46705:52:0;;12669:2:1;46705:52:0;;;12651:21:1;;;12688:18;;;12681:30;12747:34;12727:18;;;12720:62;12799:18;;46705:52:0;12467:356:1;46705:52:0;46601:168;46582:187;46784:30;;1987:25:1;;;46784:30:0;;1975:2:1;1960:18;46784:30:0;1841:177:1;6004:98:0;6062:7;6089:5;6093:1;6089;:5;:::i;:::-;6082:12;6004:98;-1:-1:-1;;;6004:98:0:o;6403:::-;6461:7;6488:5;6492:1;6488;:5;:::i;5647:98::-;5705:7;5732:5;5736:1;5732;:5;:::i;5266:98::-;5324:7;5351:5;5355:1;5351;:5;:::i;44574:1499::-;44726:16;;;44740:1;44726:16;;;;;;;;44702:21;;44726:16;;;;;;;;;;-1:-1:-1;44726:16:0;44702:40;;44771:4;44753;44758:1;44753:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44753:23:0;;;:7;;;;;;;;;;:23;;;;44797:15;;:22;;;-1:-1:-1;;;44797:22:0;;;;:15;;;;;:20;;:22;;;;;44753:7;;44797:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44787:4;44792:1;44787:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44787:32:0;;;:7;;;;;;;;;:32;44864:15;;44832:62;;44849:4;;44864:15;44882:11;44832:8;:62::i;:::-;44933:15;;:224;;-1:-1:-1;;;44933:224:0;;-1:-1:-1;;;;;44933:15:0;;;;:66;;:224;;45014:11;;44933:15;;45084:4;;45111;;45131:15;;44933:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45173:9:0;:16;45193:1;45173:21;;-1:-1:-1;;45173:44:0;;;;-1:-1:-1;45198:11:0;;;;:19;;:11;:19;45173:44;45170:886;;;45378:15;;:246;;-1:-1:-1;;;45378:246:0;;45290:21;;-1:-1:-1;;;;;45378:15:0;;:66;;45290:21;;45378:246;;45269:18;;45534:9;;45570:4;;45594:15;;45378:246;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45639:21;45670:9;45680:1;45670:12;;;;;;;;:::i;:::-;;;;;;;;;;;45663:45;;-1:-1:-1;;;45663:45:0;;45702:4;45663:45;;;1779:51:1;-1:-1:-1;;;;;45670:12:0;;;;45663:30;;1752:18:1;;45663:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45639:69;-1:-1:-1;45726:17:0;;45723:112;;45771:9;45781:1;45771:12;;;;;;;;:::i;:::-;;;;;;;;;;;45794:9;;45764:55;;-1:-1:-1;;;45764:55:0;;-1:-1:-1;;;;;45794:9:0;;;45764:55;;;15895:51:1;15962:18;;;15955:34;;;45771:12:0;;;45764:29;;15868:18:1;;45764:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45723:112;45849:21;45880:9;45890:1;45880:12;;;;;;;;:::i;:::-;;;;;;;;;;;45873:45;;-1:-1:-1;;;45873:45:0;;45912:4;45873:45;;;1779:51:1;-1:-1:-1;;;;;45880:12:0;;;;45873:30;;1752:18:1;;45873:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45849:69;-1:-1:-1;45936:17:0;;45933:112;;45981:9;45991:1;45981:12;;;;;;;;:::i;:::-;;;;;;;;;;;46004:9;;45974:55;;-1:-1:-1;;;45974:55:0;;-1:-1:-1;;;;;46004:9:0;;;45974:55;;;15895:51:1;15962:18;;;15955:34;;;45981:12:0;;;45974:29;;15868:18:1;;45974:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45933:112::-;45218:838;;;44629:1444;44574:1499;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:548:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:134;771:20;;800:31;771:20;800:31;:::i;:::-;703:134;;;:::o;842:315::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1026:9;1013:23;1045:31;1070:5;1045:31;:::i;:::-;1095:5;1147:2;1132:18;;;;1119:32;;-1:-1:-1;;;842:315:1:o;1354:247::-;1413:6;1466:2;1454:9;1445:7;1441:23;1437:32;1434:52;;;1482:1;1479;1472:12;1434:52;1521:9;1508:23;1540:31;1565:5;1540:31;:::i;2023:180::-;2082:6;2135:2;2123:9;2114:7;2110:23;2106:32;2103:52;;;2151:1;2148;2141:12;2103:52;-1:-1:-1;2174:23:1;;2023:180;-1:-1:-1;2023:180:1:o;2208:456::-;2285:6;2293;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2409:9;2396:23;2428:31;2453:5;2428:31;:::i;:::-;2478:5;-1:-1:-1;2535:2:1;2520:18;;2507:32;2548:33;2507:32;2548:33;:::i;:::-;2208:456;;2600:7;;-1:-1:-1;;;2654:2:1;2639:18;;;;2626:32;;2208:456::o;2669:127::-;2730:10;2725:3;2721:20;2718:1;2711:31;2761:4;2758:1;2751:15;2785:4;2782:1;2775:15;2801:1121;2885:6;2916:2;2959;2947:9;2938:7;2934:23;2930:32;2927:52;;;2975:1;2972;2965:12;2927:52;3015:9;3002:23;3044:18;3085:2;3077:6;3074:14;3071:34;;;3101:1;3098;3091:12;3071:34;3139:6;3128:9;3124:22;3114:32;;3184:7;3177:4;3173:2;3169:13;3165:27;3155:55;;3206:1;3203;3196:12;3155:55;3242:2;3229:16;3264:2;3260;3257:10;3254:36;;;3270:18;;:::i;:::-;3316:2;3313:1;3309:10;3348:2;3342:9;3411:2;3407:7;3402:2;3398;3394:11;3390:25;3382:6;3378:38;3466:6;3454:10;3451:22;3446:2;3434:10;3431:18;3428:46;3425:72;;;3477:18;;:::i;:::-;3513:2;3506:22;3563:18;;;3597:15;;;;-1:-1:-1;3639:11:1;;;3635:20;;;3667:19;;;3664:39;;;3699:1;3696;3689:12;3664:39;3723:11;;;;3743:148;3759:6;3754:3;3751:15;3743:148;;;3825:23;3844:3;3825:23;:::i;:::-;3813:36;;3776:12;;;;3869;;;;3743:148;;;3910:6;2801:1121;-1:-1:-1;;;;;;;;2801:1121:1:o;4324:118::-;4410:5;4403:13;4396:21;4389:5;4386:32;4376:60;;4432:1;4429;4422:12;4447:241;4503:6;4556:2;4544:9;4535:7;4531:23;4527:32;4524:52;;;4572:1;4569;4562:12;4524:52;4611:9;4598:23;4630:28;4652:5;4630:28;:::i;4693:382::-;4758:6;4766;4819:2;4807:9;4798:7;4794:23;4790:32;4787:52;;;4835:1;4832;4825:12;4787:52;4874:9;4861:23;4893:31;4918:5;4893:31;:::i;:::-;4943:5;-1:-1:-1;5000:2:1;4985:18;;4972:32;5013:30;4972:32;5013:30;:::i;:::-;5062:7;5052:17;;;4693:382;;;;;:::o;5080:388::-;5148:6;5156;5209:2;5197:9;5188:7;5184:23;5180:32;5177:52;;;5225:1;5222;5215:12;5177:52;5264:9;5251:23;5283:31;5308:5;5283:31;:::i;:::-;5333:5;-1:-1:-1;5390:2:1;5375:18;;5362:32;5403:33;5362:32;5403:33;:::i;5473:380::-;5552:1;5548:12;;;;5595;;;5616:61;;5670:4;5662:6;5658:17;5648:27;;5616:61;5723:2;5715:6;5712:14;5692:18;5689:38;5686:161;;5769:10;5764:3;5760:20;5757:1;5750:31;5804:4;5801:1;5794:15;5832:4;5829:1;5822:15;5686:161;;5473:380;;;:::o;6199:127::-;6260:10;6255:3;6251:20;6248:1;6241:31;6291:4;6288:1;6281:15;6315:4;6312:1;6305:15;6331:125;6396:9;;;6417:10;;;6414:36;;;6430:18;;:::i;9485:401::-;9687:2;9669:21;;;9726:2;9706:18;;;9699:30;9765:34;9760:2;9745:18;;9738:62;-1:-1:-1;;;9831:2:1;9816:18;;9809:35;9876:3;9861:19;;9485:401::o;9891:399::-;10093:2;10075:21;;;10132:2;10112:18;;;10105:30;10171:34;10166:2;10151:18;;10144:62;-1:-1:-1;;;10237:2:1;10222:18;;10215:33;10280:3;10265:19;;9891:399::o;11927:128::-;11994:9;;;12015:11;;;12012:37;;;12029:18;;:::i;12828:168::-;12901:9;;;12932;;12949:15;;;12943:22;;12929:37;12919:71;;12970:18;;:::i;13001:217::-;13041:1;13067;13057:132;;13111:10;13106:3;13102:20;13099:1;13092:31;13146:4;13143:1;13136:15;13174:4;13171:1;13164:15;13057:132;-1:-1:-1;13203:9:1;;13001:217::o;13223:127::-;13284:10;13279:3;13275:20;13272:1;13265:31;13315:4;13312:1;13305:15;13339:4;13336:1;13329:15;13355:251;13425:6;13478:2;13466:9;13457:7;13453:23;13449:32;13446:52;;;13494:1;13491;13484:12;13446:52;13526:9;13520:16;13545:31;13570:5;13545:31;:::i;13611:980::-;13873:4;13921:3;13910:9;13906:19;13952:6;13941:9;13934:25;13978:2;14016:6;14011:2;14000:9;13996:18;13989:34;14059:3;14054:2;14043:9;14039:18;14032:31;14083:6;14118;14112:13;14149:6;14141;14134:22;14187:3;14176:9;14172:19;14165:26;;14226:2;14218:6;14214:15;14200:29;;14247:1;14257:195;14271:6;14268:1;14265:13;14257:195;;;14336:13;;-1:-1:-1;;;;;14332:39:1;14320:52;;14427:15;;;;14392:12;;;;14368:1;14286:9;14257:195;;;-1:-1:-1;;;;;;;14508:32:1;;;;14503:2;14488:18;;14481:60;-1:-1:-1;;;14572:3:1;14557:19;14550:35;14469:3;13611:980;-1:-1:-1;;;13611:980:1:o;14596:931::-;14827:4;14875:3;14864:9;14860:19;14906:6;14895:9;14888:25;14932:2;14970:3;14965:2;14954:9;14950:18;14943:31;14994:6;15029;15023:13;15060:6;15052;15045:22;15098:3;15087:9;15083:19;15076:26;;15121:6;15118:1;15111:17;15164:2;15161:1;15151:16;15137:30;;15185:1;15195:194;15209:6;15206:1;15203:13;15195:194;;;15274:13;;-1:-1:-1;;;;;15270:39:1;15258:52;;15306:1;15365:14;;;;15330:12;;;;15224:9;15195:194;;;-1:-1:-1;;;;;;;15445:32:1;;;;15440:2;15425:18;;15418:60;-1:-1:-1;;;15509:2:1;15494:18;15487:34;15406:3;14596:931;-1:-1:-1;;14596:931:1:o;15532:184::-;15602:6;15655:2;15643:9;15634:7;15630:23;15626:32;15623:52;;;15671:1;15668;15661:12;15623:52;-1:-1:-1;15694:16:1;;15532:184;-1:-1:-1;15532:184:1:o;16000:245::-;16067:6;16120:2;16108:9;16099:7;16095:23;16091:32;16088:52;;;16136:1;16133;16126:12;16088:52;16168:9;16162:16;16187:28;16209:5;16187:28;:::i

Swarm Source

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