false
true
0

Contract Address Details

0x9DeF8cf2643C54fc143B2aE923e830C7a806b57E

Token
BrokeNoMo (Mo💰)
Creator
0x4499ab–305fc0 at 0x893d6a–423a31
Balance
25,544.826109907150138211 PLS ( )
Tokens
Fetching tokens...
Transactions
942 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26239127
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
BrokeNoMo




Optimization enabled
true
Compiler version
v0.8.2+commit.661d1103




Optimization runs
200
EVM Version
default




Verified at
2025-03-10T02:55:28.046563Z

Constructor Arguments

0x000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d90000000000000000000000005737b501a0ec2c5fc95dd02b80049c4f6b615b31000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c413192000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c413192000000000000000000000000c6f3a1542c93f115579f245cc4bc3f5a7be9ffeb

Arg [0] (address) : 0x165c3410fc91ef562c50559f7d2289febed552d9
Arg [1] (address) : 0x5737b501a0ec2c5fc95dd02b80049c4f6b615b31
Arg [2] (address) : 0xf2322eab9f83ff2bd62c5dfb15eb72383c413192
Arg [3] (address) : 0xf2322eab9f83ff2bd62c5dfb15eb72383c413192
Arg [4] (address) : 0xc6f3a1542c93f115579f245cc4bc3f5a7be9ffeb

              

Contract source code

// Sources flattened with hardhat v2.19.2 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/Context.sol@v4.9.5

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File @openzeppelin/contracts/access/Ownable.sol@v4.9.5

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/token/ERC20/IERC20.sol@v4.9.5

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}


// File @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol@v4.9.5

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC20/ERC20.sol@v4.9.5

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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}.
     *
     * 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 default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}


// File @openzeppelin/contracts/security/ReentrancyGuard.sol@v4.9.5

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}


// File contracts/interfaces/IUniswapV2Factory.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.6.0;

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

    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 feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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


// File contracts/interfaces/IUniswapV2Router.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.6.12;

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

    function WETH() external pure returns (address);
    function WPLS() external pure returns (address);
    function WBNB() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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


