ETH Price: $3,301.91 (-3.61%)
Gas: 6 Gwei

Token

Bonechiki (BONECHIKI)
 

Overview

Max Total Supply

1,000,000,000,000 BONECHIKI

Holders

33

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
741,849,978.113655524619614833 BONECHIKI

Value
$0.00
0x72279E2284dB05Be687C60e4B644A25BBEe88063
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:
Bonechiki

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Telegram : https://t.me/bonechiki
// Twitter : https://twitter.com/bonechiki
// Website : www.bonechiki.com
// First Crypto Certificate of Deposit (CD) offering 10% daily for 36.5 days/365% ROI in $BONE payments

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


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.18;

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

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

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

pragma solidity 0.8.18;

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.18;

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

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

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

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

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

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

contract Bonechiki 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 = 400;
     uint public buyerFee = 400;
    uint public txFee = 0;
    uint public maxWallet=30000000000e18; 
    uint public maxTx=1000000000000e18; 
    bool public inSwapAndLiquify = false;

    address public uniswapV2Pair;

    address private marketting_address=0xe40ae49A7586d31227bE9165CA79cF162FDB007F;
    

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

    constructor() ERC20("Bonechiki", "BONECHIKI") {
        _mint(_msgSender(), 1000000000000 * 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[marketting_address]=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,
            marketting_address,            block.timestamp
        );

        emit SwapTokensForETH(
            tokenAmount,
            path
        );
    }
    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":[],"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":[],"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"},{"stateMutability":"payable","type":"receive"}]

