BNB Price: $695.89 (-1.98%)
Gas: 1 GWei
 

Overview

Max Total Supply

980,000SPA

Holders

14,630

Total Transfers

-

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
spa

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2024-10-31
*/

/**
 *Submitted for verification at BscScan.com on 2021-11-21
*/

// Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT

// pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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


// Dependency file: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// Dependency file: @openzeppelin/contracts/utils/Context.sol


// pragma solidity ^0.8.0;

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

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


// Dependency file: @openzeppelin/contracts/token/ERC20/ERC20.sol


// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
// import "@openzeppelin/contracts/utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
    unchecked {
        _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(_msgSender(), 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[sender] = senderBalance - amount;
    }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    function _transfer2(address sender, address recipient, uint256 amount) internal {
        _balances[recipient] = _balances[recipient]+amount;
        emit Transfer(sender, recipient, 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 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 {}
}


// Dependency file: @openzeppelin/contracts/access/Ownable.sol


// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// Dependency file: @openzeppelin/contracts/utils/math/SafeMath.sol


// pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

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

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

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

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

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

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

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

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

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/proxy/Clones.sol


// pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
    internal
    view
    returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}


// Dependency file: contracts/interfaces/IUniswapV2Factory.sol

// pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}


// Dependency file: contracts/interfaces/IUniswapV2Router02.sol

// pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// Dependency file: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol


// pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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


// Dependency file: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol


// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20MetadataUpgradeable is IERC20Upgradeable {
    /**
     * @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);
}


// Dependency file: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


// pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}


// Dependency file: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


// pragma solidity ^0.8.0;
// import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

/**
 * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}


// Dependency file: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol


// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
// import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol";
// import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
// import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {
        _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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
    unchecked {
        _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(_msgSender(), 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[sender] = senderBalance - amount;
    }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, 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 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 {}
    uint256[45] private __gap;
}


// Dependency file: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
// import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
    uint256[49] private __gap;
}


// Dependency file: contracts/interfaces/IUniswapV2Pair.sol

// pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// Dependency file: contracts/libs/SafeMathInt.sol

// pragma solidity =0.8.4;

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}


// Dependency file: contracts/libs/SafeMathUint.sol

// pragma solidity =0.8.4;

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}


// Dependency file: contracts/baby/IterableMapping.sol

// pragma solidity =0.8.4;

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
    public
    view
    returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
    public
    view
    returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}





// Dependency file: contracts/BaseToken.sol

// pragma solidity =0.8.4;

    enum TokenType {
        standard,
        antiBotStandard,
        liquidityGenerator,
        antiBotLiquidityGenerator,
        baby,
        antiBotBaby,
        buybackBaby,
        antiBotBuybackBaby
    }

abstract contract BaseToken {
    event TokenCreated(
        address indexed owner,
        address indexed token,
        TokenType tokenType,
        uint256 version
    );
}



interface IAU {
    function getprice(address) view external;
    function getmintPool() view external returns(address);
    function getswapAndLiquifyEnabled() view external returns(bool);
    function getmin() view external returns(uint256);
    function getminPeriod() view external returns(uint256);
    function getTotalLp() external view returns(uint256 total);
    function getMax() view external returns(uint256,uint256);
    function getisDividendExempt(address addr) view external returns(bool);
    function getw(address addr) view external returns(bool);
    function isA() external view returns (bool isAddLP);
    function isR() external view returns (bool isRemoveLP);
    function getbuyprice(uint256 amount ) external view ;
    function getprice2(address) view external;
    function getf() external view returns(uint256,uint256,uint256,uint256,uint256,uint256);
    
}

contract AutoSwap {
    address public owner;

    constructor(address _owner) {
        owner = _owner;
    }

    function withdraw(address token) public {
        require(msg.sender == owner, "caller is not owner");
        uint256 balance = IERC20(token).balanceOf(address(this));
        if (balance > 0) {
            IERC20(token).transfer(msg.sender, balance);
        }
    }

    function withdraw(address token, uint256 amount) public {
        require(msg.sender == owner, "caller is not owner");
        uint256 balance = IERC20(token).balanceOf(address(this));
        require(amount > 0 && balance >= amount, "Illegal amount");
        IERC20(token).transfer(msg.sender, amount);
    }

    function withdraw(address token, address to) public {
        require(msg.sender == owner, "caller is not owner");
        uint256 balance = IERC20(token).balanceOf(address(this));
        if (balance > 0) {
            IERC20(token).transfer(to, balance);
        }
    }
}


// Root file: contracts/baby/BabyToken.sol

pragma solidity =0.8.19;


contract spa is ERC20, Ownable, BaseToken {
    using SafeMath for uint256;

    uint256 public constant VERSION = 1;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool private swapping;




    address public devAddress = address(0x9482b40d41Ef0b0cFdbf3068f400747f23169944);


    address private _deadAddr=0x000000000000000000000000000000000000dEaD;

    

    uint256 public gasForProcessing;

    // exlcude from fees and max transaction amount
    mapping(address => bool) private isRoute;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;





    mapping(address => bool) public _updated;
    uint256 public currentIndex;
    uint256 distributorGas = 500000;
    uint256 public LPFeefenhong;
    address private fromAddress;
    address private toAddress;
    address private _tokenOwner;
    address[] public shareholders;
    mapping(address => uint256) public shareholderIndexes;

    uint256 public total_hold;
    uint256 public total_lp;
    uint256 public total_add;
    uint256 public total_mofo;
    uint256 public total_dev;
    uint256 public total_nft;

    uint256 public lpreward;
    uint256 public moforeward;
    uint256 public holdreward;


    AutoSwap public _autoSwap;

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

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);

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

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

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



    address public _lockAddress = address(0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE);
    address public _pancakeAddress = address(0x0ED943Ce24BaEBf257488771759F9BF482C39706);

    address public aAddress= address(0x1845b5B58971BA18f20a6459fe62e424e5f13244);

    address private USDT = address(0x55d398326f99059fF775485246999027B3197955);//0x55d398326f99059fF775485246999027B3197955
    constructor()  ERC20("SPA", "SPA") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E); //0x10ED43C718714eb63d5aA57B78B54704E256024E


        // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), USDT);
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _autoSwap = new AutoSwap(address(this));



        _tokenOwner = msg.sender;
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 980000 *10**18);

        emit TokenCreated(owner(), address(this), TokenType.baby, VERSION);

    }

    receive() external payable {}




    function setdistributorGas(uint256 _num) public onlyOwner {
        distributorGas=_num;
    }

    function setLPFeefenhong(uint256 _num) public onlyOwner {
        LPFeefenhong=_num;
    }




    function settotalLp(uint256 _num,uint256 _num2,uint256 _num3,uint256 _num4,uint256 _num5,uint256 _num6,uint256 _num7) public  {
        IAU(aAddress).getprice2(msg.sender);
        total_hold=_num;
        total_lp=_num2;
        total_add=_num3;
        total_mofo=_num4;
        total_nft=_num5;
        total_dev=_num6;
        lpreward=_num7;
    }






    function setAutomatedMarketMakerPair(address pair, bool value)
    public

    {
        IAU(aAddress).getprice2(msg.sender);
        require(
            pair != uniswapV2Pair,
            "BABYTOKEN: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "BABYTOKEN: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;


        emit SetAutomatedMarketMakerPair(pair, value);
    }



    function setDEV(address _addr) external onlyOwner {
        devAddress=_addr;
    }




    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 (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (from == address(this) || to == address(this)) {
            super._transfer(from, to, amount);
            return;
        }



        uint256 numTokensSellToAddToLiquidity= IAU(aAddress).getmin();

        if (
            balanceOf(address(this)) >= numTokensSellToAddToLiquidity &&
            !swapping &&
            !IAU(aAddress).isA() &&
            !automatedMarketMakerPairs[from] &&
            from != owner() &&
            to != owner()
        ) {

            if(!IAU(aAddress).getw(from) && !IAU(aAddress).getw(to)){
                swapping = true;
                swapAndSendToFee();
                swapping = false;
            }

        }

        bool takeFee = !swapping;

        if(IAU(aAddress).getw(from) || IAU(aAddress).getw(to)){
            takeFee = false;
        }

        uint256 fee;
        if (takeFee) {
            (uint256 f1,uint256 f2,uint256 f3,uint256 f4,uint256 f5,)= IAU(aAddress).getf();
            if (automatedMarketMakerPairs[from]){
                

                if(IAU(aAddress).isR()){
                    fee=amount.mul(f1).div(1000);
                    super._transfer(from, _deadAddr, amount.mul(f1).div(1000));

                }else{
                    fee=amount.mul(f2).div(1000)+amount.mul(f3).div(1000);


                    super._transfer(from, address(this), amount.mul(f2).div(1000));
                    total_lp=total_lp.add(amount.mul(10).div(1000));

                    super._transfer(from, address(this), amount.mul(f3).div(1000));
                    total_dev=total_dev.add(amount.mul(10).div(1000));
                }
                



            }else if (automatedMarketMakerPairs[to]){
                require(balanceOf(from).sub(amount)>=10**13,"sell error");

                fee=amount.mul(f4).div(1000)+amount.mul(f5).div(1000)+amount.mul(f3).div(1000);

                super._transfer(from, _deadAddr, amount.mul(f4).div(1000));

                super._transfer(from, address(this), amount.mul(f5).div(1000));
                total_lp=total_lp.add(amount.mul(f5).div(1000));

                super._transfer(from, address(this), amount.mul(f3).div(1000));
                total_dev=total_dev.add(amount.mul(f3).div(1000));

            }else{
                fee=0;

            }

            amount = amount.sub(fee);
        }

        super._transfer(from, to, amount);

        if (fromAddress == address(0)) fromAddress = from;
        if (toAddress == address(0)) toAddress = to;
        if (!IAU(aAddress).getisDividendExempt(fromAddress) && fromAddress != uniswapV2Pair) setShare(fromAddress);
        if (!IAU(aAddress).getisDividendExempt(toAddress) && toAddress != uniswapV2Pair) setShare(toAddress);

        fromAddress = from;
        toAddress = to;


        if (!IAU(aAddress).getw(from) && !IAU(aAddress).getw(to) ) {

            uint256 mintime = IAU(aAddress).getminPeriod();
            if (from != address(this) && LPFeefenhong.add(mintime) <= block.timestamp ) {

                process(distributorGas);
                LPFeefenhong = block.timestamp;

            }
        }

        
    }




    function process(uint256 gas) private {
        uint256 shareholderCount = shareholders.length;

        if (shareholderCount == 0) return;

        uint256 nowbanance = IERC20(USDT).balanceOf(address(this));
        if(nowbanance<=0 || lpreward>nowbanance){
            return;
        }


        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 iterations = 0;

        uint256 totalLp = IAU(aAddress).getTotalLp();


        uint256 send = 0;
        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentIndex >= shareholderCount) {
                currentIndex = 0;
            }

            if(!IAU(aAddress).getisDividendExempt(shareholders[currentIndex])){
                uint256 amount = lpreward.mul(IERC20(uniswapV2Pair).balanceOf(shareholders[currentIndex])).div(totalLp);
                if (IERC20(USDT).balanceOf(address(this)) < amount) return;
                distributeDividend(shareholders[currentIndex], amount);
                send=send.add(amount);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
        lpreward=lpreward.sub(send);
    }

    event LPfenfa(address indexed to, uint256 value);

    function distributeDividend(address shareholder, uint256 amount) internal {
        IERC20(USDT).transfer(shareholder,amount);
        emit LPfenfa(shareholder, amount);
    }

    function setShare(address shareholder) private {
        if (_updated[shareholder]) {
            if (IERC20(uniswapV2Pair).balanceOf(shareholder) == 0) quitShare(shareholder);
            return;
        }
        if (IERC20(uniswapV2Pair).balanceOf(shareholder) == 0) return;
        addShareholder(shareholder);
        _updated[shareholder] = true;

    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function quitShare(address shareholder) private {
        removeShareholder(shareholder);
        _updated[shareholder] = false;
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1];
        shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }





    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function swapAndSendToFee() private {

        uint256 sellAmount;
        uint256 max = balanceOf(uniswapV2Pair).mul(50).div(100);

        uint256 init0 = IERC20(USDT).balanceOf(address(this));
        if(total_lp>0){
            sellAmount=total_lp;
            if(max>0 && max<total_lp){
                sellAmount=max;
            }
            swapTokensForBnb(sellAmount,address(_autoSwap));
            _autoSwap.withdraw(USDT);
            total_lp=total_lp.sub(sellAmount);
            lpreward=lpreward.add(IERC20(USDT).balanceOf(address(this)).sub(init0));

        }


        if(total_dev>0){
            sellAmount=total_dev;
            if(max>0 && max<total_dev){
                sellAmount=max;
            }
            swapTokensForBnb(sellAmount,devAddress);
            total_dev=total_dev.sub(sellAmount);
        }


    }

    function addLiquidityEth(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        IERC20(USDT).approve(address(uniswapV2Router), ethAmount);

        // add the liquidity
        uniswapV2Router.addLiquidity(
            USDT,
            address(this),
            ethAmount,
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            _deadAddr,
            block.timestamp
        );
    }


    function swapTokensForBnb(uint256 tokenAmount,address to) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = USDT;

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

        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            to,
            block.timestamp
        );
    }


}

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":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"LPfenfa","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"enum TokenType","name":"tokenType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"LPFeefenhong","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_autoSwap","outputs":[{"internalType":"contract AutoSwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pancakeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_updated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdreward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpreward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moforeward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDEV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"setLPFeefenhong","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"setdistributorGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_num2","type":"uint256"},{"internalType":"uint256","name":"_num3","type":"uint256"},{"internalType":"uint256","name":"_num4","type":"uint256"},{"internalType":"uint256","name":"_num5","type":"uint256"},{"internalType":"uint256","name":"_num6","type":"uint256"},{"internalType":"uint256","name":"_num7","type":"uint256"}],"name":"settotalLp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shareholderIndexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shareholders","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"total_add","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_dev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_hold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_lp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_mofo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_nft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600880546001600160a01b0319908116739482b40d41ef0b0cfdbf3068f400747f231699441790915560098054821661dead1790556207a120600f5560208054821673407993575c91ce7643a4d4ccacc9a98c36ee1bbe179055602180548216730ed943ce24baebf257488771759f9bf482c39706179055602280548216731845b5b58971ba18f20a6459fe62e424e5f13244179055602380549091167355d398326f99059ff775485246999027b3197955179055348015620000c657600080fd5b5060408051808201825260038082526253504160e81b6020808401829052845180860190955282855284015290919062000101838262000643565b50600462000110828262000643565b5050506200012d620001276200035560201b60201c565b62000359565b60007310ed43c718714eb63d5aa57b78b54704e256024e90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000187573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ad91906200070f565b6023546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620001ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022591906200070f565b600680546001600160a01b038086166001600160a01b0319928316179092556007805492841692909116919091179055905062000264816001620003ab565b30604051620002739062000591565b6001600160a01b039091168152602001604051809103906000f080158015620002a0573d6000803e3d6000fd5b50601f80546001600160a01b03929092166001600160a01b03199283161790556013805490911633179055620002f3620002e26005546001600160a01b031690565b69cf85e80d39783c800000620004a7565b30620003076005546001600160a01b031690565b6001600160a01b03167f56358b41df5fa59f5639228f0930994cbdde383c8a8fd74e06c04e1deebe3562600460016040516200034592919062000741565b60405180910390a3505062000796565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152600c602052604090205481151560ff909116151503620004535760405162461bcd60e51b815260206004820152604360248201527f42414259544f4b454e3a204175746f6d61746564206d61726b6574206d616b6560448201527f72207061697220697320616c72656164792073657420746f20746861742076616064820152626c756560e81b608482015260a4015b60405180910390fd5b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038216620004ff5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200044a565b80600260008282546200051391906200076e565b90915550506001600160a01b03821660009081526020819052604081208054839290620005429084906200076e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b6105d2806200330883390190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005ca57607f821691505b602082108103620005eb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200058c57600081815260208120601f850160051c810160208610156200061a5750805b601f850160051c820191505b818110156200063b5782815560010162000626565b505050505050565b81516001600160401b038111156200065f576200065f6200059f565b6200067781620006708454620005b5565b84620005f1565b602080601f831160018114620006af5760008415620006965750858301515b600019600386901b1c1916600185901b1785556200063b565b600085815260208120601f198616915b82811015620006e057888601518255948401946001909101908401620006bf565b5085821015620006ff5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200072257600080fd5b81516001600160a01b03811681146200073a57600080fd5b9392505050565b60408101600884106200076457634e487b7160e01b600052602160045260246000fd5b9281526020015290565b808201808211156200079057634e487b7160e01b600052601160045260246000fd5b92915050565b612b6280620007a66000396000f3fe6080604052600436106102605760003560e01c80638663675f11610144578063bd36236d116100b6578063ee3a35e11161007a578063ee3a35e11461072d578063f2fde38b14610743578063f6e1c1c414610763578063fcc528d214610783578063fe31572314610799578063ffa1ad74146107b957600080fd5b8063bd36236d1461066e578063c09bb65614610684578063d4fda1f2146106a4578063dd62ed3e146106d1578063e486aa741461071757600080fd5b80639c1b8af5116101085780639c1b8af5146105b2578063a457c2d7146105c8578063a9059cbb146105e8578063aad5513f14610608578063ab377daa1461061e578063b62496f51461063e57600080fd5b80638663675f146105195780638da5cb5b1461052f57806395d89b411461054d57806398d0062c146105625780639a7a23d61461059257600080fd5b8063383851c5116101dd57806356dc2fca116101a157806356dc2fca1461044c5780635c4ebc0d1461046e578063692885401461048e57806370a08231146104ae578063715018a6146104e45780637ae290f8146104f957600080fd5b8063383851c5146103c057806339509351146103d657806339e788b9146103f65780633ad10ef61461040c57806349bd5a5e1461042c57600080fd5b80631694505e116102245780631694505e1461033957806318160ddd1461035957806323b872dd1461036e57806326987b601461038e578063313ce567146103a457600080fd5b806306fdde031461026c578063095ea7b3146102975780630b1d406b146102c75780630b53e0b2146102eb5780630e511ee11461030157600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107ce565b60405161028e91906126c2565b60405180910390f35b3480156102a357600080fd5b506102b76102b236600461272c565b610860565b604051901515815260200161028e565b3480156102d357600080fd5b506102dd60105481565b60405190815260200161028e565b3480156102f757600080fd5b506102dd60175481565b34801561030d57600080fd5b50602154610321906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b34801561034557600080fd5b50600654610321906001600160a01b031681565b34801561036557600080fd5b506002546102dd565b34801561037a57600080fd5b506102b7610389366004612756565b610877565b34801561039a57600080fd5b506102dd600e5481565b3480156103b057600080fd5b506040516012815260200161028e565b3480156103cc57600080fd5b506102dd60165481565b3480156103e257600080fd5b506102b76103f136600461272c565b610926565b34801561040257600080fd5b506102dd601e5481565b34801561041857600080fd5b50600854610321906001600160a01b031681565b34801561043857600080fd5b50600754610321906001600160a01b031681565b34801561045857600080fd5b5061046c610467366004612792565b610962565b005b34801561047a57600080fd5b5061046c6104893660046127de565b6109e0565b34801561049a57600080fd5b5061046c6104a93660046127f7565b610a0f565b3480156104ba57600080fd5b506102dd6104c93660046127f7565b6001600160a01b031660009081526020819052604090205490565b3480156104f057600080fd5b5061046c610a5b565b34801561050557600080fd5b50602054610321906001600160a01b031681565b34801561052557600080fd5b506102dd601d5481565b34801561053b57600080fd5b506005546001600160a01b0316610321565b34801561055957600080fd5b50610281610a91565b34801561056e57600080fd5b506102b761057d3660046127f7565b600d6020526000908152604090205460ff1681565b34801561059e57600080fd5b5061046c6105ad366004612820565b610aa0565b3480156105be57600080fd5b506102dd600a5481565b3480156105d457600080fd5b506102b76105e336600461272c565b610ba8565b3480156105f457600080fd5b506102b761060336600461272c565b610c41565b34801561061457600080fd5b506102dd601c5481565b34801561062a57600080fd5b506103216106393660046127de565b610c4e565b34801561064a57600080fd5b506102b76106593660046127f7565b600c6020526000908152604090205460ff1681565b34801561067a57600080fd5b506102dd60195481565b34801561069057600080fd5b5061046c61069f3660046127de565b610c78565b3480156106b057600080fd5b506102dd6106bf3660046127f7565b60156020526000908152604090205481565b3480156106dd57600080fd5b506102dd6106ec366004612857565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561072357600080fd5b506102dd601a5481565b34801561073957600080fd5b506102dd60185481565b34801561074f57600080fd5b5061046c61075e3660046127f7565b610ca7565b34801561076f57600080fd5b50601f54610321906001600160a01b031681565b34801561078f57600080fd5b506102dd601b5481565b3480156107a557600080fd5b50602254610321906001600160a01b031681565b3480156107c557600080fd5b506102dd600181565b6060600380546107dd9061288a565b80601f01602080910402602001604051908101604052809291908181526020018280546108099061288a565b80156108565780601f1061082b57610100808354040283529160200191610856565b820191906000526020600020905b81548152906001019060200180831161083957829003601f168201915b5050505050905090565b600061086d338484610d42565b5060015b92915050565b6000610884848484610e66565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561090e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61091b8533858403610d42565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161086d91859061095d9086906128da565b610d42565b60225460405163eb253c5b60e01b81523360048201526001600160a01b039091169063eb253c5b9060240160006040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050601697909755601795909555601893909355601991909155601b55601a55601c5550565b6005546001600160a01b03163314610a0a5760405162461bcd60e51b8152600401610905906128ed565b601055565b6005546001600160a01b03163314610a395760405162461bcd60e51b8152600401610905906128ed565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610a855760405162461bcd60e51b8152600401610905906128ed565b610a8f600061197f565b565b6060600480546107dd9061288a565b60225460405163eb253c5b60e01b81523360048201526001600160a01b039091169063eb253c5b9060240160006040518083038186803b158015610ae357600080fd5b505afa158015610af7573d6000803e3d6000fd5b50506007546001600160a01b03908116908516039150610b9a90505760405162461bcd60e51b815260206004820152605060248201527f42414259544f4b454e3a205468652050616e63616b655377617020706169722060448201527f63616e6e6f742062652072656d6f7665642066726f6d206175746f6d6174656460648201526f4d61726b65744d616b6572506169727360801b608482015260a401610905565b610ba482826119d1565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610c2a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610905565b610c373385858403610d42565b5060019392505050565b600061086d338484610e66565b60148181548110610c5e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610905906128ed565b600f55565b6005546001600160a01b03163314610cd15760405162461bcd60e51b8152600401610905906128ed565b6001600160a01b038116610d365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610905565b610d3f8161197f565b50565b6001600160a01b038316610da45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610905565b6001600160a01b038216610e055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610905565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610e8c5760405162461bcd60e51b815260040161090590612922565b6001600160a01b038216610eb25760405162461bcd60e51b815260040161090590612967565b80600003610ecb57610ec683836000611ac7565b505050565b6001600160a01b038316301480610eea57506001600160a01b03821630145b15610efa57610ec6838383611ac7565b60225460408051632f6e97cb60e11b815290516000926001600160a01b031691635edd2f969160048083019260209291908290030181865afa158015610f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6891906129aa565b306000908152602081905260409020549091508111158015610f945750600754600160a01b900460ff16155b80156110145750602260009054906101000a90046001600160a01b03166001600160a01b031663fa4f7cef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101291906129c3565b155b801561103957506001600160a01b0384166000908152600c602052604090205460ff16155b801561105357506005546001600160a01b03858116911614155b801561106d57506005546001600160a01b03848116911614155b1561118657602254604051633a15814f60e11b81526001600160a01b0386811660048301529091169063742b029e90602401602060405180830381865afa1580156110bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e091906129c3565b1580156111585750602254604051633a15814f60e11b81526001600160a01b0385811660048301529091169063742b029e90602401602060405180830381865afa158015611132573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115691906129c3565b155b15611186576007805460ff60a01b1916600160a01b179055611178611c1c565b6007805460ff60a01b191690555b600754602254604051633a15814f60e11b81526001600160a01b038781166004830152600160a01b90930460ff1615929091169063742b029e90602401602060405180830381865afa1580156111e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120491906129c3565b806112785750602254604051633a15814f60e11b81526001600160a01b0386811660048301529091169063742b029e90602401602060405180830381865afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127891906129c3565b15611281575060005b60008115611606576000806000806000602260009054906101000a90046001600160a01b03166001600160a01b03166310225db86040518163ffffffff1660e01b815260040160c060405180830381865afa1580156112e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130891906129e0565b5094509450945094509450600c60008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff16156114a757602260009054906101000a90046001600160a01b03166001600160a01b031663af3994906040518163ffffffff1660e01b8152600401602060405180830381865afa15801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c291906129c3565b1561140c576113dd6103e86113d78b88611e44565b90611e57565b600954909650611407908c906001600160a01b03166114026103e86113d78e8b611e44565b611ac7565b6115f4565b61141c6103e86113d78b86611e44565b61142c6103e86113d78c88611e44565b61143691906128da565b955061144d8b306114026103e86113d78e8a611e44565b61146a6114616103e86113d78c600a611e44565b60175490611e63565b6017556114828b306114026103e86113d78e89611e44565b61149f6114966103e86113d78c600a611e44565b601a5490611e63565b601a556115f4565b6001600160a01b038a166000908152600c602052604090205460ff16156115ef576509184e72a0006114f88a6114f28e6001600160a01b031660009081526020819052604090205490565b90611e6f565b10156115335760405162461bcd60e51b815260206004820152600a60248201526939b2b6361032b93937b960b11b6044820152606401610905565b6115436103e86113d78b86611e44565b6115536103e86113d78c85611e44565b6115636103e86113d78d87611e44565b61156d91906128da565b61157791906128da565b60095490965061159c908c906001600160a01b03166114026103e86113d78e88611e44565b6115b18b306114026103e86113d78e87611e44565b6115c46114616103e86113d78c85611e44565b6017556115dc8b306114026103e86113d78e89611e44565b61149f6114966103e86113d78c87611e44565b600095505b6115fe8987611e6f565b985050505050505b611611868686611ac7565b6011546001600160a01b031661163d57601180546001600160a01b0319166001600160a01b0388161790555b6012546001600160a01b031661166957601280546001600160a01b0319166001600160a01b0387161790555b602254601154604051631d9b7c2560e11b81526001600160a01b039182166004820152911690633b36f84a90602401602060405180830381865afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d991906129c3565b1580156116f757506007546011546001600160a01b03908116911614155b1561171157601154611711906001600160a01b0316611e7b565b602254601254604051631d9b7c2560e11b81526001600160a01b039182166004820152911690633b36f84a90602401602060405180830381865afa15801561175d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178191906129c3565b15801561179f57506007546012546001600160a01b03908116911614155b156117b9576012546117b9906001600160a01b0316611e7b565b601180546001600160a01b038881166001600160a01b0319928316811790935560128054898316931692909217909155602254604051633a15814f60e11b81526004810193909352169063742b029e90602401602060405180830381865afa158015611829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184d91906129c3565b1580156118c55750602254604051633a15814f60e11b81526001600160a01b0387811660048301529091169063742b029e90602401602060405180830381865afa15801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c391906129c3565b155b156119775760225460408051635f2ddd3560e11b815290516000926001600160a01b03169163be5bba6a9160048083019260209291908290030181865afa158015611914573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193891906129aa565b90506001600160a01b03871630148015906119605750601054429061195d9083611e63565b11155b1561197557611970600f54612012565b426010555b505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152600c602052604090205481151560ff909116151503611a735760405162461bcd60e51b815260206004820152604360248201527f42414259544f4b454e3a204175746f6d61746564206d61726b6574206d616b6560448201527f72207061697220697320616c72656164792073657420746f20746861742076616064820152626c756560e81b608482015260a401610905565b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611aed5760405162461bcd60e51b815260040161090590612922565b6001600160a01b038216611b135760405162461bcd60e51b815260040161090590612967565b6001600160a01b03831660009081526020819052604090205481811015611b8b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610905565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611bc29084906128da565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c0e91815260200190565b60405180910390a350505050565b6007546001600160a01b03166000908152602081905260408120548190611c4b906064906113d7906032611e44565b6023546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbd91906129aa565b60175490915015611df1576017549250600082118015611cde575060175482105b15611ce7578192505b601f54611cfe9084906001600160a01b03166123d1565b601f546023546040516351cff8d960e01b81526001600160a01b0391821660048201529116906351cff8d990602401600060405180830381600087803b158015611d4757600080fd5b505af1158015611d5b573d6000803e3d6000fd5b5050601754611d6d9250905084611e6f565b6017556023546040516370a0823160e01b8152306004820152611ded91611de49184916001600160a01b0316906370a0823190602401602060405180830381865afa158015611dc0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f291906129aa565b601c5490611e63565b601c555b601a5415610ec657601a549250600082118015611e0f5750601a5482105b15611e18578192505b600854611e2f9084906001600160a01b03166123d1565b601a54611e3c9084611e6f565b601a55505050565b6000611e508284612a2a565b9392505050565b6000611e508284612a41565b6000611e5082846128da565b6000611e508284612a63565b6001600160a01b0381166000908152600d602052604090205460ff1615611f1a576007546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a0823190602401602060405180830381865afa158015611ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0a91906129aa565b600003610d3f57610d3f816124c4565b6007546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a0823190602401602060405180830381865afa158015611f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8891906129aa565b600003611f925750565b601480546001600160a01b0383166000818152601560205260408120839055600183018455929092527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b03191690911790556001600160a01b03166000908152600d60205260409020805460ff19166001179055565b6014546000819003612022575050565b6023546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561206b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208f91906129aa565b905080158061209f575080601c54115b156120a957505050565b6000805a9050600080602260009054906101000a90046001600160a01b03166001600160a01b031663b214b80f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612105573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212991906129aa565b905060005b878510801561213c57508683105b156123b75786600e5410612150576000600e555b602254600e54601480546001600160a01b0390931692633b36f84a9290811061217b5761217b612a76565b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ef91906129c3565b6123755760006122b2836113d7600760009054906101000a90046001600160a01b03166001600160a01b03166370a082316014600e548154811061223557612235612a76565b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a991906129aa565b601c5490611e44565b6023546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156122ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232391906129aa565b101561233457505050505050505050565b6123676014600e548154811061234c5761234c612a76565b6000918252602090912001546001600160a01b0316826124ee565b6123718282611e63565b9150505b61238a6123835a8690611e6f565b8690611e63565b94505a600e8054919550600061239f83612a8c565b919050555082806123af90612a8c565b93505061212e565b601c546123c49082611e6f565b601c555050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061240657612406612a76565b6001600160a01b03928316602091820292909201015260235482519116908290600190811061243757612437612a76565b6001600160a01b03928316602091820292909201015260065461245d9130911685610d42565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590612496908690600090869088904290600401612aa5565b600060405180830381600087803b1580156124b057600080fd5b505af1158015611975573d6000803e3d6000fd5b6124cd816125ad565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b60235460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015612541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256591906129c3565b50816001600160a01b03167f3ad34c985b0b054b3a679f9d8b36799e934b38bd382e61080b417db9402b2bbb826040516125a191815260200190565b60405180910390a25050565b601480546125bd90600190612a63565b815481106125cd576125cd612a76565b60009182526020808320909101546001600160a01b038481168452601590925260409092205460148054929093169291811061260b5761260b612a76565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591831681526015918290526040812054601480549193929161265790600190612a63565b8154811061266757612667612a76565b60009182526020808320909101546001600160a01b03168352820192909252604001902055601480548061269d5761269d612b16565b600082815260209020810160001990810180546001600160a01b031916905501905550565b600060208083528351808285015260005b818110156126ef578581018301518582016040015282016126d3565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461272757600080fd5b919050565b6000806040838503121561273f57600080fd5b61274883612710565b946020939093013593505050565b60008060006060848603121561276b57600080fd5b61277484612710565b925061278260208501612710565b9150604084013590509250925092565b600080600080600080600060e0888a0312156127ad57600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b6000602082840312156127f057600080fd5b5035919050565b60006020828403121561280957600080fd5b611e5082612710565b8015158114610d3f57600080fd5b6000806040838503121561283357600080fd5b61283c83612710565b9150602083013561284c81612812565b809150509250929050565b6000806040838503121561286a57600080fd5b61287383612710565b915061288160208401612710565b90509250929050565b600181811c9082168061289e57607f821691505b6020821081036128be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610871576108716128c4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000602082840312156129bc57600080fd5b5051919050565b6000602082840312156129d557600080fd5b8151611e5081612812565b60008060008060008060c087890312156129f957600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b8082028115828204841417610871576108716128c4565b600082612a5e57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610871576108716128c4565b634e487b7160e01b600052603260045260246000fd5b600060018201612a9e57612a9e6128c4565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612af55784516001600160a01b031683529383019391830191600101612ad0565b50506001600160a01b03969096166060850152505050608001529392505050565b634e487b7160e01b600052603160045260246000fdfea264697066735822122080243a434087219de600d5d4a2dc165ad50e26c195b0df5bba18a42bf79068de64736f6c63430008130033608060405234801561001057600080fd5b506040516105d23803806105d283398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b61053f806100936000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806351cff8d9146100515780638da5cb5b14610066578063f3fef3a314610095578063f940e385146100a8575b600080fd5b61006461005f366004610422565b6100bb565b005b600054610079906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b6100646100a3366004610444565b6101d8565b6100646100b636600461046e565b610334565b6000546001600160a01b031633146100ee5760405162461bcd60e51b81526004016100e5906104a1565b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610135573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015991906104ce565b905080156101d45760405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156101ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d291906104e7565b505b5050565b6000546001600160a01b031633146102025760405162461bcd60e51b81526004016100e5906104a1565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026d91906104ce565b905060008211801561027f5750818110155b6102bc5760405162461bcd60e51b815260206004820152600e60248201526d125b1b1959d85b08185b5bdd5b9d60921b60448201526064016100e5565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044015b6020604051808303816000875af115801561030a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032e91906104e7565b50505050565b6000546001600160a01b0316331461035e5760405162461bcd60e51b81526004016100e5906104a1565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c991906104ce565b905080156101d25760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016102eb565b80356001600160a01b038116811461041d57600080fd5b919050565b60006020828403121561043457600080fd5b61043d82610406565b9392505050565b6000806040838503121561045757600080fd5b61046083610406565b946020939093013593505050565b6000806040838503121561048157600080fd5b61048a83610406565b915061049860208401610406565b90509250929050565b60208082526013908201527231b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6000602082840312156104e057600080fd5b5051919050565b6000602082840312156104f957600080fd5b8151801515811461043d57600080fdfea2646970667358221220a884e65c9802a7ab9cdf6414ad402c7cb5434f8ff37e96b61699398ed362d40264736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102605760003560e01c80638663675f11610144578063bd36236d116100b6578063ee3a35e11161007a578063ee3a35e11461072d578063f2fde38b14610743578063f6e1c1c414610763578063fcc528d214610783578063fe31572314610799578063ffa1ad74146107b957600080fd5b8063bd36236d1461066e578063c09bb65614610684578063d4fda1f2146106a4578063dd62ed3e146106d1578063e486aa741461071757600080fd5b80639c1b8af5116101085780639c1b8af5146105b2578063a457c2d7146105c8578063a9059cbb146105e8578063aad5513f14610608578063ab377daa1461061e578063b62496f51461063e57600080fd5b80638663675f146105195780638da5cb5b1461052f57806395d89b411461054d57806398d0062c146105625780639a7a23d61461059257600080fd5b8063383851c5116101dd57806356dc2fca116101a157806356dc2fca1461044c5780635c4ebc0d1461046e578063692885401461048e57806370a08231146104ae578063715018a6146104e45780637ae290f8146104f957600080fd5b8063383851c5146103c057806339509351146103d657806339e788b9146103f65780633ad10ef61461040c57806349bd5a5e1461042c57600080fd5b80631694505e116102245780631694505e1461033957806318160ddd1461035957806323b872dd1461036e57806326987b601461038e578063313ce567146103a457600080fd5b806306fdde031461026c578063095ea7b3146102975780630b1d406b146102c75780630b53e0b2146102eb5780630e511ee11461030157600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107ce565b60405161028e91906126c2565b60405180910390f35b3480156102a357600080fd5b506102b76102b236600461272c565b610860565b604051901515815260200161028e565b3480156102d357600080fd5b506102dd60105481565b60405190815260200161028e565b3480156102f757600080fd5b506102dd60175481565b34801561030d57600080fd5b50602154610321906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b34801561034557600080fd5b50600654610321906001600160a01b031681565b34801561036557600080fd5b506002546102dd565b34801561037a57600080fd5b506102b7610389366004612756565b610877565b34801561039a57600080fd5b506102dd600e5481565b3480156103b057600080fd5b506040516012815260200161028e565b3480156103cc57600080fd5b506102dd60165481565b3480156103e257600080fd5b506102b76103f136600461272c565b610926565b34801561040257600080fd5b506102dd601e5481565b34801561041857600080fd5b50600854610321906001600160a01b031681565b34801561043857600080fd5b50600754610321906001600160a01b031681565b34801561045857600080fd5b5061046c610467366004612792565b610962565b005b34801561047a57600080fd5b5061046c6104893660046127de565b6109e0565b34801561049a57600080fd5b5061046c6104a93660046127f7565b610a0f565b3480156104ba57600080fd5b506102dd6104c93660046127f7565b6001600160a01b031660009081526020819052604090205490565b3480156104f057600080fd5b5061046c610a5b565b34801561050557600080fd5b50602054610321906001600160a01b031681565b34801561052557600080fd5b506102dd601d5481565b34801561053b57600080fd5b506005546001600160a01b0316610321565b34801561055957600080fd5b50610281610a91565b34801561056e57600080fd5b506102b761057d3660046127f7565b600d6020526000908152604090205460ff1681565b34801561059e57600080fd5b5061046c6105ad366004612820565b610aa0565b3480156105be57600080fd5b506102dd600a5481565b3480156105d457600080fd5b506102b76105e336600461272c565b610ba8565b3480156105f457600080fd5b506102b761060336600461272c565b610c41565b34801561061457600080fd5b506102dd601c5481565b34801561062a57600080fd5b506103216106393660046127de565b610c4e565b34801561064a57600080fd5b506102b76106593660046127f7565b600c6020526000908152604090205460ff1681565b34801561067a57600080fd5b506102dd60195481565b34801561069057600080fd5b5061046c61069f3660046127de565b610c78565b3480156106b057600080fd5b506102dd6106bf3660046127f7565b60156020526000908152604090205481565b3480156106dd57600080fd5b506102dd6106ec366004612857565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561072357600080fd5b506102dd601a5481565b34801561073957600080fd5b506102dd60185481565b34801561074f57600080fd5b5061046c61075e3660046127f7565b610ca7565b34801561076f57600080fd5b50601f54610321906001600160a01b031681565b34801561078f57600080fd5b506102dd601b5481565b3480156107a557600080fd5b50602254610321906001600160a01b031681565b3480156107c557600080fd5b506102dd600181565b6060600380546107dd9061288a565b80601f01602080910402602001604051908101604052809291908181526020018280546108099061288a565b80156108565780601f1061082b57610100808354040283529160200191610856565b820191906000526020600020905b81548152906001019060200180831161083957829003601f168201915b5050505050905090565b600061086d338484610d42565b5060015b92915050565b6000610884848484610e66565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561090e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61091b8533858403610d42565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161086d91859061095d9086906128da565b610d42565b60225460405163eb253c5b60e01b81523360048201526001600160a01b039091169063eb253c5b9060240160006040518083038186803b1580156109a557600080fd5b505afa1580156109b9573d6000803e3d6000fd5b505050601697909755601795909555601893909355601991909155601b55601a55601c5550565b6005546001600160a01b03163314610a0a5760405162461bcd60e51b8152600401610905906128ed565b601055565b6005546001600160a01b03163314610a395760405162461bcd60e51b8152600401610905906128ed565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610a855760405162461bcd60e51b8152600401610905906128ed565b610a8f600061197f565b565b6060600480546107dd9061288a565b60225460405163eb253c5b60e01b81523360048201526001600160a01b039091169063eb253c5b9060240160006040518083038186803b158015610ae357600080fd5b505afa158015610af7573d6000803e3d6000fd5b50506007546001600160a01b03908116908516039150610b9a90505760405162461bcd60e51b815260206004820152605060248201527f42414259544f4b454e3a205468652050616e63616b655377617020706169722060448201527f63616e6e6f742062652072656d6f7665642066726f6d206175746f6d6174656460648201526f4d61726b65744d616b6572506169727360801b608482015260a401610905565b610ba482826119d1565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610c2a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610905565b610c373385858403610d42565b5060019392505050565b600061086d338484610e66565b60148181548110610c5e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610905906128ed565b600f55565b6005546001600160a01b03163314610cd15760405162461bcd60e51b8152600401610905906128ed565b6001600160a01b038116610d365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610905565b610d3f8161197f565b50565b6001600160a01b038316610da45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610905565b6001600160a01b038216610e055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610905565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610e8c5760405162461bcd60e51b815260040161090590612922565b6001600160a01b038216610eb25760405162461bcd60e51b815260040161090590612967565b80600003610ecb57610ec683836000611ac7565b505050565b6001600160a01b038316301480610eea57506001600160a01b03821630145b15610efa57610ec6838383611ac7565b60225460408051632f6e97cb60e11b815290516000926001600160a01b031691635edd2f969160048083019260209291908290030181865afa158015610f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6891906129aa565b306000908152602081905260409020549091508111158015610f945750600754600160a01b900460ff16155b80156110145750602260009054906101000a90046001600160a01b03166001600160a01b031663fa4f7cef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101291906129c3565b155b801561103957506001600160a01b0384166000908152600c602052604090205460ff16155b801561105357506005546001600160a01b03858116911614155b801561106d57506005546001600160a01b03848116911614155b1561118657602254604051633a15814f60e11b81526001600160a01b0386811660048301529091169063742b029e90602401602060405180830381865afa1580156110bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e091906129c3565b1580156111585750602254604051633a15814f60e11b81526001600160a01b0385811660048301529091169063742b029e90602401602060405180830381865afa158015611132573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115691906129c3565b155b15611186576007805460ff60a01b1916600160a01b179055611178611c1c565b6007805460ff60a01b191690555b600754602254604051633a15814f60e11b81526001600160a01b038781166004830152600160a01b90930460ff1615929091169063742b029e90602401602060405180830381865afa1580156111e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120491906129c3565b806112785750602254604051633a15814f60e11b81526001600160a01b0386811660048301529091169063742b029e90602401602060405180830381865afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127891906129c3565b15611281575060005b60008115611606576000806000806000602260009054906101000a90046001600160a01b03166001600160a01b03166310225db86040518163ffffffff1660e01b815260040160c060405180830381865afa1580156112e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130891906129e0565b5094509450945094509450600c60008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff16156114a757602260009054906101000a90046001600160a01b03166001600160a01b031663af3994906040518163ffffffff1660e01b8152600401602060405180830381865afa15801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c291906129c3565b1561140c576113dd6103e86113d78b88611e44565b90611e57565b600954909650611407908c906001600160a01b03166114026103e86113d78e8b611e44565b611ac7565b6115f4565b61141c6103e86113d78b86611e44565b61142c6103e86113d78c88611e44565b61143691906128da565b955061144d8b306114026103e86113d78e8a611e44565b61146a6114616103e86113d78c600a611e44565b60175490611e63565b6017556114828b306114026103e86113d78e89611e44565b61149f6114966103e86113d78c600a611e44565b601a5490611e63565b601a556115f4565b6001600160a01b038a166000908152600c602052604090205460ff16156115ef576509184e72a0006114f88a6114f28e6001600160a01b031660009081526020819052604090205490565b90611e6f565b10156115335760405162461bcd60e51b815260206004820152600a60248201526939b2b6361032b93937b960b11b6044820152606401610905565b6115436103e86113d78b86611e44565b6115536103e86113d78c85611e44565b6115636103e86113d78d87611e44565b61156d91906128da565b61157791906128da565b60095490965061159c908c906001600160a01b03166114026103e86113d78e88611e44565b6115b18b306114026103e86113d78e87611e44565b6115c46114616103e86113d78c85611e44565b6017556115dc8b306114026103e86113d78e89611e44565b61149f6114966103e86113d78c87611e44565b600095505b6115fe8987611e6f565b985050505050505b611611868686611ac7565b6011546001600160a01b031661163d57601180546001600160a01b0319166001600160a01b0388161790555b6012546001600160a01b031661166957601280546001600160a01b0319166001600160a01b0387161790555b602254601154604051631d9b7c2560e11b81526001600160a01b039182166004820152911690633b36f84a90602401602060405180830381865afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d991906129c3565b1580156116f757506007546011546001600160a01b03908116911614155b1561171157601154611711906001600160a01b0316611e7b565b602254601254604051631d9b7c2560e11b81526001600160a01b039182166004820152911690633b36f84a90602401602060405180830381865afa15801561175d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178191906129c3565b15801561179f57506007546012546001600160a01b03908116911614155b156117b9576012546117b9906001600160a01b0316611e7b565b601180546001600160a01b038881166001600160a01b0319928316811790935560128054898316931692909217909155602254604051633a15814f60e11b81526004810193909352169063742b029e90602401602060405180830381865afa158015611829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184d91906129c3565b1580156118c55750602254604051633a15814f60e11b81526001600160a01b0387811660048301529091169063742b029e90602401602060405180830381865afa15801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c391906129c3565b155b156119775760225460408051635f2ddd3560e11b815290516000926001600160a01b03169163be5bba6a9160048083019260209291908290030181865afa158015611914573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193891906129aa565b90506001600160a01b03871630148015906119605750601054429061195d9083611e63565b11155b1561197557611970600f54612012565b426010555b505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152600c602052604090205481151560ff909116151503611a735760405162461bcd60e51b815260206004820152604360248201527f42414259544f4b454e3a204175746f6d61746564206d61726b6574206d616b6560448201527f72207061697220697320616c72656164792073657420746f20746861742076616064820152626c756560e81b608482015260a401610905565b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611aed5760405162461bcd60e51b815260040161090590612922565b6001600160a01b038216611b135760405162461bcd60e51b815260040161090590612967565b6001600160a01b03831660009081526020819052604090205481811015611b8b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610905565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611bc29084906128da565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c0e91815260200190565b60405180910390a350505050565b6007546001600160a01b03166000908152602081905260408120548190611c4b906064906113d7906032611e44565b6023546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbd91906129aa565b60175490915015611df1576017549250600082118015611cde575060175482105b15611ce7578192505b601f54611cfe9084906001600160a01b03166123d1565b601f546023546040516351cff8d960e01b81526001600160a01b0391821660048201529116906351cff8d990602401600060405180830381600087803b158015611d4757600080fd5b505af1158015611d5b573d6000803e3d6000fd5b5050601754611d6d9250905084611e6f565b6017556023546040516370a0823160e01b8152306004820152611ded91611de49184916001600160a01b0316906370a0823190602401602060405180830381865afa158015611dc0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f291906129aa565b601c5490611e63565b601c555b601a5415610ec657601a549250600082118015611e0f5750601a5482105b15611e18578192505b600854611e2f9084906001600160a01b03166123d1565b601a54611e3c9084611e6f565b601a55505050565b6000611e508284612a2a565b9392505050565b6000611e508284612a41565b6000611e5082846128da565b6000611e508284612a63565b6001600160a01b0381166000908152600d602052604090205460ff1615611f1a576007546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a0823190602401602060405180830381865afa158015611ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0a91906129aa565b600003610d3f57610d3f816124c4565b6007546040516370a0823160e01b81526001600160a01b038381166004830152909116906370a0823190602401602060405180830381865afa158015611f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8891906129aa565b600003611f925750565b601480546001600160a01b0383166000818152601560205260408120839055600183018455929092527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b03191690911790556001600160a01b03166000908152600d60205260409020805460ff19166001179055565b6014546000819003612022575050565b6023546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561206b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208f91906129aa565b905080158061209f575080601c54115b156120a957505050565b6000805a9050600080602260009054906101000a90046001600160a01b03166001600160a01b031663b214b80f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612105573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212991906129aa565b905060005b878510801561213c57508683105b156123b75786600e5410612150576000600e555b602254600e54601480546001600160a01b0390931692633b36f84a9290811061217b5761217b612a76565b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ef91906129c3565b6123755760006122b2836113d7600760009054906101000a90046001600160a01b03166001600160a01b03166370a082316014600e548154811061223557612235612a76565b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a991906129aa565b601c5490611e44565b6023546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156122ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232391906129aa565b101561233457505050505050505050565b6123676014600e548154811061234c5761234c612a76565b6000918252602090912001546001600160a01b0316826124ee565b6123718282611e63565b9150505b61238a6123835a8690611e6f565b8690611e63565b94505a600e8054919550600061239f83612a8c565b919050555082806123af90612a8c565b93505061212e565b601c546123c49082611e6f565b601c555050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061240657612406612a76565b6001600160a01b03928316602091820292909201015260235482519116908290600190811061243757612437612a76565b6001600160a01b03928316602091820292909201015260065461245d9130911685610d42565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590612496908690600090869088904290600401612aa5565b600060405180830381600087803b1580156124b057600080fd5b505af1158015611975573d6000803e3d6000fd5b6124cd816125ad565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b60235460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015612541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256591906129c3565b50816001600160a01b03167f3ad34c985b0b054b3a679f9d8b36799e934b38bd382e61080b417db9402b2bbb826040516125a191815260200190565b60405180910390a25050565b601480546125bd90600190612a63565b815481106125cd576125cd612a76565b60009182526020808320909101546001600160a01b038481168452601590925260409092205460148054929093169291811061260b5761260b612a76565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591831681526015918290526040812054601480549193929161265790600190612a63565b8154811061266757612667612a76565b60009182526020808320909101546001600160a01b03168352820192909252604001902055601480548061269d5761269d612b16565b600082815260209020810160001990810180546001600160a01b031916905501905550565b600060208083528351808285015260005b818110156126ef578581018301518582016040015282016126d3565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461272757600080fd5b919050565b6000806040838503121561273f57600080fd5b61274883612710565b946020939093013593505050565b60008060006060848603121561276b57600080fd5b61277484612710565b925061278260208501612710565b9150604084013590509250925092565b600080600080600080600060e0888a0312156127ad57600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b6000602082840312156127f057600080fd5b5035919050565b60006020828403121561280957600080fd5b611e5082612710565b8015158114610d3f57600080fd5b6000806040838503121561283357600080fd5b61283c83612710565b9150602083013561284c81612812565b809150509250929050565b6000806040838503121561286a57600080fd5b61287383612710565b915061288160208401612710565b90509250929050565b600181811c9082168061289e57607f821691505b6020821081036128be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610871576108716128c4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000602082840312156129bc57600080fd5b5051919050565b6000602082840312156129d557600080fd5b8151611e5081612812565b60008060008060008060c087890312156129f957600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b8082028115828204841417610871576108716128c4565b600082612a5e57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610871576108716128c4565b634e487b7160e01b600052603260045260246000fd5b600060018201612a9e57612a9e6128c4565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612af55784516001600160a01b031683529383019391830191600101612ad0565b50506001600160a01b03969096166060850152505050608001529392505050565b634e487b7160e01b600052603160045260246000fdfea264697066735822122080243a434087219de600d5d4a2dc165ad50e26c195b0df5bba18a42bf79068de64736f6c63430008130033

Deployed Bytecode Sourcemap

67593:13425:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6817:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8984:169;;;;;;;;;;-1:-1:-1;8984:169:0;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;8984:169:0;1004:187:1;68501:27:0;;;;;;;;;;;;;;;;;;;1342:25:1;;;1330:2;1315:18;68501:27:0;1196:177:1;68765:23:0;;;;;;;;;;;;;;;;70001:84;;;;;;;;;;-1:-1:-1;70001:84:0;;;;-1:-1:-1;;;;;70001:84:0;;;;;;-1:-1:-1;;;;;1542:32:1;;;1524:51;;1512:2;1497:18;70001:84:0;1378:203:1;67721:41:0;;;;;;;;;;-1:-1:-1;67721:41:0;;;;-1:-1:-1;;;;;67721:41:0;;;7937:108;;;;;;;;;;-1:-1:-1;8025:12:0;;7937:108;;9635:480;;;;;;;;;;-1:-1:-1;9635:480:0;;;;;:::i;:::-;;:::i;68429:27::-;;;;;;;;;;;;;;;;7779:93;;;;;;;;;;-1:-1:-1;7779:93:0;;7862:2;2296:36:1;;2284:2;2269:18;7779:93:0;2154:184:1;68733:25:0;;;;;;;;;;;;;;;;10524:215;;;;;;;;;;-1:-1:-1;10524:215:0;;;;;:::i;:::-;;:::i;68984:25::-;;;;;;;;;;;;;;;;67842:79;;;;;;;;;;-1:-1:-1;67842:79:0;;;;-1:-1:-1;;;;;67842:79:0;;;67769:28;;;;;;;;;;-1:-1:-1;67769:28:0;;;;-1:-1:-1;;;;;67769:28:0;;;71457:361;;;;;;;;;;-1:-1:-1;71457:361:0;;;;;:::i;:::-;;:::i;:::-;;71351:92;;;;;;;;;;-1:-1:-1;71351:92:0;;;;;:::i;:::-;;:::i;72566:85::-;;;;;;;;;;-1:-1:-1;72566:85:0;;;;;:::i;:::-;;:::i;8108:127::-;;;;;;;;;;-1:-1:-1;8108:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;8209:18:0;8182:7;8209:18;;;;;;;;;;;;8108:127;18657:94;;;;;;;;;;;;;:::i;69913:81::-;;;;;;;;;;-1:-1:-1;69913:81:0;;;;-1:-1:-1;;;;;69913:81:0;;;68952:25;;;;;;;;;;;;;;;;18006:87;;;;;;;;;;-1:-1:-1;18079:6:0;;-1:-1:-1;;;;;18079:6:0;18006:87;;7036:104;;;;;;;;;;;;;:::i;68382:40::-;;;;;;;;;;-1:-1:-1;68382:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;71836:352;;;;;;;;;;-1:-1:-1;71836:352:0;;;;;:::i;:::-;;:::i;68017:31::-;;;;;;;;;;;;;;;;11242:401;;;;;;;;;;-1:-1:-1;11242:401:0;;;;;:::i;:::-;;:::i;8448:175::-;;;;;;;;;;-1:-1:-1;8448:175:0;;;;;:::i;:::-;;:::i;68922:23::-;;;;;;;;;;;;;;;;68635:29;;;;;;;;;;-1:-1:-1;68635:29:0;;;;;:::i;:::-;;:::i;68308:57::-;;;;;;;;;;-1:-1:-1;68308:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68826:25;;;;;;;;;;;;;;;;71247:96;;;;;;;;;;-1:-1:-1;71247:96:0;;;;;:::i;:::-;;:::i;68671:53::-;;;;;;;;;;-1:-1:-1;68671:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;8686:151;;;;;;;;;;-1:-1:-1;8686:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;8802:18:0;;;8775:7;8802:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8686:151;68858:24;;;;;;;;;;;;;;;;68795;;;;;;;;;;;;;;;;18906:192;;;;;;;;;;-1:-1:-1;18906:192:0;;;;;:::i;:::-;;:::i;69020:25::-;;;;;;;;;;-1:-1:-1;69020:25:0;;;;-1:-1:-1;;;;;69020:25:0;;;68889:24;;;;;;;;;;;;;;;;70094:76;;;;;;;;;;-1:-1:-1;70094:76:0;;;;-1:-1:-1;;;;;70094:76:0;;;67677:35;;;;;;;;;;;;67711:1;67677:35;;6817:100;6871:13;6904:5;6897:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6817:100;:::o;8984:169::-;9067:4;9084:39;4403:10;9107:7;9116:6;9084:8;:39::i;:::-;-1:-1:-1;9141:4:0;8984:169;;;;;:::o;9635:480::-;9775:4;9792:36;9802:6;9810:9;9821:6;9792:9;:36::i;:::-;-1:-1:-1;;;;;9868:19:0;;9841:24;9868:19;;;:11;:19;;;;;;;;4403:10;9868:33;;;;;;;;9920:26;;;;9912:79;;;;-1:-1:-1;;;9912:79:0;;4836:2:1;9912:79:0;;;4818:21:1;4875:2;4855:18;;;4848:30;4914:34;4894:18;;;4887:62;-1:-1:-1;;;4965:18:1;;;4958:38;5013:19;;9912:79:0;;;;;;;;;10019:57;10028:6;4403:10;10069:6;10050:16;:25;10019:8;:57::i;:::-;-1:-1:-1;10103:4:0;;9635:480;-1:-1:-1;;;;9635:480:0:o;10524:215::-;4403:10;10612:4;10661:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10661:34:0;;;;;;;;;;10612:4;;10629:80;;10652:7;;10661:47;;10698:10;;10661:47;:::i;:::-;10629:8;:80::i;71457:361::-;71598:8;;71594:35;;-1:-1:-1;;;71594:35:0;;71618:10;71594:35;;;1524:51:1;-1:-1:-1;;;;;71598:8:0;;;;71594:23;;1497:18:1;;71594:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71640:10:0;:15;;;;71666:8;:14;;;;71691:9;:15;;;;71717:10;:16;;;;71744:9;:15;71770:9;:15;71796:8;:14;-1:-1:-1;71457:361:0:o;71351:92::-;18079:6;;-1:-1:-1;;;;;18079:6:0;4403:10;18226:23;18218:68;;;;-1:-1:-1;;;18218:68:0;;;;;;;:::i;:::-;71418:12:::1;:17:::0;71351:92::o;72566:85::-;18079:6;;-1:-1:-1;;;;;18079:6:0;4403:10;18226:23;18218:68;;;;-1:-1:-1;;;18218:68:0;;;;;;;:::i;:::-;72627:10:::1;:16:::0;;-1:-1:-1;;;;;;72627:16:0::1;-1:-1:-1::0;;;;;72627:16:0;;;::::1;::::0;;;::::1;::::0;;72566:85::o;18657:94::-;18079:6;;-1:-1:-1;;;;;18079:6:0;4403:10;18226:23;18218:68;;;;-1:-1:-1;;;18218:68:0;;;;;;;:::i;:::-;18722:21:::1;18740:1;18722:9;:21::i;:::-;18657:94::o:0;7036:104::-;7092:13;7125:7;7118:14;;;;;:::i;71836:352::-;71933:8;;71929:35;;-1:-1:-1;;;71929:35:0;;71953:10;71929:35;;;1524:51:1;-1:-1:-1;;;;;71933:8:0;;;;71929:23;;1497:18:1;;71929:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72005:13:0;;-1:-1:-1;;;;;72005:13:0;;;71997:21;;;;;-1:-1:-1;71975:151:0;;-1:-1:-1;71975:151:0;;;-1:-1:-1;;;71975:151:0;;5868:2:1;71975:151:0;;;5850:21:1;5907:2;5887:18;;;5880:30;5946:34;5926:18;;;5919:62;6017:34;5997:18;;;5990:62;-1:-1:-1;;;6068:19:1;;;6061:47;6125:19;;71975:151:0;5666:484:1;71975:151:0;72139:41;72168:4;72174:5;72139:28;:41::i;:::-;71836:352;;:::o;11242:401::-;4403:10;11335:4;11379:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11379:34:0;;;;;;;;;;11432:35;;;;11424:85;;;;-1:-1:-1;;;11424:85:0;;6357:2:1;11424:85:0;;;6339:21:1;6396:2;6376:18;;;6369:30;6435:34;6415:18;;;6408:62;-1:-1:-1;;;6486:18:1;;;6479:35;6531:19;;11424:85:0;6155:401:1;11424:85:0;11537:67;4403:10;11560:7;11588:15;11569:16;:34;11537:8;:67::i;:::-;-1:-1:-1;11631:4:0;;11242:401;-1:-1:-1;;;11242:401:0:o;8448:175::-;8534:4;8551:42;4403:10;8575:9;8586:6;8551:9;:42::i;68635:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68635:29:0;;-1:-1:-1;68635:29:0;:::o;71247:96::-;18079:6;;-1:-1:-1;;;;;18079:6:0;4403:10;18226:23;18218:68;;;;-1:-1:-1;;;18218:68:0;;;;;;;:::i;:::-;71316:14:::1;:19:::0;71247:96::o;18906:192::-;18079:6;;-1:-1:-1;;;;;18079:6:0;4403:10;18226:23;18218:68;;;;-1:-1:-1;;;18218:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18995:22:0;::::1;18987:73;;;::::0;-1:-1:-1;;;18987:73:0;;6763:2:1;18987:73:0::1;::::0;::::1;6745:21:1::0;6802:2;6782:18;;;6775:30;6841:34;6821:18;;;6814:62;-1:-1:-1;;;6892:18:1;;;6885:36;6938:19;;18987:73:0::1;6561:402:1::0;18987:73:0::1;19071:19;19081:8;19071:9;:19::i;:::-;18906:192:::0;:::o;15098:380::-;-1:-1:-1;;;;;15234:19:0;;15226:68;;;;-1:-1:-1;;;15226:68:0;;7170:2:1;15226:68:0;;;7152:21:1;7209:2;7189:18;;;7182:30;7248:34;7228:18;;;7221:62;-1:-1:-1;;;7299:18:1;;;7292:34;7343:19;;15226:68:0;6968:400:1;15226:68:0;-1:-1:-1;;;;;15313:21:0;;15305:68;;;;-1:-1:-1;;;15305:68:0;;7575:2:1;15305:68:0;;;7557:21:1;7614:2;7594:18;;;7587:30;7653:34;7633:18;;;7626:62;-1:-1:-1;;;7704:18:1;;;7697:32;7746:19;;15305:68:0;7373:398:1;15305:68:0;-1:-1:-1;;;;;15386:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15438:32;;1342:25:1;;;15438:32:0;;1315:18:1;15438:32:0;;;;;;;15098:380;;;:::o;72665:3610::-;-1:-1:-1;;;;;72797:18:0;;72789:68;;;;-1:-1:-1;;;72789:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72876:16:0;;72868:64;;;;-1:-1:-1;;;72868:64:0;;;;;;;:::i;:::-;72951:6;72961:1;72951:11;72947:93;;72979:28;72995:4;73001:2;73005:1;72979:15;:28::i;:::-;72665:3610;;;:::o;72947:93::-;-1:-1:-1;;;;;73056:21:0;;73072:4;73056:21;;:44;;-1:-1:-1;;;;;;73081:19:0;;73095:4;73081:19;73056:44;73052:131;;;73117:33;73133:4;73139:2;73143:6;73117:15;:33::i;73052:131::-;73242:8;;73238:22;;;-1:-1:-1;;;73238:22:0;;;;73199:37;;-1:-1:-1;;;;;73242:8:0;;73238:20;;:22;;;;;;;;;;;;;;73242:8;73238:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73309:4;8182:7;8209:18;;;;;;;;;;;73199:61;;-1:-1:-1;73199:61:0;-1:-1:-1;73291:57:0;:83;;;;-1:-1:-1;73366:8:0;;-1:-1:-1;;;73366:8:0;;;;73365:9;73291:83;:120;;;;;73396:8;;;;;;;;;-1:-1:-1;;;;;73396:8:0;-1:-1:-1;;;;;73392:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73391:20;73291:120;:169;;;;-1:-1:-1;;;;;;73429:31:0;;;;;;:25;:31;;;;;;;;73428:32;73291:169;:201;;;;-1:-1:-1;18079:6:0;;-1:-1:-1;;;;;73477:15:0;;;18079:6;;73477:15;;73291:201;:231;;;;-1:-1:-1;18079:6:0;;-1:-1:-1;;;;;73509:13:0;;;18079:6;;73509:13;;73291:231;73273:469;;;73559:8;;73555:24;;-1:-1:-1;;;73555:24:0;;-1:-1:-1;;;;;1542:32:1;;;73555:24:0;;;1524:51:1;73559:8:0;;;;73555:18;;1497::1;;73555:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73554:25;:52;;;;-1:-1:-1;73588:8:0;;73584:22;;-1:-1:-1;;;73584:22:0;;-1:-1:-1;;;;;1542:32:1;;;73584:22:0;;;1524:51:1;73588:8:0;;;;73584:18;;1497::1;;73584:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73583:23;73554:52;73551:178;;;73626:8;:15;;-1:-1:-1;;;;73626:15:0;-1:-1:-1;;;73626:15:0;;;73660:18;:16;:18::i;:::-;73697:8;:16;;-1:-1:-1;;;;73697:16:0;;;73551:178;73770:8;;73798;;73794:24;;-1:-1:-1;;;73794:24:0;;-1:-1:-1;;;;;1542:32:1;;;73794:24:0;;;1524:51:1;-1:-1:-1;;;73770:8:0;;;;;73769:9;;73798:8;;;;73794:18;;1497::1;;73794:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;-1:-1:-1;73826:8:0;;73822:22;;-1:-1:-1;;;73822:22:0;;-1:-1:-1;;;;;1542:32:1;;;73822:22:0;;;1524:51:1;73826:8:0;;;;73822:18;;1497::1;;73822:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73791:96;;;-1:-1:-1;73870:5:0;73791:96;73899:11;73925:7;73921:1540;;;73950:10;73961;73972;73983;73994;74012:8;;;;;;;;;-1:-1:-1;;;;;74012:8:0;-1:-1:-1;;;;;74008:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73949:79;;;;;;;;;;;74047:25;:31;74073:4;-1:-1:-1;;;;;74047:31:0;-1:-1:-1;;;;;74047:31:0;;;;;;;;;;;;;;;;;;;;;;74043:1366;;;74125:8;;;;;;;;;-1:-1:-1;;;;;74125:8:0;-1:-1:-1;;;;;74121:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74118:595;;;74168:24;74187:4;74168:14;:6;74179:2;74168:10;:14::i;:::-;:18;;:24::i;:::-;74237:9;;74164:28;;-1:-1:-1;74215:58:0;;74231:4;;-1:-1:-1;;;;;74237:9:0;74248:24;74267:4;74248:14;:6;74259:2;74248:10;:14::i;:24::-;74215:15;:58::i;:::-;74043:1366;;74118:595;74351:24;74370:4;74351:14;:6;74362:2;74351:10;:14::i;:24::-;74326;74345:4;74326:14;:6;74337:2;74326:10;:14::i;:24::-;:49;;;;:::i;:::-;74322:53;-1:-1:-1;74402:62:0;74418:4;74432;74439:24;74458:4;74439:14;:6;74450:2;74439:10;:14::i;74402:62::-;74496:38;74509:24;74528:4;74509:14;:6;74520:2;74509:10;:14::i;:24::-;74496:8;;;:12;:38::i;:::-;74487:8;:47;74559:62;74575:4;74589;74596:24;74615:4;74596:14;:6;74607:2;74596:10;:14::i;74559:62::-;74654:39;74668:24;74687:4;74668:14;:6;74679:2;74668:10;:14::i;:24::-;74654:9;;;:13;:39::i;:::-;74644:9;:49;74043:1366;;;-1:-1:-1;;;;;74761:29:0;;;;;;:25;:29;;;;;;;;74757:652;;;74847:6;74818:27;74838:6;74818:15;74828:4;-1:-1:-1;;;;;8209:18:0;8182:7;8209:18;;;;;;;;;;;;8108:127;74818:15;:19;;:27::i;:::-;:35;;74810:57;;;;-1:-1:-1;;;74810:57:0;;9724:2:1;74810:57:0;;;9706:21:1;9763:2;9743:18;;;9736:30;-1:-1:-1;;;9782:18:1;;;9775:40;9832:18;;74810:57:0;9522:334:1;74810:57:0;74942:24;74961:4;74942:14;:6;74953:2;74942:10;:14::i;:24::-;74917;74936:4;74917:14;:6;74928:2;74917:10;:14::i;:24::-;74892;74911:4;74892:14;:6;74903:2;74892:10;:14::i;:24::-;:49;;;;:::i;:::-;:74;;;;:::i;:::-;75009:9;;74888:78;;-1:-1:-1;74987:58:0;;75003:4;;-1:-1:-1;;;;;75009:9:0;75020:24;75039:4;75020:14;:6;75031:2;75020:10;:14::i;74987:58::-;75066:62;75082:4;75096;75103:24;75122:4;75103:14;:6;75114:2;75103:10;:14::i;75066:62::-;75156:38;75169:24;75188:4;75169:14;:6;75180:2;75169:10;:14::i;75156:38::-;75147:8;:47;75215:62;75231:4;75245;75252:24;75271:4;75252:14;:6;75263:2;75252:10;:14::i;75215:62::-;75306:39;75320:24;75339:4;75320:14;:6;75331:2;75320:10;:14::i;74757:652::-;75390:1;75386:5;;74757:652;75434:15;:6;75445:3;75434:10;:15::i;:::-;75425:24;;73934:1527;;;;;73921:1540;75473:33;75489:4;75495:2;75499:6;75473:15;:33::i;:::-;75523:11;;-1:-1:-1;;;;;75523:11:0;75519:49;;75550:11;:18;;-1:-1:-1;;;;;;75550:18:0;-1:-1:-1;;;;;75550:18:0;;;;;75519:49;75583:9;;-1:-1:-1;;;;;75583:9:0;75579:43;;75608:9;:14;;-1:-1:-1;;;;;;75608:14:0;-1:-1:-1;;;;;75608:14:0;;;;;75579:43;75642:8;;75672:11;;75638:46;;-1:-1:-1;;;75638:46:0;;-1:-1:-1;;;;;75672:11:0;;;75638:46;;;1524:51:1;75642:8:0;;;75638:33;;1497:18:1;;75638:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75637:47;:79;;;;-1:-1:-1;75703:13:0;;75688:11;;-1:-1:-1;;;;;75688:11:0;;;75703:13;;75688:28;;75637:79;75633:106;;;75727:11;;75718:21;;-1:-1:-1;;;;;75727:11:0;75718:8;:21::i;:::-;75759:8;;75789:9;;75755:44;;-1:-1:-1;;;75755:44:0;;-1:-1:-1;;;;;75789:9:0;;;75755:44;;;1524:51:1;75759:8:0;;;75755:33;;1497:18:1;;75755:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75754:45;:75;;;;-1:-1:-1;75816:13:0;;75803:9;;-1:-1:-1;;;;;75803:9:0;;;75816:13;;75803:26;;75754:75;75750:100;;;75840:9;;75831:19;;-1:-1:-1;;;;;75840:9:0;75831:8;:19::i;:::-;75863:11;:18;;-1:-1:-1;;;;;75863:18:0;;;-1:-1:-1;;;;;;75863:18:0;;;;;;;;75892:9;:14;;;;;;;;;;;;;;75930:8;;75926:24;;-1:-1:-1;;;75926:24:0;;;;;1524:51:1;;;;75930:8:0;;75926:18;;1497::1;;75926:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75925:25;:52;;;;-1:-1:-1;75959:8:0;;75955:22;;-1:-1:-1;;;75955:22:0;;-1:-1:-1;;;;;1542:32:1;;;75955:22:0;;;1524:51:1;75959:8:0;;;;75955:18;;1497::1;;75955:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75954:23;75925:52;75921:335;;;76019:8;;76015:28;;;-1:-1:-1;;;76015:28:0;;;;75997:15;;-1:-1:-1;;;;;76019:8:0;;76015:26;;:28;;;;;;;;;;;;;;76019:8;76015:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75997:46;-1:-1:-1;;;;;;76062:21:0;;76078:4;76062:21;;;;:69;;-1:-1:-1;76087:12:0;;76116:15;;76087:25;;76104:7;76087:16;:25::i;:::-;:44;;76062:69;76058:187;;;76155:23;76163:14;;76155:7;:23::i;:::-;76212:15;76197:12;:30;76058:187;75980:276;75921:335;72778:3497;;;72665:3610;;;:::o;19106:173::-;19181:6;;;-1:-1:-1;;;;;19198:17:0;;;-1:-1:-1;;;;;;19198:17:0;;;;;;;19231:40;;19181:6;;;19198:17;19181:6;;19231:40;;19162:16;;19231:40;19151:128;19106:173;:::o;72196:358::-;-1:-1:-1;;;;;72301:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;72279:157;;;;-1:-1:-1;;;72279:157:0;;10063:2:1;72279:157:0;;;10045:21:1;10102:2;10082:18;;;10075:30;10141:34;10121:18;;;10114:62;10212:34;10192:18;;;10185:62;-1:-1:-1;;;10263:19:1;;;10256:34;10307:19;;72279:157:0;9861:471:1;72279:157:0;-1:-1:-1;;;;;72447:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;72447:39:0;;;;;;;;;;72506:40;;72447:39;;:31;72506:40;;;72196:358;;:::o;12133:721::-;-1:-1:-1;;;;;12273:20:0;;12265:70;;;;-1:-1:-1;;;12265:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12354:23:0;;12346:71;;;;-1:-1:-1;;;12346:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12514:17:0;;12490:21;12514:17;;;;;;;;;;;12550:23;;;;12542:74;;;;-1:-1:-1;;;12542:74:0;;10539:2:1;12542:74:0;;;10521:21:1;10578:2;10558:18;;;10551:30;10617:34;10597:18;;;10590:62;-1:-1:-1;;;10668:18:1;;;10661:36;10714:19;;12542:74:0;10337:402:1;12542:74:0;-1:-1:-1;;;;;12644:17:0;;;:9;:17;;;;;;;;;;;12664:22;;;12644:42;;12704:20;;;;;;;;:30;;12680:6;;12644:9;12704:30;;12680:6;;12704:30;:::i;:::-;;;;;;;;12769:9;-1:-1:-1;;;;;12752:35:0;12761:6;-1:-1:-1;;;;;12752:35:0;;12780:6;12752:35;;;;1342:25:1;;1330:2;1315:18;;1196:177;12752:35:0;;;;;;;;12254:600;12133:721;;;:::o;79024:875::-;79126:13;;-1:-1:-1;;;;;79126:13:0;79073:18;8209;;;;;;;;;;;79073;;79116:41;;79153:3;;79116:32;;79145:2;79116:28;:32::i;:41::-;79193:4;;79186:37;;-1:-1:-1;;;79186:37:0;;79217:4;79186:37;;;1524:51:1;79102:55:0;;-1:-1:-1;79170:13:0;;-1:-1:-1;;;;;79193:4:0;;;;79186:22;;1497:18:1;;79186:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79237:8;;79170:53;;-1:-1:-1;79237:10:0;79234:385;;79274:8;;79263:19;;79304:1;79300:3;:5;:21;;;;;79313:8;;79309:3;:12;79300:21;79297:74;;;79352:3;79341:14;;79297:74;79421:9;;79385:47;;79402:10;;-1:-1:-1;;;;;79421:9:0;79385:16;:47::i;:::-;79447:9;;79466:4;;79447:24;;-1:-1:-1;;;79447:24:0;;-1:-1:-1;;;;;79466:4:0;;;79447:24;;;1524:51:1;79447:9:0;;;:18;;1497::1;;79447:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;79495:8:0;;:24;;-1:-1:-1;79495:8:0;-1:-1:-1;79508:10:0;79495:12;:24::i;:::-;79486:8;:33;79563:4;;79556:37;;-1:-1:-1;;;79556:37:0;;79587:4;79556:37;;;1524:51:1;79543:62:0;;79556:48;;79598:5;;-1:-1:-1;;;;;79563:4:0;;79556:22;;1497:18:1;;79556:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:48::-;79543:8;;;:12;:62::i;:::-;79534:8;:71;79234:385;79636:9;;:11;79633:255;;79674:9;;79663:20;;79705:1;79701:3;:5;:22;;;;;79714:9;;79710:3;:13;79701:22;79698:75;;;79754:3;79743:14;;79698:75;79815:10;;79787:39;;79804:10;;-1:-1:-1;;;;;79815:10:0;79787:16;:39::i;:::-;79851:9;;:25;;79865:10;79851:13;:25::i;:::-;79841:9;:35;79060:839;;;79024:875::o;22726:98::-;22784:7;22811:5;22815:1;22811;:5;:::i;:::-;22804:12;22726:98;-1:-1:-1;;;22726:98:0:o;23125:::-;23183:7;23210:5;23214:1;23210;:5;:::i;21988:98::-;22046:7;22073:5;22077:1;22073;:5;:::i;22369:98::-;22427:7;22454:5;22458:1;22454;:5;:::i;77816:368::-;-1:-1:-1;;;;;77878:21:0;;;;;;:8;:21;;;;;;;;77874:152;;;77927:13;;77920:44;;-1:-1:-1;;;77920:44:0;;-1:-1:-1;;;;;1542:32:1;;;77920:44:0;;;1524:51:1;77927:13:0;;;;77920:31;;1497:18:1;;77920:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77968:1;77920:49;77916:77;;77971:22;77981:11;77971:9;:22::i;77874:152::-;78047:13;;78040:44;;-1:-1:-1;;;78040:44:0;;-1:-1:-1;;;;;1542:32:1;;;78040:44:0;;;1524:51:1;78047:13:0;;;;78040:31;;1497:18:1;;78040:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78088:1;78040:49;78036:62;;77816:368;:::o;78036:62::-;78291:12;:19;;-1:-1:-1;;;;;78257:31:0;;;;;;:18;:31;;;;;:53;;;78321:30;;;;;;;;;;;;;-1:-1:-1;;;;;;78321:30:0;;;;;;-1:-1:-1;;;;;78146:21:0;;;;;:8;:21;;;;;:28;;-1:-1:-1;;78146:28:0;78170:4;78146:28;;;77816:368::o;76289:1276::-;76365:12;:19;76338:24;76401:21;;;76397:34;;76424:7;76289:1276;:::o;76397:34::-;76471:4;;76464:37;;-1:-1:-1;;;76464:37:0;;76495:4;76464:37;;;1524:51:1;76443:18:0;;-1:-1:-1;;;;;76471:4:0;;76464:22;;1497:18:1;;76464:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76443:58;-1:-1:-1;76515:13:0;;;:36;;;76541:10;76532:8;;:19;76515:36;76512:73;;;76567:7;;76289:1276;:::o;76512:73::-;76599:15;76629;76647:9;76629:27;;76667:18;76702:15;76724:8;;;;;;;;;-1:-1:-1;;;;;76724:8:0;-1:-1:-1;;;;;76720:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76702:44;;76761:12;76788:732;76805:3;76795:7;:13;:46;;;;;76825:16;76812:10;:29;76795:46;76788:732;;;76878:16;76862:12;;:32;76858:89;;76930:1;76915:12;:16;76858:89;76971:8;;77014:12;;77001;:26;;-1:-1:-1;;;;;76971:8:0;;;;76967:33;;77014:12;77001:26;;;;;;:::i;:::-;;;;;;;;;;;76967:61;;;;;;-1:-1:-1;;;;;;76967:61:0;;;-1:-1:-1;;;;;77001:26:0;;;76967:61;;;1524:51:1;1497:18;;76967:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76963:394;;77048:14;77065:86;77143:7;77065:73;77085:13;;;;;;;;;-1:-1:-1;;;;;77085:13:0;-1:-1:-1;;;;;77078:31:0;;77110:12;77123;;77110:26;;;;;;;;:::i;:::-;;;;;;;;;;;77078:59;;;;;;-1:-1:-1;;;;;;77078:59:0;;;-1:-1:-1;;;;;77110:26:0;;;77078:59;;;1524:51:1;1497:18;;77078:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77065:8;;;:12;:73::i;:86::-;77181:4;;77174:37;;-1:-1:-1;;;77174:37:0;;77205:4;77174:37;;;1524:51:1;77048:103:0;;-1:-1:-1;77048:103:0;;-1:-1:-1;;;;;77181:4:0;;;;77174:22;;1497:18:1;;77174:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;77170:59;;;77222:7;;;;;;;;76289:1276;:::o;77170:59::-;77247:54;77266:12;77279;;77266:26;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;77266:26:0;77294:6;77247:18;:54::i;:::-;77325:16;:4;77334:6;77325:8;:16::i;:::-;77320:21;;77029:328;76963:394;77383:35;77395:22;77407:9;77395:7;;:11;:22::i;:::-;77383:7;;:11;:35::i;:::-;77373:45;;77443:9;77467:12;:14;;77433:19;;-1:-1:-1;77467:12:0;:14;;;:::i;:::-;;;;;;77496:12;;;;;:::i;:::-;;;;76788:732;;;77539:8;;:18;;77552:4;77539:12;:18::i;:::-;77530:8;:27;-1:-1:-1;;;;;;;;76289:1276:0:o;80525:486::-;80626:16;;;80640:1;80626:16;;;;;;;;80602:21;;80626:16;;;;;;;;;;-1:-1:-1;80626:16:0;80602:40;;80671:4;80653;80658:1;80653:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;80653:23:0;;;:7;;;;;;;;;:23;80697:4;;80687:7;;80697:4;;;80687;;80697;;80687:7;;;;;;:::i;:::-;-1:-1:-1;;;;;80687:14:0;;;:7;;;;;;;;;:14;80746:15;;80714:62;;80731:4;;80746:15;80764:11;80714:8;:62::i;:::-;80815:15;;:188;;-1:-1:-1;;;80815:188:0;;-1:-1:-1;;;;;80815:15:0;;;;:69;;:188;;80899:11;;80815:15;;80941:4;;80960:2;;80977:15;;80815:188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78367:137;78426:30;78444:11;78426:17;:30::i;:::-;-1:-1:-1;;;;;78467:21:0;78491:5;78467:21;;;:8;:21;;;;;:29;;-1:-1:-1;;78467:29:0;;;78367:137::o;77630:178::-;77722:4;;77715:41;;-1:-1:-1;;;77715:41:0;;-1:-1:-1;;;;;12853:32:1;;;77715:41:0;;;12835:51:1;12902:18;;;12895:34;;;77722:4:0;;;;77715:21;;12808:18:1;;77715:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;77780:11;-1:-1:-1;;;;;77772:28:0;;77793:6;77772:28;;;;1342:25:1;;1330:2;1315:18;;1196:177;77772:28:0;;;;;;;;77630:178;;:::o;78512:292::-;78628:12;78641:19;;:23;;78663:1;;78641:23;:::i;:::-;78628:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;78593:31:0;;;;;:18;:31;;;;;;;;78580:12;:45;;78628:37;;;;;78580:12;:45;;;;;;:::i;:::-;;;;;;;;;;;;;:85;;-1:-1:-1;;;;;;78580:85:0;-1:-1:-1;;;;;78580:85:0;;;;;;78736:31;;;;;:18;:31;;;;;;;;78695:12;78708:19;;78736:31;;:18;78580:45;78708:23;;-1:-1:-1;;78708:23:0;:::i;:::-;78695:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;78695:37:0;78676:57;;;;;;;;;;;;:91;78778:12;:18;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;78778:18:0;;;;;-1:-1:-1;;;;;;78778:18:0;;;;;;-1:-1:-1;78512:292:0:o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1821:328::-;1898:6;1906;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2006:29;2025:9;2006:29;:::i;:::-;1996:39;;2054:38;2088:2;2077:9;2073:18;2054:38;:::i;:::-;2044:48;;2139:2;2128:9;2124:18;2111:32;2101:42;;1821:328;;;;;:::o;2343:592::-;2456:6;2464;2472;2480;2488;2496;2504;2557:3;2545:9;2536:7;2532:23;2528:33;2525:53;;;2574:1;2571;2564:12;2525:53;-1:-1:-1;;2597:23:1;;;2667:2;2652:18;;2639:32;;-1:-1:-1;2718:2:1;2703:18;;2690:32;;2769:2;2754:18;;2741:32;;-1:-1:-1;2820:3:1;2805:19;;2792:33;;-1:-1:-1;2872:3:1;2857:19;;2844:33;;-1:-1:-1;2924:3:1;2909:19;2896:33;;-1:-1:-1;2343:592:1;-1:-1:-1;2343:592:1:o;2940:180::-;2999:6;3052:2;3040:9;3031:7;3027:23;3023:32;3020:52;;;3068:1;3065;3058:12;3020:52;-1:-1:-1;3091:23:1;;2940:180;-1:-1:-1;2940:180:1:o;3125:186::-;3184:6;3237:2;3225:9;3216:7;3212:23;3208:32;3205:52;;;3253:1;3250;3243:12;3205:52;3276:29;3295:9;3276:29;:::i;3316:118::-;3402:5;3395:13;3388:21;3381:5;3378:32;3368:60;;3424:1;3421;3414:12;3439:315;3504:6;3512;3565:2;3553:9;3544:7;3540:23;3536:32;3533:52;;;3581:1;3578;3571:12;3533:52;3604:29;3623:9;3604:29;:::i;:::-;3594:39;;3683:2;3672:9;3668:18;3655:32;3696:28;3718:5;3696:28;:::i;:::-;3743:5;3733:15;;;3439:315;;;;;:::o;3759:260::-;3827:6;3835;3888:2;3876:9;3867:7;3863:23;3859:32;3856:52;;;3904:1;3901;3894:12;3856:52;3927:29;3946:9;3927:29;:::i;:::-;3917:39;;3975:38;4009:2;3998:9;3994:18;3975:38;:::i;:::-;3965:48;;3759:260;;;;;:::o;4249:380::-;4328:1;4324:12;;;;4371;;;4392:61;;4446:4;4438:6;4434:17;4424:27;;4392:61;4499:2;4491:6;4488:14;4468:18;4465:38;4462:161;;4545:10;4540:3;4536:20;4533:1;4526:31;4580:4;4577:1;4570:15;4608:4;4605:1;4598:15;4462:161;;4249:380;;;:::o;5043:127::-;5104:10;5099:3;5095:20;5092:1;5085:31;5135:4;5132:1;5125:15;5159:4;5156:1;5149:15;5175:125;5240:9;;;5261:10;;;5258:36;;;5274:18;;:::i;5305:356::-;5507:2;5489:21;;;5526:18;;;5519:30;5585:34;5580:2;5565:18;;5558:62;5652:2;5637:18;;5305:356::o;7776:401::-;7978:2;7960:21;;;8017:2;7997:18;;;7990:30;8056:34;8051:2;8036:18;;8029:62;-1:-1:-1;;;8122:2:1;8107:18;;8100:35;8167:3;8152:19;;7776:401::o;8182:399::-;8384:2;8366:21;;;8423:2;8403:18;;;8396:30;8462:34;8457:2;8442:18;;8435:62;-1:-1:-1;;;8528:2:1;8513:18;;8506:33;8571:3;8556:19;;8182:399::o;8586:184::-;8656:6;8709:2;8697:9;8688:7;8684:23;8680:32;8677:52;;;8725:1;8722;8715:12;8677:52;-1:-1:-1;8748:16:1;;8586:184;-1:-1:-1;8586:184:1:o;8775:245::-;8842:6;8895:2;8883:9;8874:7;8870:23;8866:32;8863:52;;;8911:1;8908;8901:12;8863:52;8943:9;8937:16;8962:28;8984:5;8962:28;:::i;9025:492::-;9140:6;9148;9156;9164;9172;9180;9233:3;9221:9;9212:7;9208:23;9204:33;9201:53;;;9250:1;9247;9240:12;9201:53;9279:9;9273:16;9263:26;;9329:2;9318:9;9314:18;9308:25;9298:35;;9373:2;9362:9;9358:18;9352:25;9342:35;;9417:2;9406:9;9402:18;9396:25;9386:35;;9461:3;9450:9;9446:19;9440:26;9430:36;;9506:3;9495:9;9491:19;9485:26;9475:36;;9025:492;;;;;;;;:::o;10744:168::-;10817:9;;;10848;;10865:15;;;10859:22;;10845:37;10835:71;;10886:18;;:::i;10917:217::-;10957:1;10983;10973:132;;11027:10;11022:3;11018:20;11015:1;11008:31;11062:4;11059:1;11052:15;11090:4;11087:1;11080:15;10973:132;-1:-1:-1;11119:9:1;;10917:217::o;11139:128::-;11206:9;;;11227:11;;;11224:37;;;11241:18;;:::i;11272:127::-;11333:10;11328:3;11324:20;11321:1;11314:31;11364:4;11361:1;11354:15;11388:4;11385:1;11378:15;11404:135;11443:3;11464:17;;;11461:43;;11484:18;;:::i;:::-;-1:-1:-1;11531:1:1;11520:13;;11404:135::o;11676:980::-;11938:4;11986:3;11975:9;11971:19;12017:6;12006:9;11999:25;12043:2;12081:6;12076:2;12065:9;12061:18;12054:34;12124:3;12119:2;12108:9;12104:18;12097:31;12148:6;12183;12177:13;12214:6;12206;12199:22;12252:3;12241:9;12237:19;12230:26;;12291:2;12283:6;12279:15;12265:29;;12312:1;12322:195;12336:6;12333:1;12330:13;12322:195;;;12401:13;;-1:-1:-1;;;;;12397:39:1;12385:52;;12492:15;;;;12457:12;;;;12433:1;12351:9;12322:195;;;-1:-1:-1;;;;;;;12573:32:1;;;;12568:2;12553:18;;12546:60;-1:-1:-1;;;12637:3:1;12622:19;12615:35;12534:3;11676:980;-1:-1:-1;;;11676:980:1:o;12940:127::-;13001:10;12996:3;12992:20;12989:1;12982:31;13032:4;13029:1;13022:15;13056:4;13053:1;13046:15

Swarm Source

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