// File @openzeppelin/contracts/utils/structs/EnumerableSet.sol@v4.9.5

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```solidity
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}


// File contracts/memes/Distributor.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.2;



interface IDistributor {
   function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _minShareThreshold) external;
   function setShare(address shareholder, uint256 amount) external;
   function deposit() external payable;
   function process(uint256 gas) external;
}

contract Distributor is IDistributor, ReentrancyGuard {	
    using EnumerableSet for EnumerableSet.AddressSet;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    address public immutable token;

    EnumerableSet.AddressSet private shareholders;
    mapping (address => uint256) public shareholderClaims;
    mapping (address => Share) public shares;

    event DistributionCriteriaUpdate(uint256 minPeriod, uint256 minDistribution);
    event NewFundDeposit(uint256 amount);
    event ShareUpdated(address indexed shareholder, uint256 amount);
    // event DividendDistributed(address indexed shareholder, uint256 amount);
    // event DividendFailed(address indexed shareholder, uint256 amount);  // New event to log failed payouts

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public constant PRECISION = 10e18;

    uint256 public minPeriod = 45 * 60;
    uint256 public minDistribution = 10_000 ether;
    // Minimum share amount to be considered in the shareholder list (prevents dust attack)
    uint256 public minShareThreshold = 1_000_000 ether;

    uint256 currentIndex;

    modifier onlyToken() {
        require(msg.sender == token, "!Token"); _;
    }

    constructor () {
        require(msg.sender != address(0), "Zero address owner");
        token = msg.sender;
    }

    receive() external payable {}

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _minShareThreshold) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        minShareThreshold = _minShareThreshold;
        emit DistributionCriteriaUpdate(minPeriod, minDistribution);
    }

    function getShareholderCount() external view returns (uint256) {
        return shareholders.length();
    }

    function getShareholderAt(uint256 index) external view returns (address) {
        return shareholders.at(index);
    }

    function isShareholder(address shareholder) external view returns (bool) {
        return shareholders.contains(shareholder);
    }

    function listShareholders() external view returns (address[] memory) {
        return shareholders.values();
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken nonReentrant {        
        Share storage shareInfo = shares[shareholder];
        uint256 currentAmount = shareInfo.amount;

        if(currentAmount > 0) {
            _distributeDividend(shareholder);
        }

        if (amount < minShareThreshold) amount = 0;

        if(amount > 0 && currentAmount == 0) shareholders.add(shareholder);
        else if(amount == 0 && currentAmount > 0) shareholders.remove(shareholder);

        if (currentAmount != amount) {
            totalShares = totalShares - currentAmount + amount;
            shareInfo.amount = amount;
            shareInfo.totalExcluded = _getCumulativeDividends(amount);
            emit ShareUpdated(shareholder, amount);
        }
    }

    function deposit() external payable override onlyToken nonReentrant {
        require(totalShares > 0, "No shares to distribute");
        totalDividends += msg.value;
        dividendsPerShare += (msg.value * PRECISION / totalShares);
        emit NewFundDeposit(msg.value);
    }
	
    function process(uint256 gas) external override onlyToken nonReentrant {
        require(gas > 0, "Gas must be > 0");

        uint256 shareholderCount = shareholders.length();
        if (shareholderCount == 0) return;

        uint256 gasUsed = 0;
        uint256 _currentIndex = currentIndex;
        uint256 _minTimestamp = block.timestamp - minPeriod;
        uint256 gasLeft = gasleft();

        while (gasUsed < gas && _currentIndex < shareholderCount) {
            address shareholder = shareholders.at(_currentIndex);

            if (_shouldDistribute(shareholder, _minTimestamp)) {
                _distributeDividend(shareholder);
            }

            unchecked {
                _currentIndex++;
                gasUsed += gasLeft - gasleft();
                gasLeft = gasleft();
            }
        }

        // Reset index if we've processed all shareholders
        currentIndex = _currentIndex >= shareholderCount ? 0 : _currentIndex;
    }
	
    function claimReflection() external nonReentrant {
        if (_shouldDistribute(msg.sender, block.timestamp - minPeriod)) {
            _distributeDividend(msg.sender);
        }
    }

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        Share storage shareInfo = shares[shareholder];

        uint256 shareholderTotalDividends = _getCumulativeDividends(shareInfo.amount);
        uint256 shareholderTotalExcluded = shareInfo.totalExcluded;

        return shareholderTotalDividends > shareholderTotalExcluded
            ? shareholderTotalDividends - shareholderTotalExcluded
            : 0;
    }

    function rescueFunds(address asset, address to) external onlyToken nonReentrant returns (bool) {
        if (asset != address(0)) {
            return IERC20(asset).transfer(to, IERC20(asset).balanceOf(address(this)));
        } else {
            (bool success, ) = payable(to).call{ value: address(this).balance }("");
            return success;
        }
    }

    function shouldDistribute(address shareholder) external view returns (bool) {
        return _shouldDistribute(shareholder, block.timestamp - minPeriod);
    }

    function _shouldDistribute(address shareholder, uint256 minTimestamp) private view returns (bool) {
        return shareholderClaims[shareholder] < minTimestamp && 
            getUnpaidEarnings(shareholder) > minDistribution;
    }

    function _distributeDividend(address shareholder) private {
        Share storage shareInfo = shares[shareholder];

        uint256 amount = getUnpaidEarnings(shareholder);
        if (amount == 0) return;

        totalDistributed += amount;
        shareInfo.totalRealised += amount;
        shareInfo.totalExcluded = _getCumulativeDividends(shareInfo.amount);
        shareholderClaims[shareholder] = block.timestamp;

        (bool success, ) = payable(shareholder).call{value: amount}("");
        if (!success) {
            totalDistributed -= amount;
            shareInfo.totalRealised -= amount;
            shareInfo.totalExcluded = _getCumulativeDividends(shareInfo.amount);
            shareholderClaims[shareholder] = block.timestamp - minPeriod;
            // emit DividendFailed(shareholder, amount);
        } 
        // else {
            // emit DividendDistributed(shareholder, amount);
        // }
    }

    function _getCumulativeDividends(uint256 share) private view returns (uint256) {
        return (share * dividendsPerShare) / PRECISION;
    }
}


// File contracts/memes/BrokeNoMo.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.2;






contract BrokeNoMo is ERC20, Ownable, ReentrancyGuard {
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => bool) private _isExcludedFromReflection;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1_000_000_000 ether;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    uint256 public constant FEE_BASE = 10000;

    uint256 public burnFee; // 0.5%
    uint256 public liquidityFee; // 0.5%
    uint256 public revenueFee; // 2%
    uint256 public reflectionFee; // 1%
    uint256 public plsDividendFee; // 1%
    uint256 public feeTotal; //5%

    uint256 private swapTokensAtAmount;
    uint256 public swapReductionMultiplier = FEE_BASE;
    uint256 public distributorGas;

    address public revenueWallet;
    address public liquidityWallet;
    address public immutable seedWallet;

    address public constant DEAD = address(0x000000000000000000000000000000000000dEaD);
    IUniswapV2Router public pulseXRouter;
    address public pulseXPair;
    address public wrapped;
    Distributor public immutable distributor;

    bool private swapping;
    bool public distributionEnabled;
    bool public feeChangeDisabled;
    bool public allowUserAddLiquidity;
    address public administrator;

    mapping(address => bool) public isDividendExempt;
    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isAutomatedMarketMakerPairs;
    mapping(address => bool) public isRouterWhitelisted;


    event AccountExcludeFromFee(address indexed account, bool status);
    event AutomatedMarketMakerPairUpdated(address indexed pair, bool value);
    event FeesUpdated(uint256 burnFee, uint256 liquidityFee, uint256 revenueFee, uint256 reflectionFee, uint256 plsDividendFee);
    event RevenueWalletUpdated(address oldWallet, address newWallet);
    event LiquidityWalletUpdated(address oldWallet, address newWallet);
    event RouterUpdated(address oldRouter, address newRouter);
    event ReflectionStatusChanged(address indexed account, bool isExcluded);
    event AutoLiquify(uint256 amountBNB, uint256 amountTokens);
    event AdministratorTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(
        address routerAddress_,
        address revenueWallet_,
        address liquidityWallet_,
        address seedWallet_,
        address administrator_
    ) ERC20(unicode"BrokeNoMo", unicode"Mo💰") {
        pulseXRouter = IUniswapV2Router(routerAddress_);
        wrapped = getWrapped(routerAddress_);
        pulseXPair = IUniswapV2Factory(pulseXRouter.factory()).createPair(address(this), wrapped);
        seedWallet = seedWallet_;
        require(pulseXPair != address(0), "Pair creation failed");

        distributor = new Distributor();

        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[seedWallet_] = true;

        isDividendExempt[pulseXPair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        isDividendExempt[seedWallet_] = true;
        isDividendExempt[revenueWallet_] = true;
        isDividendExempt[liquidityWallet_] = true;
        isDividendExempt[administrator_] = true;
        isDividendExempt[msg.sender] = true;

        isAutomatedMarketMakerPairs[pulseXPair] = true;
        isRouterWhitelisted[routerAddress_] = true;

        distributorGas = 250_000;
        distributionEnabled = true;
        swapTokensAtAmount = _tTotal / 2000;

        revenueWallet = revenueWallet_;
        liquidityWallet = liquidityWallet_;
        transferAdministrator(administrator_);

        setFees(50, 50, 200, 100, 100);

        _rOwned[DEAD] = _rTotal / 10;
        _rOwned[seedWallet_] = _rTotal - _rOwned[DEAD];

        _excludeFromReflection(pulseXPair);
        _excludeFromReflection(address(this));
        
        uint256 burnedSupply = _tTotal / 10;
        emit Transfer(address(0), DEAD, burnedSupply);
        emit Transfer(address(0), seedWallet_, _tTotal - burnedSupply);
    }

    receive() external payable {}

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcludedFromReflection[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function getWrapped(address router) public pure returns (address wrappedToken) {
        try IUniswapV2Router(router).WPLS() returns (address w) { return w; } catch {}
        try IUniswapV2Router(router).WETH() returns (address w) { return w; } catch {}
        try IUniswapV2Router(router).WBNB() returns (address w) { return w; } catch {}
        revert("Failed to get wrapped token");
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

    function deliver(uint256 tAmount) external nonReentrant {
        address sender = msg.sender;
        require(allowUserAddLiquidity || sender == seedWallet, "User liquidity add disabled");
        require(!_isExcludedFromReflection[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount, , , ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rTotal = _rTotal - rAmount;
        _tFeeTotal = _tFeeTotal + tAmount;
    }

    function _excludeFromReflection(address account) private {
        require(!_isExcludedFromReflection[account], "Account is already excluded");
        if (_rOwned[account] > 0) _tOwned[account] = tokenFromReflection(_rOwned[account]);
        _isExcludedFromReflection[account] = true;
        _excluded.push(account);
        emit ReflectionStatusChanged(account, true);
    }

    function excludeFromReflection(address account) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        _excludeFromReflection(account);
    }

    function includeInReflection(address account) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        require(_isExcludedFromReflection[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcludedFromReflection[account] = false;
                _excluded.pop();
                emit ReflectionStatusChanged(account, false);
                break;
            }
        }
    }

    function excludeFromFee(address account, bool status) external nonReentrant {
        require(isExcludedFromFee[account] != status, "Account is already the value of 'status'");
        require(msg.sender == administrator || msg.sender == owner(), "Unauthorized");
        isExcludedFromFee[account] = status;
        emit AccountExcludeFromFee(account, status);
    }

    function getSwapThreshold() external view returns (uint256) {
        require(msg.sender == administrator || msg.sender == owner(), "Unauthorized");
        return swapTokensAtAmount;
    }

    function setFees(
        uint256 _burnFee,
        uint256 _liquidityFee,
        uint256 _revenueFee,
        uint256 _reflectionFee,
        uint256 _plsDividendFee
    ) public onlyOwner nonReentrant {
        require(!feeChangeDisabled, "Fee change disabled permenantly fafo.");
        feeTotal = _burnFee + _liquidityFee + _revenueFee + _reflectionFee + _plsDividendFee;
        require(feeTotal <= 1000, "Total fee exceeds 10%");
        burnFee = _burnFee;
        liquidityFee = _liquidityFee;
        revenueFee = _revenueFee;
        reflectionFee = _reflectionFee;
        plsDividendFee = _plsDividendFee;
        emit FeesUpdated(_burnFee, _liquidityFee, _revenueFee, _reflectionFee, _plsDividendFee);
    }

    function disableFeeChange() external nonReentrant {
        require(!feeChangeDisabled, "Fee change disabled");
        require(msg.sender == administrator || msg.sender == owner(), "Unauthorized");
        feeChangeDisabled = true;
    }

    function setRevenueWallet(address _revenueWallet) external nonReentrant {
        require(msg.sender == revenueWallet || msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        require(_revenueWallet != address(0), "Zero address");
        emit RevenueWalletUpdated(revenueWallet, _revenueWallet);
        revenueWallet = _revenueWallet;
    }

    function setLiquidityWallet(address _liquidityWallet) external nonReentrant {
        require(msg.sender == liquidityWallet || msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        require(_liquidityWallet != address(0), "Zero address");
        emit LiquidityWalletUpdated(liquidityWallet, _liquidityWallet);
        liquidityWallet = _liquidityWallet;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external nonReentrant {
        require(msg.sender == administrator || msg.sender == owner(), "Unauthorized");
        require(pair != address(0), "Zero address");
        isAutomatedMarketMakerPairs[pair] = value;
        emit AutomatedMarketMakerPairUpdated(pair, value);
    }

    function setSwapThreshold(uint256 amount, uint256 multiplier) external nonReentrant {
        require(msg.sender == administrator || msg.sender == owner(), "Unauthorized");
        require(amount <= _tTotal, "Amount cannot be over the total supply.");
        require(amount >= 10 ** 13, "Minimum `0.00001` token per swap required");
        require(multiplier > 0, "Zero multiplier");
        swapTokensAtAmount = amount;
        swapReductionMultiplier = multiplier;
    }

    function setAllowUserAddLiquidity(bool allow) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        allowUserAddLiquidity = allow;
    }

    function updateDefaultRouter(address router) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        address oldRouter = address(pulseXRouter);
        address oldPair = pulseXPair;

        pulseXRouter = IUniswapV2Router(router);
        wrapped = getWrapped(router);
        address pair_ = IUniswapV2Factory(IUniswapV2Router(router).factory()).getPair(address(this), wrapped);
        require(pair_ != address(0), "Pair creation failed");

        pulseXPair = pair_;
        isAutomatedMarketMakerPairs[pair_] = true;
        _excludeFromReflection(pair_);
        isDividendExempt[pair_] = true;

        try distributor.setShare(pair_, 0) {} catch {}

        emit RouterUpdated(oldRouter, router);
        emit AutomatedMarketMakerPairUpdated(oldPair, false);
        emit AutomatedMarketMakerPairUpdated(pair_, true);
    }

    function renounceAdministrator() external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        transferAdministrator(address(0));
    }

    function transferAdministrator(address newAdministrator) public nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        address oldAdmin = administrator;
        administrator = newAdministrator;
        emit AdministratorTransferred(oldAdmin, newAdministrator);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = _calculateReflectionFee(tAmount);
        uint256 tTransferAmount = tAmount - tFee;
        uint256 currentRate = _getRate();
        uint256 rAmount = tAmount * currentRate;
        uint256 rTransferAmount = tTransferAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        return (rAmount, rTransferAmount, rFee, tTransferAmount);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _calculateReflectionFee(uint256 amount) private view returns (uint256) {
        return (amount * reflectionFee) / FEE_BASE;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal override(ERC20) {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "ERC20: Transfer amount must be greater than zero");
        require(balanceOf(sender) >= amount, "ERC20: transfer amount exceeds balance");

        // Early exit w/ reflections w/o fees or distributor processing
        if (swapping) {
            return _transferStandard(sender, recipient, amount);
        }

        // Process PLS fees
        if (
            balanceOf(address(this)) >= swapTokensAtAmount && 
            !swapping && 
            isAutomatedMarketMakerPairs[recipient]  // Only when selling
        ) {
            swapping = true;

            // Calculate liquidity tokens
            uint256 processingFees = liquidityFee + revenueFee + plsDividendFee;
            uint256 tokensToLiquify = (swapTokensAtAmount * liquidityFee) / processingFees / 2;
            if (swapReductionMultiplier != FEE_BASE) {
                tokensToLiquify = tokensToLiquify * swapReductionMultiplier / FEE_BASE;
            }

            // Calculate tokens to swap (everything except liquidity tokens)
            uint256 tokensToSwap = swapTokensAtAmount - tokensToLiquify;

            if (tokensToSwap > 0) {
                uint256 plsBalanceBefore = address(this).balance;
                _swapTokensForPLS(tokensToSwap);

                uint256 plsBalance = address(this).balance - plsBalanceBefore;
                uint256 plsProcessingFees = processingFees - (liquidityFee / 2);

                // Calculate PLS splits
                uint256 plsForLiquidity = (plsBalance * liquidityFee) / plsProcessingFees / 2;
                uint256 plsForDividend = (plsBalance * plsDividendFee) / plsProcessingFees;
                uint256 plsForRevenue = (plsBalance * revenueFee) / plsProcessingFees;

                // Handle PLS dividend
                if (plsForDividend > 0) {
                    try distributor.deposit{value: plsForDividend}() {} catch {}
                }
                // Send PLS to revenue wallet
                if (plsForRevenue > 0) {
                    (bool success, ) = payable(revenueWallet).call{ value: plsForRevenue }("");
                    success = false; // only to supress warning msg
                }

                // Add liquidity
                if (tokensToLiquify > 0 && plsForLiquidity > 0) {
                    _approve(address(this), address(pulseXRouter), tokensToLiquify);
                    pulseXRouter.addLiquidityETH{ value: plsForLiquidity }(
                        address(this),
                        tokensToLiquify,
                        0, // Accept any amount of tokens
                        0, // Accept any amount of PLS
                        liquidityWallet,
                        block.timestamp
                    );
                    emit AutoLiquify(plsForLiquidity, tokensToLiquify);
                }
            }

            swapping = false;
        }

        if (isExcludedFromFee[sender] || isExcludedFromFee[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else {
            (uint256 txnBurnFee, uint256 txnLiquidityFee, uint256 txnRevenueFee, uint256 txnReflectionFee, uint256 txnDividendFee) = _collectFees(amount);

            uint256 amountForProcessing = txnLiquidityFee + txnRevenueFee + txnDividendFee;

            if (txnBurnFee > 0) {
                _transferStandard(sender, DEAD, txnBurnFee);
            }

            if (txnReflectionFee > 0) {
                _reflectFee(txnReflectionFee);
            }

            if (amountForProcessing > 0) {
                _transferStandard(sender, address(this), amountForProcessing);
            }

            _transferStandard(sender, recipient, amount - txnBurnFee - txnLiquidityFee - txnRevenueFee - txnReflectionFee - txnDividendFee);
        }

        if (!isDividendExempt[sender]) {
            try distributor.setShare(sender, balanceOf(sender)) {} catch {}
        }
        if (!isDividendExempt[recipient]) {
            try distributor.setShare(recipient, balanceOf(recipient)) {} catch {}
        } 
        if (distributionEnabled) {
            try distributor.process(distributorGas) {} catch {}
        }
    }

    function _transferStandard(address sender, address recipient, uint256 amount) private {
        uint256 currentRate = _getRate();
        uint256 rAmount = amount * currentRate;

        if (_isExcludedFromReflection[sender]) {
            _tOwned[sender] = _tOwned[sender] - amount;
        }
        _rOwned[sender] = _rOwned[sender] - rAmount;

        if (_isExcludedFromReflection[recipient]) {
            _tOwned[recipient] = _tOwned[recipient] + amount;
        }
        _rOwned[recipient] = _rOwned[recipient] + rAmount;

        emit Transfer(sender, recipient, amount);
    }

    function _reflectFee(uint256 tFee) private {
        uint256 rFee = tFee * _getRate();
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }

    function _collectFees(uint256 amount) private view returns (uint256, uint256, uint256, uint256, uint256) {
        uint256 newBurnFee = (amount * burnFee) / FEE_BASE;
        uint256 newLiquidityFee = (amount * liquidityFee) / FEE_BASE;
        uint256 newRevenueFee = (amount * revenueFee) / FEE_BASE;
        uint256 newReflectionFee = (amount * reflectionFee) / FEE_BASE;
        uint256 newDividendFee = (amount * plsDividendFee) / FEE_BASE;
        return (newBurnFee, newLiquidityFee, newRevenueFee, newReflectionFee, newDividendFee);
    }

    function _swapTokensForPLS(uint256 tokenAmount) private nonReentrant {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = wrapped;

        _approve(address(this), address(pulseXRouter), tokenAmount);
        pulseXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);
    }

    function setDistributionStatus(bool status) external onlyOwner {
        distributionEnabled = status;
    }

    function setIsDividendExempt(address holder, bool status) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        isDividendExempt[holder] = status;
        distributor.setShare(holder, status ? 0 : balanceOf(holder));
    }

    function setDistributionCriteria(uint256 minPeriod, uint256 minDistribution, uint256 minShareThreshold) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        distributor.setDistributionCriteria(minPeriod, minDistribution, minShareThreshold);
    }

    function setDistributorGas(uint256 gas) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        distributorGas = gas;
    }

    function processDistributor() external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        distributor.process(distributorGas);
    }

    function rescueFunds(bool fromDistributor, address asset, address to) external nonReentrant returns (bool) {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        if (fromDistributor) {
            return distributor.rescueFunds(asset, to);
        } else {
            if (asset != address(0)) {
                return IERC20(asset).transfer(to, IERC20(asset).balanceOf(address(this)));
            } else {
                (bool success, ) = payable(to).call{ value: address(this).balance }("");
                return success;
            }
        }
    }

    // View functions for reflection info
    function isExcludedFromReflection(address account) external view returns (bool) {
        return _isExcludedFromReflection[account];
    }

    function totalReflections() external view returns (uint256) {
        return _tFeeTotal;
    }

    function reflectionRate() external view returns (uint256) {
        return _getRate();
    }

    function multiTransferFixed(address[] calldata addresses, uint256 tokens) external nonReentrant {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        require(addresses.length < 2001, "GAS Error: max airdrop limit is 2000 addresses"); // to prevent overflow

        address from = msg.sender;
        require(balanceOf(from) >= tokens * addresses.length, "Insufficient sender balance");

        for (uint i; i < addresses.length; ) {
            _transferStandard(from, addresses[i], tokens);
            if (!isDividendExempt[addresses[i]]) {
                try distributor.setShare(addresses[i], balanceOf(addresses[i])) {} catch {}
            }
            unchecked {
                ++i;
            }
        }

        // Dividend tracker
        if (!isDividendExempt[from]) {
            try distributor.setShare(from, balanceOf(from)) {} catch {}
        }
    }

    function setRouterWhitelisted(address router, bool whitelisted) external {
        require(msg.sender == owner() || msg.sender == administrator, "Unauthorized");
        require(router != address(0), "Zero address");
        isRouterWhitelisted[router] = whitelisted;
    }

    // Feeless liquidity add & remove
    function getPair(address router, address tokenOther) public view returns (address) {
        return IUniswapV2Factory(IUniswapV2Router(router).factory()).getPair(address(this), tokenOther);
    }

    function createPair(address router, address tokenOther) external returns (address pair) {
        require(allowUserAddLiquidity || msg.sender == seedWallet, "User liquidity add disabled");
        require(!swapping, "Internal swapping");
        require(isRouterWhitelisted[router], "Router not whitelisted");
        pair = IUniswapV2Factory(IUniswapV2Router(router).factory()).createPair(address(this), tokenOther);
        require(pair != address(0), "Pair creaation failed");
        
        if (!isAutomatedMarketMakerPairs[pair]) {
            isAutomatedMarketMakerPairs[pair] = true;
        }
        if (!_isExcludedFromReflection[pair]) {
            _excludeFromReflection(pair);
        }
        if (!isDividendExempt[pair]) {
            isDividendExempt[pair] = true;
            try distributor.setShare(pair, 0) {} catch {}
        }
    }

    function addLiquidity(
        address router,
        address tokenOther,
        uint256 amount,
        uint256 amountOther,
        uint256 minAmount,
        uint256 minAmountOther,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity) {
        require(allowUserAddLiquidity || msg.sender == seedWallet, "User liquidity add disabled");
        require(isRouterWhitelisted[router], "Router not whitelisted");
        require(!swapping, "Internal swapping");
        require(isExcludedFromFee[address(this)], "Token contract must be whitelisted from all fees");
        require(IERC20(address(this)).transferFrom(msg.sender, address(this), amount), "Failure: token transferFrom");
        require(IERC20(tokenOther).transferFrom(msg.sender, address(this), amountOther), "Failure: tokenOther transferFrom");
        require(balanceOf(address(this)) >= amount, "Failure: token transfer failed");
        require(IERC20(tokenOther).balanceOf(address(this)) >= amountOther, "Failure: tokenOther transfer failed");
        
        require(IERC20(tokenOther).approve(router, amountOther), "Failure: tokenOther approve");
        _approve(address(this), router, amount);
    
        address pair = getPair(router, tokenOther);
        require(pair != address(0), "Pair non existing");

        if (!isAutomatedMarketMakerPairs[pair]) {
            isAutomatedMarketMakerPairs[pair] = true;
        }
        if (!_isExcludedFromReflection[pair]) {
            _excludeFromReflection(pair);
        }
        if (!isDividendExempt[pair]) {
            isDividendExempt[pair] = true;
            try distributor.setShare(pair, 0) {} catch {}
        }

        swapping = true;
        (amountA, amountB, liquidity) = IUniswapV2Router(router).addLiquidity(address(this), tokenOther, amount, amountOther, minAmount, minAmountOther, to, deadline);
        swapping = false;
    }

    function addLiquidityETH(
        address router,
        uint256 amountToken,
        uint256 minAmountToken,
        uint256 minAmountETH,
        address to,
        uint deadline
    ) external payable returns (uint amountA, uint amountB, uint liquidity) {
        require(allowUserAddLiquidity || msg.sender == seedWallet, "User liquidity add disabled");
        require(isRouterWhitelisted[router], "Router not whitelisted");
        require(!swapping, "Internal swapping");
        require(isExcludedFromFee[address(this)], "Token contract must be whitelisted from all fees");
        require(IERC20(address(this)).transferFrom(msg.sender, address(this), amountToken), "Failure: token transferFrom");
        require(balanceOf(address(this)) >= amountToken, "Token transfer failed");
        require(msg.value > 0, "Zero payable");

        _approve(address(this), router, amountToken);

        address pair = getPair(router, getWrapped(router));
        require(pair != address(0), "Pair non existing");

        if (!isAutomatedMarketMakerPairs[pair]) {
            isAutomatedMarketMakerPairs[pair] = true;
        }
        if (!_isExcludedFromReflection[pair]) {
            _excludeFromReflection(pair);
        }
        if (!isDividendExempt[pair]) {
            isDividendExempt[pair] = true;
            try distributor.setShare(pair, 0) {} catch {}
        }

        swapping = true;
        (amountA, amountB, liquidity) = IUniswapV2Router(router).addLiquidityETH{ value: msg.value }(address(this), amountToken, minAmountToken, minAmountETH, to, deadline);
        swapping = false;
    }

    function removeLiquidity(
        address router,
        address tokenOther,
        uint liquidity,
        uint amountMin,
        uint amountOtherMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB) {
        require(allowUserAddLiquidity || msg.sender == seedWallet, "User liquidity add disabled");
        require(isRouterWhitelisted[router], "Router not whitelisted");
        require(!swapping, "Internal swapping");
        address pair = getPair(router, tokenOther);
        require(pair != address(0), "Pair non existing");
        require(IERC20(pair).transferFrom(msg.sender, address(this), liquidity), "Failure: liquidity transferFrom");
        require(IERC20(pair).approve(router, liquidity), "Failure: liquidity approve");
        

        swapping = true;
        (amountA, amountB) = IUniswapV2Router(router).removeLiquidity(address(this), tokenOther, liquidity, amountMin, amountOtherMin, to, deadline);
        swapping = false;

        if (!isDividendExempt[to]) {
            try distributor.setShare(to, balanceOf(to)) {} catch {}
        }
    }

    function removeLiquidityETH(
        address router,
        uint liquidity,
        uint amountMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH) {
        require(allowUserAddLiquidity || msg.sender == seedWallet, "User liquidity add disabled");
        require(isRouterWhitelisted[router], "Router not whitelisted");
        require(!swapping, "Internal swapping");
        address pair = getPair(router, getWrapped(router));
        require(pair != address(0), "Pair non existing");        
        require(IERC20(pair).transferFrom(msg.sender, address(this), liquidity), "Failure: liquidity transferFrom");
        require(IERC20(pair).approve(router, liquidity), "Failure: liquidity approve");
        
        swapping = true;
        (amountToken, amountETH) = IUniswapV2Router(router).removeLiquidityETH(address(this), liquidity, amountMin, amountETHMin, to, deadline);
        swapping = false;

        if (!isDividendExempt[to]) {
            try distributor.setShare(to, balanceOf(to)) {} catch {}
        }
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"routerAddress_","internalType":"address"},{"type":"address","name":"revenueWallet_","internalType":"address"},{"type":"address","name":"liquidityWallet_","internalType":"address"},{"type":"address","name":"seedWallet_","internalType":"address"},{"type":"address","name":"administrator_","internalType":"address"}]},{"type":"event","name":"AccountExcludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"AdministratorTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutoLiquify","inputs":[{"type":"uint256","name":"amountBNB","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutomatedMarketMakerPairUpdated","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"bool","name":"value","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"FeesUpdated","inputs":[{"type":"uint256","name":"burnFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"liquidityFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"revenueFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"reflectionFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsDividendFee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LiquidityWalletUpdated","inputs":[{"type":"address","name":"oldWallet","internalType":"address","indexed":false},{"type":"address","name":"newWallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ReflectionStatusChanged","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"bool","name":"isExcluded","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"RevenueWalletUpdated","inputs":[{"type":"address","name":"oldWallet","internalType":"address","indexed":false},{"type":"address","name":"newWallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"RouterUpdated","inputs":[{"type":"address","name":"oldRouter","internalType":"address","indexed":false},{"type":"address","name":"newRouter","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"FEE_BASE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountA","internalType":"uint256"},{"type":"uint256","name":"amountB","internalType":"uint256"},{"type":"uint256","name":"liquidity","internalType":"uint256"}],"name":"addLiquidity","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"address","name":"tokenOther","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"amountOther","internalType":"uint256"},{"type":"uint256","name":"minAmount","internalType":"uint256"},{"type":"uint256","name":"minAmountOther","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"amountA","internalType":"uint256"},{"type":"uint256","name":"amountB","internalType":"uint256"},{"type":"uint256","name":"liquidity","internalType":"uint256"}],"name":"addLiquidityETH","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"uint256","name":"amountToken","internalType":"uint256"},{"type":"uint256","name":"minAmountToken","internalType":"uint256"},{"type":"uint256","name":"minAmountETH","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"administrator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowUserAddLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"pair","internalType":"address"}],"name":"createPair","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"address","name":"tokenOther","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deliver","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableFeeChange","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"distributionEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract Distributor"}],"name":"distributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"distributorGas","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReflection","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"feeChangeDisabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeTotal","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getPair","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"address","name":"tokenOther","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getSwapThreshold","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"address","name":"wrappedToken","internalType":"address"}],"name":"getWrapped","inputs":[{"type":"address","name":"router","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReflection","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAutomatedMarketMakerPairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isDividendExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReflection","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isRouterWhitelisted","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"liquidityWallet","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"multiTransferFixed","inputs":[{"type":"address[]","name":"addresses","internalType":"address[]"},{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"plsDividendFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"processDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pulseXPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router"}],"name":"pulseXRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionRate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountA","internalType":"uint256"},{"type":"uint256","name":"amountB","internalType":"uint256"}],"name":"removeLiquidity","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"address","name":"tokenOther","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountMin","internalType":"uint256"},{"type":"uint256","name":"amountOtherMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountToken","internalType":"uint256"},{"type":"uint256","name":"amountETH","internalType":"uint256"}],"name":"removeLiquidityETH","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountMin","internalType":"uint256"},{"type":"uint256","name":"amountETHMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceAdministrator","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"rescueFunds","inputs":[{"type":"bool","name":"fromDistributor","internalType":"bool"},{"type":"address","name":"asset","internalType":"address"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"revenueFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"revenueWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"seedWallet","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAllowUserAddLiquidity","inputs":[{"type":"bool","name":"allow","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutomatedMarketMakerPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"minPeriod","internalType":"uint256"},{"type":"uint256","name":"minDistribution","internalType":"uint256"},{"type":"uint256","name":"minShareThreshold","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionStatus","inputs":[{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorGas","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_burnFee","internalType":"uint256"},{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_revenueFee","internalType":"uint256"},{"type":"uint256","name":"_reflectionFee","internalType":"uint256"},{"type":"uint256","name":"_plsDividendFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidityWallet","inputs":[{"type":"address","name":"_liquidityWallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRevenueWallet","inputs":[{"type":"address","name":"_revenueWallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRouterWhitelisted","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"bool","name":"whitelisted","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapThreshold","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"multiplier","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapReductionMultiplier","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalReflections","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferAdministrator","inputs":[{"type":"address","name":"newAdministrator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateDefaultRouter","inputs":[{"type":"address","name":"router","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"wrapped","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60c06040526200001e6b033b2e3c9fd0803ce8000000600019620010a8565b6200002c9060001962001033565b600b556127106014553480156200004257600080fd5b506040516200832238038062008322833981016040819052620000659162000f92565b604080518082018252600981526842726f6b654e6f4d6f60b81b60208083019182528351808501909452600684526504d6ff09f92b60d41b908401528151919291620000b49160039162000ea9565b508051620000ca90600490602084019062000ea9565b505050620000e7620000e16200058f60201b60201c565b62000593565b6001600655601880546001600160a01b0319166001600160a01b0387161790556200011285620005e5565b601a80546001600160a01b0319166001600160a01b039283161790556018546040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b1580156200016c57600080fd5b505afa15801562000181573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a7919062000f75565b601a546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c6539690604401602060405180830381600087803b158015620001f457600080fd5b505af115801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f919062000f75565b601980546001600160a01b0319166001600160a01b039283161790819055606084901b6001600160601b03191660805216620002b25760405162461bcd60e51b815260206004820152601460248201527f50616972206372656174696f6e206661696c656400000000000000000000000060448201526064015b60405180910390fd5b604051620002c09062000f38565b604051809103906000f080158015620002dd573d6000803e3d6000fd5b5060601b6001600160601b03191660a052306000818152601d602090815260408083208054600160ff1991821681179092556001600160a01b0388811680875284872080548416851790556019805483168852601c8752858820805485168617905597875284872080548416851790557fa48bd8e7b1565515cde2859b6cc48308ba05b5325bcf90fb096b9ac0b8087dfc8054841685179055865283862080548316841790558a81168652838620805483168417905589811686528386208054831684179055878116865283862080548316841790553386528386208054831684179055955486168552601e84528285208054821683179055948a168452601f90925290912080549092161790556203d090601555601a8054600160a81b60ff60a81b19909116179055620004216107d06b033b2e3c9fd0803ce80000006200101c565b601355601680546001600160a01b038087166001600160a01b03199283161790925560178054928616929091169190911790556200045f8162000799565b6200047160328060c860648062000861565b600a600b546200048291906200101c565b61dead60005260076020527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d819055600b54620004c0919062001033565b6001600160a01b03808416600090815260076020526040902091909155601954620004ec9116620009e4565b620004f730620009e4565b600062000512600a6b033b2e3c9fd0803ce80000006200101c565b60405181815290915061dead90600090600080516020620083028339815191529060200160405180910390a36001600160a01b03831660006000805160206200830283398151915262000572846b033b2e3c9fd0803ce800000062001033565b60405190815260200160405180910390a3505050505050620010eb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000816001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200062157600080fd5b505afa92505050801562000654575060408051601f3d908101601f19168201909252620006519181019062000f75565b60015b6200065f5762000667565b905062000794565b816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620006a157600080fd5b505afa925050508015620006d4575060408051601f3d908101601f19168201909252620006d19181019062000f75565b60015b6200065f57816001600160a01b0316638dd950026040518163ffffffff1660e01b815260040160206040518083038186803b1580156200071357600080fd5b505afa92505050801562000746575060408051601f3d908101601f19168201909252620007439181019062000f75565b60015b6200065f5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f20676574207772617070656420746f6b656e00000000006044820152606401620002a9565b919050565b620007a362000b46565b6005546001600160a01b0316331480620007c75750601b546001600160a01b031633145b620008045760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401620002a9565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f399b55200f7f639a63d76efe3dcfa9156ce367058d6b673041b84a628885f5a790600090a3506200085e6001600655565b50565b6200086b62000ba2565b6200087562000b46565b601a54600160b01b900460ff1615620008df5760405162461bcd60e51b815260206004820152602560248201527f466565206368616e67652064697361626c6564207065726d656e616e746c79206044820152643330b3379760d91b6064820152608401620002a9565b808284620008ee878962001001565b620008fa919062001001565b62000906919062001001565b62000912919062001001565b60128190556103e810156200096a5760405162461bcd60e51b815260206004820152601560248201527f546f74616c2066656520657863656564732031302500000000000000000000006044820152606401620002a9565b600d859055600e849055600f83905560108290556011819055604080518681526020810186905290810184905260608101839052608081018290527f96b67df2c4648b38ada47da86f80d0a256df93150752a7b365ca487cab934e649060a00160405180910390a1620009dd6001600655565b5050505050565b6001600160a01b03811660009081526009602052604090205460ff161562000a4f5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401620002a9565b6001600160a01b0381166000908152600760205260409020541562000aac576001600160a01b03811660009081526007602052604090205462000a929062000c00565b6001600160a01b0382166000908152600860205260409020555b6001600160a01b0381166000818152600960209081526040808320805460ff19166001908117909155600a8054808301825594527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890930180546001600160a01b03191685179055519182527f0b2cd0788922aac4a4720c91d0aa922d05be58153f67525c98ed1aad86bc86aa910160405180910390a250565b6002600654141562000b9b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620002a9565b6002600655565b6005546001600160a01b0316331462000bfe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620002a9565b565b6000600b5482111562000c695760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620002a9565b600062000c7562000c8a565b905062000c8381846200101c565b9392505050565b6000808062000c9862000cb0565b909250905062000ca981836200101c565b9250505090565b600b5460009081906b033b2e3c9fd0803ce8000000825b600a5481101562000e5e578260076000600a848154811062000cf957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000d7457508160086000600a848154811062000d4d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000d9757600b546b033b2e3c9fd0803ce80000009450945050505062000ea5565b60076000600a838154811062000dbd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205462000dee908462001033565b925060086000600a838154811062000e1657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205462000e47908362001033565b91508062000e55816200108a565b91505062000cc7565b506b033b2e3c9fd0803ce8000000600b5462000e7b91906200101c565b82101562000e9f57600b546b033b2e3c9fd0803ce800000093509350505062000ea5565b90925090505b9091565b82805462000eb7906200104d565b90600052602060002090601f01602090048101928262000edb576000855562000f26565b82601f1062000ef657805160ff191683800117855562000f26565b8280016001018555821562000f26579182015b8281111562000f2657825182559160200191906001019062000f09565b5062000f3492915062000f46565b5090565b6112b2806200705083390190565b5b8082111562000f34576000815560010162000f47565b80516001600160a01b03811681146200079457600080fd5b60006020828403121562000f87578081fd5b62000c838262000f5d565b600080600080600060a0868803121562000faa578081fd5b62000fb58662000f5d565b945062000fc56020870162000f5d565b935062000fd56040870162000f5d565b925062000fe56060870162000f5d565b915062000ff56080870162000f5d565b90509295509295909350565b60008219821115620010175762001017620010bf565b500190565b6000826200102e576200102e620010d5565b500490565b600082821015620010485762001048620010bf565b500390565b6002810460018216806200106257607f821691505b602082108114156200108457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620010a157620010a1620010bf565b5060010190565b600082620010ba57620010ba620010d5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60805160601c60a05160601c615e9f620011b160003960008181610b5901528181611170015281816116f8015281816117cf01528181611a5101528181611b6001528181611e3e0152818161225201528181612d8c0152818161317e01528181613bc901528181614118015281816142a801528181614cb701528181614fbb0152818161505e015261510e01526000818161061401528181610e320152818161240a01528181612a3301528181612edb015281816136720152613df40152615e9f6000f3fe6080604052600436106104355760003560e01c80635342acb411610229578063bfe109281161012e578063e8e33700116100b6578063f53d0a8e1161007a578063f53d0a8e14610d09578063f708a64f14610d29578063fb235f3414610d49578063fce589d814610d69578063fe3f52f414610d7f5761043c565b8063e8e3370014610c70578063ecefc70514610cab578063f005f2ca14610cc1578063f2fde38b14610cd6578063f305d71914610cf65761043c565b8063d4698016116100fd578063d469801614610bd0578063dd62ed3e14610bf0578063df8408fe14610c10578063e0edd58614610c30578063e6a4390514610c505761043c565b8063bfe1092814610b47578063c648a3a214610b7b578063c9c6539614610b9b578063d0f5640814610bbb5761043c565b806386608326116101b15780639a7a23d6116101805780639a7a23d614610aa7578063a457c2d714610ac7578063a9059cbb14610ae7578063aec9b6f414610b07578063baa2abde14610b275761043c565b80638660832614610a3d5780638da5cb5b14610a5e57806395d89b4114610a7c57806398118cb414610a915761043c565b80636f9c870e116101f85780636f9c870e1461099957806370a08231146109b9578063715018a6146109d95780637d459db3146109ee57806383ad799414610a275761043c565b80635342acb41461091d578063542aa2291461094d578063607b50191461096257806360e71962146109835761043c565b806323b872dd1161033a57806337bfc1ef116102c25780634035542c116102865780634035542c1461086c5780634355855a1461088d57806344478425146108bd5780634549b039146108dd57806350e70d48146108fd5761043c565b806337bfc1ef146107d657806339509351146107ec5780633ae7303b1461080c5780633bd5d1731461082c5780633feb0c3e1461084c5761043c565b8063296f0a0c11610309578063296f0a0c1461074e5780632d8381191461076e5780632ff399f71461078e578063313ce567146107a457806336e4ec64146107c05761043c565b806323b872dd146106be578063244ce7db146106de578063255fe847146106fe57806327334a081461072e5761043c565b80630a2d140c116103bd5780630fc59bae1161038c5780630fc59bae1461063657806310622ee81461064b57806318160ddd1461066057806319530f761461067e57806319f2d79d1461069e5761043c565b80630a2d140c146105925780630aef023f146105b25780630ca61cb1146105e25780630f4101e0146106025761043c565b806303fd2a451161040457806303fd2a45146104d257806304a66b481461050057806305f82a451461052057806306fdde0314610540578063095ea7b3146105625761043c565b8063018763ed1461044157806302373b831461046557806302751cec1461048757806302ee6bf4146104bc5761043c565b3661043c57005b600080fd5b34801561044d57600080fd5b50600c545b6040519081526020015b60405180910390f35b34801561047157600080fd5b5061048561048036600461592c565b610d9f565b005b34801561049357600080fd5b506104a76104a236600461585a565b610e0f565b6040805192835260208301919091520161045c565b3480156104c857600080fd5b5061045260145481565b3480156104de57600080fd5b506104e861dead81565b6040516001600160a01b03909116815260200161045c565b34801561050c57600080fd5b5061048561051b366004615a9e565b6111fd565b34801561052c57600080fd5b5061048561053b366004615666565b611367565b34801561054c57600080fd5b506105556115bb565b60405161045c9190615b50565b34801561056e57600080fd5b5061058261057d36600461582f565b61164d565b604051901515815260200161045c565b34801561059e57600080fd5b506104856105ad36600461592c565b611667565b3480156105be57600080fd5b506105826105cd366004615666565b601f6020526000908152604090205460ff1681565b3480156105ee57600080fd5b506104856105fd366004615a46565b61168d565b34801561060e57600080fd5b506104e87f000000000000000000000000000000000000000000000000000000000000000081565b34801561064257600080fd5b5061048561176b565b34801561065757600080fd5b5061048561183f565b34801561066c57600080fd5b50676765c793fa10079d601b1b610452565b34801561068a57600080fd5b506104856106993660046158b7565b61189a565b3480156106aa57600080fd5b506104856106b9366004615666565b611bec565b3480156106ca57600080fd5b506105826106d93660046156d6565b611f70565b3480156106ea57600080fd5b506104856106f93660046159ae565b611f96565b34801561070a57600080fd5b50610582610719366004615666565b601e6020526000908152604090205460ff1681565b34801561073a57600080fd5b50610485610749366004615666565b611fec565b34801561075a57600080fd5b50610485610769366004615666565b612046565b34801561077a57600080fd5b506104526107893660046159ae565b612134565b34801561079a57600080fd5b5061045260115481565b3480156107b057600080fd5b506040516012815260200161045c565b3480156107cc57600080fd5b50610452600f5481565b3480156107e257600080fd5b5061045260125481565b3480156107f857600080fd5b5061058261080736600461582f565b6121ba565b34801561081857600080fd5b50610582610827366004615964565b6121dc565b34801561083857600080fd5b506104856108473660046159ae565b6123eb565b34801561085857600080fd5b50610485610867366004615802565b612554565b34801561087857600080fd5b50601a5461058290600160b81b900460ff1681565b34801561089957600080fd5b506105826108a8366004615666565b601c6020526000908152604090205460ff1681565b3480156108c957600080fd5b506016546104e8906001600160a01b031681565b3480156108e957600080fd5b506104526108f83660046159de565b6125e4565b34801561090957600080fd5b50601a546104e8906001600160a01b031681565b34801561092957600080fd5b50610582610938366004615666565b601d6020526000908152604090205460ff1681565b34801561095957600080fd5b50610452612676565b34801561096e57600080fd5b50601a5461058290600160b01b900460ff1681565b34801561098f57600080fd5b5061045260155481565b3480156109a557600080fd5b506104e86109b4366004615666565b612685565b3480156109c557600080fd5b506104526109d4366004615666565b612822565b3480156109e557600080fd5b50610485612884565b3480156109fa57600080fd5b50610582610a09366004615666565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610a3357600080fd5b5061045260105481565b348015610a4957600080fd5b50601a5461058290600160a81b900460ff1681565b348015610a6a57600080fd5b506005546001600160a01b03166104e8565b348015610a8857600080fd5b50610555612896565b348015610a9d57600080fd5b50610452600e5481565b348015610ab357600080fd5b50610485610ac2366004615802565b6128a5565b348015610ad357600080fd5b50610582610ae236600461582f565b61297c565b348015610af357600080fd5b50610582610b0236600461582f565b612a02565b348015610b1357600080fd5b506018546104e8906001600160a01b031681565b348015610b3357600080fd5b506104a7610b42366004615716565b612a10565b348015610b5357600080fd5b506104e87f000000000000000000000000000000000000000000000000000000000000000081565b348015610b8757600080fd5b50610485610b96366004615666565b612e1a565b348015610ba757600080fd5b506104e8610bb636600461569e565b612eba565b348015610bc757600080fd5b506104856131ea565b348015610bdc57600080fd5b506017546104e8906001600160a01b031681565b348015610bfc57600080fd5b50610452610c0b36600461569e565b61329e565b348015610c1c57600080fd5b50610485610c2b366004615802565b6132c9565b348015610c3c57600080fd5b50610485610c4b366004615a02565b6133e8565b348015610c5c57600080fd5b506104e8610c6b36600461569e565b613558565b348015610c7c57600080fd5b50610c90610c8b366004615787565b61364c565b6040805193845260208401929092529082015260600161045c565b348015610cb757600080fd5b5061045261271081565b348015610ccd57600080fd5b50610452613d0f565b348015610ce257600080fd5b50610485610cf1366004615666565b613d58565b610c90610d0436600461585a565b613dce565b348015610d1557600080fd5b50601b546104e8906001600160a01b031681565b348015610d3557600080fd5b50610485610d44366004615802565b61423a565b348015610d5557600080fd5b50610485610d64366004615666565b61433d565b348015610d7557600080fd5b50610452600d5481565b348015610d8b57600080fd5b506019546104e8906001600160a01b031681565b610da761442b565b6005546001600160a01b0316331480610dca5750601b546001600160a01b031633145b610def5760405162461bcd60e51b8152600401610de690615ba3565b60405180910390fd5b601a805460ff60b81b1916600160b81b8315150217905560016006555b50565b601a546000908190600160b81b900460ff1680610e545750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610e705760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b0388166000908152601f602052604090205460ff16610ea85760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff1615610ed25760405162461bcd60e51b8152600401610de690615c9a565b6000610ee189610c6b8b612685565b90506001600160a01b038116610f095760405162461bcd60e51b8152600401610de690615c49565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610f3990339030908d90600401615ad8565b602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b9190615948565b610fd75760405162461bcd60e51b815260206004820152601f60248201527f4661696c7572653a206c6971756964697479207472616e7366657246726f6d006044820152606401610de6565b60405163095ea7b360e01b81526001600160a01b0382169063095ea7b390611005908c908c90600401615afc565b602060405180830381600087803b15801561101f57600080fd5b505af1158015611033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110579190615948565b6110a35760405162461bcd60e51b815260206004820152601a60248201527f4661696c7572653a206c697175696469747920617070726f76650000000000006044820152606401610de6565b601a805460ff60a01b1916600160a01b179055604051629d473b60e21b81526001600160a01b038a16906302751cec906110eb9030908c908c908c908c908c90600401615b15565b6040805180830381600087803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113c9190615a23565b601a805460ff60a01b191690556001600160a01b0387166000908152601c6020526040902054919450925060ff166111f1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166314b6ca96866111a788612822565b6040518363ffffffff1660e01b81526004016111c4929190615afc565b600060405180830381600087803b1580156111de57600080fd5b505af19250505080156111ef575060015b505b50965096945050505050565b611205614485565b61120d61442b565b601a54600160b01b900460ff16156112755760405162461bcd60e51b815260206004820152602560248201527f466565206368616e67652064697361626c6564207065726d656e616e746c79206044820152643330b3379760d91b6064820152608401610de6565b8082846112828789615d6c565b61128c9190615d6c565b6112969190615d6c565b6112a09190615d6c565b60128190556103e810156112ee5760405162461bcd60e51b8152602060048201526015602482015274546f74616c2066656520657863656564732031302560581b6044820152606401610de6565b600d859055600e849055600f83905560108290556011819055604080518681526020810186905290810184905260608101839052608081018290527f96b67df2c4648b38ada47da86f80d0a256df93150752a7b365ca487cab934e649060a00160405180910390a16113606001600655565b5050505050565b61136f61442b565b6005546001600160a01b03163314806113925750601b546001600160a01b031633145b6113ae5760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b03811660009081526009602052604090205460ff166114165760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610de6565b60005b600a548110156115b057816001600160a01b0316600a828154811061144e57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141561159e57600a805461147990600190615dc3565b8154811061149757634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600a80546001600160a01b0390921691839081106114d157634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600882526040808220829055600990925220805460ff19169055600a80548061153757634e487b7160e01b600052603160045260246000fd5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556040519182526001600160a01b038416917f0b2cd0788922aac4a4720c91d0aa922d05be58153f67525c98ed1aad86bc86aa910160405180910390a26115b0565b806115a881615e15565b915050611419565b50610e0c6001600655565b6060600380546115ca90615dda565b80601f01602080910402602001604051908101604052809291908181526020018280546115f690615dda565b80156116435780601f1061161857610100808354040283529160200191611643565b820191906000526020600020905b81548152906001019060200180831161162657829003601f168201915b5050505050905090565b60003361165b8185856144df565b60019150505b92915050565b61166f614485565b601a8054911515600160a81b0260ff60a81b19909216919091179055565b61169561442b565b6005546001600160a01b03163314806116b85750601b546001600160a01b031633145b6116d45760405162461bcd60e51b8152600401610de690615ba3565b604051630ca61cb160e01b81526004810184905260248101839052604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630ca61cb190606401600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b505050506117666001600655565b505050565b61177361442b565b6005546001600160a01b03163314806117965750601b546001600160a01b031633145b6117b25760405162461bcd60e51b8152600401610de690615ba3565b6015546040516001624d3b8760e01b0319815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ffb2c47990602401600060405180830381600087803b15801561181b57600080fd5b505af115801561182f573d6000803e3d6000fd5b5050505061183d6001600655565b565b61184761442b565b6005546001600160a01b031633148061186a5750601b546001600160a01b031633145b6118865760405162461bcd60e51b8152600401610de690615ba3565b6118906000612e1a565b61183d6001600655565b6118a261442b565b6005546001600160a01b03163314806118c55750601b546001600160a01b031633145b6118e15760405162461bcd60e51b8152600401610de690615ba3565b6107d182106119495760405162461bcd60e51b815260206004820152602e60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526d323030302061646472657373657360901b6064820152608401610de6565b336119548383615da4565b61195d82612822565b10156119ab5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742073656e6465722062616c616e636500000000006044820152606401610de6565b60005b83811015611b3d576119f5828686848181106119da57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119ef9190615666565b85614603565b601c6000868684818110611a1957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611a2e9190615666565b6001600160a01b0316815260208101919091526040016000205460ff16611b35577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166314b6ca96868684818110611a9e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ab39190615666565b611aeb888886818110611ad657634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109d49190615666565b6040518363ffffffff1660e01b8152600401611b08929190615afc565b600060405180830381600087803b158015611b2257600080fd5b505af1925050508015611b33575060015b505b6001016119ae565b506001600160a01b0381166000908152601c602052604090205460ff16611be1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166314b6ca9682611b9784612822565b6040518363ffffffff1660e01b8152600401611bb4929190615afc565b600060405180830381600087803b158015611bce57600080fd5b505af1925050508015611bdf575060015b505b506117666001600655565b611bf461442b565b6005546001600160a01b0316331480611c175750601b546001600160a01b031633145b611c335760405162461bcd60e51b8152600401610de690615ba3565b601880546019546001600160a01b038481166001600160a01b03198416179093559082169116611c6283612685565b601a60006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000836001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611cc357600080fd5b505afa158015611cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfb9190615682565b601a5460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a439059060440160206040518083038186803b158015611d4557600080fd5b505afa158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190615682565b90506001600160a01b038116611dcc5760405162461bcd60e51b815260206004820152601460248201527314185a5c8818dc99585d1a5bdb8819985a5b195960621b6044820152606401610de6565b601980546001600160a01b0319166001600160a01b0383169081179091556000908152601e60205260409020805460ff19166001179055611e0c8161479a565b6001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f0000000000000000000000000000000000000000000000000000000000000000909216916314b6ca9691611e7691859190600401615afc565b600060405180830381600087803b158015611e9057600080fd5b505af1925050508015611ea1575060015b50604080516001600160a01b038086168252861660208201527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a1604051600081526001600160a01b038316907fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e909060200160405180910390a2604051600181526001600160a01b038216907fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e909060200160405180910390a2505050610e0c6001600655565b600033611f7e8582856148f7565b611f89858585614971565b60019150505b9392505050565b611f9e61442b565b6005546001600160a01b0316331480611fc15750601b546001600160a01b031633145b611fdd5760405162461bcd60e51b8152600401610de690615ba3565b6015819055610e0c6001600655565b611ff461442b565b6005546001600160a01b03163314806120175750601b546001600160a01b031633145b6120335760405162461bcd60e51b8152600401610de690615ba3565b61203c8161479a565b610e0c6001600655565b61204e61442b565b6017546001600160a01b031633148061207157506005546001600160a01b031633145b806120865750601b546001600160a01b031633145b6120a25760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0381166120c85760405162461bcd60e51b8152600401610de690615c74565b601754604080516001600160a01b03928316815291831660208301527f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e910160405180910390a1601780546001600160a01b0319166001600160a01b0383161790556001600655610e0c565b6000600b5482111561219b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610de6565b60006121a5615174565b90506121b18184615d84565b9150505b919050565b60003361165b8185856121cd838361329e565b6121d79190615d6c565b6144df565b60006121e661442b565b6005546001600160a01b03163314806122095750601b546001600160a01b031633145b6122255760405162461bcd60e51b8152600401610de690615ba3565b83156122d657604051630ffcdb7960e11b81526001600160a01b03848116600483015283811660248301527f00000000000000000000000000000000000000000000000000000000000000001690631ff9b6f2906044015b602060405180830381600087803b15801561229757600080fd5b505af11580156122ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cf9190615948565b90506123e1565b6001600160a01b03831615612383576040516370a0823160e01b81523060048201526001600160a01b0384169063a9059cbb90849083906370a082319060240160206040518083038186803b15801561232e57600080fd5b505afa158015612342573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236691906159c6565b6040518363ffffffff1660e01b815260040161227d929190615afc565b6000826001600160a01b03164760405160006040518083038185875af1925050503d80600081146123d0576040519150601f19603f3d011682016040523d82523d6000602084013e6123d5565b606091505b509092506123e1915050565b611f8f6001600655565b6123f361442b565b601a543390600160b81b900460ff168061243e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316145b61245a5760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b03811660009081526009602052604090205460ff16156124d85760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610de6565b60006124e383615197565b5050506001600160a01b03831660009081526007602052604090205490915061250d908290615dc3565b6001600160a01b038316600090815260076020526040902055600b54612534908290615dc3565b600b55600c54612545908490615d6c565b600c5550506001600655610e0c565b6005546001600160a01b03163314806125775750601b546001600160a01b031633145b6125935760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0382166125b95760405162461bcd60e51b8152600401610de690615c74565b6001600160a01b03919091166000908152601f60205260409020805460ff1916911515919091179055565b6000676765c793fa10079d601b1b8311156126415760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610de6565b8161265e57600061265184615197565b5091935061166192505050565b600061266984615197565b5090935061166192505050565b6000612680615174565b905090565b6000816001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126c057600080fd5b505afa9250505080156126f0575060408051601f3d908101601f191682019092526126ed91810190615682565b60015b6126f957612700565b90506121b5565b816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561273957600080fd5b505afa925050508015612769575060408051601f3d908101601f1916820190925261276691810190615682565b60015b6126f957816001600160a01b0316638dd950026040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a657600080fd5b505afa9250505080156127d6575060408051601f3d908101601f191682019092526127d391810190615682565b60015b6126f95760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f20676574207772617070656420746f6b656e00000000006044820152606401610de6565b6001600160a01b03811660009081526009602052604081205460ff161561286257506001600160a01b0381166000908152600860205260409020546121b5565b6001600160a01b03821660009081526007602052604090205461166190612134565b61288c614485565b61183d6000615200565b6060600480546115ca90615dda565b6128ad61442b565b601b546001600160a01b03163314806128d057506005546001600160a01b031633145b6128ec5760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0382166129125760405162461bcd60e51b8152600401610de690615c74565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e9091015b60405180910390a26129786001600655565b5050565b6000338161298a828661329e565b9050838110156129ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610de6565b6129f782868684036144df565b506001949350505050565b60003361165b818585614971565b601a546000908190600160b81b900460ff1680612a555750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b612a715760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b0389166000908152601f602052604090205460ff16612aa95760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff1615612ad35760405162461bcd60e51b8152600401610de690615c9a565b6000612adf8a8a613558565b90506001600160a01b038116612b075760405162461bcd60e51b8152600401610de690615c49565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90612b3790339030908d90600401615ad8565b602060405180830381600087803b158015612b5157600080fd5b505af1158015612b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b899190615948565b612bd55760405162461bcd60e51b815260206004820152601f60248201527f4661696c7572653a206c6971756964697479207472616e7366657246726f6d006044820152606401610de6565b60405163095ea7b360e01b81526001600160a01b0382169063095ea7b390612c03908d908c90600401615afc565b602060405180830381600087803b158015612c1d57600080fd5b505af1158015612c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c559190615948565b612ca15760405162461bcd60e51b815260206004820152601a60248201527f4661696c7572653a206c697175696469747920617070726f76650000000000006044820152606401610de6565b601a805460ff60a01b1916600160a01b179055604051635d5155ef60e11b81523060048201526001600160a01b038a81166024830152604482018a9052606482018990526084820188905286811660a483015260c482018690528b169063baa2abde9060e4016040805180830381600087803b158015612d2057600080fd5b505af1158015612d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d589190615a23565b601a805460ff60a01b191690556001600160a01b0387166000908152601c6020526040902054919450925060ff16612e0d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166314b6ca9686612dc388612822565b6040518363ffffffff1660e01b8152600401612de0929190615afc565b600060405180830381600087803b158015612dfa57600080fd5b505af1925050508015612e0b575060015b505b5097509795505050505050565b612e2261442b565b6005546001600160a01b0316331480612e455750601b546001600160a01b031633145b612e615760405162461bcd60e51b8152600401610de690615ba3565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f399b55200f7f639a63d76efe3dcfa9156ce367058d6b673041b84a628885f5a790600090a350610e0c6001600655565b601a54600090600160b81b900460ff1680612efd5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b612f195760405162461bcd60e51b8152600401610de690615cc5565b601a54600160a01b900460ff1615612f435760405162461bcd60e51b8152600401610de690615c9a565b6001600160a01b0383166000908152601f602052604090205460ff16612f7b5760405162461bcd60e51b8152600401610de690615c19565b826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612fb457600080fd5b505afa158015612fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fec9190615682565b6040516364e329cb60e11b81523060048201526001600160a01b038481166024830152919091169063c9c6539690604401602060405180830381600087803b15801561303757600080fd5b505af115801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190615682565b90506001600160a01b0381166130bf5760405162461bcd60e51b815260206004820152601560248201527414185a5c8818dc9958585d1a5bdb8819985a5b1959605a1b6044820152606401610de6565b6001600160a01b0381166000908152601e602052604090205460ff16613103576001600160a01b0381166000908152601e60205260409020805460ff191660011790555b6001600160a01b03811660009081526009602052604090205460ff1661312c5761312c8161479a565b6001600160a01b0381166000908152601c602052604090205460ff16611661576001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f0000000000000000000000000000000000000000000000000000000000000000909216916314b6ca96916131b691859190600401615afc565b600060405180830381600087803b1580156131d057600080fd5b505af19250505080156131e1575060015b61166157611661565b6131f261442b565b601a54600160b01b900460ff16156132425760405162461bcd60e51b81526020600482015260136024820152721199594818da185b99d948191a5cd8589b1959606a1b6044820152606401610de6565b601b546001600160a01b031633148061326557506005546001600160a01b031633145b6132815760405162461bcd60e51b8152600401610de690615ba3565b601a805460ff60b01b1916600160b01b17905561183d6001600655565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6132d161442b565b6001600160a01b0382166000908152601d602052604090205460ff16151581151514156133515760405162461bcd60e51b815260206004820152602860248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015267277374617475732760c01b6064820152608401610de6565b601b546001600160a01b031633148061337457506005546001600160a01b031633145b6133905760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b9101612966565b6133f061442b565b601b546001600160a01b031633148061341357506005546001600160a01b031633145b61342f5760405162461bcd60e51b8152600401610de690615ba3565b676765c793fa10079d601b1b82111561349a5760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b6064820152608401610de6565b6509184e72a0008210156135025760405162461bcd60e51b815260206004820152602960248201527f4d696e696d756d2060302e30303030316020746f6b656e207065722073776170604482015268081c995c5d5a5c995960ba1b6064820152608401610de6565b600081116135445760405162461bcd60e51b815260206004820152600f60248201526e2d32b9379036bab63a34b83634b2b960891b6044820152606401610de6565b601382905560148190556129786001600655565b6000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561359357600080fd5b505afa1580156135a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cb9190615682565b60405163e6a4390560e01b81523060048201526001600160a01b038481166024830152919091169063e6a439059060440160206040518083038186803b15801561361457600080fd5b505afa158015613628573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8f9190615682565b6000806000601a60179054906101000a900460ff16806136945750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6136b05760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b038b166000908152601f602052604090205460ff166136e85760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff16156137125760405162461bcd60e51b8152600401610de690615c9a565b306000908152601d602052604090205460ff166137415760405162461bcd60e51b8152600401610de690615bc9565b6040516323b872dd60e01b815230906323b872dd9061376890339084908e90600401615ad8565b602060405180830381600087803b15801561378257600080fd5b505af1158015613796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ba9190615948565b6138065760405162461bcd60e51b815260206004820152601b60248201527f4661696c7572653a20746f6b656e207472616e7366657246726f6d00000000006044820152606401610de6565b6040516323b872dd60e01b81526001600160a01b038b16906323b872dd9061383690339030908d90600401615ad8565b602060405180830381600087803b15801561385057600080fd5b505af1158015613864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138889190615948565b6138d45760405162461bcd60e51b815260206004820181905260248201527f4661696c7572653a20746f6b656e4f74686572207472616e7366657246726f6d6044820152606401610de6565b886138de30612822565b101561392c5760405162461bcd60e51b815260206004820152601e60248201527f4661696c7572653a20746f6b656e207472616e73666572206661696c656400006044820152606401610de6565b6040516370a0823160e01b815230600482015288906001600160a01b038c16906370a082319060240160206040518083038186803b15801561396d57600080fd5b505afa158015613981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a591906159c6565b10156139ff5760405162461bcd60e51b815260206004820152602360248201527f4661696c7572653a20746f6b656e4f74686572207472616e73666572206661696044820152621b195960ea1b6064820152608401610de6565b60405163095ea7b360e01b81526001600160a01b038b169063095ea7b390613a2d908e908c90600401615afc565b602060405180830381600087803b158015613a4757600080fd5b505af1158015613a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a7f9190615948565b613acb5760405162461bcd60e51b815260206004820152601b60248201527f4661696c7572653a20746f6b656e4f7468657220617070726f766500000000006044820152606401610de6565b613ad6308c8b6144df565b6000613ae28c8c613558565b90506001600160a01b038116613b0a5760405162461bcd60e51b8152600401610de690615c49565b6001600160a01b0381166000908152601e602052604090205460ff16613b4e576001600160a01b0381166000908152601e60205260409020805460ff191660011790555b6001600160a01b03811660009081526009602052604090205460ff16613b7757613b778161479a565b6001600160a01b0381166000908152601c602052604090205460ff16613c2e576001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f0000000000000000000000000000000000000000000000000000000000000000909216916314b6ca9691613c0191859190600401615afc565b600060405180830381600087803b158015613c1b57600080fd5b505af1925050508015613c2c575060015b505b601a805460ff60a01b1916600160a01b17905560405162e8e33760e81b81523060048201526001600160a01b038c81166024830152604482018c9052606482018b9052608482018a905260a4820189905287811660c483015260e482018790528d169063e8e337009061010401606060405180830381600087803b158015613cb557600080fd5b505af1158015613cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ced9190615a71565b601a805460ff60a01b19169055919e909d50909b509950505050505050505050565b601b546000906001600160a01b0316331480613d3557506005546001600160a01b031633145b613d515760405162461bcd60e51b8152600401610de690615ba3565b5060135490565b613d60614485565b6001600160a01b038116613dc55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610de6565b610e0c81615200565b6000806000601a60179054906101000a900460ff1680613e165750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b613e325760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b0389166000908152601f602052604090205460ff16613e6a5760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff1615613e945760405162461bcd60e51b8152600401610de690615c9a565b306000908152601d602052604090205460ff16613ec35760405162461bcd60e51b8152600401610de690615bc9565b6040516323b872dd60e01b815230906323b872dd90613eea90339084908d90600401615ad8565b602060405180830381600087803b158015613f0457600080fd5b505af1158015613f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3c9190615948565b613f885760405162461bcd60e51b815260206004820152601b60248201527f4661696c7572653a20746f6b656e207472616e7366657246726f6d00000000006044820152606401610de6565b87613f9230612822565b1015613fd85760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610de6565b600034116140175760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2070617961626c6560a01b6044820152606401610de6565b614022308a8a6144df565b60006140318a610c6b8c612685565b90506001600160a01b0381166140595760405162461bcd60e51b8152600401610de690615c49565b6001600160a01b0381166000908152601e602052604090205460ff1661409d576001600160a01b0381166000908152601e60205260409020805460ff191660011790555b6001600160a01b03811660009081526009602052604090205460ff166140c6576140c68161479a565b6001600160a01b0381166000908152601c602052604090205460ff1661417d576001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f0000000000000000000000000000000000000000000000000000000000000000909216916314b6ca969161415091859190600401615afc565b600060405180830381600087803b15801561416a57600080fd5b505af192505050801561417b575060015b505b601a805460ff60a01b1916600160a01b17905560405163f305d71960e01b81526001600160a01b038b169063f305d7199034906141c89030908e908e908e908e908e90600401615b15565b6060604051808303818588803b1580156141e157600080fd5b505af11580156141f5573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061421a9190615a71565b601a805460ff60a01b19169055919c909b50909950975050505050505050565b61424261442b565b6005546001600160a01b03163314806142655750601b546001600160a01b031633145b6142815760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b038281166000908152601c60205260409020805460ff19168315151790557f0000000000000000000000000000000000000000000000000000000000000000166314b6ca9683836142e1576142dc85612822565b6142e4565b60005b6040518363ffffffff1660e01b8152600401614301929190615afc565b600060405180830381600087803b15801561431b57600080fd5b505af115801561432f573d6000803e3d6000fd5b505050506129786001600655565b61434561442b565b6016546001600160a01b031633148061436857506005546001600160a01b031633145b8061437d5750601b546001600160a01b031633145b6143995760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0381166143bf5760405162461bcd60e51b8152600401610de690615c74565b601654604080516001600160a01b03928316815291831660208301527f5ede98256e49a93a11ecfa040cd1fa6630eec48f364993adafecc4766b325f61910160405180910390a1601680546001600160a01b0319166001600160a01b0383161790556001600655610e0c565b6002600654141561447e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610de6565b6002600655565b6005546001600160a01b0316331461183d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610de6565b6001600160a01b0383166145415760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610de6565b6001600160a01b0382166145a25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610de6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061460d615174565b9050600061461b8284615da4565b6001600160a01b03861660009081526009602052604090205490915060ff161561467d576001600160a01b038516600090815260086020526040902054614663908490615dc3565b6001600160a01b0386166000908152600860205260409020555b6001600160a01b0385166000908152600760205260409020546146a1908290615dc3565b6001600160a01b0380871660009081526007602090815260408083209490945591871681526009909152205460ff1615614713576001600160a01b0384166000908152600860205260409020546146f9908490615d6c565b6001600160a01b0385166000908152600860205260409020555b6001600160a01b038416600090815260076020526040902054614737908290615d6c565b6001600160a01b0380861660008181526007602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061478b9087815260200190565b60405180910390a35050505050565b6001600160a01b03811660009081526009602052604090205460ff16156148035760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610de6565b6001600160a01b0381166000908152600760205260409020541561485d576001600160a01b03811660009081526007602052604090205461484390612134565b6001600160a01b0382166000908152600860205260409020555b6001600160a01b0381166000818152600960209081526040808320805460ff19166001908117909155600a8054808301825594527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890930180546001600160a01b03191685179055519182527f0b2cd0788922aac4a4720c91d0aa922d05be58153f67525c98ed1aad86bc86aa910160405180910390a250565b6000614903848461329e565b9050600019811461496b578181101561495e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610de6565b61496b84848484036144df565b50505050565b6001600160a01b0383166149d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610de6565b6001600160a01b038216614a375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610de6565b60008111614aa05760405162461bcd60e51b815260206004820152603060248201527f45524332303a205472616e7366657220616d6f756e74206d757374206265206760448201526f726561746572207468616e207a65726f60801b6064820152608401610de6565b80614aaa84612822565b1015614b075760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610de6565b601a54600160a01b900460ff1615614b2957614b24838383614603565b611766565b601354614b3530612822565b10158015614b4d5750601a54600160a01b900460ff16155b8015614b7157506001600160a01b0382166000908152601e602052604090205460ff165b15614e9557601a805460ff60a01b1916600160a01b179055601154600f54600e5460009291614b9f91615d6c565b614ba99190615d6c565b90506000600282600e54601354614bc09190615da4565b614bca9190615d84565b614bd49190615d84565b905061271060145414614bff5761271060145482614bf29190615da4565b614bfc9190615d84565b90505b600081601354614c0f9190615dc3565b90508015614e845747614c2182615252565b6000614c2d8247615dc3565b905060006002600e54614c409190615d84565b614c4a9087615dc3565b90506000600282600e5485614c5f9190615da4565b614c699190615d84565b614c739190615d84565b905060008260115485614c869190615da4565b614c909190615d84565b9050600083600f5486614ca39190615da4565b614cad9190615d84565b90508115614d24577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015614d1057600080fd5b505af193505050508015614d22575060015b505b8015614d81576016546040516000916001600160a01b03169083908381818185875af1925050503d8060008114614d77576040519150601f19603f3d011682016040523d82523d6000602084013e614d7c565b606091505b505050505b600088118015614d915750600083115b15614e7d57601854614dae9030906001600160a01b03168a6144df565b60185460175460405163f305d71960e01b81526001600160a01b039283169263f305d719928792614dee9230928f92600092839216904290600401615b15565b6060604051808303818588803b158015614e0757600080fd5b505af1158015614e1b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190614e409190615a71565b505060408051858152602081018b90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050505050505b5050601a805460ff60a01b19169055505b6001600160a01b0383166000908152601d602052604090205460ff1680614ed457506001600160a01b0382166000908152601d602052604090205460ff165b15614ee957614ee4838383614603565b614f99565b6000806000806000614efa86615378565b945094509450945094506000818486614f139190615d6c565b614f1d9190615d6c565b90508515614f3257614f328961dead88614603565b8215614f4157614f418361542b565b8015614f5257614f52893083614603565b614f9289898486888a614f658d8f615dc3565b614f6f9190615dc3565b614f799190615dc3565b614f839190615dc3565b614f8d9190615dc3565b614603565b5050505050505b6001600160a01b0383166000908152601c602052604090205460ff1661503c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166314b6ca9684614ff286612822565b6040518363ffffffff1660e01b815260040161500f929190615afc565b600060405180830381600087803b15801561502957600080fd5b505af192505050801561503a575060015b505b6001600160a01b0382166000908152601c602052604090205460ff166150df577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166314b6ca968361509585612822565b6040518363ffffffff1660e01b81526004016150b2929190615afc565b600060405180830381600087803b1580156150cc57600080fd5b505af19250505080156150dd575060015b505b601a54600160a81b900460ff1615611766576015546040516001624d3b8760e01b0319815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ffb2c47990602401600060405180830381600087803b15801561515a57600080fd5b505af192505050801561516b575060015b61176657611766565b6000806000615181615467565b90925090506151908183615d84565b9250505090565b60008060008060006151a886615649565b905060006151b68288615dc3565b905060006151c2615174565b905060006151d0828a615da4565b905060006151de8385615da4565b905060006151ec8487615da4565b929b919a5091985092965091945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61525a61442b565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061529d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a548251911690829060019081106152dc57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260185461530291309116846144df565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac9479061533b908590600090869030904290600401615cfc565b600060405180830381600087803b15801561535557600080fd5b505af1158015615369573d6000803e3d6000fd5b5050505050610e0c6001600655565b600080600080600080612710600d54886153929190615da4565b61539c9190615d84565b90506000612710600e54896153b19190615da4565b6153bb9190615d84565b90506000612710600f548a6153d09190615da4565b6153da9190615d84565b905060006127106010548b6153ef9190615da4565b6153f99190615d84565b905060006127106011548c61540e9190615da4565b6154189190615d84565b949b939a50919850965091945092505050565b6000615435615174565b61543f9083615da4565b905080600b5461544f9190615dc3565b600b55600c54615460908390615d6c565b600c555050565b600b546000908190676765c793fa10079d601b1b825b600a54811015615604578260076000600a84815481106154ad57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061552657508160086000600a84815481106154ff57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561554657600b54676765c793fa10079d601b1b94509450505050615645565b60076000600a838154811061556b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205461559a9084615dc3565b925060086000600a83815481106155c157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546155f09083615dc3565b9150806155fc81615e15565b91505061547d565b50676765c793fa10079d601b1b600b5461561e9190615d84565b82101561563f57600b54676765c793fa10079d601b1b935093505050615645565b90925090505b9091565b60006127106010548361565c9190615da4565b6116619190615d84565b600060208284031215615677578081fd5b8135611f8f81615e46565b600060208284031215615693578081fd5b8151611f8f81615e46565b600080604083850312156156b0578081fd5b82356156bb81615e46565b915060208301356156cb81615e46565b809150509250929050565b6000806000606084860312156156ea578081fd5b83356156f581615e46565b9250602084013561570581615e46565b929592945050506040919091013590565b600080600080600080600060e0888a031215615730578283fd5b873561573b81615e46565b9650602088013561574b81615e46565b955060408801359450606088013593506080880135925060a088013561577081615e46565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b0312156157a3578081fd5b88356157ae81615e46565b975060208901356157be81615e46565b965060408901359550606089013594506080890135935060a0890135925060c08901356157ea81615e46565b8092505060e089013590509295985092959890939650565b60008060408385031215615814578182fd5b823561581f81615e46565b915060208301356156cb81615e5b565b60008060408385031215615841578182fd5b823561584c81615e46565b946020939093013593505050565b60008060008060008060c08789031215615872578182fd5b863561587d81615e46565b955060208701359450604087013593506060870135925060808701356158a281615e46565b8092505060a087013590509295509295509295565b6000806000604084860312156158cb578283fd5b833567ffffffffffffffff808211156158e2578485fd5b818601915086601f8301126158f5578485fd5b813581811115615903578586fd5b8760208083028501011115615916578586fd5b6020928301989097509590910135949350505050565b60006020828403121561593d578081fd5b8135611f8f81615e5b565b600060208284031215615959578081fd5b8151611f8f81615e5b565b600080600060608486031215615978578081fd5b833561598381615e5b565b9250602084013561599381615e46565b915060408401356159a381615e46565b809150509250925092565b6000602082840312156159bf578081fd5b5035919050565b6000602082840312156159d7578081fd5b5051919050565b600080604083850312156159f0578182fd5b8235915060208301356156cb81615e5b565b60008060408385031215615a14578182fd5b50508035926020909101359150565b60008060408385031215615a35578182fd5b505080516020909101519092909150565b600080600060608486031215615a5a578081fd5b505081359360208301359350604090920135919050565b600080600060608486031215615a85578081fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215615ab5578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602080835283518082850152825b81811015615b7c57858101830151858201604001528201615b60565b81811115615b8d5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b60208082526030908201527f546f6b656e20636f6e7472616374206d7573742062652077686974656c69737460408201526f65642066726f6d20616c6c206665657360801b606082015260800190565b602080825260169082015275149bdd5d195c881b9bdd081dda1a5d195b1a5cdd195960521b604082015260600190565b60208082526011908201527050616972206e6f6e206578697374696e6760781b604082015260600190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b602080825260119082015270496e7465726e616c207377617070696e6760781b604082015260600190565b6020808252601b908201527f55736572206c6971756964697479206164642064697361626c65640000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015615d4b5784516001600160a01b031683529383019391830191600101615d26565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115615d7f57615d7f615e30565b500190565b600082615d9f57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615dbe57615dbe615e30565b500290565b600082821015615dd557615dd5615e30565b500390565b600281046001821680615dee57607f821691505b60208210811415615e0f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e2957615e29615e30565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610e0c57600080fd5b8015158114610e0c57600080fdfea264697066735822122083484836e17c77c4b616a4732157bd5c0aa1e374d80d403ed888408af605e16e64736f6c6343000802003360a0604052610a8c60095569021e19e0c9bab2400000600a5569d3c21bcecceda1000000600b5534801561003257600080fd5b5060016000553361007e5760405162461bcd60e51b81526020600482015260126024820152712d32b9379030b2323932b9b99037bbb732b960711b604482015260640160405180910390fd5b33606081901b6080526111f06100c2600039600081816103f70152818161046b015281816105090152818161065a015281816108f00152610a1b01526111f06000f3fe6080604052600436106101445760003560e01c8063890c3233116100b6578063d0e30db01161006f578063d0e30db0146103b1578063e2d2e219146103b9578063efca2eed146103cf578063fc0c546a146103e5578063ffb2c47914610419578063ffd49c84146104395761014b565b8063890c3233146102c65780638c21cd52146102e8578063997664d714610308578063aaf5eb681461031e578063b89a73cb1461033a578063ce7c2ac21461035a5761014b565b80633756329311610108578063375632931461020a5780633a98ef391461021f5780634fab0ae8146102355780635e011a3d1461024b57806366817df5146102835780637ed73f7d146102b05761014b565b806304972881146101505780630ca61cb11461017857806314b6ca961461019a5780631ff9b6f2146101ba57806328fd3198146101ea5761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b5061016561044f565b6040519081526020015b60405180910390f35b34801561018457600080fd5b5061019861019336600461109e565b610460565b005b3480156101a657600080fd5b506101986101b5366004611025565b6104fe565b3480156101c657600080fd5b506101da6101d5366004610ff3565b61064d565b604051901515815260200161016f565b3480156101f657600080fd5b50610165610205366004610fd9565b610822565b34801561021657600080fd5b50610198610872565b34801561022b57600080fd5b5061016560055481565b34801561024157600080fd5b50610165600a5481565b34801561025757600080fd5b5061026b61026636600461106e565b6108ab565b6040516001600160a01b03909116815260200161016f565b34801561028f57600080fd5b5061016561029e366004610fd9565b60036020526000908152604090205481565b3480156102bc57600080fd5b50610165600b5481565b3480156102d257600080fd5b506102db6108b8565b60405161016f91906110c9565b3480156102f457600080fd5b506101da610303366004610fd9565b6108c4565b34801561031457600080fd5b5061016560065481565b34801561032a57600080fd5b50610165678ac7230489e8000081565b34801561034657600080fd5b506101da610355366004610fd9565b6108d8565b34801561036657600080fd5b50610396610375366004610fd9565b60046020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161016f565b6101986108e5565b3480156103c557600080fd5b5061016560085481565b3480156103db57600080fd5b5061016560075481565b3480156103f157600080fd5b5061026b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561042557600080fd5b5061019861043436600461106e565b610a10565b34801561044557600080fd5b5061016560095481565b600061045b6001610b50565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104b15760405162461bcd60e51b81526004016104a890611116565b60405180910390fd5b6009839055600a829055600b81905560408051848152602081018490527f7d38de579bb682aa05ace7e32d15f88df69a3a53f6f89fcd0236f93fcc7e6362910160405180910390a1505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105465760405162461bcd60e51b81526004016104a890611116565b61054e610b5a565b6001600160a01b0382166000908152600460205260409020805480156105775761057784610bb4565b600b5483101561058657600092505b600083118015610594575080155b156105aa576105a4600185610cfd565b506105ca565b821580156105b85750600081115b156105ca576105c8600185610d19565b505b82811461063d5782816005546105e0919061118d565b6105ea9190611136565b6005558282556105f983610d2e565b60018301556040518381526001600160a01b038516907f465bc1e774b3c331b04932a22f9781dbb864defe943d70548ba9b8af6c528b5c9060200160405180910390a25b50506106496001600055565b5050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106975760405162461bcd60e51b81526004016104a890611116565b61069f610b5a565b6001600160a01b038316156107b4576040516370a0823160e01b81523060048201526001600160a01b0384169063a9059cbb90849083906370a082319060240160206040518083038186803b1580156106f757600080fd5b505afa15801561070b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072f9190611086565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561077557600080fd5b505af1158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061104e565b9050610812565b6000826001600160a01b03164760405160006040518083038185875af1925050503d8060008114610801576040519150601f19603f3d011682016040523d82523d6000602084013e610806565b606091505b50909250610812915050565b61081c6001600055565b92915050565b6001600160a01b03811660009081526004602052604081208054829061084790610d2e565b600183015490915080821161085d576000610867565b610867818361118d565b93505050505b919050565b61087a610b5a565b610891336009544261088c919061118d565b610d51565b1561089f5761089f33610bb4565b6108a96001600055565b565b600061081c600183610d87565b606061045b6001610d93565b600061081c826009544261088c919061118d565b600061081c600183610da0565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461092d5760405162461bcd60e51b81526004016104a890611116565b610935610b5a565b6000600554116109875760405162461bcd60e51b815260206004820152601760248201527f4e6f2073686172657320746f206469737472696275746500000000000000000060448201526064016104a8565b34600660008282546109999190611136565b90915550506005546109b3678ac7230489e800003461116e565b6109bd919061114e565b600860008282546109ce9190611136565b90915550506040513481527f6a464fbfd2428ef7edab93930e64042148498d37c64c5122c4ab37843d6a3d119060200160405180910390a16108a96001600055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a585760405162461bcd60e51b81526004016104a890611116565b610a60610b5a565b60008111610aa25760405162461bcd60e51b815260206004820152600f60248201526e0476173206d757374206265203e203608c1b60448201526064016104a8565b6000610aae6001610b50565b905080610abb5750610b43565b600c54600954600091908290610ad1904261118d565b905060005a90505b8584108015610ae757508483105b15610b29576000610af9600185610d87565b9050610b058184610d51565b15610b1357610b1381610bb4565b6001909301925a8203850194505a915050610ad9565b84831015610b375782610b3a565b60005b600c5550505050505b610b4d6001600055565b50565b600061081c825490565b60026000541415610bad5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104a8565b6002600055565b6001600160a01b038116600090815260046020526040812090610bd683610822565b905080610be4575050610b4d565b8060076000828254610bf69190611136565b9250508190555080826002016000828254610c119190611136565b90915550508154610c2190610d2e565b60018301556001600160a01b0383166000818152600360205260408082204290555190919083908381818185875af1925050503d8060008114610c80576040519150601f19603f3d011682016040523d82523d6000602084013e610c85565b606091505b5050905080610cf7578160076000828254610ca0919061118d565b9250508190555081836002016000828254610cbb919061118d565b90915550508254610ccb90610d2e565b6001840155600954610cdd904261118d565b6001600160a01b0385166000908152600360205260409020555b50505050565b6000610d12836001600160a01b038416610dc2565b9392505050565b6000610d12836001600160a01b038416610e11565b6000678ac7230489e8000060085483610d47919061116e565b61081c919061114e565b6001600160a01b03821660009081526003602052604081205482118015610d125750600a54610d7f84610822565b119392505050565b6000610d128383610f2e565b60606000610d1283610f66565b6001600160a01b03811660009081526001830160205260408120541515610d12565b6000818152600183016020526040812054610e095750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561081c565b50600061081c565b60008181526001830160205260408120548015610f24576000610e3560018361118d565b8554909150600090610e499060019061118d565b9050818114610eca576000866000018281548110610e7757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110610ea857634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ee957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061081c565b600091505061081c565b6000826000018281548110610f5357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b606081600001805480602002602001604051908101604052809291908181526020018280548015610fb657602002820191906000526020600020905b815481526020019060010190808311610fa2575b50505050509050919050565b80356001600160a01b038116811461086d57600080fd5b600060208284031215610fea578081fd5b610d1282610fc2565b60008060408385031215611005578081fd5b61100e83610fc2565b915061101c60208401610fc2565b90509250929050565b60008060408385031215611037578182fd5b61104083610fc2565b946020939093013593505050565b60006020828403121561105f578081fd5b81518015158114610d12578182fd5b60006020828403121561107f578081fd5b5035919050565b600060208284031215611097578081fd5b5051919050565b6000806000606084860312156110b2578081fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b8181101561110a5783516001600160a01b0316835292840192918401916001016110e5565b50909695505050505050565b60208082526006908201526510aa37b5b2b760d11b604082015260600190565b60008219821115611149576111496111a4565b500190565b60008261116957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611188576111886111a4565b500290565b60008282101561119f5761119f6111a4565b500390565b634e487b7160e01b600052601160045260246000fdfea26469706673582212201926b2fb1148fc958da5518978c5ed949f5f415735a8a126a0607db800b8ddf064736f6c63430008020033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d90000000000000000000000005737b501a0ec2c5fc95dd02b80049c4f6b615b31000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c413192000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c413192000000000000000000000000c6f3a1542c93f115579f245cc4bc3f5a7be9ffeb

Deployed ByteCode

0x6080604052600436106104355760003560e01c80635342acb411610229578063bfe109281161012e578063e8e33700116100b6578063f53d0a8e1161007a578063f53d0a8e14610d09578063f708a64f14610d29578063fb235f3414610d49578063fce589d814610d69578063fe3f52f414610d7f5761043c565b8063e8e3370014610c70578063ecefc70514610cab578063f005f2ca14610cc1578063f2fde38b14610cd6578063f305d71914610cf65761043c565b8063d4698016116100fd578063d469801614610bd0578063dd62ed3e14610bf0578063df8408fe14610c10578063e0edd58614610c30578063e6a4390514610c505761043c565b8063bfe1092814610b47578063c648a3a214610b7b578063c9c6539614610b9b578063d0f5640814610bbb5761043c565b806386608326116101b15780639a7a23d6116101805780639a7a23d614610aa7578063a457c2d714610ac7578063a9059cbb14610ae7578063aec9b6f414610b07578063baa2abde14610b275761043c565b80638660832614610a3d5780638da5cb5b14610a5e57806395d89b4114610a7c57806398118cb414610a915761043c565b80636f9c870e116101f85780636f9c870e1461099957806370a08231146109b9578063715018a6146109d95780637d459db3146109ee57806383ad799414610a275761043c565b80635342acb41461091d578063542aa2291461094d578063607b50191461096257806360e71962146109835761043c565b806323b872dd1161033a57806337bfc1ef116102c25780634035542c116102865780634035542c1461086c5780634355855a1461088d57806344478425146108bd5780634549b039146108dd57806350e70d48146108fd5761043c565b806337bfc1ef146107d657806339509351146107ec5780633ae7303b1461080c5780633bd5d1731461082c5780633feb0c3e1461084c5761043c565b8063296f0a0c11610309578063296f0a0c1461074e5780632d8381191461076e5780632ff399f71461078e578063313ce567146107a457806336e4ec64146107c05761043c565b806323b872dd146106be578063244ce7db146106de578063255fe847146106fe57806327334a081461072e5761043c565b80630a2d140c116103bd5780630fc59bae1161038c5780630fc59bae1461063657806310622ee81461064b57806318160ddd1461066057806319530f761461067e57806319f2d79d1461069e5761043c565b80630a2d140c146105925780630aef023f146105b25780630ca61cb1146105e25780630f4101e0146106025761043c565b806303fd2a451161040457806303fd2a45146104d257806304a66b481461050057806305f82a451461052057806306fdde0314610540578063095ea7b3146105625761043c565b8063018763ed1461044157806302373b831461046557806302751cec1461048757806302ee6bf4146104bc5761043c565b3661043c57005b600080fd5b34801561044d57600080fd5b50600c545b6040519081526020015b60405180910390f35b34801561047157600080fd5b5061048561048036600461592c565b610d9f565b005b34801561049357600080fd5b506104a76104a236600461585a565b610e0f565b6040805192835260208301919091520161045c565b3480156104c857600080fd5b5061045260145481565b3480156104de57600080fd5b506104e861dead81565b6040516001600160a01b03909116815260200161045c565b34801561050c57600080fd5b5061048561051b366004615a9e565b6111fd565b34801561052c57600080fd5b5061048561053b366004615666565b611367565b34801561054c57600080fd5b506105556115bb565b60405161045c9190615b50565b34801561056e57600080fd5b5061058261057d36600461582f565b61164d565b604051901515815260200161045c565b34801561059e57600080fd5b506104856105ad36600461592c565b611667565b3480156105be57600080fd5b506105826105cd366004615666565b601f6020526000908152604090205460ff1681565b3480156105ee57600080fd5b506104856105fd366004615a46565b61168d565b34801561060e57600080fd5b506104e87f000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c41319281565b34801561064257600080fd5b5061048561176b565b34801561065757600080fd5b5061048561183f565b34801561066c57600080fd5b50676765c793fa10079d601b1b610452565b34801561068a57600080fd5b506104856106993660046158b7565b61189a565b3480156106aa57600080fd5b506104856106b9366004615666565b611bec565b3480156106ca57600080fd5b506105826106d93660046156d6565b611f70565b3480156106ea57600080fd5b506104856106f93660046159ae565b611f96565b34801561070a57600080fd5b50610582610719366004615666565b601e6020526000908152604090205460ff1681565b34801561073a57600080fd5b50610485610749366004615666565b611fec565b34801561075a57600080fd5b50610485610769366004615666565b612046565b34801561077a57600080fd5b506104526107893660046159ae565b612134565b34801561079a57600080fd5b5061045260115481565b3480156107b057600080fd5b506040516012815260200161045c565b3480156107cc57600080fd5b50610452600f5481565b3480156107e257600080fd5b5061045260125481565b3480156107f857600080fd5b5061058261080736600461582f565b6121ba565b34801561081857600080fd5b50610582610827366004615964565b6121dc565b34801561083857600080fd5b506104856108473660046159ae565b6123eb565b34801561085857600080fd5b50610485610867366004615802565b612554565b34801561087857600080fd5b50601a5461058290600160b81b900460ff1681565b34801561089957600080fd5b506105826108a8366004615666565b601c6020526000908152604090205460ff1681565b3480156108c957600080fd5b506016546104e8906001600160a01b031681565b3480156108e957600080fd5b506104526108f83660046159de565b6125e4565b34801561090957600080fd5b50601a546104e8906001600160a01b031681565b34801561092957600080fd5b50610582610938366004615666565b601d6020526000908152604090205460ff1681565b34801561095957600080fd5b50610452612676565b34801561096e57600080fd5b50601a5461058290600160b01b900460ff1681565b34801561098f57600080fd5b5061045260155481565b3480156109a557600080fd5b506104e86109b4366004615666565b612685565b3480156109c557600080fd5b506104526109d4366004615666565b612822565b3480156109e557600080fd5b50610485612884565b3480156109fa57600080fd5b50610582610a09366004615666565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610a3357600080fd5b5061045260105481565b348015610a4957600080fd5b50601a5461058290600160a81b900460ff1681565b348015610a6a57600080fd5b506005546001600160a01b03166104e8565b348015610a8857600080fd5b50610555612896565b348015610a9d57600080fd5b50610452600e5481565b348015610ab357600080fd5b50610485610ac2366004615802565b6128a5565b348015610ad357600080fd5b50610582610ae236600461582f565b61297c565b348015610af357600080fd5b50610582610b0236600461582f565b612a02565b348015610b1357600080fd5b506018546104e8906001600160a01b031681565b348015610b3357600080fd5b506104a7610b42366004615716565b612a10565b348015610b5357600080fd5b506104e87f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b181565b348015610b8757600080fd5b50610485610b96366004615666565b612e1a565b348015610ba757600080fd5b506104e8610bb636600461569e565b612eba565b348015610bc757600080fd5b506104856131ea565b348015610bdc57600080fd5b506017546104e8906001600160a01b031681565b348015610bfc57600080fd5b50610452610c0b36600461569e565b61329e565b348015610c1c57600080fd5b50610485610c2b366004615802565b6132c9565b348015610c3c57600080fd5b50610485610c4b366004615a02565b6133e8565b348015610c5c57600080fd5b506104e8610c6b36600461569e565b613558565b348015610c7c57600080fd5b50610c90610c8b366004615787565b61364c565b6040805193845260208401929092529082015260600161045c565b348015610cb757600080fd5b5061045261271081565b348015610ccd57600080fd5b50610452613d0f565b348015610ce257600080fd5b50610485610cf1366004615666565b613d58565b610c90610d0436600461585a565b613dce565b348015610d1557600080fd5b50601b546104e8906001600160a01b031681565b348015610d3557600080fd5b50610485610d44366004615802565b61423a565b348015610d5557600080fd5b50610485610d64366004615666565b61433d565b348015610d7557600080fd5b50610452600d5481565b348015610d8b57600080fd5b506019546104e8906001600160a01b031681565b610da761442b565b6005546001600160a01b0316331480610dca5750601b546001600160a01b031633145b610def5760405162461bcd60e51b8152600401610de690615ba3565b60405180910390fd5b601a805460ff60b81b1916600160b81b8315150217905560016006555b50565b601a546000908190600160b81b900460ff1680610e545750336001600160a01b037f000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c41319216145b610e705760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b0388166000908152601f602052604090205460ff16610ea85760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff1615610ed25760405162461bcd60e51b8152600401610de690615c9a565b6000610ee189610c6b8b612685565b90506001600160a01b038116610f095760405162461bcd60e51b8152600401610de690615c49565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610f3990339030908d90600401615ad8565b602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b9190615948565b610fd75760405162461bcd60e51b815260206004820152601f60248201527f4661696c7572653a206c6971756964697479207472616e7366657246726f6d006044820152606401610de6565b60405163095ea7b360e01b81526001600160a01b0382169063095ea7b390611005908c908c90600401615afc565b602060405180830381600087803b15801561101f57600080fd5b505af1158015611033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110579190615948565b6110a35760405162461bcd60e51b815260206004820152601a60248201527f4661696c7572653a206c697175696469747920617070726f76650000000000006044820152606401610de6565b601a805460ff60a01b1916600160a01b179055604051629d473b60e21b81526001600160a01b038a16906302751cec906110eb9030908c908c908c908c908c90600401615b15565b6040805180830381600087803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113c9190615a23565b601a805460ff60a01b191690556001600160a01b0387166000908152601c6020526040902054919450925060ff166111f1577f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03166314b6ca96866111a788612822565b6040518363ffffffff1660e01b81526004016111c4929190615afc565b600060405180830381600087803b1580156111de57600080fd5b505af19250505080156111ef575060015b505b50965096945050505050565b611205614485565b61120d61442b565b601a54600160b01b900460ff16156112755760405162461bcd60e51b815260206004820152602560248201527f466565206368616e67652064697361626c6564207065726d656e616e746c79206044820152643330b3379760d91b6064820152608401610de6565b8082846112828789615d6c565b61128c9190615d6c565b6112969190615d6c565b6112a09190615d6c565b60128190556103e810156112ee5760405162461bcd60e51b8152602060048201526015602482015274546f74616c2066656520657863656564732031302560581b6044820152606401610de6565b600d859055600e849055600f83905560108290556011819055604080518681526020810186905290810184905260608101839052608081018290527f96b67df2c4648b38ada47da86f80d0a256df93150752a7b365ca487cab934e649060a00160405180910390a16113606001600655565b5050505050565b61136f61442b565b6005546001600160a01b03163314806113925750601b546001600160a01b031633145b6113ae5760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b03811660009081526009602052604090205460ff166114165760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610de6565b60005b600a548110156115b057816001600160a01b0316600a828154811061144e57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141561159e57600a805461147990600190615dc3565b8154811061149757634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600a80546001600160a01b0390921691839081106114d157634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600882526040808220829055600990925220805460ff19169055600a80548061153757634e487b7160e01b600052603160045260246000fd5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556040519182526001600160a01b038416917f0b2cd0788922aac4a4720c91d0aa922d05be58153f67525c98ed1aad86bc86aa910160405180910390a26115b0565b806115a881615e15565b915050611419565b50610e0c6001600655565b6060600380546115ca90615dda565b80601f01602080910402602001604051908101604052809291908181526020018280546115f690615dda565b80156116435780601f1061161857610100808354040283529160200191611643565b820191906000526020600020905b81548152906001019060200180831161162657829003601f168201915b5050505050905090565b60003361165b8185856144df565b60019150505b92915050565b61166f614485565b601a8054911515600160a81b0260ff60a81b19909216919091179055565b61169561442b565b6005546001600160a01b03163314806116b85750601b546001600160a01b031633145b6116d45760405162461bcd60e51b8152600401610de690615ba3565b604051630ca61cb160e01b81526004810184905260248101839052604481018290527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b031690630ca61cb190606401600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b505050506117666001600655565b505050565b61177361442b565b6005546001600160a01b03163314806117965750601b546001600160a01b031633145b6117b25760405162461bcd60e51b8152600401610de690615ba3565b6015546040516001624d3b8760e01b0319815260048101919091527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03169063ffb2c47990602401600060405180830381600087803b15801561181b57600080fd5b505af115801561182f573d6000803e3d6000fd5b5050505061183d6001600655565b565b61184761442b565b6005546001600160a01b031633148061186a5750601b546001600160a01b031633145b6118865760405162461bcd60e51b8152600401610de690615ba3565b6118906000612e1a565b61183d6001600655565b6118a261442b565b6005546001600160a01b03163314806118c55750601b546001600160a01b031633145b6118e15760405162461bcd60e51b8152600401610de690615ba3565b6107d182106119495760405162461bcd60e51b815260206004820152602e60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526d323030302061646472657373657360901b6064820152608401610de6565b336119548383615da4565b61195d82612822565b10156119ab5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742073656e6465722062616c616e636500000000006044820152606401610de6565b60005b83811015611b3d576119f5828686848181106119da57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119ef9190615666565b85614603565b601c6000868684818110611a1957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611a2e9190615666565b6001600160a01b0316815260208101919091526040016000205460ff16611b35577f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03166314b6ca96868684818110611a9e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ab39190615666565b611aeb888886818110611ad657634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109d49190615666565b6040518363ffffffff1660e01b8152600401611b08929190615afc565b600060405180830381600087803b158015611b2257600080fd5b505af1925050508015611b33575060015b505b6001016119ae565b506001600160a01b0381166000908152601c602052604090205460ff16611be1577f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03166314b6ca9682611b9784612822565b6040518363ffffffff1660e01b8152600401611bb4929190615afc565b600060405180830381600087803b158015611bce57600080fd5b505af1925050508015611bdf575060015b505b506117666001600655565b611bf461442b565b6005546001600160a01b0316331480611c175750601b546001600160a01b031633145b611c335760405162461bcd60e51b8152600401610de690615ba3565b601880546019546001600160a01b038481166001600160a01b03198416179093559082169116611c6283612685565b601a60006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000836001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611cc357600080fd5b505afa158015611cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfb9190615682565b601a5460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a439059060440160206040518083038186803b158015611d4557600080fd5b505afa158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190615682565b90506001600160a01b038116611dcc5760405162461bcd60e51b815260206004820152601460248201527314185a5c8818dc99585d1a5bdb8819985a5b195960621b6044820152606401610de6565b601980546001600160a01b0319166001600160a01b0383169081179091556000908152601e60205260409020805460ff19166001179055611e0c8161479a565b6001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b1909216916314b6ca9691611e7691859190600401615afc565b600060405180830381600087803b158015611e9057600080fd5b505af1925050508015611ea1575060015b50604080516001600160a01b038086168252861660208201527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a1604051600081526001600160a01b038316907fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e909060200160405180910390a2604051600181526001600160a01b038216907fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e909060200160405180910390a2505050610e0c6001600655565b600033611f7e8582856148f7565b611f89858585614971565b60019150505b9392505050565b611f9e61442b565b6005546001600160a01b0316331480611fc15750601b546001600160a01b031633145b611fdd5760405162461bcd60e51b8152600401610de690615ba3565b6015819055610e0c6001600655565b611ff461442b565b6005546001600160a01b03163314806120175750601b546001600160a01b031633145b6120335760405162461bcd60e51b8152600401610de690615ba3565b61203c8161479a565b610e0c6001600655565b61204e61442b565b6017546001600160a01b031633148061207157506005546001600160a01b031633145b806120865750601b546001600160a01b031633145b6120a25760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0381166120c85760405162461bcd60e51b8152600401610de690615c74565b601754604080516001600160a01b03928316815291831660208301527f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e910160405180910390a1601780546001600160a01b0319166001600160a01b0383161790556001600655610e0c565b6000600b5482111561219b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610de6565b60006121a5615174565b90506121b18184615d84565b9150505b919050565b60003361165b8185856121cd838361329e565b6121d79190615d6c565b6144df565b60006121e661442b565b6005546001600160a01b03163314806122095750601b546001600160a01b031633145b6122255760405162461bcd60e51b8152600401610de690615ba3565b83156122d657604051630ffcdb7960e11b81526001600160a01b03848116600483015283811660248301527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b11690631ff9b6f2906044015b602060405180830381600087803b15801561229757600080fd5b505af11580156122ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cf9190615948565b90506123e1565b6001600160a01b03831615612383576040516370a0823160e01b81523060048201526001600160a01b0384169063a9059cbb90849083906370a082319060240160206040518083038186803b15801561232e57600080fd5b505afa158015612342573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236691906159c6565b6040518363ffffffff1660e01b815260040161227d929190615afc565b6000826001600160a01b03164760405160006040518083038185875af1925050503d80600081146123d0576040519150601f19603f3d011682016040523d82523d6000602084013e6123d5565b606091505b509092506123e1915050565b611f8f6001600655565b6123f361442b565b601a543390600160b81b900460ff168061243e57507f000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c4131926001600160a01b0316816001600160a01b0316145b61245a5760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b03811660009081526009602052604090205460ff16156124d85760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610de6565b60006124e383615197565b5050506001600160a01b03831660009081526007602052604090205490915061250d908290615dc3565b6001600160a01b038316600090815260076020526040902055600b54612534908290615dc3565b600b55600c54612545908490615d6c565b600c5550506001600655610e0c565b6005546001600160a01b03163314806125775750601b546001600160a01b031633145b6125935760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0382166125b95760405162461bcd60e51b8152600401610de690615c74565b6001600160a01b03919091166000908152601f60205260409020805460ff1916911515919091179055565b6000676765c793fa10079d601b1b8311156126415760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610de6565b8161265e57600061265184615197565b5091935061166192505050565b600061266984615197565b5090935061166192505050565b6000612680615174565b905090565b6000816001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126c057600080fd5b505afa9250505080156126f0575060408051601f3d908101601f191682019092526126ed91810190615682565b60015b6126f957612700565b90506121b5565b816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561273957600080fd5b505afa925050508015612769575060408051601f3d908101601f1916820190925261276691810190615682565b60015b6126f957816001600160a01b0316638dd950026040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a657600080fd5b505afa9250505080156127d6575060408051601f3d908101601f191682019092526127d391810190615682565b60015b6126f95760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f20676574207772617070656420746f6b656e00000000006044820152606401610de6565b6001600160a01b03811660009081526009602052604081205460ff161561286257506001600160a01b0381166000908152600860205260409020546121b5565b6001600160a01b03821660009081526007602052604090205461166190612134565b61288c614485565b61183d6000615200565b6060600480546115ca90615dda565b6128ad61442b565b601b546001600160a01b03163314806128d057506005546001600160a01b031633145b6128ec5760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0382166129125760405162461bcd60e51b8152600401610de690615c74565b6001600160a01b0382166000818152601e6020908152604091829020805460ff191685151590811790915591519182527fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e9091015b60405180910390a26129786001600655565b5050565b6000338161298a828661329e565b9050838110156129ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610de6565b6129f782868684036144df565b506001949350505050565b60003361165b818585614971565b601a546000908190600160b81b900460ff1680612a555750336001600160a01b037f000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c41319216145b612a715760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b0389166000908152601f602052604090205460ff16612aa95760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff1615612ad35760405162461bcd60e51b8152600401610de690615c9a565b6000612adf8a8a613558565b90506001600160a01b038116612b075760405162461bcd60e51b8152600401610de690615c49565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90612b3790339030908d90600401615ad8565b602060405180830381600087803b158015612b5157600080fd5b505af1158015612b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b899190615948565b612bd55760405162461bcd60e51b815260206004820152601f60248201527f4661696c7572653a206c6971756964697479207472616e7366657246726f6d006044820152606401610de6565b60405163095ea7b360e01b81526001600160a01b0382169063095ea7b390612c03908d908c90600401615afc565b602060405180830381600087803b158015612c1d57600080fd5b505af1158015612c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c559190615948565b612ca15760405162461bcd60e51b815260206004820152601a60248201527f4661696c7572653a206c697175696469747920617070726f76650000000000006044820152606401610de6565b601a805460ff60a01b1916600160a01b179055604051635d5155ef60e11b81523060048201526001600160a01b038a81166024830152604482018a9052606482018990526084820188905286811660a483015260c482018690528b169063baa2abde9060e4016040805180830381600087803b158015612d2057600080fd5b505af1158015612d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d589190615a23565b601a805460ff60a01b191690556001600160a01b0387166000908152601c6020526040902054919450925060ff16612e0d577f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03166314b6ca9686612dc388612822565b6040518363ffffffff1660e01b8152600401612de0929190615afc565b600060405180830381600087803b158015612dfa57600080fd5b505af1925050508015612e0b575060015b505b5097509795505050505050565b612e2261442b565b6005546001600160a01b0316331480612e455750601b546001600160a01b031633145b612e615760405162461bcd60e51b8152600401610de690615ba3565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f399b55200f7f639a63d76efe3dcfa9156ce367058d6b673041b84a628885f5a790600090a350610e0c6001600655565b601a54600090600160b81b900460ff1680612efd5750336001600160a01b037f000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c41319216145b612f195760405162461bcd60e51b8152600401610de690615cc5565b601a54600160a01b900460ff1615612f435760405162461bcd60e51b8152600401610de690615c9a565b6001600160a01b0383166000908152601f602052604090205460ff16612f7b5760405162461bcd60e51b8152600401610de690615c19565b826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612fb457600080fd5b505afa158015612fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fec9190615682565b6040516364e329cb60e11b81523060048201526001600160a01b038481166024830152919091169063c9c6539690604401602060405180830381600087803b15801561303757600080fd5b505af115801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190615682565b90506001600160a01b0381166130bf5760405162461bcd60e51b815260206004820152601560248201527414185a5c8818dc9958585d1a5bdb8819985a5b1959605a1b6044820152606401610de6565b6001600160a01b0381166000908152601e602052604090205460ff16613103576001600160a01b0381166000908152601e60205260409020805460ff191660011790555b6001600160a01b03811660009081526009602052604090205460ff1661312c5761312c8161479a565b6001600160a01b0381166000908152601c602052604090205460ff16611661576001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b1909216916314b6ca96916131b691859190600401615afc565b600060405180830381600087803b1580156131d057600080fd5b505af19250505080156131e1575060015b61166157611661565b6131f261442b565b601a54600160b01b900460ff16156132425760405162461bcd60e51b81526020600482015260136024820152721199594818da185b99d948191a5cd8589b1959606a1b6044820152606401610de6565b601b546001600160a01b031633148061326557506005546001600160a01b031633145b6132815760405162461bcd60e51b8152600401610de690615ba3565b601a805460ff60b01b1916600160b01b17905561183d6001600655565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6132d161442b565b6001600160a01b0382166000908152601d602052604090205460ff16151581151514156133515760405162461bcd60e51b815260206004820152602860248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015267277374617475732760c01b6064820152608401610de6565b601b546001600160a01b031633148061337457506005546001600160a01b031633145b6133905760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b9101612966565b6133f061442b565b601b546001600160a01b031633148061341357506005546001600160a01b031633145b61342f5760405162461bcd60e51b8152600401610de690615ba3565b676765c793fa10079d601b1b82111561349a5760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b6064820152608401610de6565b6509184e72a0008210156135025760405162461bcd60e51b815260206004820152602960248201527f4d696e696d756d2060302e30303030316020746f6b656e207065722073776170604482015268081c995c5d5a5c995960ba1b6064820152608401610de6565b600081116135445760405162461bcd60e51b815260206004820152600f60248201526e2d32b9379036bab63a34b83634b2b960891b6044820152606401610de6565b601382905560148190556129786001600655565b6000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561359357600080fd5b505afa1580156135a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cb9190615682565b60405163e6a4390560e01b81523060048201526001600160a01b038481166024830152919091169063e6a439059060440160206040518083038186803b15801561361457600080fd5b505afa158015613628573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8f9190615682565b6000806000601a60179054906101000a900460ff16806136945750336001600160a01b037f000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c41319216145b6136b05760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b038b166000908152601f602052604090205460ff166136e85760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff16156137125760405162461bcd60e51b8152600401610de690615c9a565b306000908152601d602052604090205460ff166137415760405162461bcd60e51b8152600401610de690615bc9565b6040516323b872dd60e01b815230906323b872dd9061376890339084908e90600401615ad8565b602060405180830381600087803b15801561378257600080fd5b505af1158015613796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ba9190615948565b6138065760405162461bcd60e51b815260206004820152601b60248201527f4661696c7572653a20746f6b656e207472616e7366657246726f6d00000000006044820152606401610de6565b6040516323b872dd60e01b81526001600160a01b038b16906323b872dd9061383690339030908d90600401615ad8565b602060405180830381600087803b15801561385057600080fd5b505af1158015613864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138889190615948565b6138d45760405162461bcd60e51b815260206004820181905260248201527f4661696c7572653a20746f6b656e4f74686572207472616e7366657246726f6d6044820152606401610de6565b886138de30612822565b101561392c5760405162461bcd60e51b815260206004820152601e60248201527f4661696c7572653a20746f6b656e207472616e73666572206661696c656400006044820152606401610de6565b6040516370a0823160e01b815230600482015288906001600160a01b038c16906370a082319060240160206040518083038186803b15801561396d57600080fd5b505afa158015613981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a591906159c6565b10156139ff5760405162461bcd60e51b815260206004820152602360248201527f4661696c7572653a20746f6b656e4f74686572207472616e73666572206661696044820152621b195960ea1b6064820152608401610de6565b60405163095ea7b360e01b81526001600160a01b038b169063095ea7b390613a2d908e908c90600401615afc565b602060405180830381600087803b158015613a4757600080fd5b505af1158015613a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a7f9190615948565b613acb5760405162461bcd60e51b815260206004820152601b60248201527f4661696c7572653a20746f6b656e4f7468657220617070726f766500000000006044820152606401610de6565b613ad6308c8b6144df565b6000613ae28c8c613558565b90506001600160a01b038116613b0a5760405162461bcd60e51b8152600401610de690615c49565b6001600160a01b0381166000908152601e602052604090205460ff16613b4e576001600160a01b0381166000908152601e60205260409020805460ff191660011790555b6001600160a01b03811660009081526009602052604090205460ff16613b7757613b778161479a565b6001600160a01b0381166000908152601c602052604090205460ff16613c2e576001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b1909216916314b6ca9691613c0191859190600401615afc565b600060405180830381600087803b158015613c1b57600080fd5b505af1925050508015613c2c575060015b505b601a805460ff60a01b1916600160a01b17905560405162e8e33760e81b81523060048201526001600160a01b038c81166024830152604482018c9052606482018b9052608482018a905260a4820189905287811660c483015260e482018790528d169063e8e337009061010401606060405180830381600087803b158015613cb557600080fd5b505af1158015613cc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ced9190615a71565b601a805460ff60a01b19169055919e909d50909b509950505050505050505050565b601b546000906001600160a01b0316331480613d3557506005546001600160a01b031633145b613d515760405162461bcd60e51b8152600401610de690615ba3565b5060135490565b613d60614485565b6001600160a01b038116613dc55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610de6565b610e0c81615200565b6000806000601a60179054906101000a900460ff1680613e165750336001600160a01b037f000000000000000000000000f2322eab9f83ff2bd62c5dfb15eb72383c41319216145b613e325760405162461bcd60e51b8152600401610de690615cc5565b6001600160a01b0389166000908152601f602052604090205460ff16613e6a5760405162461bcd60e51b8152600401610de690615c19565b601a54600160a01b900460ff1615613e945760405162461bcd60e51b8152600401610de690615c9a565b306000908152601d602052604090205460ff16613ec35760405162461bcd60e51b8152600401610de690615bc9565b6040516323b872dd60e01b815230906323b872dd90613eea90339084908d90600401615ad8565b602060405180830381600087803b158015613f0457600080fd5b505af1158015613f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3c9190615948565b613f885760405162461bcd60e51b815260206004820152601b60248201527f4661696c7572653a20746f6b656e207472616e7366657246726f6d00000000006044820152606401610de6565b87613f9230612822565b1015613fd85760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610de6565b600034116140175760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2070617961626c6560a01b6044820152606401610de6565b614022308a8a6144df565b60006140318a610c6b8c612685565b90506001600160a01b0381166140595760405162461bcd60e51b8152600401610de690615c49565b6001600160a01b0381166000908152601e602052604090205460ff1661409d576001600160a01b0381166000908152601e60205260409020805460ff191660011790555b6001600160a01b03811660009081526009602052604090205460ff166140c6576140c68161479a565b6001600160a01b0381166000908152601c602052604090205460ff1661417d576001600160a01b038082166000908152601c6020526040808220805460ff1916600117905551630a5b654b60e11b81527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b1909216916314b6ca969161415091859190600401615afc565b600060405180830381600087803b15801561416a57600080fd5b505af192505050801561417b575060015b505b601a805460ff60a01b1916600160a01b17905560405163f305d71960e01b81526001600160a01b038b169063f305d7199034906141c89030908e908e908e908e908e90600401615b15565b6060604051808303818588803b1580156141e157600080fd5b505af11580156141f5573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061421a9190615a71565b601a805460ff60a01b19169055919c909b50909950975050505050505050565b61424261442b565b6005546001600160a01b03163314806142655750601b546001600160a01b031633145b6142815760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b038281166000908152601c60205260409020805460ff19168315151790557f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b1166314b6ca9683836142e1576142dc85612822565b6142e4565b60005b6040518363ffffffff1660e01b8152600401614301929190615afc565b600060405180830381600087803b15801561431b57600080fd5b505af115801561432f573d6000803e3d6000fd5b505050506129786001600655565b61434561442b565b6016546001600160a01b031633148061436857506005546001600160a01b031633145b8061437d5750601b546001600160a01b031633145b6143995760405162461bcd60e51b8152600401610de690615ba3565b6001600160a01b0381166143bf5760405162461bcd60e51b8152600401610de690615c74565b601654604080516001600160a01b03928316815291831660208301527f5ede98256e49a93a11ecfa040cd1fa6630eec48f364993adafecc4766b325f61910160405180910390a1601680546001600160a01b0319166001600160a01b0383161790556001600655610e0c565b6002600654141561447e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610de6565b6002600655565b6005546001600160a01b0316331461183d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610de6565b6001600160a01b0383166145415760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610de6565b6001600160a01b0382166145a25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610de6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061460d615174565b9050600061461b8284615da4565b6001600160a01b03861660009081526009602052604090205490915060ff161561467d576001600160a01b038516600090815260086020526040902054614663908490615dc3565b6001600160a01b0386166000908152600860205260409020555b6001600160a01b0385166000908152600760205260409020546146a1908290615dc3565b6001600160a01b0380871660009081526007602090815260408083209490945591871681526009909152205460ff1615614713576001600160a01b0384166000908152600860205260409020546146f9908490615d6c565b6001600160a01b0385166000908152600860205260409020555b6001600160a01b038416600090815260076020526040902054614737908290615d6c565b6001600160a01b0380861660008181526007602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061478b9087815260200190565b60405180910390a35050505050565b6001600160a01b03811660009081526009602052604090205460ff16156148035760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610de6565b6001600160a01b0381166000908152600760205260409020541561485d576001600160a01b03811660009081526007602052604090205461484390612134565b6001600160a01b0382166000908152600860205260409020555b6001600160a01b0381166000818152600960209081526040808320805460ff19166001908117909155600a8054808301825594527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890930180546001600160a01b03191685179055519182527f0b2cd0788922aac4a4720c91d0aa922d05be58153f67525c98ed1aad86bc86aa910160405180910390a250565b6000614903848461329e565b9050600019811461496b578181101561495e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610de6565b61496b84848484036144df565b50505050565b6001600160a01b0383166149d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610de6565b6001600160a01b038216614a375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610de6565b60008111614aa05760405162461bcd60e51b815260206004820152603060248201527f45524332303a205472616e7366657220616d6f756e74206d757374206265206760448201526f726561746572207468616e207a65726f60801b6064820152608401610de6565b80614aaa84612822565b1015614b075760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610de6565b601a54600160a01b900460ff1615614b2957614b24838383614603565b611766565b601354614b3530612822565b10158015614b4d5750601a54600160a01b900460ff16155b8015614b7157506001600160a01b0382166000908152601e602052604090205460ff165b15614e9557601a805460ff60a01b1916600160a01b179055601154600f54600e5460009291614b9f91615d6c565b614ba99190615d6c565b90506000600282600e54601354614bc09190615da4565b614bca9190615d84565b614bd49190615d84565b905061271060145414614bff5761271060145482614bf29190615da4565b614bfc9190615d84565b90505b600081601354614c0f9190615dc3565b90508015614e845747614c2182615252565b6000614c2d8247615dc3565b905060006002600e54614c409190615d84565b614c4a9087615dc3565b90506000600282600e5485614c5f9190615da4565b614c699190615d84565b614c739190615d84565b905060008260115485614c869190615da4565b614c909190615d84565b9050600083600f5486614ca39190615da4565b614cad9190615d84565b90508115614d24577f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015614d1057600080fd5b505af193505050508015614d22575060015b505b8015614d81576016546040516000916001600160a01b03169083908381818185875af1925050503d8060008114614d77576040519150601f19603f3d011682016040523d82523d6000602084013e614d7c565b606091505b505050505b600088118015614d915750600083115b15614e7d57601854614dae9030906001600160a01b03168a6144df565b60185460175460405163f305d71960e01b81526001600160a01b039283169263f305d719928792614dee9230928f92600092839216904290600401615b15565b6060604051808303818588803b158015614e0757600080fd5b505af1158015614e1b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190614e409190615a71565b505060408051858152602081018b90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050505050505b5050601a805460ff60a01b19169055505b6001600160a01b0383166000908152601d602052604090205460ff1680614ed457506001600160a01b0382166000908152601d602052604090205460ff165b15614ee957614ee4838383614603565b614f99565b6000806000806000614efa86615378565b945094509450945094506000818486614f139190615d6c565b614f1d9190615d6c565b90508515614f3257614f328961dead88614603565b8215614f4157614f418361542b565b8015614f5257614f52893083614603565b614f9289898486888a614f658d8f615dc3565b614f6f9190615dc3565b614f799190615dc3565b614f839190615dc3565b614f8d9190615dc3565b614603565b5050505050505b6001600160a01b0383166000908152601c602052604090205460ff1661503c577f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03166314b6ca9684614ff286612822565b6040518363ffffffff1660e01b815260040161500f929190615afc565b600060405180830381600087803b15801561502957600080fd5b505af192505050801561503a575060015b505b6001600160a01b0382166000908152601c602052604090205460ff166150df577f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03166314b6ca968361509585612822565b6040518363ffffffff1660e01b81526004016150b2929190615afc565b600060405180830381600087803b1580156150cc57600080fd5b505af19250505080156150dd575060015b505b601a54600160a81b900460ff1615611766576015546040516001624d3b8760e01b0319815260048101919091527f000000000000000000000000e8f6144da898b7896fa3a131c72fc5cb1e1530b16001600160a01b03169063ffb2c47990602401600060405180830381600087803b15801561515a57600080fd5b505af192505050801561516b575060015b61176657611766565b6000806000615181615467565b90925090506151908183615d84565b9250505090565b60008060008060006151a886615649565b905060006151b68288615dc3565b905060006151c2615174565b905060006151d0828a615da4565b905060006151de8385615da4565b905060006151ec8487615da4565b929b919a5091985092965091945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61525a61442b565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061529d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a548251911690829060019081106152dc57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260185461530291309116846144df565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac9479061533b908590600090869030904290600401615cfc565b600060405180830381600087803b15801561535557600080fd5b505af1158015615369573d6000803e3d6000fd5b5050505050610e0c6001600655565b600080600080600080612710600d54886153929190615da4565b61539c9190615d84565b90506000612710600e54896153b19190615da4565b6153bb9190615d84565b90506000612710600f548a6153d09190615da4565b6153da9190615d84565b905060006127106010548b6153ef9190615da4565b6153f99190615d84565b905060006127106011548c61540e9190615da4565b6154189190615d84565b949b939a50919850965091945092505050565b6000615435615174565b61543f9083615da4565b905080600b5461544f9190615dc3565b600b55600c54615460908390615d6c565b600c555050565b600b546000908190676765c793fa10079d601b1b825b600a54811015615604578260076000600a84815481106154ad57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061552657508160086000600a84815481106154ff57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561554657600b54676765c793fa10079d601b1b94509450505050615645565b60076000600a838154811061556b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205461559a9084615dc3565b925060086000600a83815481106155c157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546155f09083615dc3565b9150806155fc81615e15565b91505061547d565b50676765c793fa10079d601b1b600b5461561e9190615d84565b82101561563f57600b54676765c793fa10079d601b1b935093505050615645565b90925090505b9091565b60006127106010548361565c9190615da4565b6116619190615d84565b600060208284031215615677578081fd5b8135611f8f81615e46565b600060208284031215615693578081fd5b8151611f8f81615e46565b600080604083850312156156b0578081fd5b82356156bb81615e46565b915060208301356156cb81615e46565b809150509250929050565b6000806000606084860312156156ea578081fd5b83356156f581615e46565b9250602084013561570581615e46565b929592945050506040919091013590565b600080600080600080600060e0888a031215615730578283fd5b873561573b81615e46565b9650602088013561574b81615e46565b955060408801359450606088013593506080880135925060a088013561577081615e46565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b0312156157a3578081fd5b88356157ae81615e46565b975060208901356157be81615e46565b965060408901359550606089013594506080890135935060a0890135925060c08901356157ea81615e46565b8092505060e089013590509295985092959890939650565b60008060408385031215615814578182fd5b823561581f81615e46565b915060208301356156cb81615e5b565b60008060408385031215615841578182fd5b823561584c81615e46565b946020939093013593505050565b60008060008060008060c08789031215615872578182fd5b863561587d81615e46565b955060208701359450604087013593506060870135925060808701356158a281615e46565b8092505060a087013590509295509295509295565b6000806000604084860312156158cb578283fd5b833567ffffffffffffffff808211156158e2578485fd5b818601915086601f8301126158f5578485fd5b813581811115615903578586fd5b8760208083028501011115615916578586fd5b6020928301989097509590910135949350505050565b60006020828403121561593d578081fd5b8135611f8f81615e5b565b600060208284031215615959578081fd5b8151611f8f81615e5b565b600080600060608486031215615978578081fd5b833561598381615e5b565b9250602084013561599381615e46565b915060408401356159a381615e46565b809150509250925092565b6000602082840312156159bf578081fd5b5035919050565b6000602082840312156159d7578081fd5b5051919050565b600080604083850312156159f0578182fd5b8235915060208301356156cb81615e5b565b60008060408385031215615a14578182fd5b50508035926020909101359150565b60008060408385031215615a35578182fd5b505080516020909101519092909150565b600080600060608486031215615a5a578081fd5b505081359360208301359350604090920135919050565b600080600060608486031215615a85578081fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215615ab5578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602080835283518082850152825b81811015615b7c57858101830151858201604001528201615b60565b81811115615b8d5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b60208082526030908201527f546f6b656e20636f6e7472616374206d7573742062652077686974656c69737460408201526f65642066726f6d20616c6c206665657360801b606082015260800190565b602080825260169082015275149bdd5d195c881b9bdd081dda1a5d195b1a5cdd195960521b604082015260600190565b60208082526011908201527050616972206e6f6e206578697374696e6760781b604082015260600190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b602080825260119082015270496e7465726e616c207377617070696e6760781b604082015260600190565b6020808252601b908201527f55736572206c6971756964697479206164642064697361626c65640000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015615d4b5784516001600160a01b031683529383019391830191600101615d26565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115615d7f57615d7f615e30565b500190565b600082615d9f57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615dbe57615dbe615e30565b500290565b600082821015615dd557615dd5615e30565b500390565b600281046001821680615dee57607f821691505b60208210811415615e0f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e2957615e29615e30565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610e0c57600080fd5b8015158114610e0c57600080fdfea264697066735822122083484836e17c77c4b616a4732157bd5c0aa1e374d80d403ed888408af605e16e64736f6c63430008020033