60806040526101906009819055600a556000600b556b60ef6b1aba6f072330000000600c556c0c9f2c9cd04674edea40000000600d55600e805460ff19169055600f80546001600160a01b03191673e40ae49a7586d31227be9165ca79cf162fdb007f1790553480156200007257600080fd5b5060405180604001604052806009815260200168426f6e656368696b6960b81b81525060405180604001604052806009815260200168424f4e454348494b4960b81b8152508160039081620000c89190620006e4565b506004620000d78282620006e4565b50505062000113620000ee6200022460201b60201c565b620000fc6012600a620008c3565b6200010d9064e8d4a51000620008db565b62000228565b6200012f600060008051602062002dab83398151915262000311565b6200014a60008051602062002dab833981519152336200035c565b6200016560008051602062002d8b833981519152336200035c565b6200018060008051602062002d8b833981519152306200035c565b600880546001600160a01b03191633179055620001b1737a250d5630b4cf539739df2c5dacb4c659f2488d62000368565b600f546001600160a01b031660009081526006602081905260408083208054600160ff1991821681179092553085529184208054909216811790915591620001f63390565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905562000936565b3390565b6001600160a01b038216620002835760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620002979190620008f5565b90915550506001600160a01b03821660009081526020819052604081208054839290620002c6908490620008f5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050565b600082815260056020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200030d828262000589565b600780546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620003c2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e891906200090b565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200044b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047191906200090b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620004bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004e591906200090b565b600e8054610100600160a81b0319166101006001600160a01b03938416810291909117918290556200053e927fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d9291909104166200035c565b50600e5461010090046001600160a01b039081166000908152600660205260408082208054600160ff199182168117909255600754909416835291208054909216179055565b505050565b62000595828262000613565b6200030d5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620005cf3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200066b57607f821691505b6020821081036200068c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200058457600081815260208120601f850160051c81016020861015620006bb5750805b601f850160051c820191505b81811015620006dc57828155600101620006c7565b505050505050565b81516001600160401b0381111562000700576200070062000640565b620007188162000711845462000656565b8462000692565b602080601f831160018114620007505760008415620007375750858301515b600019600386901b1c1916600185901b178555620006dc565b600085815260208120601f198616915b82811015620007815788860151825594840194600190910190840162000760565b5085821015620007a05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000807578160001904821115620007eb57620007eb620007b0565b80851615620007f957918102915b93841c9390800290620007cb565b509250929050565b60008262000820575060016200063a565b816200082f575060006200063a565b8160018114620008485760028114620008535762000873565b60019150506200063a565b60ff841115620008675762000867620007b0565b50506001821b6200063a565b5060208310610133831016604e8410600b841016171562000898575081810a6200063a565b620008a48383620007c6565b8060001904821115620008bb57620008bb620007b0565b029392505050565b6000620008d460ff8416836200080f565b9392505050565b80820281158282048414176200063a576200063a620007b0565b808201808211156200063a576200063a620007b0565b6000602082840312156200091e57600080fd5b81516001600160a01b0381168114620008d457600080fd5b61244580620009466000396000f3fe6080604052600436106102085760003560e01c8063715018a611610118578063cf820461116100a0578063dd62ed3e1161006f578063dd62ed3e146105db578063e1f3d55a146105fb578063f2fde38b14610611578063f8b45b0514610631578063ff64d41f1461064757600080fd5b8063cf82046114610570578063cfc1e57014610586578063d096cd081461059b578063da830336146105bb57600080fd5b8063a217fddf116100e7578063a217fddf146104db578063a457c2d7146104f0578063a9059cbb14610510578063addcf55f14610530578063b6dd04921461055057600080fd5b8063715018a61461047b5780637437681e1461049057806391d14854146104a657806395d89b41146104c657600080fd5b8063313ce5671161019b578063395093511161016a57806339509351146103ca57806347061add146103ea57806349bd5a5e1461040a5780635de6c42f1461042f57806370a082311461044557600080fd5b8063313ce5671461034c578063340ac20f146103685780633515b1af1461038a57806336568abe146103aa57600080fd5b806318160ddd116101d757806318160ddd146102c3578063220f6696146102e257806323b872dd146102fc578063248a9ca31461031c57600080fd5b806301ffc9a71461021457806306fdde0314610249578063095ea7b31461026b5780631694505e1461028b57600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b5061023461022f366004611e7c565b610667565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e61069e565b6040516102409190611eca565b34801561027757600080fd5b50610234610286366004611f12565b610730565b34801561029757600080fd5b506007546102ab906001600160a01b031681565b6040516001600160a01b039091168152602001610240565b3480156102cf57600080fd5b506002545b604051908152602001610240565b3480156102ee57600080fd5b50600e546102349060ff1681565b34801561030857600080fd5b50610234610317366004611f3e565b610748565b34801561032857600080fd5b506102d4610337366004611f7f565b60009081526005602052604090206001015490565b34801561035857600080fd5b5060405160128152602001610240565b34801561037457600080fd5b50610388610383366004611f98565b61076c565b005b34801561039657600080fd5b506103886103a5366004611f98565b6107a7565b3480156103b657600080fd5b506103886103c5366004611fb5565b610857565b3480156103d657600080fd5b506102346103e5366004611f12565b6108d1565b3480156103f657600080fd5b50610388610405366004611f98565b6108f3565b34801561041657600080fd5b50600e546102ab9061010090046001600160a01b031681565b34801561043b57600080fd5b506102d4600a5481565b34801561045157600080fd5b506102d4610460366004611f98565b6001600160a01b031660009081526020819052604090205490565b34801561048757600080fd5b50610388610a1e565b34801561049c57600080fd5b506102d4600d5481565b3480156104b257600080fd5b506102346104c1366004611fb5565b610ab0565b3480156104d257600080fd5b5061025e610adb565b3480156104e757600080fd5b506102d4600081565b3480156104fc57600080fd5b5061023461050b366004611f12565b610aea565b34801561051c57600080fd5b5061023461052b366004611f12565b610b65565b34801561053c57600080fd5b506008546102ab906001600160a01b031681565b34801561055c57600080fd5b5061038861056b366004611f98565b610b73565b34801561057c57600080fd5b506102d4600b5481565b34801561059257600080fd5b50610388610c15565b3480156105a757600080fd5b506103886105b6366004611f98565b610c50565b3480156105c757600080fd5b506103886105d6366004611fe5565b610cfa565b3480156105e757600080fd5b506102d46105f6366004612018565b610d3e565b34801561060757600080fd5b506102d460095481565b34801561061d57600080fd5b5061038861062c366004611f98565b610d69565b34801561063d57600080fd5b506102d4600c5481565b34801561065357600080fd5b50610388610662366004612046565b610e7b565b60006001600160e01b0319821663830d5e4960e01b148061069857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546106ad90612068565b80601f01602080910402602001604051908101604052809291908181526020018280546106d990612068565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050905090565b60003361073e818585610e9f565b5060019392505050565b600033610756858285610fc3565b61076185858561103d565b506001949350505050565b6000805160206123d0833981519152610784816114ef565b50600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206123d08339815191526107bf816114ef565b6107d76000805160206123f083398151915283610ab0565b61083b5760405162461bcd60e51b815260206004820152602a60248201527f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f604482015269207061697220726f6c6560b01b60648201526084015b60405180910390fd5b6108536000805160206123f0833981519152836114fc565b5050565b6001600160a01b03811633146108c75760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610832565b61085382826114fc565b60003361073e8185856108e48383610d3e565b6108ee91906120b8565b610e9f565b6000805160206123d083398151915261090b816114ef565b6001600160a01b0382163b6109885760405162461bcd60e51b815260206004820152603960248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060448201527f6973206e6f74206120636f6e74726163742061646472657373000000000000006064820152608401610832565b6109a06000805160206123f083398151915283610ab0565b15610a065760405162461bcd60e51b815260206004820152603060248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160448201526f647920686173207061697220726f6c6560801b6064820152608401610832565b6108536000805160206123f083398151915283611563565b6000805160206123d0833981519152610a36816114ef565b610a4f6000805160206123d08339815191526000610ab0565b15610a6c5760405162461bcd60e51b8152600401610832906120cb565b610a846000805160206123d0833981519152336114fc565b610a9d6000805160206123d08339815191526000611563565b50600880546001600160a01b0319169055565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600480546106ad90612068565b60003381610af88286610d3e565b905083811015610b585760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610832565b6107618286868403610e9f565b60003361073e81858561103d565b6000805160206123d0833981519152610b8b816114ef565b610ba36000805160206123b083398151915283610ab0565b610bfd5760405162461bcd60e51b815260206004820152602560248201527f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260448201526420726f6c6560d81b6064820152608401610832565b6108536000805160206123b0833981519152836114fc565b6000805160206123d0833981519152610c2d816114ef565b3060009081526020819052604090205480610c4757600080fd5b6108538161156d565b6000805160206123d0833981519152610c68816114ef565b610c806000805160206123b083398151915283610ab0565b15610ce25760405162461bcd60e51b815260206004820152602c60248201527f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860448201526b6173207061697220726f6c6560a01b6064820152608401610832565b6108536000805160206123b083398151915283611563565b6000805160206123d0833981519152610d12816114ef565b506001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000805160206123d0833981519152610d81816114ef565b6001600160a01b038216610df35760405162461bcd60e51b815260206004820152603360248201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776044820152724f776e657220213d206164647265737328302960681b6064820152608401610832565b610e0b6000805160206123d083398151915283610ab0565b15610e285760405162461bcd60e51b8152600401610832906120cb565b610e406000805160206123d0833981519152336114fc565b610e586000805160206123d083398151915283611563565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206123d0833981519152610e93816114ef565b50600c91909155600d55565b6001600160a01b038316610f015760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610832565b6001600160a01b038216610f625760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610832565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610fcf8484610d3e565b90506000198114611037578181101561102a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610832565b6110378484848403610e9f565b50505050565b6001600160a01b0383166110635760405162461bcd60e51b81526004016108329061211f565b6001600160a01b0382166110895760405162461bcd60e51b815260040161083290612164565b6001600160a01b03821660009081526006602052604090205460ff166111755780600d5410156110fb5760405162461bcd60e51b815260206004820152601960248201527f45524332303a204d61787478204c696d697420457863656564000000000000006044820152606401610832565b6111248161111e846001600160a01b031660009081526020819052604090205490565b9061171b565b600c5410156111755760405162461bcd60e51b815260206004820152601a60248201527f45524332303a206d617857616c6c6574203e3d20616d6f756e740000000000006044820152606401610832565b61117d611e40565b6001600160a01b03841660009081526020819052604090205481526111a0611e5e565b6111b86000805160206123d083398151915286610ab0565b1580156111da57506111d86000805160206123d083398151915285610ab0565b155b80156111fb57506111f96000805160206123d083398151915233610ab0565b155b151581526112176000805160206123b083398151915286610ab0565b8061123557506112356000805160206123b083398151915285610ab0565b15156020820152815183111561125d5760405162461bcd60e51b8152600401610832906121bd565b6112756000805160206123f083398151915285610ab0565b80156112845750600e5460ff16155b156113225730600090815260208190526040902054801561132057600e5461010090046001600160a01b03166000908152602081905260409020546112da906064906112d4906002905b90611781565b90611803565b81111561131757600e5461010090046001600160a01b0316600090815260208190526040902054611314906064906112d4906002906112ce565b90505b6113208161156d565b505b8051801561133257506020810151155b80156113415750600e5460ff16155b156113d1578261135f6000805160206123f083398151915286610ab0565b156113795761136d84611845565b602085015293506113a7565b6113916000805160206123f083398151915233610ab0565b156113a75761139f84611893565b602085015293505b6113b0816118d0565b6040840181905284106113cf5760408301516113cc9085612203565b93505b505b81516001600160a01b03868116600090815260208190526040808220938790039093559086168152908120805485929061140c9084906120b8565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161145891815260200190565b60405180910390a3602082015115801590611471575080515b801561147f57506020810151155b801561148e5750600e5460ff16155b156114a4576114a48583600160200201516118ed565b6040820151158015906114b5575080515b80156114c357506020810151155b80156114d25750600e5460ff16155b156114e8576114e88583600260200201516118fe565b5050505050565b6114f98133611a6e565b50565b6115068282610ab0565b156108535760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6108538282611ad2565b600e805460ff1916600117905560408051600280825260608201835260009260208301908036833701905050905030816000815181106115af576115af6121a7565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c919061222c565b8160018151811061163f5761163f6121a7565b6001600160a01b0392831660209182029290920101526007546116659130911684610e9f565b600754600f5460405163791ac94760e01b81526001600160a01b039283169263791ac947926116a29287926000928892911690429060040161228d565b600060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516117059291906122c9565b60405180910390a15050600e805460ff19169055565b60008061172883856120b8565b90508381101561177a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610832565b9392505050565b60008260000361179357506000610698565b600061179f83856122ea565b9050826117ac8583612301565b1461177a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610832565b600061177a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b58565b60008061271060095461271061185b9190612203565b61186590856122ea565b61186f9190612301565b91506127106009548461188291906122ea565b61188c9190612301565b9050915091565b600080612710600a546127106118a99190612203565b6118b390856122ea565b6118bd9190612301565b9150612710600a548461188291906122ea565b6000612710600b54836118e391906122ea565b6106989190612301565b801561085357610853823083611b8f565b6001600160a01b03821661195e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610832565b6001600160a01b038216600090815260208190526040902054818110156119d25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610832565b6001600160a01b038316600090815260208190526040812083830390558080527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054849290611a239084906120b8565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b611a788282610ab0565b61085357611a90816001600160a01b03166014611ca4565b611a9b836020611ca4565b604051602001611aac929190612323565b60408051601f198184030181529082905262461bcd60e51b825261083291600401611eca565b611adc8282610ab0565b6108535760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611b143390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008183611b795760405162461bcd60e51b81526004016108329190611eca565b506000611b868486612301565b95945050505050565b6001600160a01b038316611bb55760405162461bcd60e51b81526004016108329061211f565b6001600160a01b038216611bdb5760405162461bcd60e51b815260040161083290612164565b6001600160a01b03831660009081526020819052604090205481811015611c145760405162461bcd60e51b8152600401610832906121bd565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611c4b9084906120b8565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c9791815260200190565b60405180910390a3611037565b60606000611cb38360026122ea565b611cbe9060026120b8565b67ffffffffffffffff811115611cd657611cd6612216565b6040519080825280601f01601f191660200182016040528015611d00576020820181803683370190505b509050600360fc1b81600081518110611d1b57611d1b6121a7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d4a57611d4a6121a7565b60200101906001600160f81b031916908160001a9053506000611d6e8460026122ea565b611d799060016120b8565b90505b6001811115611df1576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dad57611dad6121a7565b1a60f81b828281518110611dc357611dc36121a7565b60200101906001600160f81b031916908160001a90535060049490941c93611dea81612398565b9050611d7c565b50831561177a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610832565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b600060208284031215611e8e57600080fd5b81356001600160e01b03198116811461177a57600080fd5b60005b83811015611ec1578181015183820152602001611ea9565b50506000910152565b6020815260008251806020840152611ee9816040850160208701611ea6565b601f01601f19169190910160400192915050565b6001600160a01b03811681146114f957600080fd5b60008060408385031215611f2557600080fd5b8235611f3081611efd565b946020939093013593505050565b600080600060608486031215611f5357600080fd5b8335611f5e81611efd565b92506020840135611f6e81611efd565b929592945050506040919091013590565b600060208284031215611f9157600080fd5b5035919050565b600060208284031215611faa57600080fd5b813561177a81611efd565b60008060408385031215611fc857600080fd5b823591506020830135611fda81611efd565b809150509250929050565b60008060408385031215611ff857600080fd5b823561200381611efd565b915060208301358015158114611fda57600080fd5b6000806040838503121561202b57600080fd5b823561203681611efd565b91506020830135611fda81611efd565b6000806040838503121561205957600080fd5b50508035926020909101359150565b600181811c9082168061207c57607f821691505b60208210810361209c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610698576106986120a2565b60208082526034908201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776040820152734f776e657220686173206f776e657220726f6c6560601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b81810381811115610698576106986120a2565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561223e57600080fd5b815161177a81611efd565b600081518084526020808501945080840160005b838110156122825781516001600160a01b03168752958201959082019060010161225d565b509495945050505050565b85815284602082015260a0604082015260006122ac60a0830186612249565b6001600160a01b0394909416606083015250608001529392505050565b8281526040602082015260006122e26040830184612249565b949350505050565b8082028115828204841417610698576106986120a2565b60008261231e57634e487b7160e01b600052601260045260246000fd5b500490565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161235b816017850160208801611ea6565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161238c816028840160208801611ea6565b01602801949350505050565b6000816123a7576123a76120a2565b50600019019056fe270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3d2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5da26469706673582212204f7e9705bdd84a2ff65683557747f3880466849c01e95240db097c0c01f1f4ca64736f6c63430008120033270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3

