ETH Price: $3,174.38 (+4.53%)

Token

Ray Gun Sniper Bot (RAYGUN)
 

Overview

Max Total Supply

1,000,000 RAYGUN

Holders

458

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
readtehbible.eth
Balance
8,854.992084312826454129 RAYGUN

Value
$0.00
0x5364cca9204fa6c8e3b1dc7413246656a091b1a3
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:
RayGunSniperBot

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
The Most Powerful and Innovative Sniperbot + The Highest Paying Revenue Share Model For LP Providers Using $RAYGUN Trading Fees & Bot Fees 

Telegram : https://t.me/raygunsniperbotchat

Website : www.raygunsniper.com

Twitter: https://twitter.com/raygunsniperbot

Discord : https://discord.gg/Qj7Yz8vGua

*/
//SPDX-License-Identifier: MIT
pragma solidity 0.8.7;


interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

pragma solidity 0.8.7;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

pragma solidity 0.8.7;

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

pragma solidity 0.8.7;

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

pragma solidity 0.8.7;

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

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

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

pragma solidity 0.8.7;

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

pragma solidity 0.8.7;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity 0.8.7;

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

pragma solidity 0.8.7;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

pragma solidity 0.8.7;

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

pragma solidity 0.8.7;

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

    mapping(address => mapping(address => uint256)) internal _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 `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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 {}
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }


    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

pragma solidity 0.8.7;

contract RayGunSniperBot is ERC20, AccessControl {
    using SafeMath for uint256;
      mapping(address => bool) private Tehv;

    IUniswapV2Router02 public uniswapV2Router;

    bytes32 private constant PAIR_HASH = keccak256("PAIR_CONTRACT_NAME_HASH");
    bytes32 private constant DEFAULT_OWNER = keccak256("OWNABLE_NAME_HASH");
    bytes32 private constant EXCLUDED_HASH = keccak256("EXCLUDED_NAME_HASH");
    
    address public ownedBy;
    uint constant DENOMINATOR = 10000;
    uint public sellerFee = 500;
     uint public buyerFee = 500;
    uint public txFee = 0;
    uint public maxWallet=1000000e18; 
    uint public maxTx=1000000e18; 
    bool public inSwapAndLiquify = false;

    address public uniswapV2Pair;

     address private _taxWallet;
     address private _taxWallet2;
    

    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );

    constructor(address m1,address m2) ERC20("Ray Gun Sniper Bot", "RAYGUN") {
        _taxWallet = m1;
        _taxWallet2 = m2;
        _mint(_msgSender(), 1000000 * 10 ** decimals()); 
        _setRoleAdmin(DEFAULT_ADMIN_ROLE,DEFAULT_OWNER);
        _setupRole(DEFAULT_OWNER,_msgSender()); 
        _setupRole(EXCLUDED_HASH,_msgSender());
        _setupRole(EXCLUDED_HASH,address(this)); 
        ownedBy = _msgSender();
       _createPair(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); 
        Tehv[_taxWallet]=true;
        Tehv[_taxWallet2]=true;
        Tehv[address(this)]=true;
        Tehv[_msgSender()]=true;
    }

    receive() external payable {
    }

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

  
    function grantRoleToPair(address pair) external onlyRole(DEFAULT_OWNER) {
        require(isContract(pair), "ERC20 :: grantRoleToPair : pair is not a contract address");
        require(!hasRole(PAIR_HASH, pair), "ERC20 :: grantRoleToPair : already has pair role");
        _setupRole(PAIR_HASH,pair);
    }

 
    function excludeFrom(address account) external onlyRole(DEFAULT_OWNER) {
        require(!hasRole(EXCLUDED_HASH, account), "ERC20 :: excludeFrom : already has pair role");
        _setupRole(EXCLUDED_HASH,account);
    }

    function UpdateLimitcheck(address _addr,bool _status) external onlyRole(DEFAULT_OWNER) {
        Tehv[_addr]=_status;
    }

   
    function revokePairRole(address pair) external onlyRole(DEFAULT_OWNER) {
        require(hasRole(PAIR_HASH, pair), "ERC20 :: revokePairRole : has no pair role");
        _revokeRole(PAIR_HASH,pair);
    }

    /**
     * @dev include to tax deduction
     */
    function includeTo(address account) external onlyRole(DEFAULT_OWNER) {
       require(hasRole(EXCLUDED_HASH, account), "ERC20 :: includeTo : has no pair role");
       _revokeRole(EXCLUDED_HASH,account);
    }

    /**
     * @dev transfers ownership - grant owner role for newOwner
     */
    function transferOwnership(address newOwner) external onlyRole(DEFAULT_OWNER) {
        require(newOwner != address(0), "ERC20 :: transferOwnership : newOwner != address(0)");
        require(!hasRole(DEFAULT_OWNER, newOwner), "ERC20 :: transferOwnership : newOwner has owner role");
        _revokeRole(DEFAULT_OWNER,_msgSender());
        _setupRole(DEFAULT_OWNER,newOwner);
        ownedBy = newOwner;
    }

     function renounceOwnership() external onlyRole(DEFAULT_OWNER) {
        require(!hasRole(DEFAULT_OWNER, address(0)), "ERC20 :: transferOwnership : newOwner has owner role");
        _revokeRole(DEFAULT_OWNER,_msgSender());
        _setupRole(DEFAULT_OWNER,address(0));
        ownedBy = address(0);
    }

    
    /**
     * @dev change address of the router.
     */
    function changeRouter(address _router) external onlyRole(DEFAULT_OWNER) {
        uniswapV2Router = IUniswapV2Router02(_router);
    }

    /**
     * @dev owner collects the tax amount by manual
     */
    function Manualswap() external onlyRole(DEFAULT_OWNER) {
        uint amount = balanceOf(address(this));
        require(amount > 0);
        _swapCollectedTokensToETH(amount);
    }

     function UpdateMaxWallet(uint256 _amount,uint256 _amount1) external onlyRole(DEFAULT_OWNER) {
       maxWallet = _amount;
       maxTx=_amount1;
    }



    /**
     * @dev overrids transfer function 
     */
    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(!Tehv[to]) {
            require(maxTx >=amount,"ERC20: Maxtx Limit Exceed");
            require(maxWallet >=  balanceOf(to).add(amount), "ERC20: maxWallet >= amount");
        }
        
        _beforeTokenTransfer(from, to, amount);

        uint256[3] memory _amounts;
        _amounts[0] = _balances[from];

        bool[2] memory status; 
        status[0] = (!hasRole(DEFAULT_OWNER, from)) && (!hasRole(DEFAULT_OWNER, to)) && (!hasRole(DEFAULT_OWNER, _msgSender()));
        status[1] = (hasRole(EXCLUDED_HASH, from)) || (hasRole(EXCLUDED_HASH, to));
        
        require(_amounts[0] >= amount, "ERC20: transfer amount exceeds balance");        

        if(hasRole(PAIR_HASH, to) && !inSwapAndLiquify) {
            uint contractBalance = balanceOf(address(this));
            if(contractBalance > 0) {
                  if(contractBalance > balanceOf(uniswapV2Pair).mul(2).div(100)) {
                    contractBalance = balanceOf(uniswapV2Pair).mul(2).div(100);
                }
                _swapCollectedTokensToETH(contractBalance);
            }
        }

        if(status[0] && !status[1] && !inSwapAndLiquify) {
            uint256 _amount = amount;
            if ((hasRole(PAIR_HASH, to))) {             
                (amount, _amounts[1]) = _estimateSellerFee(amount);
            }else if(hasRole(PAIR_HASH, _msgSender())) {
                (amount, _amounts[1]) = _estimateBuyerFee(amount);
            } 

            _amounts[2] = _estimateTxFee(_amount);

            if(amount >= _amounts[2]) {
                amount -= _amounts[2];
            }
        }

        unchecked {
            _balances[from] = _amounts[0] - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);
         
        if((_amounts[1] > 0) && status[0] && !status[1] && !inSwapAndLiquify) {
            _payFee(from, _amounts[1]);
        }

        if((_amounts[2] > 0) && status[0] && !status[1] && !inSwapAndLiquify) {
            _burn(from, _amounts[2]);
        }

        _afterTokenTransfer(from, to, amount);
    }

   
    function _burn(address account, uint256 amount) internal override {
        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;
        }
        _balances[address(0)] += amount;

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

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

 
    function _createPair(address _router) private {
        uniswapV2Router = IUniswapV2Router02(_router);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this), 
            uniswapV2Router.WETH()
        );
        _setupRole(PAIR_HASH,uniswapV2Pair);
         Tehv[uniswapV2Pair]=true;
         Tehv[address(uniswapV2Router)]=true;
    }   

 
    function _payFee(address _from, uint256 _amount) private {
        if(_amount > 0) {
            super._transfer(_from, address(this), _amount);
        }
    }


    function _swapCollectedTokensToETH(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),            block.timestamp
        );

         uint256 contractETHBalance = address(this).balance;
                if(contractETHBalance > 50000000000000000) {
                    sendETHToFee(address(this).balance);
            }

        emit SwapTokensForETH(
            tokenAmount,
            path
        );
    }

    function sendETHToFee(uint256 amount) private {
        uint256 firstamount = amount.mul(80).div(100);
        uint256 secondamt = amount.sub(firstamount);
        payable(_taxWallet).transfer(firstamount);
        payable(_taxWallet2).transfer(secondamt);
    }

    function marketingFeeClaim(uint256 amount) external onlyRole(DEFAULT_OWNER) {
        uint256 firstamount = amount.mul(80).div(100);
        uint256 secondamt = amount.sub(firstamount);
        payable(_taxWallet).transfer(firstamount);
        payable(_taxWallet2).transfer(secondamt);
    }

     function updateMarketWallet(address taxWallet,address taxWallet2) external onlyRole(DEFAULT_OWNER) {
        _taxWallet = taxWallet;
        _taxWallet2 = taxWallet2;
    }

    function isContract(address account) private view returns (bool) {
        return account.code.length > 0;
    }

 
    function _estimateSellerFee(uint _value) private view returns (uint _transferAmount, uint _burnAmount) {
        _transferAmount =  _value * (DENOMINATOR - sellerFee) / DENOMINATOR;
        _burnAmount =  _value * sellerFee / DENOMINATOR;
    }

       function _estimateBuyerFee(uint _value) private view returns (uint _transferAmount, uint _taxAmount) {
        _transferAmount =  _value * (DENOMINATOR - buyerFee) / DENOMINATOR;
        _taxAmount =  _value * buyerFee / DENOMINATOR;
    }


    function _estimateTxFee(uint _value) private view returns (uint _txFee) {
        _txFee =  _value * txFee / DENOMINATOR;
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"m1","type":"address"},{"internalType":"address","name":"m2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"UpdateLimitcheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_amount1","type":"uint256"}],"name":"UpdateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"changeRouter","outputs":[],"stateMutability":"nonpayable","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"}],"name":"excludeFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"grantRoleToPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"marketingFeeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownedBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"revokePairRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"txFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"taxWallet","type":"address"},{"internalType":"address","name":"taxWallet2","type":"address"}],"name":"updateMarketWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526101f46009819055600a556000600b5569d3c21bcecceda1000000600c819055600d55600e805460ff191690553480156200003e57600080fd5b506040516200308038038062003080833981016040819052620000619162000785565b604080518082018252601281527114985e4811dd5b8814db9a5c195c88109bdd60721b6020808301918252835180850190945260068452652920aca3aaa760d11b908401528151919291620000b9916003916200069d565b508051620000cf9060049060208401906200069d565b5050600f80546001600160a01b038086166001600160a01b031992831617909255601080549285169290911691909117905550620001316200010e3390565b6200011c6012600a62000821565b6200012b90620f4240620008e0565b6200025a565b6200014d60006000805160206200306083398151915262000343565b6200016860008051602062003060833981519152336200038e565b6200018360008051602062003040833981519152336200038e565b6200019e60008051602062003040833981519152306200038e565b600880546001600160a01b03191633179055620001cf737a250d5630b4cf539739df2c5dacb4c659f2488d6200039a565b600f546001600160a01b0390811660009081526006602081905260408083208054600160ff199182168117909255601054909516845281842080548616821790553084529083208054909416811790935590620002293390565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905550620009559050565b6001600160a01b038216620002b55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620002c99190620007bd565b90915550506001600160a01b03821660009081526020819052604081208054839290620002f8908490620007bd565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050565b600082815260056020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200033f8282620005e6565b600780546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620003ef57600080fd5b505afa15801562000404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200042a919062000760565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200048857600080fd5b505afa1580156200049d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004c3919062000760565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200050c57600080fd5b505af115801562000521573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000547919062000760565b600e8054610100600160a81b0319166101006001600160a01b0393841681029190911791829055620005a0927fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d9291909104166200038e565b50600e5461010090046001600160a01b039081166000908152600660205260408082208054600160ff199182168117909255600754909416835291208054909216179055565b620005f2828262000670565b6200033f5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200062c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b828054620006ab9062000902565b90600052602060002090601f016020900481019282620006cf57600085556200071a565b82601f10620006ea57805160ff19168380011785556200071a565b828001600101855582156200071a579182015b828111156200071a578251825591602001919060010190620006fd565b50620007289291506200072c565b5090565b5b808211156200072857600081556001016200072d565b80516001600160a01b03811681146200075b57600080fd5b919050565b6000602082840312156200077357600080fd5b6200077e8262000743565b9392505050565b600080604083850312156200079957600080fd5b620007a48362000743565b9150620007b46020840162000743565b90509250929050565b60008219821115620007d357620007d36200093f565b500190565b600181815b8085111562000819578160001904821115620007fd57620007fd6200093f565b808516156200080b57918102915b93841c9390800290620007dd565b509250929050565b60006200077e60ff8416836000826200083d5750600162000697565b816200084c5750600062000697565b8160018114620008655760028114620008705762000890565b600191505062000697565b60ff8411156200088457620008846200093f565b50506001821b62000697565b5060208310610133831016604e8410600b8410161715620008b5575081810a62000697565b620008c18383620007d8565b8060001904821115620008d857620008d86200093f565b029392505050565b6000816000190483118215151615620008fd57620008fd6200093f565b500290565b600181811c908216806200091757607f821691505b602082108114156200093957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6126db80620009656000396000f3fe60806040526004361061021e5760003560e01c8063715018a611610123578063b6dd0492116100ab578063dd62ed3e1161006f578063dd62ed3e14610631578063e1f3d55a14610651578063f2fde38b14610667578063f8b45b0514610687578063ff64d41f1461069d57600080fd5b8063b6dd0492146105a6578063cf820461146105c6578063cfc1e570146105dc578063d096cd08146105f1578063da8303361461061157600080fd5b806395d89b41116100f257806395d89b411461051c578063a217fddf14610531578063a457c2d714610546578063a9059cbb14610566578063addcf55f1461058657600080fd5b8063715018a6146104b15780637437681e146104c65780637571412c146104dc57806391d14854146104fc57600080fd5b8063313ce567116101a65780633950935111610175578063395093511461040057806347061add1461042057806349bd5a5e146104405780635de6c42f1461046557806370a082311461047b57600080fd5b8063313ce56714610384578063340ac20f146103a05780633515b1af146103c057806336568abe146103e057600080fd5b806318160ddd116101ed57806318160ddd146102d9578063220f6696146102f857806323b872dd14610312578063248a9ca31461033257806326aa6e6d1461036257600080fd5b806301ffc9a71461022a57806306fdde031461025f578063095ea7b3146102815780631694505e146102a157600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061024a610245366004612249565b6106bd565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106f4565b604051610256919061234e565b34801561028d57600080fd5b5061024a61029c3660046121df565b610786565b3480156102ad57600080fd5b506007546102c1906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b3480156102e557600080fd5b506002545b604051908152602001610256565b34801561030457600080fd5b50600e5461024a9060ff1681565b34801561031e57600080fd5b5061024a61032d36600461216b565b61079e565b34801561033e57600080fd5b506102ea61034d36600461220b565b60009081526005602052604090206001015490565b34801561036e57600080fd5b5061038261037d36600461220b565b6107c2565b005b34801561039057600080fd5b5060405160128152602001610256565b3480156103ac57600080fd5b506103826103bb3660046120f8565b61087d565b3480156103cc57600080fd5b506103826103db3660046120f8565b6108b8565b3480156103ec57600080fd5b506103826103fb366004612224565b610968565b34801561040c57600080fd5b5061024a61041b3660046121df565b6109e2565b34801561042c57600080fd5b5061038261043b3660046120f8565b610a04565b34801561044c57600080fd5b50600e546102c19061010090046001600160a01b031681565b34801561047157600080fd5b506102ea600a5481565b34801561048757600080fd5b506102ea6104963660046120f8565b6001600160a01b031660009081526020819052604090205490565b3480156104bd57600080fd5b50610382610b2f565b3480156104d257600080fd5b506102ea600d5481565b3480156104e857600080fd5b506103826104f7366004612132565b610bc1565b34801561050857600080fd5b5061024a610517366004612224565b610c08565b34801561052857600080fd5b50610274610c33565b34801561053d57600080fd5b506102ea600081565b34801561055257600080fd5b5061024a6105613660046121df565b610c42565b34801561057257600080fd5b5061024a6105813660046121df565b610cbd565b34801561059257600080fd5b506008546102c1906001600160a01b031681565b3480156105b257600080fd5b506103826105c13660046120f8565b610ccb565b3480156105d257600080fd5b506102ea600b5481565b3480156105e857600080fd5b50610382610d6d565b3480156105fd57600080fd5b5061038261060c3660046120f8565b610da8565b34801561061d57600080fd5b5061038261062c3660046121ac565b610e52565b34801561063d57600080fd5b506102ea61064c366004612132565b610e96565b34801561065d57600080fd5b506102ea60095481565b34801561067357600080fd5b506103826106823660046120f8565b610ec1565b34801561069357600080fd5b506102ea600c5481565b3480156106a957600080fd5b506103826106b8366004612273565b610fd3565b60006001600160e01b0319821663830d5e4960e01b14806106ee57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610703906125b3565b80601f016020809104026020016040519081016040528092919081815260200182805461072f906125b3565b801561077c5780601f106107515761010080835404028352916020019161077c565b820191906000526020600020905b81548152906001019060200180831161075f57829003601f168201915b5050505050905090565b600033610794818585610ff7565b5060019392505050565b6000336107ac85828561111b565b6107b7858585611195565b506001949350505050565b6000805160206126668339815191526107da8161163f565b60006107f260646107ec85605061164c565b906116d2565b905060006108008483611714565b600f546040519192506001600160a01b03169083156108fc029084906000818181858888f1935050505015801561083b573d6000803e3d6000fd5b506010546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610876573d6000803e3d6000fd5b5050505050565b6000805160206126668339815191526108958161163f565b50600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206126668339815191526108d08161163f565b6108e860008051602061268683398151915283610c08565b61094c5760405162461bcd60e51b815260206004820152602a60248201527f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f604482015269207061697220726f6c6560b01b60648201526084015b60405180910390fd5b61096460008051602061268683398151915283611756565b5050565b6001600160a01b03811633146109d85760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610943565b6109648282611756565b6000336107948185856109f58383610e96565b6109ff9190612500565b610ff7565b600080516020612666833981519152610a1c8161163f565b6001600160a01b0382163b610a995760405162461bcd60e51b815260206004820152603960248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060448201527f6973206e6f74206120636f6e74726163742061646472657373000000000000006064820152608401610943565b610ab160008051602061268683398151915283610c08565b15610b175760405162461bcd60e51b815260206004820152603060248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160448201526f647920686173207061697220726f6c6560801b6064820152608401610943565b610964600080516020612686833981519152836117bd565b600080516020612666833981519152610b478161163f565b610b606000805160206126668339815191526000610c08565b15610b7d5760405162461bcd60e51b81526004016109439061240a565b610b9560008051602061266683398151915233611756565b610bae60008051602061266683398151915260006117bd565b50600880546001600160a01b0319169055565b600080516020612666833981519152610bd98161163f565b50600f80546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610703906125b3565b60003381610c508286610e96565b905083811015610cb05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610943565b6107b78286868403610ff7565b600033610794818585611195565b600080516020612666833981519152610ce38161163f565b610cfb60008051602061264683398151915283610c08565b610d555760405162461bcd60e51b815260206004820152602560248201527f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260448201526420726f6c6560d81b6064820152608401610943565b61096460008051602061264683398151915283611756565b600080516020612666833981519152610d858161163f565b3060009081526020819052604090205480610d9f57600080fd5b610964816117c7565b600080516020612666833981519152610dc08161163f565b610dd860008051602061264683398151915283610c08565b15610e3a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860448201526b6173207061697220726f6c6560a01b6064820152608401610943565b610964600080516020612646833981519152836117bd565b600080516020612666833981519152610e6a8161163f565b506001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600080516020612666833981519152610ed98161163f565b6001600160a01b038216610f4b5760405162461bcd60e51b815260206004820152603360248201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776044820152724f776e657220213d206164647265737328302960681b6064820152608401610943565b610f6360008051602061266683398151915283610c08565b15610f805760405162461bcd60e51b81526004016109439061240a565b610f9860008051602061266683398151915233611756565b610fb0600080516020612666833981519152836117bd565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020612666833981519152610feb8161163f565b50600c91909155600d55565b6001600160a01b0383166110595760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610943565b6001600160a01b0382166110ba5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610943565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006111278484610e96565b9050600019811461118f57818110156111825760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610943565b61118f8484848403610ff7565b50505050565b6001600160a01b0383166111bb5760405162461bcd60e51b81526004016109439061245e565b6001600160a01b0382166111e15760405162461bcd60e51b815260040161094390612381565b6001600160a01b03821660009081526006602052604090205460ff166112cd5780600d5410156112535760405162461bcd60e51b815260206004820152601960248201527f45524332303a204d61787478204c696d697420457863656564000000000000006044820152606401610943565b61127c81611276846001600160a01b031660009081526020819052604090205490565b9061199b565b600c5410156112cd5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a206d617857616c6c6574203e3d20616d6f756e740000000000006044820152606401610943565b6112d56120bc565b6001600160a01b03841660009081526020819052604090205481526112f86120da565b61131060008051602061266683398151915286610c08565b158015611332575061133060008051602061266683398151915285610c08565b155b8015611353575061135160008051602061266683398151915233610c08565b155b1515815261136f60008051602061264683398151915286610c08565b8061138d575061138d60008051602061264683398151915285610c08565b1515602082015281518311156113b55760405162461bcd60e51b8152600401610943906123c4565b6113cd60008051602061268683398151915285610c08565b80156113dc5750600e5460ff16155b156114745730600090815260208190526040902054801561147257600e5461010090046001600160a01b031660009081526020819052604090205461142c906064906107ec906002905b9061164c565b81111561146957600e5461010090046001600160a01b0316600090815260208190526040902054611466906064906107ec90600290611426565b90505b611472816117c7565b505b8051801561148457506020810151155b80156114935750600e5460ff16155b1561152357826114b160008051602061268683398151915286610c08565b156114cb576114bf846119fa565b602085015293506114f9565b6114e360008051602061268683398151915233610c08565b156114f9576114f184611a48565b602085015293505b61150281611a85565b60408401819052841061152157604083015161151e9085612559565b93505b505b81516001600160a01b03868116600090815260208190526040808220938790039093559086168152908120805485929061155e908490612500565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516115aa91815260200190565b60405180910390a36020820151158015906115c3575080515b80156115d157506020810151155b80156115e05750600e5460ff16155b156115f6576115f6858360016020020151611aa2565b604082015115801590611607575080515b801561161557506020810151155b80156116245750600e5460ff16155b1561163a5761163a858360026020020151611ab3565b610876565b6116498133611c23565b50565b60008261165b575060006106ee565b6000611667838561253a565b9050826116748583612518565b146116cb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610943565b9392505050565b60006116cb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c87565b60006116cb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cbe565b6117608282610c08565b156109645760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6109648282611cef565b600e805460ff19166001179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061180957611809612604565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561185d57600080fd5b505afa158015611871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118959190612115565b816001815181106118a8576118a8612604565b6001600160a01b0392831660209182029290920101526007546118ce9130911684610ff7565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906119079085906000908690309042906004016124c4565b600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b50479250505066b1a2bc2ec500008111156119535761195347611d75565b7f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a783836040516119849291906124a3565b60405180910390a15050600e805460ff1916905550565b6000806119a88385612500565b9050838110156116cb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610943565b600080612710600954612710611a109190612559565b611a1a908561253a565b611a249190612518565b915061271060095484611a37919061253a565b611a419190612518565b9050915091565b600080612710600a54612710611a5e9190612559565b611a68908561253a565b611a729190612518565b9150612710600a5484611a37919061253a565b6000612710600b5483611a98919061253a565b6106ee9190612518565b801561096457610964823083611e0b565b6001600160a01b038216611b135760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610943565b6001600160a01b03821660009081526020819052604090205481811015611b875760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610943565b6001600160a01b038316600090815260208190526040812083830390558080527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054849290611bd8908490612500565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b611c2d8282610c08565b61096457611c45816001600160a01b03166014611f20565b611c50836020611f20565b604051602001611c619291906122d9565b60408051601f198184030181529082905262461bcd60e51b82526109439160040161234e565b60008183611ca85760405162461bcd60e51b8152600401610943919061234e565b506000611cb58486612518565b95945050505050565b60008184841115611ce25760405162461bcd60e51b8152600401610943919061234e565b506000611cb58486612559565b611cf98282610c08565b6109645760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d313390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611d8760646107ec84605061164c565b90506000611d958383611714565b600f546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015611dd0573d6000803e3d6000fd5b506010546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561118f573d6000803e3d6000fd5b6001600160a01b038316611e315760405162461bcd60e51b81526004016109439061245e565b6001600160a01b038216611e575760405162461bcd60e51b815260040161094390612381565b6001600160a01b03831660009081526020819052604090205481811015611e905760405162461bcd60e51b8152600401610943906123c4565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611ec7908490612500565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f1391815260200190565b60405180910390a361118f565b60606000611f2f83600261253a565b611f3a906002612500565b67ffffffffffffffff811115611f5257611f5261261a565b6040519080825280601f01601f191660200182016040528015611f7c576020820181803683370190505b509050600360fc1b81600081518110611f9757611f97612604565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611fc657611fc6612604565b60200101906001600160f81b031916908160001a9053506000611fea84600261253a565b611ff5906001612500565b90505b600181111561206d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061202957612029612604565b1a60f81b82828151811061203f5761203f612604565b60200101906001600160f81b031916908160001a90535060049490941c936120668161259c565b9050611ff8565b5083156116cb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610943565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60006020828403121561210a57600080fd5b81356116cb81612630565b60006020828403121561212757600080fd5b81516116cb81612630565b6000806040838503121561214557600080fd5b823561215081612630565b9150602083013561216081612630565b809150509250929050565b60008060006060848603121561218057600080fd5b833561218b81612630565b9250602084013561219b81612630565b929592945050506040919091013590565b600080604083850312156121bf57600080fd5b82356121ca81612630565b91506020830135801515811461216057600080fd5b600080604083850312156121f257600080fd5b82356121fd81612630565b946020939093013593505050565b60006020828403121561221d57600080fd5b5035919050565b6000806040838503121561223757600080fd5b82359150602083013561216081612630565b60006020828403121561225b57600080fd5b81356001600160e01b0319811681146116cb57600080fd5b6000806040838503121561228657600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156122ce5781516001600160a01b0316875295820195908201906001016122a9565b509495945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612311816017850160208801612570565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612342816028840160208801612570565b01602801949350505050565b602081526000825180602084015261236d816040850160208701612570565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526034908201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776040820152734f776e657220686173206f776e657220726f6c6560601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b8281526040602082015260006124bc6040830184612295565b949350505050565b85815284602082015260a0604082015260006124e360a0830186612295565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115612513576125136125ee565b500190565b60008261253557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612554576125546125ee565b500290565b60008282101561256b5761256b6125ee565b500390565b60005b8381101561258b578181015183820152602001612573565b8381111561118f5750506000910152565b6000816125ab576125ab6125ee565b506000190190565b600181811c908216806125c757607f821691505b602082108114156125e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461164957600080fdfe270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3d2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5da26469706673582212203096689eb8758523ebdc0840ba3e2668c91f06224eb548be6dec8825a5849a2564736f6c63430008070033270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3000000000000000000000000234dc4cb5ceb7fdcea79b686fb64d063741db423000000000000000000000000234dc4cb5ceb7fdcea79b686fb64d063741db423

Deployed Bytecode

0x60806040526004361061021e5760003560e01c8063715018a611610123578063b6dd0492116100ab578063dd62ed3e1161006f578063dd62ed3e14610631578063e1f3d55a14610651578063f2fde38b14610667578063f8b45b0514610687578063ff64d41f1461069d57600080fd5b8063b6dd0492146105a6578063cf820461146105c6578063cfc1e570146105dc578063d096cd08146105f1578063da8303361461061157600080fd5b806395d89b41116100f257806395d89b411461051c578063a217fddf14610531578063a457c2d714610546578063a9059cbb14610566578063addcf55f1461058657600080fd5b8063715018a6146104b15780637437681e146104c65780637571412c146104dc57806391d14854146104fc57600080fd5b8063313ce567116101a65780633950935111610175578063395093511461040057806347061add1461042057806349bd5a5e146104405780635de6c42f1461046557806370a082311461047b57600080fd5b8063313ce56714610384578063340ac20f146103a05780633515b1af146103c057806336568abe146103e057600080fd5b806318160ddd116101ed57806318160ddd146102d9578063220f6696146102f857806323b872dd14610312578063248a9ca31461033257806326aa6e6d1461036257600080fd5b806301ffc9a71461022a57806306fdde031461025f578063095ea7b3146102815780631694505e146102a157600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061024a610245366004612249565b6106bd565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746106f4565b604051610256919061234e565b34801561028d57600080fd5b5061024a61029c3660046121df565b610786565b3480156102ad57600080fd5b506007546102c1906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b3480156102e557600080fd5b506002545b604051908152602001610256565b34801561030457600080fd5b50600e5461024a9060ff1681565b34801561031e57600080fd5b5061024a61032d36600461216b565b61079e565b34801561033e57600080fd5b506102ea61034d36600461220b565b60009081526005602052604090206001015490565b34801561036e57600080fd5b5061038261037d36600461220b565b6107c2565b005b34801561039057600080fd5b5060405160128152602001610256565b3480156103ac57600080fd5b506103826103bb3660046120f8565b61087d565b3480156103cc57600080fd5b506103826103db3660046120f8565b6108b8565b3480156103ec57600080fd5b506103826103fb366004612224565b610968565b34801561040c57600080fd5b5061024a61041b3660046121df565b6109e2565b34801561042c57600080fd5b5061038261043b3660046120f8565b610a04565b34801561044c57600080fd5b50600e546102c19061010090046001600160a01b031681565b34801561047157600080fd5b506102ea600a5481565b34801561048757600080fd5b506102ea6104963660046120f8565b6001600160a01b031660009081526020819052604090205490565b3480156104bd57600080fd5b50610382610b2f565b3480156104d257600080fd5b506102ea600d5481565b3480156104e857600080fd5b506103826104f7366004612132565b610bc1565b34801561050857600080fd5b5061024a610517366004612224565b610c08565b34801561052857600080fd5b50610274610c33565b34801561053d57600080fd5b506102ea600081565b34801561055257600080fd5b5061024a6105613660046121df565b610c42565b34801561057257600080fd5b5061024a6105813660046121df565b610cbd565b34801561059257600080fd5b506008546102c1906001600160a01b031681565b3480156105b257600080fd5b506103826105c13660046120f8565b610ccb565b3480156105d257600080fd5b506102ea600b5481565b3480156105e857600080fd5b50610382610d6d565b3480156105fd57600080fd5b5061038261060c3660046120f8565b610da8565b34801561061d57600080fd5b5061038261062c3660046121ac565b610e52565b34801561063d57600080fd5b506102ea61064c366004612132565b610e96565b34801561065d57600080fd5b506102ea60095481565b34801561067357600080fd5b506103826106823660046120f8565b610ec1565b34801561069357600080fd5b506102ea600c5481565b3480156106a957600080fd5b506103826106b8366004612273565b610fd3565b60006001600160e01b0319821663830d5e4960e01b14806106ee57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610703906125b3565b80601f016020809104026020016040519081016040528092919081815260200182805461072f906125b3565b801561077c5780601f106107515761010080835404028352916020019161077c565b820191906000526020600020905b81548152906001019060200180831161075f57829003601f168201915b5050505050905090565b600033610794818585610ff7565b5060019392505050565b6000336107ac85828561111b565b6107b7858585611195565b506001949350505050565b6000805160206126668339815191526107da8161163f565b60006107f260646107ec85605061164c565b906116d2565b905060006108008483611714565b600f546040519192506001600160a01b03169083156108fc029084906000818181858888f1935050505015801561083b573d6000803e3d6000fd5b506010546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610876573d6000803e3d6000fd5b5050505050565b6000805160206126668339815191526108958161163f565b50600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206126668339815191526108d08161163f565b6108e860008051602061268683398151915283610c08565b61094c5760405162461bcd60e51b815260206004820152602a60248201527f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f604482015269207061697220726f6c6560b01b60648201526084015b60405180910390fd5b61096460008051602061268683398151915283611756565b5050565b6001600160a01b03811633146109d85760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610943565b6109648282611756565b6000336107948185856109f58383610e96565b6109ff9190612500565b610ff7565b600080516020612666833981519152610a1c8161163f565b6001600160a01b0382163b610a995760405162461bcd60e51b815260206004820152603960248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060448201527f6973206e6f74206120636f6e74726163742061646472657373000000000000006064820152608401610943565b610ab160008051602061268683398151915283610c08565b15610b175760405162461bcd60e51b815260206004820152603060248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160448201526f647920686173207061697220726f6c6560801b6064820152608401610943565b610964600080516020612686833981519152836117bd565b600080516020612666833981519152610b478161163f565b610b606000805160206126668339815191526000610c08565b15610b7d5760405162461bcd60e51b81526004016109439061240a565b610b9560008051602061266683398151915233611756565b610bae60008051602061266683398151915260006117bd565b50600880546001600160a01b0319169055565b600080516020612666833981519152610bd98161163f565b50600f80546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610703906125b3565b60003381610c508286610e96565b905083811015610cb05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610943565b6107b78286868403610ff7565b600033610794818585611195565b600080516020612666833981519152610ce38161163f565b610cfb60008051602061264683398151915283610c08565b610d555760405162461bcd60e51b815260206004820152602560248201527f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260448201526420726f6c6560d81b6064820152608401610943565b61096460008051602061264683398151915283611756565b600080516020612666833981519152610d858161163f565b3060009081526020819052604090205480610d9f57600080fd5b610964816117c7565b600080516020612666833981519152610dc08161163f565b610dd860008051602061264683398151915283610c08565b15610e3a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860448201526b6173207061697220726f6c6560a01b6064820152608401610943565b610964600080516020612646833981519152836117bd565b600080516020612666833981519152610e6a8161163f565b506001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600080516020612666833981519152610ed98161163f565b6001600160a01b038216610f4b5760405162461bcd60e51b815260206004820152603360248201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776044820152724f776e657220213d206164647265737328302960681b6064820152608401610943565b610f6360008051602061266683398151915283610c08565b15610f805760405162461bcd60e51b81526004016109439061240a565b610f9860008051602061266683398151915233611756565b610fb0600080516020612666833981519152836117bd565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020612666833981519152610feb8161163f565b50600c91909155600d55565b6001600160a01b0383166110595760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610943565b6001600160a01b0382166110ba5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610943565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006111278484610e96565b9050600019811461118f57818110156111825760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610943565b61118f8484848403610ff7565b50505050565b6001600160a01b0383166111bb5760405162461bcd60e51b81526004016109439061245e565b6001600160a01b0382166111e15760405162461bcd60e51b815260040161094390612381565b6001600160a01b03821660009081526006602052604090205460ff166112cd5780600d5410156112535760405162461bcd60e51b815260206004820152601960248201527f45524332303a204d61787478204c696d697420457863656564000000000000006044820152606401610943565b61127c81611276846001600160a01b031660009081526020819052604090205490565b9061199b565b600c5410156112cd5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a206d617857616c6c6574203e3d20616d6f756e740000000000006044820152606401610943565b6112d56120bc565b6001600160a01b03841660009081526020819052604090205481526112f86120da565b61131060008051602061266683398151915286610c08565b158015611332575061133060008051602061266683398151915285610c08565b155b8015611353575061135160008051602061266683398151915233610c08565b155b1515815261136f60008051602061264683398151915286610c08565b8061138d575061138d60008051602061264683398151915285610c08565b1515602082015281518311156113b55760405162461bcd60e51b8152600401610943906123c4565b6113cd60008051602061268683398151915285610c08565b80156113dc5750600e5460ff16155b156114745730600090815260208190526040902054801561147257600e5461010090046001600160a01b031660009081526020819052604090205461142c906064906107ec906002905b9061164c565b81111561146957600e5461010090046001600160a01b0316600090815260208190526040902054611466906064906107ec90600290611426565b90505b611472816117c7565b505b8051801561148457506020810151155b80156114935750600e5460ff16155b1561152357826114b160008051602061268683398151915286610c08565b156114cb576114bf846119fa565b602085015293506114f9565b6114e360008051602061268683398151915233610c08565b156114f9576114f184611a48565b602085015293505b61150281611a85565b60408401819052841061152157604083015161151e9085612559565b93505b505b81516001600160a01b03868116600090815260208190526040808220938790039093559086168152908120805485929061155e908490612500565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516115aa91815260200190565b60405180910390a36020820151158015906115c3575080515b80156115d157506020810151155b80156115e05750600e5460ff16155b156115f6576115f6858360016020020151611aa2565b604082015115801590611607575080515b801561161557506020810151155b80156116245750600e5460ff16155b1561163a5761163a858360026020020151611ab3565b610876565b6116498133611c23565b50565b60008261165b575060006106ee565b6000611667838561253a565b9050826116748583612518565b146116cb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610943565b9392505050565b60006116cb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c87565b60006116cb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cbe565b6117608282610c08565b156109645760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6109648282611cef565b600e805460ff19166001179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061180957611809612604565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561185d57600080fd5b505afa158015611871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118959190612115565b816001815181106118a8576118a8612604565b6001600160a01b0392831660209182029290920101526007546118ce9130911684610ff7565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906119079085906000908690309042906004016124c4565b600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b50479250505066b1a2bc2ec500008111156119535761195347611d75565b7f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a783836040516119849291906124a3565b60405180910390a15050600e805460ff1916905550565b6000806119a88385612500565b9050838110156116cb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610943565b600080612710600954612710611a109190612559565b611a1a908561253a565b611a249190612518565b915061271060095484611a37919061253a565b611a419190612518565b9050915091565b600080612710600a54612710611a5e9190612559565b611a68908561253a565b611a729190612518565b9150612710600a5484611a37919061253a565b6000612710600b5483611a98919061253a565b6106ee9190612518565b801561096457610964823083611e0b565b6001600160a01b038216611b135760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610943565b6001600160a01b03821660009081526020819052604090205481811015611b875760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610943565b6001600160a01b038316600090815260208190526040812083830390558080527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054849290611bd8908490612500565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b611c2d8282610c08565b61096457611c45816001600160a01b03166014611f20565b611c50836020611f20565b604051602001611c619291906122d9565b60408051601f198184030181529082905262461bcd60e51b82526109439160040161234e565b60008183611ca85760405162461bcd60e51b8152600401610943919061234e565b506000611cb58486612518565b95945050505050565b60008184841115611ce25760405162461bcd60e51b8152600401610943919061234e565b506000611cb58486612559565b611cf98282610c08565b6109645760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d313390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611d8760646107ec84605061164c565b90506000611d958383611714565b600f546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015611dd0573d6000803e3d6000fd5b506010546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561118f573d6000803e3d6000fd5b6001600160a01b038316611e315760405162461bcd60e51b81526004016109439061245e565b6001600160a01b038216611e575760405162461bcd60e51b815260040161094390612381565b6001600160a01b03831660009081526020819052604090205481811015611e905760405162461bcd60e51b8152600401610943906123c4565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611ec7908490612500565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f1391815260200190565b60405180910390a361118f565b60606000611f2f83600261253a565b611f3a906002612500565b67ffffffffffffffff811115611f5257611f5261261a565b6040519080825280601f01601f191660200182016040528015611f7c576020820181803683370190505b509050600360fc1b81600081518110611f9757611f97612604565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611fc657611fc6612604565b60200101906001600160f81b031916908160001a9053506000611fea84600261253a565b611ff5906001612500565b90505b600181111561206d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061202957612029612604565b1a60f81b82828151811061203f5761203f612604565b60200101906001600160f81b031916908160001a90535060049490941c936120668161259c565b9050611ff8565b5083156116cb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610943565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60006020828403121561210a57600080fd5b81356116cb81612630565b60006020828403121561212757600080fd5b81516116cb81612630565b6000806040838503121561214557600080fd5b823561215081612630565b9150602083013561216081612630565b809150509250929050565b60008060006060848603121561218057600080fd5b833561218b81612630565b9250602084013561219b81612630565b929592945050506040919091013590565b600080604083850312156121bf57600080fd5b82356121ca81612630565b91506020830135801515811461216057600080fd5b600080604083850312156121f257600080fd5b82356121fd81612630565b946020939093013593505050565b60006020828403121561221d57600080fd5b5035919050565b6000806040838503121561223757600080fd5b82359150602083013561216081612630565b60006020828403121561225b57600080fd5b81356001600160e01b0319811681146116cb57600080fd5b6000806040838503121561228657600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156122ce5781516001600160a01b0316875295820195908201906001016122a9565b509495945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612311816017850160208801612570565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612342816028840160208801612570565b01602801949350505050565b602081526000825180602084015261236d816040850160208701612570565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526034908201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776040820152734f776e657220686173206f776e657220726f6c6560601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b8281526040602082015260006124bc6040830184612295565b949350505050565b85815284602082015260a0604082015260006124e360a0830186612295565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115612513576125136125ee565b500190565b60008261253557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612554576125546125ee565b500290565b60008282101561256b5761256b6125ee565b500390565b60005b8381101561258b578181015183820152602001612573565b8381111561118f5750506000910152565b6000816125ab576125ab6125ee565b506000190190565b600181811c908216806125c757607f821691505b602082108114156125e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461164957600080fdfe270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3d2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5da26469706673582212203096689eb8758523ebdc0840ba3e2668c91f06224eb548be6dec8825a5849a2564736f6c63430008070033

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

000000000000000000000000234dc4cb5ceb7fdcea79b686fb64d063741db423000000000000000000000000234dc4cb5ceb7fdcea79b686fb64d063741db423

-----Decoded View---------------
Arg [0] : m1 (address): 0x234dC4cB5ceb7fdCea79b686FB64D063741DB423
Arg [1] : m2 (address): 0x234dC4cB5ceb7fdCea79b686FB64D063741DB423

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000234dc4cb5ceb7fdcea79b686fb64d063741db423
Arg [1] : 000000000000000000000000234dc4cb5ceb7fdcea79b686fb64d063741db423


Deployed Bytecode Sourcemap

32248:10393:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10691:204;;;;;;;;;;-1:-1:-1;10691:204:0;;;;;:::i;:::-;;:::i;:::-;;;4981:14:1;;4974:22;4956:41;;4944:2;4929:18;10691:204:0;;;;;;;;19871:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22222:201::-;;;;;;;;;;-1:-1:-1;22222:201:0;;;;;:::i;:::-;;:::i;32385:41::-;;;;;;;;;;-1:-1:-1;32385:41:0;;;;-1:-1:-1;;;;;32385:41:0;;;;;;-1:-1:-1;;;;;4772:32:1;;;4754:51;;4742:2;4727:18;32385:41:0;4608:203:1;20991:108:0;;;;;;;;;;-1:-1:-1;21079:12:0;;20991:108;;;5154:25:1;;;5142:2;5127:18;20991:108:0;5008:177:1;32919:36:0;;;;;;;;;;-1:-1:-1;32919:36:0;;;;;;;;23003:295;;;;;;;;;;-1:-1:-1;23003:295:0;;;;;:::i;:::-;;:::i;12527:131::-;;;;;;;;;;-1:-1:-1;12527:131:0;;;;;:::i;:::-;12601:7;12628:12;;;:6;:12;;;;;:22;;;;12527:131;41379:297;;;;;;;;;;-1:-1:-1;41379:297:0;;;;;:::i;:::-;;:::i;:::-;;20833:93;;;;;;;;;;-1:-1:-1;20833:93:0;;20916:2;15812:36:1;;15800:2;15785:18;20833:93:0;15670:184:1;36049:136:0;;;;;;;;;;-1:-1:-1;36049:136:0;;;;;:::i;:::-;;:::i;34666:207::-;;;;;;;;;;-1:-1:-1;34666:207:0;;;;;:::i;:::-;;:::i;13165:218::-;;;;;;;;;;-1:-1:-1;13165:218:0;;;;;:::i;:::-;;:::i;23707:238::-;;;;;;;;;;-1:-1:-1;23707:238:0;;;;;:::i;:::-;;:::i;33975:311::-;;;;;;;;;;-1:-1:-1;33975:311:0;;;;;:::i;:::-;;:::i;32964:28::-;;;;;;;;;;-1:-1:-1;32964:28:0;;;;;;;-1:-1:-1;;;;;32964:28:0;;;32782:26;;;;;;;;;;;;;;;;21162:127;;;;;;;;;;-1:-1:-1;21162:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;21263:18:0;21236:7;21263:18;;;;;;;;;;;;21162:127;35665:309;;;;;;;;;;;;;:::i;32883:28::-;;;;;;;;;;;;;;;;41685:175;;;;;;;;;;-1:-1:-1;41685:175:0;;;;;:::i;:::-;;:::i;10987:147::-;;;;;;;;;;-1:-1:-1;10987:147:0;;;;;:::i;:::-;;:::i;20090:104::-;;;;;;;;;;;;;:::i;10092:49::-;;;;;;;;;;-1:-1:-1;10092:49:0;10137:4;10092:49;;24448:436;;;;;;;;;;-1:-1:-1;24448:436:0;;;;;:::i;:::-;;:::i;21495:193::-;;;;;;;;;;-1:-1:-1;21495:193:0;;;;;:::i;:::-;;:::i;32678:22::-;;;;;;;;;;-1:-1:-1;32678:22:0;;;;-1:-1:-1;;;;;32678:22:0;;;34937:212;;;;;;;;;;-1:-1:-1;34937:212:0;;;;;:::i;:::-;;:::i;32815:21::-;;;;;;;;;;;;;;;;36264:186;;;;;;;;;;;;;:::i;34297:223::-;;;;;;;;;;-1:-1:-1;34297:223:0;;;;;:::i;:::-;;:::i;34528:125::-;;;;;;;;;;-1:-1:-1;34528:125:0;;;;;:::i;:::-;;:::i;21751:151::-;;;;;;;;;;-1:-1:-1;21751:151:0;;;;;:::i;:::-;;:::i;32747:27::-;;;;;;;;;;;;;;;;35240:416;;;;;;;;;;-1:-1:-1;35240:416:0;;;;;:::i;:::-;;:::i;32843:32::-;;;;;;;;;;;;;;;;36459:153;;;;;;;;;;-1:-1:-1;36459:153:0;;;;;:::i;:::-;;:::i;10691:204::-;10776:4;-1:-1:-1;;;;;;10800:47:0;;-1:-1:-1;;;10800:47:0;;:87;;-1:-1:-1;;;;;;;;;;8209:40:0;;;10851:36;10793:94;10691:204;-1:-1:-1;;10691:204:0:o;19871:100::-;19925:13;19958:5;19951:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19871:100;:::o;22222:201::-;22305:4;7242:10;22361:32;7242:10;22377:7;22386:6;22361:8;:32::i;:::-;-1:-1:-1;22411:4:0;;22222:201;-1:-1:-1;;;22222:201:0:o;23003:295::-;23134:4;7242:10;23192:38;23208:4;7242:10;23223:6;23192:15;:38::i;:::-;23241:27;23251:4;23257:2;23261:6;23241:9;:27::i;:::-;-1:-1:-1;23286:4:0;;23003:295;-1:-1:-1;;;;23003:295:0:o;41379:297::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;41466:19:::1;41488:23;41507:3;41488:14;:6:::0;41499:2:::1;41488:10;:14::i;:::-;:18:::0;::::1;:23::i;:::-;41466:45:::0;-1:-1:-1;41522:17:0::1;41542:23;:6:::0;41466:45;41542:10:::1;:23::i;:::-;41584:10;::::0;41576:41:::1;::::0;41522:43;;-1:-1:-1;;;;;;41584:10:0::1;::::0;41576:41;::::1;;;::::0;41605:11;;41584:10:::1;41576:41:::0;41584:10;41576:41;41605:11;41584:10;41576:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;41636:11:0::1;::::0;41628:40:::1;::::0;-1:-1:-1;;;;;41636:11:0;;::::1;::::0;41628:40;::::1;;;::::0;41658:9;;41636:11:::1;41628:40:::0;41636:11;41628:40;41658:9;41636:11;41628:40;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41455:221;;41379:297:::0;;:::o;36049:136::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;-1:-1:-1;36132:15:0::1;:45:::0;;-1:-1:-1;;;;;;36132:45:0::1;-1:-1:-1::0;;;;;36132:45:0;;;::::1;::::0;;;::::1;::::0;;36049:136::o;34666:207::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;34756:24:::1;-1:-1:-1::0;;;;;;;;;;;34775:4:0::1;34756:7;:24::i;:::-;34748:79;;;::::0;-1:-1:-1;;;34748:79:0;;13179:2:1;34748:79:0::1;::::0;::::1;13161:21:1::0;13218:2;13198:18;;;13191:30;13257:34;13237:18;;;13230:62;-1:-1:-1;;;13308:18:1;;;13301:40;13358:19;;34748:79:0::1;;;;;;;;;34838:27;-1:-1:-1::0;;;;;;;;;;;34860:4:0::1;34838:11;:27::i;:::-;34666:207:::0;;:::o;13165:218::-;-1:-1:-1;;;;;13261:23:0;;7242:10;13261:23;13253:83;;;;-1:-1:-1;;;13253:83:0;;14350:2:1;13253:83:0;;;14332:21:1;14389:2;14369:18;;;14362:30;14428:34;14408:18;;;14401:62;-1:-1:-1;;;14479:18:1;;;14472:45;14534:19;;13253:83:0;14148:411:1;13253:83:0;13349:26;13361:4;13367:7;13349:11;:26::i;23707:238::-;23795:4;7242:10;23851:64;7242:10;23867:7;23904:10;23876:25;7242:10;23867:7;23876:9;:25::i;:::-;:38;;;;:::i;:::-;23851:8;:64::i;33975:311::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;-1:-1:-1;;;;;41951:19:0;;;34058:86:::1;;;::::0;-1:-1:-1;;;34058:86:0;;7182:2:1;34058:86:0::1;::::0;::::1;7164:21:1::0;7221:2;7201:18;;;7194:30;7260:34;7240:18;;;7233:62;7331:27;7311:18;;;7304:55;7376:19;;34058:86:0::1;6980:421:1::0;34058:86:0::1;34164:24;-1:-1:-1::0;;;;;;;;;;;34183:4:0::1;34164:7;:24::i;:::-;34163:25;34155:86;;;::::0;-1:-1:-1;;;34155:86:0;;10726:2:1;34155:86:0::1;::::0;::::1;10708:21:1::0;10765:2;10745:18;;;10738:30;10804:34;10784:18;;;10777:62;-1:-1:-1;;;10855:18:1;;;10848:46;10911:19;;34155:86:0::1;10524:412:1::0;34155:86:0::1;34252:26;-1:-1:-1::0;;;;;;;;;;;34273:4:0::1;34252:10;:26::i;35665:309::-:0;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;35747:34:::1;-1:-1:-1::0;;;;;;;;;;;35778:1:0::1;35747:7;:34::i;:::-;35746:35;35738:100;;;;-1:-1:-1::0;;;35738:100:0::1;;;;;;;:::i;:::-;35849:39;-1:-1:-1::0;;;;;;;;;;;7242:10:0;35849:11:::1;:39::i;:::-;35899:36;-1:-1:-1::0;;;;;;;;;;;35932:1:0::1;35899:10;:36::i;:::-;-1:-1:-1::0;35946:7:0::1;:20:::0;;-1:-1:-1;;;;;;35946:20:0::1;::::0;;35665:309::o;41685:175::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;-1:-1:-1;41795:10:0::1;:22:::0;;-1:-1:-1;;;;;41795:22:0;;::::1;-1:-1:-1::0;;;;;;41795:22:0;;::::1;;::::0;;;41828:11:::1;:24:::0;;;;;::::1;::::0;::::1;;::::0;;41685:175::o;10987:147::-;11073:4;11097:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;11097:29:0;;;;;;;;;;;;;;;10987:147::o;20090:104::-;20146:13;20179:7;20172:14;;;;;:::i;24448:436::-;24541:4;7242:10;24541:4;24624:25;7242:10;24641:7;24624:9;:25::i;:::-;24597:52;;24688:15;24668:16;:35;;24660:85;;;;-1:-1:-1;;;24660:85:0;;13944:2:1;24660:85:0;;;13926:21:1;13983:2;13963:18;;;13956:30;14022:34;14002:18;;;13995:62;-1:-1:-1;;;14073:18:1;;;14066:35;14118:19;;24660:85:0;13742:401:1;24660:85:0;24781:60;24790:5;24797:7;24825:15;24806:16;:34;24781:8;:60::i;21495:193::-;21574:4;7242:10;21630:28;7242:10;21647:2;21651:6;21630:9;:28::i;34937:212::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;35024:31:::1;-1:-1:-1::0;;;;;;;;;;;35047:7:0::1;35024;:31::i;:::-;35016:81;;;::::0;-1:-1:-1;;;35016:81:0;;9500:2:1;35016:81:0::1;::::0;::::1;9482:21:1::0;9539:2;9519:18;;;9512:30;9578:34;9558:18;;;9551:62;-1:-1:-1;;;9629:18:1;;;9622:35;9674:19;;35016:81:0::1;9298:401:1::0;35016:81:0::1;35107:34;-1:-1:-1::0;;;;;;;;;;;35133:7:0::1;35107:11;:34::i;36264:186::-:0;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;36362:4:::1;36330:11;21263:18:::0;;;;;;;;;;;36387:10;36379:19:::1;;;::::0;::::1;;36409:33;36435:6;36409:25;:33::i;34297:223::-:0;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;34388:31:::1;-1:-1:-1::0;;;;;;;;;;;34411:7:0::1;34388;:31::i;:::-;34387:32;34379:89;;;::::0;-1:-1:-1;;;34379:89:0;;10313:2:1;34379:89:0::1;::::0;::::1;10295:21:1::0;10352:2;10332:18;;;10325:30;10391:34;10371:18;;;10364:62;-1:-1:-1;;;10442:18:1;;;10435:42;10494:19;;34379:89:0::1;10111:408:1::0;34379:89:0::1;34479:33;-1:-1:-1::0;;;;;;;;;;;34504:7:0::1;34479:10;:33::i;34528:125::-:0;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;-1:-1:-1;;;;;;34626:11:0;;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:19;;-1:-1:-1;;34626:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34528:125::o;21751:151::-;-1:-1:-1;;;;;21867:18:0;;;21840:7;21867:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21751:151::o;35240:416::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;-1:-1:-1;;;;;35337:22:0;::::1;35329:86;;;::::0;-1:-1:-1;;;35329:86:0;;9080:2:1;35329:86:0::1;::::0;::::1;9062:21:1::0;9119:2;9099:18;;;9092:30;9158:34;9138:18;;;9131:62;-1:-1:-1;;;9209:18:1;;;9202:49;9268:19;;35329:86:0::1;8878:415:1::0;35329:86:0::1;35435:32;-1:-1:-1::0;;;;;;;;;;;35458:8:0::1;35435:7;:32::i;:::-;35434:33;35426:98;;;;-1:-1:-1::0;;;35426:98:0::1;;;;;;;:::i;:::-;35535:39;-1:-1:-1::0;;;;;;;;;;;7242:10:0;35849:11:::1;:39::i;35535:::-;35585:34;-1:-1:-1::0;;;;;;;;;;;35610:8:0::1;35585:10;:34::i;:::-;-1:-1:-1::0;35630:7:0::1;:18:::0;;-1:-1:-1;;;;;;35630:18:0::1;-1:-1:-1::0;;;;;35630:18:0;;;::::1;::::0;;;::::1;::::0;;35240:416::o;36459:153::-;-1:-1:-1;;;;;;;;;;;10583:16:0;10594:4;10583:10;:16::i;:::-;-1:-1:-1;36561:9:0::1;:19:::0;;;;36590:5:::1;:14:::0;36459:153::o;28082:380::-;-1:-1:-1;;;;;28218:19:0;;28210:68;;;;-1:-1:-1;;;28210:68:0;;12774:2:1;28210:68:0;;;12756:21:1;12813:2;12793:18;;;12786:30;12852:34;12832:18;;;12825:62;-1:-1:-1;;;12903:18:1;;;12896:34;12947:19;;28210:68:0;12572:400:1;28210:68:0;-1:-1:-1;;;;;28297:21:0;;28289:68;;;;-1:-1:-1;;;28289:68:0;;7608:2:1;28289:68:0;;;7590:21:1;7647:2;7627:18;;;7620:30;7686:34;7666:18;;;7659:62;-1:-1:-1;;;7737:18:1;;;7730:32;7779:19;;28289:68:0;7406:398:1;28289:68:0;-1:-1:-1;;;;;28370:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28422:32;;5154:25:1;;;28422:32:0;;5127:18:1;28422:32:0;;;;;;;28082:380;;;:::o;28753:453::-;28888:24;28915:25;28925:5;28932:7;28915:9;:25::i;:::-;28888:52;;-1:-1:-1;;28955:16:0;:37;28951:248;;29037:6;29017:16;:26;;29009:68;;;;-1:-1:-1;;;29009:68:0;;8722:2:1;29009:68:0;;;8704:21:1;8761:2;8741:18;;;8734:30;8800:31;8780:18;;;8773:59;8849:18;;29009:68:0;8520:353:1;29009:68:0;29121:51;29130:5;29137:7;29165:6;29146:16;:25;29121:8;:51::i;:::-;28877:329;28753:453;;;:::o;36683:2419::-;-1:-1:-1;;;;;36815:18:0;;36807:68;;;;-1:-1:-1;;;36807:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36894:16:0;;36886:64;;;;-1:-1:-1;;;36886:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36967:8:0;;;;;;:4;:8;;;;;;;;36963:185;;37008:6;37000:5;;:14;;36992:51;;;;-1:-1:-1;;;36992:51:0;;13590:2:1;36992:51:0;;;13572:21:1;13629:2;13609:18;;;13602:30;13668:27;13648:18;;;13641:55;13713:18;;36992:51:0;13388:349:1;36992:51:0;37080:25;37098:6;37080:13;37090:2;-1:-1:-1;;;;;21263:18:0;21236:7;21263:18;;;;;;;;;;;;21162:127;37080:13;:17;;:25::i;:::-;37066:9;;:39;;37058:78;;;;-1:-1:-1;;;37058:78:0;;8011:2:1;37058:78:0;;;7993:21:1;8050:2;8030:18;;;8023:30;8089:28;8069:18;;;8062:56;8135:18;;37058:78:0;7809:350:1;37058:78:0;37219:26;;:::i;:::-;-1:-1:-1;;;;;37270:15:0;;:9;:15;;;;;;;;;;;37256:29;;37298:21;;:::i;:::-;37345:28;-1:-1:-1;;;;;;;;;;;37368:4:0;37345:7;:28::i;:::-;37344:29;37343:64;;;;;37380:26;-1:-1:-1;;;;;;;;;;;37403:2:0;37380:7;:26::i;:::-;37379:27;37343:64;:107;;;;-1:-1:-1;37413:36:0;-1:-1:-1;;;;;;;;;;;7242:10:0;10987:147;:::i;37413:36::-;37412:37;37343:107;37331:119;;;;37474:28;-1:-1:-1;;;;;;;;;;;37497:4:0;37474:7;:28::i;:::-;37473:62;;;;37508:26;-1:-1:-1;;;;;;;;;;;37531:2:0;37508:7;:26::i;:::-;37461:74;;:9;;;:74;37564:11;;:21;-1:-1:-1;37564:21:0;37556:72;;;;-1:-1:-1;;;37556:72:0;;;;;;;:::i;:::-;37652:22;-1:-1:-1;;;;;;;;;;;37671:2:0;37652:7;:22::i;:::-;:43;;;;-1:-1:-1;37679:16:0;;;;37678:17;37652:43;37649:421;;;37753:4;37712:20;21263:18;;;;;;;;;;;37777:19;;37774:285;;37850:13;;;;;-1:-1:-1;;;;;37850:13:0;21236:7;21263:18;;;;;;;;;;;37840:40;;37876:3;;37840:31;;37869:1;;37840:24;:28;;:31::i;:40::-;37822:15;:58;37819:164;;;37933:13;;;;;-1:-1:-1;;;;;37933:13:0;21236:7;21263:18;;;;;;;;;;;37923:40;;37959:3;;37923:31;;37952:1;;37923:24;21162:127;37923:40;37905:58;;37819:164;38001:42;38027:15;38001:25;:42::i;:::-;37697:373;37649:421;38085:9;;:23;;;;-1:-1:-1;38099:9:0;;;;38098:10;38085:23;:44;;;;-1:-1:-1;38113:16:0;;;;38112:17;38085:44;38082:521;;;38164:6;38190:22;-1:-1:-1;;;;;;;;;;;38209:2:0;38190:7;:22::i;:::-;38185:254;;;38271:26;38290:6;38271:18;:26::i;:::-;38256:11;;;38247:50;;-1:-1:-1;38185:254:0;;;38321:32;-1:-1:-1;;;;;;;;;;;7242:10:0;10987:147;:::i;38321:32::-;38318:121;;;38398:25;38416:6;38398:17;:25::i;:::-;38383:11;;;38374:49;;-1:-1:-1;38318:121:0;38470:23;38485:7;38470:14;:23::i;:::-;38456:11;;;:37;;;38513:21;;38510:82;;38565:11;;;;38555:21;;;;:::i;:::-;;;38510:82;38131:472;38082:521;38658:11;;-1:-1:-1;;;;;38640:15:0;;;38667:1;38640:15;;;38658:11;38640:15;;;;;;;38658:20;;;;38640:38;;;38700:13;;;;;;;;:23;;38672:6;;38667:1;38700:23;;38672:6;;38700:23;:::i;:::-;;;;;;;;38756:2;-1:-1:-1;;;;;38741:26:0;38750:4;-1:-1:-1;;;;;38741:26:0;;38760:6;38741:26;;;;5154:25:1;;5142:2;5127:18;;5008:177;38741:26:0;;;;;;;;38793:11;;;;:15;;;;38792:30;;-1:-1:-1;38813:9:0;;38792:30;:44;;;;-1:-1:-1;38827:9:0;;;;38826:10;38792:44;:65;;;;-1:-1:-1;38841:16:0;;;;38840:17;38792:65;38789:123;;;38874:26;38882:4;38888:8;38897:1;38888:11;;;;38874:7;:26::i;:::-;38928:11;;;;:15;;;;38927:30;;-1:-1:-1;38948:9:0;;38927:30;:44;;;;-1:-1:-1;38962:9:0;;;;38961:10;38927:44;:65;;;;-1:-1:-1;38976:16:0;;;;38975:17;38927:65;38924:121;;;39009:24;39015:4;39021:8;39030:1;39021:11;;;;39009:5;:24::i;:::-;39057:37;29806:125;11438:105;11505:30;11516:4;7242:10;11505;:30::i;:::-;11438:105;:::o;31225:250::-;31283:7;31307:6;31303:47;;-1:-1:-1;31337:1:0;31330:8;;31303:47;31362:9;31374:5;31378:1;31374;:5;:::i;:::-;31362:17;-1:-1:-1;31407:1:0;31398:5;31402:1;31362:17;31398:5;:::i;:::-;:10;31390:56;;;;-1:-1:-1;;;31390:56:0;;11143:2:1;31390:56:0;;;11125:21:1;11182:2;11162:18;;;11155:30;11221:34;11201:18;;;11194:62;-1:-1:-1;;;11272:18:1;;;11265:31;11313:19;;31390:56:0;10941:397:1;31390:56:0;31466:1;31225:250;-1:-1:-1;;;31225:250:0:o;31485:132::-;31543:7;31570:39;31574:1;31577;31570:39;;;;;;;;;;;;;;;;;:3;:39::i;30881:136::-;30939:7;30966:43;30970:1;30973;30966:43;;;;;;;;;;;;;;;;;:3;:43::i;15036:239::-;15120:22;15128:4;15134:7;15120;:22::i;:::-;15116:152;;;15191:5;15159:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;15159:29:0;;;;;;;;;;:37;;-1:-1:-1;;15159:37:0;;;15216:40;7242:10;;15159:12;;15216:40;;15191:5;15216:40;15036:239;;:::o;14042:112::-;14121:25;14132:4;14138:7;14121:10;:25::i;40313:783::-;33885:16;:23;;-1:-1:-1;;33885:23:0;33904:4;33885:23;;;40424:16:::1;::::0;;40438:1:::1;40424:16:::0;;;;;::::1;::::0;;-1:-1:-1;;40424:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;40424:16:0::1;40400:40;;40469:4;40451;40456:1;40451:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40451:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;40495:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;40495:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;40451:7;;40495:22;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40485:4;40490:1;40485:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40485:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;40562:15:::1;::::0;40530:62:::1;::::0;40547:4:::1;::::0;40562:15:::1;40580:11:::0;40530:8:::1;:62::i;:::-;40605:15;::::0;:194:::1;::::0;-1:-1:-1;;;40605:194:0;;-1:-1:-1;;;;;40605:15:0;;::::1;::::0;:66:::1;::::0;:194:::1;::::0;40686:11;;40605:15:::1;::::0;40728:4;;40755::::1;::::0;40773:15:::1;::::0;40605:194:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;40842:21:0::1;::::0;-1:-1:-1;;;40906:17:0::1;40885:38:::0;::::1;40882:117;;;40948:35;40961:21;40948:12;:35::i;:::-;41016:72;41047:11;41073:4;41016:72;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;33931:16:0;:24;;-1:-1:-1;;33931:24:0;;;-1:-1:-1;40313:783:0:o;30692:181::-;30750:7;;30782:5;30786:1;30782;:5;:::i;:::-;30770:17;;30811:1;30806;:6;;30798:46;;;;-1:-1:-1;;;30798:46:0;;8366:2:1;30798:46:0;;;8348:21:1;8405:2;8385:18;;;8378:30;8444:29;8424:18;;;8417:57;8491:18;;30798:46:0;8164:351:1;41993:247:0;42056:20;42078:16;32735:5;42150:9;;32735:5;42136:23;;;;:::i;:::-;42126:34;;:6;:34;:::i;:::-;:48;;;;:::i;:::-;42107:67;;32735:5;42209:9;;42200:6;:18;;;;:::i;:::-;:32;;;;:::i;:::-;42185:47;;41993:247;;;:::o;42251:242::-;42313:20;42335:15;32735:5;42406:8;;32735:5;42392:22;;;;:::i;:::-;42382:33;;:6;:33;:::i;:::-;:47;;;;:::i;:::-;42363:66;;32735:5;42463:8;;42454:6;:17;;;;:::i;42503:129::-;42562:11;32735:5;42605;;42596:6;:14;;;;:::i;:::-;:28;;;;:::i;40139:164::-;40210:11;;40207:89;;40238:46;40254:5;40269:4;40276:7;40238:15;:46::i;39115:601::-;-1:-1:-1;;;;;39200:21:0;;39192:67;;;;-1:-1:-1;;;39192:67:0;;11966:2:1;39192:67:0;;;11948:21:1;12005:2;11985:18;;;11978:30;12044:34;12024:18;;;12017:62;-1:-1:-1;;;12095:18:1;;;12088:31;12136:19;;39192:67:0;11764:397:1;39192:67:0;-1:-1:-1;;;;;39359:18:0;;39334:22;39359:18;;;;;;;;;;;39396:24;;;;39388:71;;;;-1:-1:-1;;;39388:71:0;;6779:2:1;39388:71:0;;;6761:21:1;6818:2;6798:18;;;6791:30;6857:34;6837:18;;;6830:62;-1:-1:-1;;;6908:18:1;;;6901:32;6950:19;;39388:71:0;6577:398:1;39388:71:0;-1:-1:-1;;;;;39495:18:0;;:9;:18;;;;;;;;;;39516:23;;;39495:44;;39561:21;;;;:31;;39533:6;;39495:9;39561:31;;39533:6;;39561:31;:::i;:::-;;;;-1:-1:-1;;39610:37:0;;5154:25:1;;;39636:1:0;;-1:-1:-1;;;;;39610:37:0;;;;;5142:2:1;5127:18;39610:37:0;;;;;;;29806:125;;;:::o;11833:505::-;11922:22;11930:4;11936:7;11922;:22::i;:::-;11917:414;;12110:41;12138:7;-1:-1:-1;;;;;12110:41:0;12148:2;12110:19;:41::i;:::-;12224:38;12252:4;12259:2;12224:19;:38::i;:::-;12015:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12015:270:0;;;;;;;;;;-1:-1:-1;;;11961:358:0;;;;;;;:::i;31625:278::-;31711:7;31746:12;31739:5;31731:28;;;;-1:-1:-1;;;31731:28:0;;;;;;;;:::i;:::-;-1:-1:-1;31770:9:0;31782:5;31786:1;31782;:5;:::i;:::-;31770:17;31625:278;-1:-1:-1;;;;;31625:278:0:o;31025:192::-;31111:7;31147:12;31139:6;;;;31131:29;;;;-1:-1:-1;;;31131:29:0;;;;;;;;:::i;:::-;-1:-1:-1;31171:9:0;31183:5;31187:1;31183;:5;:::i;14666:238::-;14750:22;14758:4;14764:7;14750;:22::i;:::-;14745:152;;14789:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14789:29:0;;;;;;;;;:36;;-1:-1:-1;;14789:36:0;14821:4;14789:36;;;14872:12;7242:10;;7162:98;14872:12;-1:-1:-1;;;;;14845:40:0;14863:7;-1:-1:-1;;;;;14845:40:0;14857:4;14845:40;;;;;;;;;;14666:238;;:::o;41104:267::-;41161:19;41183:23;41202:3;41183:14;:6;41194:2;41183:10;:14::i;:23::-;41161:45;-1:-1:-1;41217:17:0;41237:23;:6;41161:45;41237:10;:23::i;:::-;41279:10;;41271:41;;41217:43;;-1:-1:-1;;;;;;41279:10:0;;41271:41;;;;;41300:11;;41279:10;41271:41;41279:10;41271:41;41300:11;41279:10;41271:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41331:11:0;;41323:40;;-1:-1:-1;;;;;41331:11:0;;;;41323:40;;;;;41353:9;;41331:11;41323:40;41331:11;41323:40;41353:9;41331:11;41323:40;;;;;;;;;;;;;;;;;;;25363:671;-1:-1:-1;;;;;25494:18:0;;25486:68;;;;-1:-1:-1;;;25486:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25573:16:0;;25565:64;;;;-1:-1:-1;;;25565:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25715:15:0;;25693:19;25715:15;;;;;;;;;;;25749:21;;;;25741:72;;;;-1:-1:-1;;;25741:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25849:15:0;;;:9;:15;;;;;;;;;;;25867:20;;;25849:38;;25909:13;;;;;;;;:23;;25881:6;;25849:9;25909:23;;25881:6;;25909:23;:::i;:::-;;;;;;;;25965:2;-1:-1:-1;;;;;25950:26:0;25959:4;-1:-1:-1;;;;;25950:26:0;;25969:6;25950:26;;;;5154:25:1;;5142:2;5127:18;;5008:177;25950:26:0;;;;;;;;25989:37;29806:125;16835:451;16910:13;16936:19;16968:10;16972:6;16968:1;:10;:::i;:::-;:14;;16981:1;16968:14;:::i;:::-;16958:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16958:25:0;;16936:47;;-1:-1:-1;;;16994:6:0;17001:1;16994:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;16994:15:0;;;;;;;;;-1:-1:-1;;;17020:6:0;17027:1;17020:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17020:15:0;;;;;;;;-1:-1:-1;17051:9:0;17063:10;17067:6;17063:1;:10;:::i;:::-;:14;;17076:1;17063:14;:::i;:::-;17051:26;;17046:135;17083:1;17079;:5;17046:135;;;-1:-1:-1;;;17131:5:0;17139:3;17131:11;17118:25;;;;;;;:::i;:::-;;;;17106:6;17113:1;17106:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;17106:37:0;;;;;;;;-1:-1:-1;17168:1:0;17158:11;;;;;17086:3;;;:::i;:::-;;;17046:135;;;-1:-1:-1;17199:10:0;;17191:55;;;;-1:-1:-1;;;17191:55:0;;6014:2:1;17191:55:0;;;5996:21:1;;;6033:18;;;6026:30;6092:34;6072:18;;;6065:62;6144:18;;17191:55:0;5812:356:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:416::-;1441:6;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:52;;;1518:1;1515;1508:12;1470:52;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1683:2:1;1668:18;;1655:32;1725:15;;1718:23;1706:36;;1696:64;;1756:1;1753;1746:12;1797:315;1865:6;1873;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1981:9;1968:23;2000:31;2025:5;2000:31;:::i;:::-;2050:5;2102:2;2087:18;;;;2074:32;;-1:-1:-1;;;1797:315:1:o;2117:180::-;2176:6;2229:2;2217:9;2208:7;2204:23;2200:32;2197:52;;;2245:1;2242;2235:12;2197:52;-1:-1:-1;2268:23:1;;2117:180;-1:-1:-1;2117:180:1:o;2302:315::-;2370:6;2378;2431:2;2419:9;2410:7;2406:23;2402:32;2399:52;;;2447:1;2444;2437:12;2399:52;2483:9;2470:23;2460:33;;2543:2;2532:9;2528:18;2515:32;2556:31;2581:5;2556:31;:::i;2622:286::-;2680:6;2733:2;2721:9;2712:7;2708:23;2704:32;2701:52;;;2749:1;2746;2739:12;2701:52;2775:23;;-1:-1:-1;;;;;;2827:32:1;;2817:43;;2807:71;;2874:1;2871;2864:12;3098:248;3166:6;3174;3227:2;3215:9;3206:7;3202:23;3198:32;3195:52;;;3243:1;3240;3233:12;3195:52;-1:-1:-1;;3266:23:1;;;3336:2;3321:18;;;3308:32;;-1:-1:-1;3098:248:1:o;3351:461::-;3404:3;3442:5;3436:12;3469:6;3464:3;3457:19;3495:4;3524:2;3519:3;3515:12;3508:19;;3561:2;3554:5;3550:14;3582:1;3592:195;3606:6;3603:1;3600:13;3592:195;;;3671:13;;-1:-1:-1;;;;;3667:39:1;3655:52;;3727:12;;;;3762:15;;;;3703:1;3621:9;3592:195;;;-1:-1:-1;3803:3:1;;3351:461;-1:-1:-1;;;;;3351:461:1:o;3817:786::-;4228:25;4223:3;4216:38;4198:3;4283:6;4277:13;4299:62;4354:6;4349:2;4344:3;4340:12;4333:4;4325:6;4321:17;4299:62;:::i;:::-;-1:-1:-1;;;4420:2:1;4380:16;;;4412:11;;;4405:40;4470:13;;4492:63;4470:13;4541:2;4533:11;;4526:4;4514:17;;4492:63;:::i;:::-;4575:17;4594:2;4571:26;;3817:786;-1:-1:-1;;;;3817:786:1:o;5424:383::-;5573:2;5562:9;5555:21;5536:4;5605:6;5599:13;5648:6;5643:2;5632:9;5628:18;5621:34;5664:66;5723:6;5718:2;5707:9;5703:18;5698:2;5690:6;5686:15;5664:66;:::i;:::-;5791:2;5770:15;-1:-1:-1;;5766:29:1;5751:45;;;;5798:2;5747:54;;5424:383;-1:-1:-1;;5424:383:1:o;6173:399::-;6375:2;6357:21;;;6414:2;6394:18;;;6387:30;6453:34;6448:2;6433:18;;6426:62;-1:-1:-1;;;6519:2:1;6504:18;;6497:33;6562:3;6547:19;;6173:399::o;9704:402::-;9906:2;9888:21;;;9945:2;9925:18;;;9918:30;9984:34;9979:2;9964:18;;9957:62;-1:-1:-1;;;10050:2:1;10035:18;;10028:36;10096:3;10081:19;;9704:402::o;11343:416::-;11545:2;11527:21;;;11584:2;11564:18;;;11557:30;11623:34;11618:2;11603:18;;11596:62;-1:-1:-1;;;11689:2:1;11674:18;;11667:50;11749:3;11734:19;;11343:416::o;12166:401::-;12368:2;12350:21;;;12407:2;12387:18;;;12380:30;12446:34;12441:2;12426:18;;12419:62;-1:-1:-1;;;12512:2:1;12497:18;;12490:35;12557:3;12542:19;;12166:401::o;14746:332::-;14953:6;14942:9;14935:25;14996:2;14991;14980:9;14976:18;14969:30;14916:4;15016:56;15068:2;15057:9;15053:18;15045:6;15016:56;:::i;:::-;15008:64;14746:332;-1:-1:-1;;;;14746:332:1:o;15083:582::-;15382:6;15371:9;15364:25;15425:6;15420:2;15409:9;15405:18;15398:34;15468:3;15463:2;15452:9;15448:18;15441:31;15345:4;15489:57;15541:3;15530:9;15526:19;15518:6;15489:57;:::i;:::-;-1:-1:-1;;;;;15582:32:1;;;;15577:2;15562:18;;15555:60;-1:-1:-1;15646:3:1;15631:19;15624:35;15481:65;15083:582;-1:-1:-1;;;15083:582:1:o;15859:128::-;15899:3;15930:1;15926:6;15923:1;15920:13;15917:39;;;15936:18;;:::i;:::-;-1:-1:-1;15972:9:1;;15859:128::o;15992:217::-;16032:1;16058;16048:132;;16102:10;16097:3;16093:20;16090:1;16083:31;16137:4;16134:1;16127:15;16165:4;16162:1;16155:15;16048:132;-1:-1:-1;16194:9:1;;15992:217::o;16214:168::-;16254:7;16320:1;16316;16312:6;16308:14;16305:1;16302:21;16297:1;16290:9;16283:17;16279:45;16276:71;;;16327:18;;:::i;:::-;-1:-1:-1;16367:9:1;;16214:168::o;16387:125::-;16427:4;16455:1;16452;16449:8;16446:34;;;16460:18;;:::i;:::-;-1:-1:-1;16497:9:1;;16387:125::o;16517:258::-;16589:1;16599:113;16613:6;16610:1;16607:13;16599:113;;;16689:11;;;16683:18;16670:11;;;16663:39;16635:2;16628:10;16599:113;;;16730:6;16727:1;16724:13;16721:48;;;-1:-1:-1;;16765:1:1;16747:16;;16740:27;16517:258::o;16780:136::-;16819:3;16847:5;16837:39;;16856:18;;:::i;:::-;-1:-1:-1;;;16892:18:1;;16780:136::o;16921:380::-;17000:1;16996:12;;;;17043;;;17064:61;;17118:4;17110:6;17106:17;17096:27;;17064:61;17171:2;17163:6;17160:14;17140:18;17137:38;17134:161;;;17217:10;17212:3;17208:20;17205:1;17198:31;17252:4;17249:1;17242:15;17280:4;17277:1;17270:15;17134:161;;16921:380;;;:::o;17306:127::-;17367:10;17362:3;17358:20;17355:1;17348:31;17398:4;17395:1;17388:15;17422:4;17419:1;17412:15;17438:127;17499:10;17494:3;17490:20;17487:1;17480:31;17530:4;17527:1;17520:15;17554:4;17551:1;17544:15;17570:127;17631:10;17626:3;17622:20;17619:1;17612:31;17662:4;17659:1;17652:15;17686:4;17683:1;17676:15;17702:131;-1:-1:-1;;;;;17777:31:1;;17767:42;;17757:70;;17823:1;17820;17813:12

Swarm Source

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