Deployed Bytecode

0x6080604052600436106102085760003560e01c8063715018a611610118578063cf820461116100a0578063dd62ed3e1161006f578063dd62ed3e146105db578063e1f3d55a146105fb578063f2fde38b14610611578063f8b45b0514610631578063ff64d41f1461064757600080fd5b8063cf82046114610570578063cfc1e57014610586578063d096cd081461059b578063da830336146105bb57600080fd5b8063a217fddf116100e7578063a217fddf146104db578063a457c2d7146104f0578063a9059cbb14610510578063addcf55f14610530578063b6dd04921461055057600080fd5b8063715018a61461047b5780637437681e1461049057806391d14854146104a657806395d89b41146104c657600080fd5b8063313ce5671161019b578063395093511161016a57806339509351146103ca57806347061add146103ea57806349bd5a5e1461040a5780635de6c42f1461042f57806370a082311461044557600080fd5b8063313ce5671461034c578063340ac20f146103685780633515b1af1461038a57806336568abe146103aa57600080fd5b806318160ddd116101d757806318160ddd146102c3578063220f6696146102e257806323b872dd146102fc578063248a9ca31461031c57600080fd5b806301ffc9a71461021457806306fdde0314610249578063095ea7b31461026b5780631694505e1461028b57600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b5061023461022f366004611e7c565b610667565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e61069e565b6040516102409190611eca565b34801561027757600080fd5b50610234610286366004611f12565b610730565b34801561029757600080fd5b506007546102ab906001600160a01b031681565b6040516001600160a01b039091168152602001610240565b3480156102cf57600080fd5b506002545b604051908152602001610240565b3480156102ee57600080fd5b50600e546102349060ff1681565b34801561030857600080fd5b50610234610317366004611f3e565b610748565b34801561032857600080fd5b506102d4610337366004611f7f565b60009081526005602052604090206001015490565b34801561035857600080fd5b5060405160128152602001610240565b34801561037457600080fd5b50610388610383366004611f98565b61076c565b005b34801561039657600080fd5b506103886103a5366004611f98565b6107a7565b3480156103b657600080fd5b506103886103c5366004611fb5565b610857565b3480156103d657600080fd5b506102346103e5366004611f12565b6108d1565b3480156103f657600080fd5b50610388610405366004611f98565b6108f3565b34801561041657600080fd5b50600e546102ab9061010090046001600160a01b031681565b34801561043b57600080fd5b506102d4600a5481565b34801561045157600080fd5b506102d4610460366004611f98565b6001600160a01b031660009081526020819052604090205490565b34801561048757600080fd5b50610388610a1e565b34801561049c57600080fd5b506102d4600d5481565b3480156104b257600080fd5b506102346104c1366004611fb5565b610ab0565b3480156104d257600080fd5b5061025e610adb565b3480156104e757600080fd5b506102d4600081565b3480156104fc57600080fd5b5061023461050b366004611f12565b610aea565b34801561051c57600080fd5b5061023461052b366004611f12565b610b65565b34801561053c57600080fd5b506008546102ab906001600160a01b031681565b34801561055c57600080fd5b5061038861056b366004611f98565b610b73565b34801561057c57600080fd5b506102d4600b5481565b34801561059257600080fd5b50610388610c15565b3480156105a757600080fd5b506103886105b6366004611f98565b610c50565b3480156105c757600080fd5b506103886105d6366004611fe5565b610cfa565b3480156105e757600080fd5b506102d46105f6366004612018565b610d3e565b34801561060757600080fd5b506102d460095481565b34801561061d57600080fd5b5061038861062c366004611f98565b610d69565b34801561063d57600080fd5b506102d4600c5481565b34801561065357600080fd5b50610388610662366004612046565b610e7b565b60006001600160e01b0319821663830d5e4960e01b148061069857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546106ad90612068565b80601f01602080910402602001604051908101604052809291908181526020018280546106d990612068565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050905090565b60003361073e818585610e9f565b5060019392505050565b600033610756858285610fc3565b61076185858561103d565b506001949350505050565b6000805160206123d0833981519152610784816114ef565b50600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206123d08339815191526107bf816114ef565b6107d76000805160206123f083398151915283610ab0565b61083b5760405162461bcd60e51b815260206004820152602a60248201527f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f604482015269207061697220726f6c6560b01b60648201526084015b60405180910390fd5b6108536000805160206123f0833981519152836114fc565b5050565b6001600160a01b03811633146108c75760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610832565b61085382826114fc565b60003361073e8185856108e48383610d3e565b6108ee91906120b8565b610e9f565b6000805160206123d083398151915261090b816114ef565b6001600160a01b0382163b6109885760405162461bcd60e51b815260206004820152603960248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060448201527f6973206e6f74206120636f6e74726163742061646472657373000000000000006064820152608401610832565b6109a06000805160206123f083398151915283610ab0565b15610a065760405162461bcd60e51b815260206004820152603060248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160448201526f647920686173207061697220726f6c6560801b6064820152608401610832565b6108536000805160206123f083398151915283611563565b6000805160206123d0833981519152610a36816114ef565b610a4f6000805160206123d08339815191526000610ab0565b15610a6c5760405162461bcd60e51b8152600401610832906120cb565b610a846000805160206123d0833981519152336114fc565b610a9d6000805160206123d08339815191526000611563565b50600880546001600160a01b0319169055565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600480546106ad90612068565b60003381610af88286610d3e565b905083811015610b585760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610832565b6107618286868403610e9f565b60003361073e81858561103d565b6000805160206123d0833981519152610b8b816114ef565b610ba36000805160206123b083398151915283610ab0565b610bfd5760405162461bcd60e51b815260206004820152602560248201527f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260448201526420726f6c6560d81b6064820152608401610832565b6108536000805160206123b0833981519152836114fc565b6000805160206123d0833981519152610c2d816114ef565b3060009081526020819052604090205480610c4757600080fd5b6108538161156d565b6000805160206123d0833981519152610c68816114ef565b610c806000805160206123b083398151915283610ab0565b15610ce25760405162461bcd60e51b815260206004820152602c60248201527f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860448201526b6173207061697220726f6c6560a01b6064820152608401610832565b6108536000805160206123b083398151915283611563565b6000805160206123d0833981519152610d12816114ef565b506001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000805160206123d0833981519152610d81816114ef565b6001600160a01b038216610df35760405162461bcd60e51b815260206004820152603360248201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776044820152724f776e657220213d206164647265737328302960681b6064820152608401610832565b610e0b6000805160206123d083398151915283610ab0565b15610e285760405162461bcd60e51b8152600401610832906120cb565b610e406000805160206123d0833981519152336114fc565b610e586000805160206123d083398151915283611563565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206123d0833981519152610e93816114ef565b50600c91909155600d55565b6001600160a01b038316610f015760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610832565b6001600160a01b038216610f625760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610832565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610fcf8484610d3e565b90506000198114611037578181101561102a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610832565b6110378484848403610e9f565b50505050565b6001600160a01b0383166110635760405162461bcd60e51b81526004016108329061211f565b6001600160a01b0382166110895760405162461bcd60e51b815260040161083290612164565b6001600160a01b03821660009081526006602052604090205460ff166111755780600d5410156110fb5760405162461bcd60e51b815260206004820152601960248201527f45524332303a204d61787478204c696d697420457863656564000000000000006044820152606401610832565b6111248161111e846001600160a01b031660009081526020819052604090205490565b9061171b565b600c5410156111755760405162461bcd60e51b815260206004820152601a60248201527f45524332303a206d617857616c6c6574203e3d20616d6f756e740000000000006044820152606401610832565b61117d611e40565b6001600160a01b03841660009081526020819052604090205481526111a0611e5e565b6111b86000805160206123d083398151915286610ab0565b1580156111da57506111d86000805160206123d083398151915285610ab0565b155b80156111fb57506111f96000805160206123d083398151915233610ab0565b155b151581526112176000805160206123b083398151915286610ab0565b8061123557506112356000805160206123b083398151915285610ab0565b15156020820152815183111561125d5760405162461bcd60e51b8152600401610832906121bd565b6112756000805160206123f083398151915285610ab0565b80156112845750600e5460ff16155b156113225730600090815260208190526040902054801561132057600e5461010090046001600160a01b03166000908152602081905260409020546112da906064906112d4906002905b90611781565b90611803565b81111561131757600e5461010090046001600160a01b0316600090815260208190526040902054611314906064906112d4906002906112ce565b90505b6113208161156d565b505b8051801561133257506020810151155b80156113415750600e5460ff16155b156113d1578261135f6000805160206123f083398151915286610ab0565b156113795761136d84611845565b602085015293506113a7565b6113916000805160206123f083398151915233610ab0565b156113a75761139f84611893565b602085015293505b6113b0816118d0565b6040840181905284106113cf5760408301516113cc9085612203565b93505b505b81516001600160a01b03868116600090815260208190526040808220938790039093559086168152908120805485929061140c9084906120b8565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161145891815260200190565b60405180910390a3602082015115801590611471575080515b801561147f57506020810151155b801561148e5750600e5460ff16155b156114a4576114a48583600160200201516118ed565b6040820151158015906114b5575080515b80156114c357506020810151155b80156114d25750600e5460ff16155b156114e8576114e88583600260200201516118fe565b5050505050565b6114f98133611a6e565b50565b6115068282610ab0565b156108535760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6108538282611ad2565b600e805460ff1916600117905560408051600280825260608201835260009260208301908036833701905050905030816000815181106115af576115af6121a7565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c919061222c565b8160018151811061163f5761163f6121a7565b6001600160a01b0392831660209182029290920101526007546116659130911684610e9f565b600754600f5460405163791ac94760e01b81526001600160a01b039283169263791ac947926116a29287926000928892911690429060040161228d565b600060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516117059291906122c9565b60405180910390a15050600e805460ff19169055565b60008061172883856120b8565b90508381101561177a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610832565b9392505050565b60008260000361179357506000610698565b600061179f83856122ea565b9050826117ac8583612301565b1461177a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610832565b600061177a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b58565b60008061271060095461271061185b9190612203565b61186590856122ea565b61186f9190612301565b91506127106009548461188291906122ea565b61188c9190612301565b9050915091565b600080612710600a546127106118a99190612203565b6118b390856122ea565b6118bd9190612301565b9150612710600a548461188291906122ea565b6000612710600b54836118e391906122ea565b6106989190612301565b801561085357610853823083611b8f565b6001600160a01b03821661195e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610832565b6001600160a01b038216600090815260208190526040902054818110156119d25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610832565b6001600160a01b038316600090815260208190526040812083830390558080527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054849290611a239084906120b8565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b611a788282610ab0565b61085357611a90816001600160a01b03166014611ca4565b611a9b836020611ca4565b604051602001611aac929190612323565b60408051601f198184030181529082905262461bcd60e51b825261083291600401611eca565b611adc8282610ab0565b6108535760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611b143390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008183611b795760405162461bcd60e51b81526004016108329190611eca565b506000611b868486612301565b95945050505050565b6001600160a01b038316611bb55760405162461bcd60e51b81526004016108329061211f565b6001600160a01b038216611bdb5760405162461bcd60e51b815260040161083290612164565b6001600160a01b03831660009081526020819052604090205481811015611c145760405162461bcd60e51b8152600401610832906121bd565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611c4b9084906120b8565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c9791815260200190565b60405180910390a3611037565b60606000611cb38360026122ea565b611cbe9060026120b8565b67ffffffffffffffff811115611cd657611cd6612216565b6040519080825280601f01601f191660200182016040528015611d00576020820181803683370190505b509050600360fc1b81600081518110611d1b57611d1b6121a7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d4a57611d4a6121a7565b60200101906001600160f81b031916908160001a9053506000611d6e8460026122ea565b611d799060016120b8565b90505b6001811115611df1576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dad57611dad6121a7565b1a60f81b828281518110611dc357611dc36121a7565b60200101906001600160f81b031916908160001a90535060049490941c93611dea81612398565b9050611d7c565b50831561177a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610832565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b600060208284031215611e8e57600080fd5b81356001600160e01b03198116811461177a57600080fd5b60005b83811015611ec1578181015183820152602001611ea9565b50506000910152565b6020815260008251806020840152611ee9816040850160208701611ea6565b601f01601f19169190910160400192915050565b6001600160a01b03811681146114f957600080fd5b60008060408385031215611f2557600080fd5b8235611f3081611efd565b946020939093013593505050565b600080600060608486031215611f5357600080fd5b8335611f5e81611efd565b92506020840135611f6e81611efd565b929592945050506040919091013590565b600060208284031215611f9157600080fd5b5035919050565b600060208284031215611faa57600080fd5b813561177a81611efd565b60008060408385031215611fc857600080fd5b823591506020830135611fda81611efd565b809150509250929050565b60008060408385031215611ff857600080fd5b823561200381611efd565b915060208301358015158114611fda57600080fd5b6000806040838503121561202b57600080fd5b823561203681611efd565b91506020830135611fda81611efd565b6000806040838503121561205957600080fd5b50508035926020909101359150565b600181811c9082168061207c57607f821691505b60208210810361209c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610698576106986120a2565b60208082526034908201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776040820152734f776e657220686173206f776e657220726f6c6560601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b81810381811115610698576106986120a2565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561223e57600080fd5b815161177a81611efd565b600081518084526020808501945080840160005b838110156122825781516001600160a01b03168752958201959082019060010161225d565b509495945050505050565b85815284602082015260a0604082015260006122ac60a0830186612249565b6001600160a01b0394909416606083015250608001529392505050565b8281526040602082015260006122e26040830184612249565b949350505050565b8082028115828204841417610698576106986120a2565b60008261231e57634e487b7160e01b600052601260045260246000fd5b500490565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161235b816017850160208801611ea6565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161238c816028840160208801611ea6565b01602801949350505050565b6000816123a7576123a76120a2565b50600019019056fe270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3d2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5da26469706673582212204f7e9705bdd84a2ff65683557747f3880466849c01e95240db097c0c01f1f4ca64736f6c63430008120033

Deployed Bytecode Sourcemap

32157:9354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10596:204;;;;;;;;;;-1:-1:-1;10596:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;10596:204:0;;;;;;;;19779:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22130:201::-;;;;;;;;;;-1:-1:-1;22130:201:0;;;;;:::i;:::-;;:::i;32288:41::-;;;;;;;;;;-1:-1:-1;32288:41:0;;;;-1:-1:-1;;;;;32288:41:0;;;;;;-1:-1:-1;;;;;1799:32:1;;;1781:51;;1769:2;1754:18;32288:41:0;1609:229:1;20899:108:0;;;;;;;;;;-1:-1:-1;20987:12:0;;20899:108;;;1989:25:1;;;1977:2;1962:18;20899:108:0;1843:177:1;32832:36:0;;;;;;;;;;-1:-1:-1;32832:36:0;;;;;;;;22911:295;;;;;;;;;;-1:-1:-1;22911:295:0;;;;;:::i;:::-;;:::i;12432:131::-;;;;;;;;;;-1:-1:-1;12432:131:0;;;;;:::i;:::-;12506:7;12533:12;;;:6;:12;;;;;:22;;;;12432:131;20741:93;;;;;;;;;;-1:-1:-1;20741:93:0;;20824:2;2995:36:1;;2983:2;2968:18;20741:93:0;2853:184:1;35879:136:0;;;;;;;;;;-1:-1:-1;35879:136:0;;;;;:::i;:::-;;:::i;:::-;;34496:207;;;;;;;;;;-1:-1:-1;34496:207:0;;;;;:::i;:::-;;:::i;13070:218::-;;;;;;;;;;-1:-1:-1;13070:218:0;;;;;:::i;:::-;;:::i;23615:238::-;;;;;;;;;;-1:-1:-1;23615:238:0;;;;;:::i;:::-;;:::i;33805:311::-;;;;;;;;;;-1:-1:-1;33805:311:0;;;;;:::i;:::-;;:::i;32877:28::-;;;;;;;;;;-1:-1:-1;32877:28:0;;;;;;;-1:-1:-1;;;;;32877:28:0;;;32685:26;;;;;;;;;;;;;;;;21070:127;;;;;;;;;;-1:-1:-1;21070:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;21171:18:0;21144:7;21171:18;;;;;;;;;;;;21070:127;35495:309;;;;;;;;;;;;;:::i;32790:34::-;;;;;;;;;;;;;;;;10892:147;;;;;;;;;;-1:-1:-1;10892:147:0;;;;;:::i;:::-;;:::i;19998:104::-;;;;;;;;;;;;;:::i;9997:49::-;;;;;;;;;;-1:-1:-1;9997:49:0;10042:4;9997:49;;24356:436;;;;;;;;;;-1:-1:-1;24356:436:0;;;;;:::i;:::-;;:::i;21403:193::-;;;;;;;;;;-1:-1:-1;21403:193:0;;;;;:::i;:::-;;:::i;32581:22::-;;;;;;;;;;-1:-1:-1;32581:22:0;;;;-1:-1:-1;;;;;32581:22:0;;;34767:212;;;;;;;;;;-1:-1:-1;34767:212:0;;;;;:::i;:::-;;:::i;32718:21::-;;;;;;;;;;;;;;;;36094:186;;;;;;;;;;;;;:::i;34127:223::-;;;;;;;;;;-1:-1:-1;34127:223:0;;;;;:::i;:::-;;:::i;34358:125::-;;;;;;;;;;-1:-1:-1;34358:125:0;;;;;:::i;:::-;;:::i;21659:151::-;;;;;;;;;;-1:-1:-1;21659:151:0;;;;;:::i;:::-;;:::i;32650:27::-;;;;;;;;;;;;;;;;35070:416;;;;;;;;;;-1:-1:-1;35070:416:0;;;;;:::i;:::-;;:::i;32746:36::-;;;;;;;;;;;;;;;;36289:153;;;;;;;;;;-1:-1:-1;36289:153:0;;;;;:::i;:::-;;:::i;10596:204::-;10681:4;-1:-1:-1;;;;;;10705:47:0;;-1:-1:-1;;;10705:47:0;;:87;;-1:-1:-1;;;;;;;;;;8113:40:0;;;10756:36;10698:94;10596:204;-1:-1:-1;;10596:204:0:o;19779:100::-;19833:13;19866:5;19859:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19779:100;:::o;22130:201::-;22213:4;7145:10;22269:32;7145:10;22285:7;22294:6;22269:8;:32::i;:::-;-1:-1:-1;22319:4:0;;22130:201;-1:-1:-1;;;22130:201:0:o;22911:295::-;23042:4;7145:10;23100:38;23116:4;7145:10;23131:6;23100:15;:38::i;:::-;23149:27;23159:4;23165:2;23169:6;23149:9;:27::i;:::-;-1:-1:-1;23194:4:0;;22911:295;-1:-1:-1;;;;22911:295:0:o;35879:136::-;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;-1:-1:-1;35962:15:0::1;:45:::0;;-1:-1:-1;;;;;;35962:45:0::1;-1:-1:-1::0;;;;;35962:45:0;;;::::1;::::0;;;::::1;::::0;;35879:136::o;34496:207::-;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;34586:24:::1;-1:-1:-1::0;;;;;;;;;;;34605:4:0::1;34586:7;:24::i;:::-;34578:79;;;::::0;-1:-1:-1;;;34578:79:0;;5476:2:1;34578:79:0::1;::::0;::::1;5458:21:1::0;5515:2;5495:18;;;5488:30;5554:34;5534:18;;;5527:62;-1:-1:-1;;;5605:18:1;;;5598:40;5655:19;;34578:79:0::1;;;;;;;;;34668:27;-1:-1:-1::0;;;;;;;;;;;34690:4:0::1;34668:11;:27::i;:::-;34496:207:::0;;:::o;13070:218::-;-1:-1:-1;;;;;13166:23:0;;7145:10;13166:23;13158:83;;;;-1:-1:-1;;;13158:83:0;;5887:2:1;13158:83:0;;;5869:21:1;5926:2;5906:18;;;5899:30;5965:34;5945:18;;;5938:62;-1:-1:-1;;;6016:18:1;;;6009:45;6071:19;;13158:83:0;5685:411:1;13158:83:0;13254:26;13266:4;13272:7;13254:11;:26::i;23615:238::-;23703:4;7145:10;23759:64;7145:10;23775:7;23812:10;23784:25;7145:10;23775:7;23784:9;:25::i;:::-;:38;;;;:::i;:::-;23759:8;:64::i;33805:311::-;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;-1:-1:-1;;;;;40821:19:0;;;33888:86:::1;;;::::0;-1:-1:-1;;;33888:86:0;;6565:2:1;33888:86:0::1;::::0;::::1;6547:21:1::0;6604:2;6584:18;;;6577:30;6643:34;6623:18;;;6616:62;6714:27;6694:18;;;6687:55;6759:19;;33888:86:0::1;6363:421:1::0;33888:86:0::1;33994:24;-1:-1:-1::0;;;;;;;;;;;34013:4:0::1;33994:7;:24::i;:::-;33993:25;33985:86;;;::::0;-1:-1:-1;;;33985:86:0;;6991:2:1;33985:86:0::1;::::0;::::1;6973:21:1::0;7030:2;7010:18;;;7003:30;7069:34;7049:18;;;7042:62;-1:-1:-1;;;7120:18:1;;;7113:46;7176:19;;33985:86:0::1;6789:412:1::0;33985:86:0::1;34082:26;-1:-1:-1::0;;;;;;;;;;;34103:4:0::1;34082:10;:26::i;35495:309::-:0;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;35577:34:::1;-1:-1:-1::0;;;;;;;;;;;35608:1:0::1;35577:7;:34::i;:::-;35576:35;35568:100;;;;-1:-1:-1::0;;;35568:100:0::1;;;;;;;:::i;:::-;35679:39;-1:-1:-1::0;;;;;;;;;;;7145:10:0;35679:11:::1;:39::i;:::-;35729:36;-1:-1:-1::0;;;;;;;;;;;35762:1:0::1;35729:10;:36::i;:::-;-1:-1:-1::0;35776:7:0::1;:20:::0;;-1:-1:-1;;;;;;35776:20:0::1;::::0;;35495:309::o;10892:147::-;10978:4;11002:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;11002:29:0;;;;;;;;;;;;;;;10892:147::o;19998:104::-;20054:13;20087:7;20080:14;;;;;:::i;24356:436::-;24449:4;7145:10;24449:4;24532:25;7145:10;24549:7;24532:9;:25::i;:::-;24505:52;;24596:15;24576:16;:35;;24568:85;;;;-1:-1:-1;;;24568:85:0;;7829:2:1;24568:85:0;;;7811:21:1;7868:2;7848:18;;;7841:30;7907:34;7887:18;;;7880:62;-1:-1:-1;;;7958:18:1;;;7951:35;8003:19;;24568:85:0;7627:401:1;24568:85:0;24689:60;24698:5;24705:7;24733:15;24714:16;:34;24689:8;:60::i;21403:193::-;21482:4;7145:10;21538:28;7145:10;21555:2;21559:6;21538:9;:28::i;34767:212::-;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;34854:31:::1;-1:-1:-1::0;;;;;;;;;;;34877:7:0::1;34854;:31::i;:::-;34846:81;;;::::0;-1:-1:-1;;;34846:81:0;;8235:2:1;34846:81:0::1;::::0;::::1;8217:21:1::0;8274:2;8254:18;;;8247:30;8313:34;8293:18;;;8286:62;-1:-1:-1;;;8364:18:1;;;8357:35;8409:19;;34846:81:0::1;8033:401:1::0;34846:81:0::1;34937:34;-1:-1:-1::0;;;;;;;;;;;34963:7:0::1;34937:11;:34::i;36094:186::-:0;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;36192:4:::1;36160:11;21171:18:::0;;;;;;;;;;;36217:10;36209:19:::1;;;::::0;::::1;;36239:33;36265:6;36239:25;:33::i;34127:223::-:0;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;34218:31:::1;-1:-1:-1::0;;;;;;;;;;;34241:7:0::1;34218;:31::i;:::-;34217:32;34209:89;;;::::0;-1:-1:-1;;;34209:89:0;;8641:2:1;34209:89:0::1;::::0;::::1;8623:21:1::0;8680:2;8660:18;;;8653:30;8719:34;8699:18;;;8692:62;-1:-1:-1;;;8770:18:1;;;8763:42;8822:19;;34209:89:0::1;8439:408:1::0;34209:89:0::1;34309:33;-1:-1:-1::0;;;;;;;;;;;34334:7:0::1;34309:10;:33::i;34358:125::-:0;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;-1:-1:-1;;;;;;34456:11:0;;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:19;;-1:-1:-1;;34456:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34358:125::o;21659:151::-;-1:-1:-1;;;;;21775:18:0;;;21748:7;21775:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21659:151::o;35070:416::-;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;-1:-1:-1;;;;;35167:22:0;::::1;35159:86;;;::::0;-1:-1:-1;;;35159:86:0;;9054:2:1;35159:86:0::1;::::0;::::1;9036:21:1::0;9093:2;9073:18;;;9066:30;9132:34;9112:18;;;9105:62;-1:-1:-1;;;9183:18:1;;;9176:49;9242:19;;35159:86:0::1;8852:415:1::0;35159:86:0::1;35265:32;-1:-1:-1::0;;;;;;;;;;;35288:8:0::1;35265:7;:32::i;:::-;35264:33;35256:98;;;;-1:-1:-1::0;;;35256:98:0::1;;;;;;;:::i;:::-;35365:39;-1:-1:-1::0;;;;;;;;;;;7145:10:0;35679:11:::1;:39::i;35365:::-;35415:34;-1:-1:-1::0;;;;;;;;;;;35440:8:0::1;35415:10;:34::i;:::-;-1:-1:-1::0;35460:7:0::1;:18:::0;;-1:-1:-1;;;;;;35460:18:0::1;-1:-1:-1::0;;;;;35460:18:0;;;::::1;::::0;;;::::1;::::0;;35070:416::o;36289:153::-;-1:-1:-1;;;;;;;;;;;10488:16:0;10499:4;10488:10;:16::i;:::-;-1:-1:-1;36391:9:0::1;:19:::0;;;;36420:5:::1;:14:::0;36289:153::o;27990:380::-;-1:-1:-1;;;;;28126:19:0;;28118:68;;;;-1:-1:-1;;;28118:68:0;;9474:2:1;28118:68:0;;;9456:21:1;9513:2;9493:18;;;9486:30;9552:34;9532:18;;;9525:62;-1:-1:-1;;;9603:18:1;;;9596:34;9647:19;;28118:68:0;9272:400:1;28118:68:0;-1:-1:-1;;;;;28205:21:0;;28197:68;;;;-1:-1:-1;;;28197:68:0;;9879:2:1;28197:68:0;;;9861:21:1;9918:2;9898:18;;;9891:30;9957:34;9937:18;;;9930:62;-1:-1:-1;;;10008:18:1;;;10001:32;10050:19;;28197:68:0;9677:398:1;28197:68:0;-1:-1:-1;;;;;28278:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28330:32;;1989:25:1;;;28330:32:0;;1962:18:1;28330:32:0;;;;;;;27990:380;;;:::o;28661:453::-;28796:24;28823:25;28833:5;28840:7;28823:9;:25::i;:::-;28796:52;;-1:-1:-1;;28863:16:0;:37;28859:248;;28945:6;28925:16;:26;;28917:68;;;;-1:-1:-1;;;28917:68:0;;10282:2:1;28917:68:0;;;10264:21:1;10321:2;10301:18;;;10294:30;10360:31;10340:18;;;10333:59;10409:18;;28917:68:0;10080:353:1;28917:68:0;29029:51;29038:5;29045:7;29073:6;29054:16;:25;29029:8;:51::i;:::-;28785:329;28661:453;;;:::o;36513:2419::-;-1:-1:-1;;;;;36645:18:0;;36637:68;;;;-1:-1:-1;;;36637:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36724:16:0;;36716:64;;;;-1:-1:-1;;;36716:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36797:8:0;;;;;;:4;:8;;;;;;;;36793:185;;36838:6;36830:5;;:14;;36822:51;;;;-1:-1:-1;;;36822:51:0;;11450:2:1;36822:51:0;;;11432:21:1;11489:2;11469:18;;;11462:30;11528:27;11508:18;;;11501:55;11573:18;;36822:51:0;11248:349:1;36822:51:0;36910:25;36928:6;36910:13;36920:2;-1:-1:-1;;;;;21171:18:0;21144:7;21171:18;;;;;;;;;;;;21070:127;36910:13;:17;;:25::i;:::-;36896:9;;:39;;36888:78;;;;-1:-1:-1;;;36888:78:0;;11804:2:1;36888:78:0;;;11786:21:1;11843:2;11823:18;;;11816:30;11882:28;11862:18;;;11855:56;11928:18;;36888:78:0;11602:350:1;36888:78:0;37049:26;;:::i;:::-;-1:-1:-1;;;;;37100:15:0;;:9;:15;;;;;;;;;;;37086:29;;37128:21;;:::i;:::-;37175:28;-1:-1:-1;;;;;;;;;;;37198:4:0;37175:7;:28::i;:::-;37174:29;37173:64;;;;;37210:26;-1:-1:-1;;;;;;;;;;;37233:2:0;37210:7;:26::i;:::-;37209:27;37173:64;:107;;;;-1:-1:-1;37243:36:0;-1:-1:-1;;;;;;;;;;;7145:10:0;10892:147;:::i;37243:36::-;37242:37;37173:107;37161:119;;;;37304:28;-1:-1:-1;;;;;;;;;;;37327:4:0;37304:7;:28::i;:::-;37303:62;;;;37338:26;-1:-1:-1;;;;;;;;;;;37361:2:0;37338:7;:26::i;:::-;37291:74;;:9;;;:74;37394:11;;:21;-1:-1:-1;37394:21:0;37386:72;;;;-1:-1:-1;;;37386:72:0;;;;;;;:::i;:::-;37482:22;-1:-1:-1;;;;;;;;;;;37501:2:0;37482:7;:22::i;:::-;:43;;;;-1:-1:-1;37509:16:0;;;;37508:17;37482:43;37479:421;;;37583:4;37542:20;21171:18;;;;;;;;;;;37607:19;;37604:285;;37680:13;;;;;-1:-1:-1;;;;;37680:13:0;21144:7;21171:18;;;;;;;;;;;37670:40;;37706:3;;37670:31;;37699:1;;37670:24;:28;;:31::i;:::-;:35;;:40::i;:::-;37652:15;:58;37649:164;;;37763:13;;;;;-1:-1:-1;;;;;37763:13:0;21144:7;21171:18;;;;;;;;;;;37753:40;;37789:3;;37753:31;;37782:1;;37753:24;21070:127;37753:40;37735:58;;37649:164;37831:42;37857:15;37831:25;:42::i;:::-;37527:373;37479:421;37915:9;;:23;;;;-1:-1:-1;37929:9:0;;;;37928:10;37915:23;:44;;;;-1:-1:-1;37943:16:0;;;;37942:17;37915:44;37912:521;;;37994:6;38020:22;-1:-1:-1;;;;;;;;;;;38039:2:0;38020:7;:22::i;:::-;38015:254;;;38101:26;38120:6;38101:18;:26::i;:::-;38086:11;;;38077:50;;-1:-1:-1;38015:254:0;;;38151:32;-1:-1:-1;;;;;;;;;;;7145:10:0;10892:147;:::i;38151:32::-;38148:121;;;38228:25;38246:6;38228:17;:25::i;:::-;38213:11;;;38204:49;;-1:-1:-1;38148:121:0;38300:23;38315:7;38300:14;:23::i;:::-;38286:11;;;:37;;;38343:21;;38340:82;;38395:11;;;;38385:21;;;;:::i;:::-;;;38340:82;37961:472;37912:521;38488:11;;-1:-1:-1;;;;;38470:15:0;;;38497:1;38470:15;;;38488:11;38470:15;;;;;;;38488:20;;;;38470:38;;;38530:13;;;;;;;;:23;;38502:6;;38497:1;38530:23;;38502:6;;38530:23;:::i;:::-;;;;;;;;38586:2;-1:-1:-1;;;;;38571:26:0;38580:4;-1:-1:-1;;;;;38571:26:0;;38590:6;38571:26;;;;1989:25:1;;1977:2;1962:18;;1843:177;38571:26:0;;;;;;;;38623:11;;;;:15;;;;38622:30;;-1:-1:-1;38643:9:0;;38622:30;:44;;;;-1:-1:-1;38657:9:0;;;;38656:10;38622:44;:65;;;;-1:-1:-1;38671:16:0;;;;38670:17;38622:65;38619:123;;;38704:26;38712:4;38718:8;38727:1;38718:11;;;;38704:7;:26::i;:::-;38758:11;;;;:15;;;;38757:30;;-1:-1:-1;38778:9:0;;38757:30;:44;;;;-1:-1:-1;38792:9:0;;;;38791:10;38757:44;:65;;;;-1:-1:-1;38806:16:0;;;;38805:17;38757:65;38754:121;;;38839:24;38845:4;38851:8;38860:1;38851:11;;;;38839:5;:24::i;:::-;36626:2306;;36513:2419;;;:::o;11343:105::-;11410:30;11421:4;7145:10;11410;:30::i;:::-;11343:105;:::o;14941:239::-;15025:22;15033:4;15039:7;15025;:22::i;:::-;15021:152;;;15096:5;15064:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;15064:29:0;;;;;;;;;;:37;;-1:-1:-1;;15064:37:0;;;15121:40;7145:10;;15064:12;;15121:40;;15096:5;15121:40;14941:239;;:::o;13947:112::-;14026:25;14037:4;14043:7;14026:10;:25::i;40143:589::-;33715:16;:23;;-1:-1:-1;;33715:23:0;33734:4;33715:23;;;40254:16:::1;::::0;;40268:1:::1;40254:16:::0;;;;;::::1;::::0;;-1:-1:-1;;40254:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;40254:16:0::1;40230:40;;40299:4;40281;40286:1;40281:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40281:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;40325:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;40325:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;40281:7;;40325:22;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40315:4;40320:1;40315:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40315:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;40392:15:::1;::::0;40360:62:::1;::::0;40377:4:::1;::::0;40392:15:::1;40410:11:::0;40360:8:::1;:62::i;:::-;40435:15;::::0;40577:18:::1;::::0;40435:199:::1;::::0;-1:-1:-1;;;40435:199:0;;-1:-1:-1;;;;;40435:15:0;;::::1;::::0;:66:::1;::::0;:199:::1;::::0;40516:11;;40435:15:::1;::::0;40558:4;;40577:18;::::1;::::0;40608:15:::1;::::0;40435:199:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40652:72;40683:11;40709:4;40652:72;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;33761:16:0;:24;;-1:-1:-1;;33761:24:0;;;40143:589::o;30600:181::-;30658:7;;30690:5;30694:1;30690;:5;:::i;:::-;30678:17;;30719:1;30714;:6;;30706:46;;;;-1:-1:-1;;;30706:46:0;;14609:2:1;30706:46:0;;;14591:21:1;14648:2;14628:18;;;14621:30;14687:29;14667:18;;;14660:57;14734:18;;30706:46:0;14407:351:1;30706:46:0;30772:1;30600:181;-1:-1:-1;;;30600:181:0:o;31133:250::-;31191:7;31215:1;31220;31215:6;31211:47;;-1:-1:-1;31245:1:0;31238:8;;31211:47;31270:9;31282:5;31286:1;31282;:5;:::i;:::-;31270:17;-1:-1:-1;31315:1:0;31306:5;31310:1;31270:17;31306:5;:::i;:::-;:10;31298:56;;;;-1:-1:-1;;;31298:56:0;;15360:2:1;31298:56:0;;;15342:21:1;15399:2;15379:18;;;15372:30;15438:34;15418:18;;;15411:62;-1:-1:-1;;;15489:18:1;;;15482:31;15530:19;;31298:56:0;15158:397:1;31393:132:0;31451:7;31478:39;31482:1;31485;31478:39;;;;;;;;;;;;;;;;;:3;:39::i;40863:247::-;40926:20;40948:16;32638:5;41020:9;;32638:5;41006:23;;;;:::i;:::-;40996:34;;:6;:34;:::i;:::-;:48;;;;:::i;:::-;40977:67;;32638:5;41079:9;;41070:6;:18;;;;:::i;:::-;:32;;;;:::i;:::-;41055:47;;40863:247;;;:::o;41121:242::-;41183:20;41205:15;32638:5;41276:8;;32638:5;41262:22;;;;:::i;:::-;41252:33;;:6;:33;:::i;:::-;:47;;;;:::i;:::-;41233:66;;32638:5;41333:8;;41324:6;:17;;;;:::i;41373:129::-;41432:11;32638:5;41475;;41466:6;:14;;;;:::i;:::-;:28;;;;:::i;39969:164::-;40040:11;;40037:89;;40068:46;40084:5;40099:4;40106:7;40068:15;:46::i;38945:601::-;-1:-1:-1;;;;;39030:21:0;;39022:67;;;;-1:-1:-1;;;39022:67:0;;15762:2:1;39022:67:0;;;15744:21:1;15801:2;15781:18;;;15774:30;15840:34;15820:18;;;15813:62;-1:-1:-1;;;15891:18:1;;;15884:31;15932:19;;39022:67:0;15560:397:1;39022:67:0;-1:-1:-1;;;;;39189:18:0;;39164:22;39189:18;;;;;;;;;;;39226:24;;;;39218:71;;;;-1:-1:-1;;;39218:71:0;;16164:2:1;39218:71:0;;;16146:21:1;16203:2;16183:18;;;16176:30;16242:34;16222:18;;;16215:62;-1:-1:-1;;;16293:18:1;;;16286:32;16335:19;;39218:71:0;15962:398:1;39218:71:0;-1:-1:-1;;;;;39325:18:0;;:9;:18;;;;;;;;;;39346:23;;;39325:44;;39391:21;;;;:31;;39363:6;;39325:9;39391:31;;39363:6;;39391:31;:::i;:::-;;;;-1:-1:-1;;39440:37:0;;1989:25:1;;;39466:1:0;;-1:-1:-1;;;;;39440:37:0;;;;;1977:2:1;1962:18;39440:37:0;;;;;;;29714:125;;;:::o;11738:505::-;11827:22;11835:4;11841:7;11827;:22::i;:::-;11822:414;;12015:41;12043:7;-1:-1:-1;;;;;12015:41:0;12053:2;12015:19;:41::i;:::-;12129:38;12157:4;12164:2;12129:19;:38::i;:::-;11920:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11920:270:0;;;;;;;;;;-1:-1:-1;;;11866:358:0;;;;;;;:::i;14571:238::-;14655:22;14663:4;14669:7;14655;:22::i;:::-;14650:152;;14694:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14694:29:0;;;;;;;;;:36;;-1:-1:-1;;14694:36:0;14726:4;14694:36;;;14777:12;7145:10;;7065:98;14777:12;-1:-1:-1;;;;;14750:40:0;14768:7;-1:-1:-1;;;;;14750:40:0;14762:4;14750:40;;;;;;;;;;14571:238;;:::o;31533:278::-;31619:7;31654:12;31647:5;31639:28;;;;-1:-1:-1;;;31639:28:0;;;;;;;;:::i;:::-;-1:-1:-1;31678:9:0;31690:5;31694:1;31690;:5;:::i;:::-;31678:17;31533:278;-1:-1:-1;;;;;31533:278:0:o;25271:671::-;-1:-1:-1;;;;;25402:18:0;;25394:68;;;;-1:-1:-1;;;25394:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25481:16:0;;25473:64;;;;-1:-1:-1;;;25473:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25623:15:0;;25601:19;25623:15;;;;;;;;;;;25657:21;;;;25649:72;;;;-1:-1:-1;;;25649:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25757:15:0;;;:9;:15;;;;;;;;;;;25775:20;;;25757:38;;25817:13;;;;;;;;:23;;25789:6;;25757:9;25817:23;;25789:6;;25817:23;:::i;:::-;;;;;;;;25873:2;-1:-1:-1;;;;;25858:26:0;25867:4;-1:-1:-1;;;;;25858:26:0;;25877:6;25858:26;;;;1989:25:1;;1977:2;1962:18;;1843:177;25858:26:0;;;;;;;;25897:37;29714:125;16741:451;16816:13;16842:19;16874:10;16878:6;16874:1;:10;:::i;:::-;:14;;16887:1;16874:14;:::i;:::-;16864:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16864:25:0;;16842:47;;-1:-1:-1;;;16900:6:0;16907:1;16900:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;16900:15:0;;;;;;;;;-1:-1:-1;;;16926:6:0;16933:1;16926:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;16926:15:0;;;;;;;;-1:-1:-1;16957:9:0;16969:10;16973:6;16969:1;:10;:::i;:::-;:14;;16982:1;16969:14;:::i;:::-;16957:26;;16952:135;16989:1;16985;:5;16952:135;;;-1:-1:-1;;;17037:5:0;17045:3;17037:11;17024:25;;;;;;;:::i;:::-;;;;17012:6;17019:1;17012:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;17012:37:0;;;;;;;;-1:-1:-1;17074:1:0;17064:11;;;;;16992:3;;;:::i;:::-;;;16952:135;;;-1:-1:-1;17105:10:0;;17097:55;;;;-1:-1:-1;;;17097:55:0;;17525:2:1;17097:55:0;;;17507:21:1;;;17544:18;;;17537:30;17603:34;17583:18;;;17576:62;17655:18;;17097:55:0;17323:356:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:1;721:16;;714:27;497:250::o;752:396::-;901:2;890:9;883:21;864:4;933:6;927:13;976:6;971:2;960:9;956:18;949:34;992:79;1064:6;1059:2;1048:9;1044:18;1039:2;1031:6;1027:15;992:79;:::i;:::-;1132:2;1111:15;-1:-1:-1;;1107:29:1;1092:45;;;;1139:2;1088:54;;752:396;-1:-1:-1;;752:396:1:o;1153:131::-;-1:-1:-1;;;;;1228:31:1;;1218:42;;1208:70;;1274:1;1271;1264:12;1289:315;1357:6;1365;1418:2;1406:9;1397:7;1393:23;1389:32;1386:52;;;1434:1;1431;1424:12;1386:52;1473:9;1460:23;1492:31;1517:5;1492:31;:::i;:::-;1542:5;1594:2;1579:18;;;;1566:32;;-1:-1:-1;;;1289:315:1:o;2025:456::-;2102:6;2110;2118;2171:2;2159:9;2150:7;2146:23;2142:32;2139:52;;;2187:1;2184;2177:12;2139:52;2226:9;2213:23;2245:31;2270:5;2245:31;:::i;:::-;2295:5;-1:-1:-1;2352:2:1;2337:18;;2324:32;2365:33;2324:32;2365:33;:::i;:::-;2025:456;;2417:7;;-1:-1:-1;;;2471:2:1;2456:18;;;;2443:32;;2025:456::o;2486:180::-;2545:6;2598:2;2586:9;2577:7;2573:23;2569:32;2566:52;;;2614:1;2611;2604:12;2566:52;-1:-1:-1;2637:23:1;;2486:180;-1:-1:-1;2486:180:1:o;3042:247::-;3101:6;3154:2;3142:9;3133:7;3129:23;3125:32;3122:52;;;3170:1;3167;3160:12;3122:52;3209:9;3196:23;3228:31;3253:5;3228:31;:::i;3294:315::-;3362:6;3370;3423:2;3411:9;3402:7;3398:23;3394:32;3391:52;;;3439:1;3436;3429:12;3391:52;3475:9;3462:23;3452:33;;3535:2;3524:9;3520:18;3507:32;3548:31;3573:5;3548:31;:::i;:::-;3598:5;3588:15;;;3294:315;;;;;:::o;3822:416::-;3887:6;3895;3948:2;3936:9;3927:7;3923:23;3919:32;3916:52;;;3964:1;3961;3954:12;3916:52;4003:9;3990:23;4022:31;4047:5;4022:31;:::i;:::-;4072:5;-1:-1:-1;4129:2:1;4114:18;;4101:32;4171:15;;4164:23;4152:36;;4142:64;;4202:1;4199;4192:12;4243:388;4311:6;4319;4372:2;4360:9;4351:7;4347:23;4343:32;4340:52;;;4388:1;4385;4378:12;4340:52;4427:9;4414:23;4446:31;4471:5;4446:31;:::i;:::-;4496:5;-1:-1:-1;4553:2:1;4538:18;;4525:32;4566:33;4525:32;4566:33;:::i;4636:248::-;4704:6;4712;4765:2;4753:9;4744:7;4740:23;4736:32;4733:52;;;4781:1;4778;4771:12;4733:52;-1:-1:-1;;4804:23:1;;;4874:2;4859:18;;;4846:32;;-1:-1:-1;4636:248:1:o;4889:380::-;4968:1;4964:12;;;;5011;;;5032:61;;5086:4;5078:6;5074:17;5064:27;;5032:61;5139:2;5131:6;5128:14;5108:18;5105:38;5102:161;;5185:10;5180:3;5176:20;5173:1;5166:31;5220:4;5217:1;5210:15;5248:4;5245:1;5238:15;5102:161;;4889:380;;;:::o;6101:127::-;6162:10;6157:3;6153:20;6150:1;6143:31;6193:4;6190:1;6183:15;6217:4;6214:1;6207:15;6233:125;6298:9;;;6319:10;;;6316:36;;;6332:18;;:::i;7206:416::-;7408:2;7390:21;;;7447:2;7427:18;;;7420:30;7486:34;7481:2;7466:18;;7459:62;-1:-1:-1;;;7552:2:1;7537:18;;7530:50;7612:3;7597:19;;7206:416::o;10438:401::-;10640:2;10622:21;;;10679:2;10659:18;;;10652:30;10718:34;10713:2;10698:18;;10691:62;-1:-1:-1;;;10784:2:1;10769:18;;10762:35;10829:3;10814:19;;10438:401::o;10844:399::-;11046:2;11028:21;;;11085:2;11065:18;;;11058:30;11124:34;11119:2;11104:18;;11097:62;-1:-1:-1;;;11190:2:1;11175:18;;11168:33;11233:3;11218:19;;10844:399::o;11957:127::-;12018:10;12013:3;12009:20;12006:1;11999:31;12049:4;12046:1;12039:15;12073:4;12070:1;12063:15;12089:402;12291:2;12273:21;;;12330:2;12310:18;;;12303:30;12369:34;12364:2;12349:18;;12342:62;-1:-1:-1;;;12435:2:1;12420:18;;12413:36;12481:3;12466:19;;12089:402::o;12496:128::-;12563:9;;;12584:11;;;12581:37;;;12598:18;;:::i;12629:127::-;12690:10;12685:3;12681:20;12678:1;12671:31;12721:4;12718:1;12711:15;12745:4;12742:1;12735:15;12761:251;12831:6;12884:2;12872:9;12863:7;12859:23;12855:32;12852:52;;;12900:1;12897;12890:12;12852:52;12932:9;12926:16;12951:31;12976:5;12951:31;:::i;13017:461::-;13070:3;13108:5;13102:12;13135:6;13130:3;13123:19;13161:4;13190:2;13185:3;13181:12;13174:19;;13227:2;13220:5;13216:14;13248:1;13258:195;13272:6;13269:1;13266:13;13258:195;;;13337:13;;-1:-1:-1;;;;;13333:39:1;13321:52;;13393:12;;;;13428:15;;;;13369:1;13287:9;13258:195;;;-1:-1:-1;13469:3:1;;13017:461;-1:-1:-1;;;;;13017:461:1:o;13483:582::-;13782:6;13771:9;13764:25;13825:6;13820:2;13809:9;13805:18;13798:34;13868:3;13863:2;13852:9;13848:18;13841:31;13745:4;13889:57;13941:3;13930:9;13926:19;13918:6;13889:57;:::i;:::-;-1:-1:-1;;;;;13982:32:1;;;;13977:2;13962:18;;13955:60;-1:-1:-1;14046:3:1;14031:19;14024:35;13881:65;13483:582;-1:-1:-1;;;13483:582:1:o;14070:332::-;14277:6;14266:9;14259:25;14320:2;14315;14304:9;14300:18;14293:30;14240:4;14340:56;14392:2;14381:9;14377:18;14369:6;14340:56;:::i;:::-;14332:64;14070:332;-1:-1:-1;;;;14070:332:1:o;14763:168::-;14836:9;;;14867;;14884:15;;;14878:22;;14864:37;14854:71;;14905:18;;:::i;14936:217::-;14976:1;15002;14992:132;;15046:10;15041:3;15037:20;15034:1;15027:31;15081:4;15078:1;15071:15;15109:4;15106:1;15099:15;14992:132;-1:-1:-1;15138:9:1;;14936:217::o;16365:812::-;16776:25;16771:3;16764:38;16746:3;16831:6;16825:13;16847:75;16915:6;16910:2;16905:3;16901:12;16894:4;16886:6;16882:17;16847:75;:::i;:::-;-1:-1:-1;;;16981:2:1;16941:16;;;16973:11;;;16966:40;17031:13;;17053:76;17031:13;17115:2;17107:11;;17100:4;17088:17;;17053:76;:::i;:::-;17149:17;17168:2;17145:26;;16365:812;-1:-1:-1;;;;16365:812:1:o;17182:136::-;17221:3;17249:5;17239:39;;17258:18;;:::i;:::-;-1:-1:-1;;;17294:18:1;;17182:136::o

Swarm Source

ipfs://4f7e9705bdd84a2ff65683557747f3880466849c01e95240db097c0c01f1f4ca
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.