ETH Price: $3,003.72 (+3.04%)
Gas: 1 Gwei

Contract

0x98Ce74340b37762A890cb6B519dae4c0D1e7E471
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Create ERC20193434532024-03-01 22:56:23126 days ago1709333783IN
0x98Ce7434...0D1e7E471
1.3 ETH0.3193631946.29314964
Update Time Conf...193309772024-02-29 5:05:35128 days ago1709183135IN
0x98Ce7434...0D1e7E471
0 ETH0.0018625956.02633097
Create ERC20193132882024-02-26 17:41:11130 days ago1708969271IN
0x98Ce7434...0D1e7E471
1.3 ETH0.3582776851.9124453
Create ERC20192595132024-02-19 4:48:47138 days ago1708318127IN
0x98Ce7434...0D1e7E471
1.8 ETH0.1301977918.87153273
Create ERC20192579082024-02-18 23:22:35138 days ago1708298555IN
0x98Ce7434...0D1e7E471
1.25 ETH0.1514788221.95666618
Create ERC20192366812024-02-15 23:44:23141 days ago1708040663IN
0x98Ce7434...0D1e7E471
1.3 ETH0.2139947630.92910515
Update Max Team ...192366752024-02-15 23:43:11141 days ago1708040591IN
0x98Ce7434...0D1e7E471
0 ETH0.0010045130.33695392
Update Max Team ...192364742024-02-15 23:02:35141 days ago1708038155IN
0x98Ce7434...0D1e7E471
0 ETH0.001169835.32861543
Update Max Team ...192363912024-02-15 22:45:23141 days ago1708037123IN
0x98Ce7434...0D1e7E471
0 ETH0.0013040939.38442368
Update Max Team ...192363222024-02-15 22:31:23141 days ago1708036283IN
0x98Ce7434...0D1e7E471
0 ETH0.0018075336.00665017
Whitelist UUID F...192363192024-02-15 22:30:47141 days ago1708036247IN
0x98Ce7434...0D1e7E471
0 ETH0.0017607835.07199887
Update Bank Mach...192351992024-02-15 18:44:23141 days ago1708022663IN
0x98Ce7434...0D1e7E471
0 ETH0.00254354.82030277
Update Min Pair ...192177692024-02-13 8:01:11144 days ago1707811271IN
0x98Ce7434...0D1e7E471
0 ETH0.0010385821.46508736
Update Min Pair ...192177282024-02-13 7:52:47144 days ago1707810767IN
0x98Ce7434...0D1e7E471
0 ETH0.0010059220.77450079
Update LP Locker192168842024-02-13 5:03:23144 days ago1707800603IN
0x98Ce7434...0D1e7E471
0 ETH0.0012850627.26226
0x60806040192165582024-02-13 3:57:59144 days ago1707796679IN
 Create: ERC20FactoryByBankPad
0 ETH0.1025909320.52256236

Latest 15 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
193434532024-03-01 22:56:23126 days ago1709333783
0x98Ce7434...0D1e7E471
0.2 ETH
193434532024-03-01 22:56:23126 days ago1709333783
0x98Ce7434...0D1e7E471
0.1 ETH
193434532024-03-01 22:56:23126 days ago1709333783
0x98Ce7434...0D1e7E471
1 ETH
193132882024-02-26 17:41:11130 days ago1708969271
0x98Ce7434...0D1e7E471
0.2 ETH
193132882024-02-26 17:41:11130 days ago1708969271
0x98Ce7434...0D1e7E471
0.1 ETH
193132882024-02-26 17:41:11130 days ago1708969271
0x98Ce7434...0D1e7E471
1 ETH
192595132024-02-19 4:48:47138 days ago1708318127
0x98Ce7434...0D1e7E471
0.2 ETH
192595132024-02-19 4:48:47138 days ago1708318127
0x98Ce7434...0D1e7E471
0.1 ETH
192595132024-02-19 4:48:47138 days ago1708318127
0x98Ce7434...0D1e7E471
1.5 ETH
192579082024-02-18 23:22:35138 days ago1708298555
0x98Ce7434...0D1e7E471
0.15 ETH
192579082024-02-18 23:22:35138 days ago1708298555
0x98Ce7434...0D1e7E471
0.1 ETH
192579082024-02-18 23:22:35138 days ago1708298555
0x98Ce7434...0D1e7E471
1 ETH
192366812024-02-15 23:44:23141 days ago1708040663
0x98Ce7434...0D1e7E471
0.2 ETH
192366812024-02-15 23:44:23141 days ago1708040663
0x98Ce7434...0D1e7E471
0.1 ETH
192366812024-02-15 23:44:23141 days ago1708040663
0x98Ce7434...0D1e7E471
1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20FactoryByBankPad

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : ERC20FactoryByBankPad.sol
// Sources flattened with hardhat v2.19.1 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/[email protected]

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


// File @openzeppelin/contracts/access/[email protected]

// 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/security/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// 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/utils/[email protected]

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]

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

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
     * Revert on invalid signature.
     */
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}


// File contracts/interfaces/IBase.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.4;

interface IBase {
    /// - antiBotParam
    /// 1. holdLimit
    /// 2. txLimit
    /// 3. antiDumpLimit
    /// 4. antiSniperOn
    ///
    /// - taxParam
    /// 1. dexRouter: uniswap or sushiswap
    /// 2. pairedToken: eth or usdc
    /// 3. taxPayAccount
    /// 4. treasuryAccount
    /// 5. buyTax
    /// 6. sellTax
    /// 7. treasuryTax
    ///
    /// - distribParam
    /// 1. totalSupply
    /// 2. teamAccount
    /// 3. teamAllocPercent
    ///
    /// - lpParam
    /// 1. isLPBurn
    /// 2. isTradingDelayed
    /// 3. isTradingDisabled
    /// 4. pairedTokenAmount
    /// 5. lockPeriod
    struct TokenLaunchConf {
        string uuid;
        string name;
        string symbol;
        bytes distribParam;
        bytes antiBotParam;
        bytes taxParam;
        bytes lpParam;
    }

    // Configuration inherited from the factory contract
    struct InheritedConf {
        uint16 autoBurnFirstPercent;
        uint16 autoBurnSecondPercent;
        uint16 autoBurnThirdPercent;
        uint16 maxBuyTaxAfter;
        uint16 maxSellTaxAfter;
        uint16 maxTreasuryTaxAfter;
        uint16 bankPadTax;
        uint16 maxTaxToRenounce;
        uint32 bankPadTaxApplyPeriod;
        uint32 taxWhitelistApplyDelay;
        uint32 tradingDelayTime;
        uint32 tradingDisableTime;
    }
}


// File contracts/interfaces/IERC20ByBankPad.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.4;

interface IERC20ByBankPad {
    /**
     * @notice function {preLaunch}
     *
     * Configure token contract with the factory configuration
     *
     * @param param configuration structure from the factory
     */
    function preLaunch(IBase.InheritedConf calldata param) external;

    /// @notice Launch the token contract
    /// @dev Token is launched from this moment, and users can start trading
    /// @param tradingDelayed Once this flag is set, trading is delayed for 1 min
    /// @param tradingDisabled Once this flag is set, trading is disabled until it is set or 4 days
    function launch(bool tradingDelayed, bool tradingDisabled) external;

    /// @notice View amm related configuration addresses
    /// @return address dex router address
    /// @return address base paired token address
    /// @return address base pair address from the dex router
    function ammAddresses() external view returns (address, address, address);

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) external;

    /**
     * @dev BankPad UUID Hash
     */
    function bankUUIDHash() external view returns (bytes32);

    /**
     * @notice Check if the anti-dump feature is enabled in the token
     */
    function isAntiDumpEnabled() external view returns (bool);
}


// File contracts/interfaces/IERC20MachineByBankPad.sol

pragma solidity ^0.8.0;

// Original license: SPDX_License_Identifier: MIT

/**
 * @dev BankPad ERC-20 contract deployer
 *
 *
 * Lightweight deployment module for use with template contracts
 */
interface IERC20MachineByBankPad {
    /**
     * @notice function {deploy}
     *
     * Deploy a fresh instance
     */
    function deploy(
        bytes32 bankIdHash_,
        bytes32 salt_,
        bytes memory args_
    ) external payable returns (address erc20ContractAddress_);
}


// File contracts/interfaces/IDexRouter.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.4;

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

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

    function WETH() external pure returns (address);

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

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

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

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

    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 getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

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


// File contracts/interfaces/IUniLocker.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.4;

interface IERCBurn {
    function burn(uint256 _amount) external;

    function approve(address spender, uint256 amount) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external returns (uint256);

    function balanceOf(address account) external view returns (uint256);
}

interface IUniLocker {
    struct FeeStruct {
        uint256 ethFee; // Small eth fee to prevent spam on the platform
        IERCBurn secondaryFeeToken; // UNCX or UNCL
        uint256 secondaryTokenFee; // optional, UNCX or UNCL
        uint256 secondaryTokenDiscount; // discount on liquidity fee for burning secondaryToken
        uint256 liquidityFee; // fee on univ2 liquidity tokens
        uint256 referralPercent; // fee for referrals
        IERCBurn referralToken; // token the refferer must hold to qualify as a referrer
        uint256 referralHold; // balance the referrer must hold to qualify as a referrer
        uint256 referralDiscount; // discount on flatrate fees for using a valid referral address
    }

    function gFees() external view returns (FeeStruct memory);

    function lockLPToken(
        address _lpToken,
        uint256 _amount,
        uint256 _unlock_date,
        address payable _referral,
        bool _fee_in_eth,
        address payable _withdrawer
    ) external payable;
}


// File contracts/launchpad/ERC20FactoryByBankPadBase.sol

pragma solidity ^0.8.0;

// Original license: SPDX_License_Identifier: MIT


contract ERC20FactoryByBankPadBase is Ownable {
    using Address for address payable;

    uint16 internal constant DENOMINATOR = 10000;

    // ==================== 32 bytes slot 1 start ================= //
    /// @dev Anti-snipe tax is burned, reducing total supply
    /// 1. 20% tax on buys in the first block
    /// 2. Reducing to 13.33% in the second block
    /// 3. Reducing to 6.66% in the third
    /// 4. Finally 0% from the fourth block on
    uint16 private _autoBurnFirstPercent = 2000;
    uint16 private _autoBurnSecondPercent = 1333;
    uint16 private _autoBurnThirdPercent = 666;

    /// @dev Max buy tax after token launched
    uint16 private _maxBuyTaxAfter = 1500;
    /// @dev Max sell tax after token launched
    uint16 private _maxSellTaxAfter = 1500;
    /// @dev Max treasury tax after token launched
    uint16 private _maxTreasuryTaxAfter = 500;

    /// @dev Bankpad tax is set on top buy / sell / treasury tax as a service fee
    uint16 private _bankPadTax = 1000;

    /// @dev Ownership can be renounced only when buy/sell/treasury tax is below limit default 5%
    uint16 private _maxTaxToRenounce = 500;

    /// @dev Bankpad tax is removed after some days default 30 days
    uint32 private _bankPadTaxApplyPeriod = 30 days;
    /// @dev Tax whitelist (exclude list) is not applied within some days after token launches default 2 days
    uint32 private _taxWhitelistApplyDelay = 2 days;

    /// @dev Token transfer is disabled for 1 mins once trading_delay flag is set
    uint32 private _tradingDelayTime = 1 minutes;
    /// @dev Trading is disabled once {_isTradingDisabled} flag is set,
    /// it is unset automatically after 7 days if owner does not enable trading
    uint32 private _tradingDisableTime = 7 days;
    // ==================== 32 bytes slot 1 end ================= //

    // ==================== 32 bytes slot 2 start ================= //
    /// @dev Service fee and token tax fee receive account
    address payable internal _servicePayAccount;

    /// @dev Max team distribution rate default 10%
    uint16 private _maxTeamAlloc = 1000;

    /// @dev Max token launch count per wallet
    uint16 internal _maxLaunchesPerWallet = 12;

    /// @dev Max buy tax
    uint16 private _maxBuyTax = 3500;
    /// @dev Max sell tax
    uint16 private _maxSellTax = 3500;
    /// @dev Max treasury tax
    uint16 private _maxTreasuryTax = 500;
    // ==================== 32 bytes slot 2 end: 30 bytes ================= //

    /// @dev BankPad machine contract
    address internal _machine;

    /// @dev Minimum lock period default 30 days
    uint256 internal _minLockPeriod = 30 days;

    /// @dev Token launch fee in ETH
    uint256 internal _launchFee;
    /// @dev Delayed trading fee in ETH
    uint256 internal _tradingDelayFee;
    /// @dev Delayed disable fee in ETH
    uint256 internal _tradingDisableFee;
    /// @dev Anti-Dump service fee in ETH
    uint256 internal _antiDumpFee;

    /// @dev LP locker contract for dex router
    mapping(address => address) internal _lpLockers;
    /// @dev Get token address per given BankPad UUID
    mapping(string => address) internal _tokens;
    /// @dev Whitelist for the unlimited team allocation
    mapping(string => uint16) internal _teamAllocWhitelist;
    /// @dev Whitelist for manually enabling trading
    mapping(string => bool) internal _manualEnableTradingWhitelist;
    /// @dev Minimum pair token amount to be added to the liquidity
    mapping(address => uint256) internal _minPairTokenAmounts;
    /// @dev Token launched count per account
    mapping(address => uint16) internal _launchedCounts;

    event BankPadTaxUpdated(uint16 bankPadTax);
    event MaxLaunchesPerWalletUpdated(uint16 maxLaunches);
    event MaxTaxToRenounceUpdated(uint16 maxTax);
    event MaxTeamAllocUpdated(uint16 teamAlloc);
    event MaxTeamAllocUpdatedForUUID(string uuid, uint16 teamAlloc);
    event MinLockPeriodUpdated(uint256 period);
    event MinPairTokenAmountUpdated(address pairToken, uint256 amount);
    event ServiceFeesUpdated(
        uint256 launchFee,
        uint256 tradingDelayFee,
        uint256 tradingDisableFee,
        uint256 antiDumpFee
    );
    event ServicePayAccountUpdated(address payable account);
    event SnipeAutoBurnPercentsUpdated(
        uint16 firstPercent,
        uint16 secondPercent,
        uint16 thirdPercent
    );
    event TaxAfterLimitsUpdated(
        uint16 maxBuyTax,
        uint16 maxSellTax,
        uint16 maxTreasuryTax
    );
    event TaxLimitsUpdated(
        uint16 maxBuyTax,
        uint16 maxSellTax,
        uint16 maxTreasuryTax
    );
    event ManualEnableTradingForUUIDUpdated(string uuid, bool flag);
    event TimeConfigurationUpdated(
        uint32 tradingDelayTime,
        uint32 tradingDisableTime,
        uint32 bankPadTaxApplyPeriod,
        uint32 taxWhitelistApplyDelay
    );

    /**
     * @dev Build InheritedConf structure to be used in token deployment
     *
     * @param uuid token UUID
     */
    function _buildInheritedConf(
        string memory uuid
    ) internal view returns (IBase.InheritedConf memory) {
        IBase.InheritedConf memory param;
        param.autoBurnFirstPercent = _autoBurnFirstPercent;
        param.autoBurnSecondPercent = _autoBurnSecondPercent;
        param.autoBurnThirdPercent = _autoBurnThirdPercent;

        param.maxBuyTaxAfter = _maxBuyTaxAfter;
        param.maxSellTaxAfter = _maxSellTaxAfter;
        param.maxTreasuryTaxAfter = _maxTreasuryTaxAfter;

        param.bankPadTax = _bankPadTax;
        param.maxTaxToRenounce = _maxTaxToRenounce;

        param.bankPadTaxApplyPeriod = _bankPadTaxApplyPeriod;
        param.taxWhitelistApplyDelay = _taxWhitelistApplyDelay;
        param.tradingDelayTime = _tradingDelayTime;
        // when the uuid is whitelisted for the manually enable trading feature
        // we set tradingDisableTime as MAX_UINT32
        param.tradingDisableTime = _manualEnableTradingWhitelist[uuid]
            ? uint32(int32(-1))
            : _tradingDisableTime;

        return param;
    }

    function _validateTaxProps(bytes memory taxParam) internal view {
        (, , , , uint16 buyTax, uint16 sellTax, uint16 treasuryTax) = abi
            .decode(
                taxParam,
                (address, address, address, address, uint16, uint16, uint16)
            );

        require(
            buyTax <= _maxBuyTax &&
                sellTax <= _maxSellTax &&
                treasuryTax <= _maxTreasuryTax,
            "too much tax"
        );

        uint16 bankPadTax_ = _bankPadTax;

        // check if the applied tax is too much so it exceeds the transfer amount
        require(
            (uint256(buyTax + treasuryTax) * (DENOMINATOR + bankPadTax_)) /
                DENOMINATOR <=
                DENOMINATOR &&
                (uint256(sellTax + treasuryTax) * (DENOMINATOR + bankPadTax_)) /
                    DENOMINATOR <=
                DENOMINATOR,
            "tax out of range"
        );
    }

    /// @notice Update BankPad service fees
    /// @param launchFee token launch fee
    /// @param tradingDelayFee trading delay service fee
    /// @param tradingDisableFee trading disable service fee
    function updateServiceFees(
        uint256 launchFee,
        uint256 tradingDelayFee,
        uint256 tradingDisableFee,
        uint256 antiDumpFee
    ) external onlyOwner {
        _launchFee = launchFee;
        _tradingDelayFee = tradingDelayFee;
        _tradingDisableFee = tradingDisableFee;
        _antiDumpFee = antiDumpFee;

        emit ServiceFeesUpdated(
            launchFee,
            tradingDelayFee,
            tradingDisableFee,
            antiDumpFee
        );
    }

    /// @notice View BankPad service fees
    /// @return uint256 token launch fee
    /// @return uint256 trading delay service fee
    /// @return uint256 trading disable service fee
    /// @return uint256 anti-dump service fee
    function serviceFees()
        external
        view
        returns (uint256, uint256, uint256, uint256)
    {
        return (_launchFee, _tradingDelayFee, _tradingDisableFee, _antiDumpFee);
    }

    /// @notice Update LP locker contract
    function updateLPLocker(
        address dexRouter,
        address newLocker
    ) external onlyOwner {
        _lpLockers[dexRouter] = newLocker;
    }

    function lpLocker(address dexRouter) external view returns (address) {
        return _lpLockers[dexRouter];
    }

    /**
     * @notice function {updateBankMachine}
     *
     * Update BankPad token machine address
     */
    function updateBankMachine(address machine) external onlyOwner {
        require(machine != address(0), "invalid machine");

        _machine = machine;
    }

    function bankMachine() external view returns (address) {
        return _machine;
    }

    /// @notice Update service fee receive account
    function updateServicePayAccount(
        address payable account
    ) external onlyOwner {
        require(account != address(0), "invalid pay account");
        // confirm service pay account can receive ETH
        account.sendValue(0);

        _servicePayAccount = account;

        emit ServicePayAccountUpdated(account);
    }

    function servicePayAccount() external view returns (address payable) {
        return _servicePayAccount;
    }

    function getToken(string memory uuid) external view returns (address) {
        return _tokens[uuid];
    }

    /**
     * @dev function {updateMaxTeamAlloc}
     *
     * Update the limit of the team distribution percent
     *
     * @param teamAlloc new max limit of the team distribution percent
     */
    function updateMaxTeamAlloc(uint16 teamAlloc) external onlyOwner {
        require(teamAlloc <= DENOMINATOR, "out of range");
        _maxTeamAlloc = teamAlloc;
        emit MaxTeamAllocUpdated(teamAlloc);
    }

    /**
     * @dev function {maxTeamAlloc}
     *
     * Return common max team distribution percentage
     */
    function maxTeamAlloc() external view returns (uint16) {
        return _maxTeamAlloc;
    }

    /**
     * @dev function {updateMaxTeamAllocForUUID}
     *
     * Whitelist token uuid for the unlimited team allocation percent
     *
     * @param uuid token to be whitelisted
     * @param teamAlloc new max team allocation percent
     */
    function updateMaxTeamAllocForUUID(
        string calldata uuid,
        uint16 teamAlloc
    ) external onlyOwner {
        require(teamAlloc <= DENOMINATOR, "out of range");
        _teamAllocWhitelist[uuid] = teamAlloc;

        emit MaxTeamAllocUpdatedForUUID(uuid, teamAlloc);
    }

    /**
     * @dev function {maxTeamAllocForUUID}
     *
     * Return max team distribution percentage for the given `uuid` of token
     * whitelisted token will return its max allocation percent
     * return `_maxTeamAlloc` for others
     *
     * @param uuid token UUID
     */
    function maxTeamAllocForUUID(
        string calldata uuid
    ) external view returns (uint16) {
        uint16 teamAllocForUUID = _teamAllocWhitelist[uuid];
        if (teamAllocForUUID > 0) return teamAllocForUUID;
        return _maxTeamAlloc;
    }

    /**
     * @notice function {whitelistUUIDForManualEnableTrading}
     *
     * Whitelist token for setting manual enabling trading feature
     *
     * @param uuid token uuid to whitelist
     * @param flag true / false
     */
    function whitelistUUIDForManualEnableTrading(
        string calldata uuid,
        bool flag
    ) external onlyOwner {
        _manualEnableTradingWhitelist[uuid] = flag;
        emit ManualEnableTradingForUUIDUpdated(uuid, flag);
    }

    function isUUIDWhitelistedForManualEnableTrading(
        string calldata uuid
    ) external view returns (bool) {
        return _manualEnableTradingWhitelist[uuid];
    }

    /**
     * @dev function {updateMinLockPeriod}
     *
     * Update minimum lock period
     *
     * @param period new minimum lock period
     */
    function updateMinLockPeriod(uint256 period) external onlyOwner {
        _minLockPeriod = period;

        emit MinLockPeriodUpdated(period);
    }

    function minLockPeriod() external view returns (uint256) {
        return _minLockPeriod;
    }

    /**
     * @dev function {updateSnipeAutoBurnPercents}
     *
     * Update percent values of anti-snipe auto burning
     *
     * @param firstPercent anti-snipe first auto burn percent. max 35%
     * @param secondPercent anti-snipe second auto burn percent. max 20%
     * @param thirdPercent anti-snipe third auto burn percent. max 10%
     */
    function updateSnipeAutoBurnPercents(
        uint16 firstPercent,
        uint16 secondPercent,
        uint16 thirdPercent
    ) external onlyOwner {
        require(
            firstPercent <= 3500 &&
                secondPercent <= 2000 &&
                thirdPercent <= 1000,
            "out of range"
        );
        _autoBurnFirstPercent = firstPercent;
        _autoBurnSecondPercent = secondPercent;
        _autoBurnThirdPercent = thirdPercent;

        emit SnipeAutoBurnPercentsUpdated(
            firstPercent,
            secondPercent,
            thirdPercent
        );
    }

    /**
     * @dev function {snipeAutoBurnPercents}
     *
     * Return anti-snipe auto burn percent values for 3 steps
     *
     * @return uint16 first auto burn percent
     * @return uint16 second auto burn percent
     * @return uint16 third auto burn percent
     */
    function snipeAutoBurnPercents()
        external
        view
        returns (uint16, uint16, uint16)
    {
        return (
            _autoBurnFirstPercent,
            _autoBurnSecondPercent,
            _autoBurnThirdPercent
        );
    }

    /**
     * @dev function {updateTaxLimits}
     *
     * Update max limit of buy/sell/treasury tax which are used at the time of token deployment
     *
     * @param maxBuyTax maximum value of {buyTax}. max 35%
     * @param maxSellTax maximum value of {sellTax}. max 35%
     * @param maxTreasuryTax maximum value of {treasuryTax}. max 5%
     */
    function updateTaxLimits(
        uint16 maxBuyTax,
        uint16 maxSellTax,
        uint16 maxTreasuryTax
    ) external onlyOwner {
        require(
            maxBuyTax <= 3500 && maxSellTax <= 3500 && maxTreasuryTax <= 500,
            "out of range"
        );
        _maxBuyTax = maxBuyTax;
        _maxSellTax = maxSellTax;
        _maxTreasuryTax = maxTreasuryTax;

        emit TaxLimitsUpdated(maxBuyTax, maxSellTax, maxTreasuryTax);
    }

    /**
     * @dev function {taxLimits}
     *
     * Return tax limits which are used at the time of token deployment
     *
     * @return uint16 max buy tax limit
     * @return uint16 max sell tax limit
     * @return uint16 max treasury tax limit
     */
    function taxLimits() external view returns (uint16, uint16, uint16) {
        return (_maxBuyTax, _maxSellTax, _maxTreasuryTax);
    }

    /**
     * @dev function {updateTaxAfterLimits}
     *
     * Update max limit of buy/sell/treasury tax which are used after token launched
     *
     * @param maxBuyTax maximum value of {buyTax}. max 35%
     * @param maxSellTax maximum value of {sellTax}. max 35%
     * @param maxTreasuryTax maximum value of {treasuryTax}. max 5%
     */
    function updateTaxAfterLimits(
        uint16 maxBuyTax,
        uint16 maxSellTax,
        uint16 maxTreasuryTax
    ) external onlyOwner {
        require(
            maxBuyTax <= 3500 && maxSellTax <= 3500 && maxTreasuryTax <= 500,
            "out of range"
        );
        _maxBuyTaxAfter = maxBuyTax;
        _maxSellTaxAfter = maxSellTax;
        _maxTreasuryTaxAfter = maxTreasuryTax;

        emit TaxAfterLimitsUpdated(maxBuyTax, maxSellTax, maxTreasuryTax);
    }

    /**
     * @dev function {taxAfterLimits}
     *
     * Return tax limits which are used after token launched
     *
     * @return uint16 max buy tax limit
     * @return uint16 max sell tax limit
     * @return uint16 max treasury tax limit
     */
    function taxAfterLimits() external view returns (uint16, uint16, uint16) {
        return (_maxBuyTaxAfter, _maxSellTaxAfter, _maxTreasuryTaxAfter);
    }

    /**
     * @dev function {updateBankPadTax}
     *
     * Update BankPad tax value
     *
     * @param tax new BankPad tax
     */
    function updateBankPadTax(uint16 tax) external onlyOwner {
        _bankPadTax = tax;

        emit BankPadTaxUpdated(tax);
    }

    function bankPadTax() external view returns (uint16) {
        return _bankPadTax;
    }

    /**
     * @dev function {updateMaxTaxToRenounce}
     *
     * Update the tax condition for renouncing ownership of the token
     *
     * @param maxTax max tax values for renounce
     */
    function updateMaxTaxToRenounce(uint16 maxTax) external onlyOwner {
        _maxTaxToRenounce = maxTax;

        emit MaxTaxToRenounceUpdated(maxTax);
    }

    /**
     * @dev function {maxTaxToRenounce}
     *
     * Return the tax condition for renouncing ownership of the token
     *
     * @return uint16 max tax values for renounce
     */
    function maxTaxToRenounce() external view returns (uint16) {
        return _maxTaxToRenounce;
    }

    /**
     * @dev function {updateTradingTimes}
     *
     * Update token related time configuration
     *
     * @param tradingDelayTime new trading delay time
     * @param tradingDisableTime new trading disable time
     * @param bankPadTaxApplyPeriod new bankPad tax apply period
     * @param taxWhitelistApplyDelay new tax whitelist delay period
     */
    function updateTimeConfiguration(
        uint32 tradingDelayTime,
        uint32 tradingDisableTime,
        uint32 bankPadTaxApplyPeriod,
        uint32 taxWhitelistApplyDelay
    ) external onlyOwner {
        _tradingDelayTime = tradingDelayTime;
        _tradingDisableTime = tradingDisableTime;
        _bankPadTaxApplyPeriod = bankPadTaxApplyPeriod;
        _taxWhitelistApplyDelay = taxWhitelistApplyDelay;

        emit TimeConfigurationUpdated(
            tradingDelayTime,
            tradingDisableTime,
            bankPadTaxApplyPeriod,
            taxWhitelistApplyDelay
        );
    }

    /**
     * @dev function {tradingTimes}
     *
     * Return token related time configuration
     *
     * @return uint32 trading delay time
     * @return uint32 trading disable time
     * @return uint32 BankPad tax apply period
     * @return uint32 Tax whitelist delay period
     */
    function timeConfiguration()
        external
        view
        returns (uint32, uint32, uint32, uint32)
    {
        return (
            _tradingDelayTime,
            _tradingDisableTime,
            _bankPadTaxApplyPeriod,
            _taxWhitelistApplyDelay
        );
    }

    function updateMinPairTokenAmount(
        address pairToken,
        uint256 amount
    ) external onlyOwner {
        _minPairTokenAmounts[pairToken] = amount;

        emit MinPairTokenAmountUpdated(pairToken, amount);
    }

    /**
     * @dev function {minPairTokenAmount}
     *
     * Return minimum pair token amount
     *
     * @param pairToken address of adding token being added with deployed token
     */
    function minPairTokenAmount(
        address pairToken
    ) external view returns (uint256) {
        return _minPairTokenAmounts[pairToken];
    }

    /**
     * @dev function {updateMaxLaunchesPerWallet}
     *
     * Update max launches count per wallet
     *
     * @param maxLaunches new max launches count
     */
    function updateMaxLaunchesPerWallet(uint16 maxLaunches) external onlyOwner {
        _maxLaunchesPerWallet = maxLaunches;

        emit MaxLaunchesPerWalletUpdated(maxLaunches);
    }

    function maxLaunchesPerWallet() external view returns (uint16) {
        return _maxLaunchesPerWallet;
    }

    /**
     * @dev function {launchedCount}
     *
     * Return launched token count by the given account
     *
     * @param account to view
     */
    function launchedCount(address account) external view returns (uint16) {
        return _launchedCounts[account];
    }
}


// File contracts/launchpad/ERC20FactoryByBankPad.sol

pragma solidity ^0.8.0;

// Original license: SPDX_License_Identifier: MIT





// import "../interfaces/IUniLockerGoerli.sol";

contract ERC20FactoryByBankPad is ERC20FactoryByBankPadBase, Pausable {
    using SafeERC20 for IERC20;
    using Address for address payable;

    address private constant ETH_ADDRESS =
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    event NewTokenCreated(
        address token,
        address serviceAccount,
        address deployer,
        bytes32 uuidHash,
        uint256 serviceFee,
        IBase.TokenLaunchConf tokenLaunchConf,
        IBase.InheritedConf inheritedConf
    );

    constructor(
        address payable servicePayAccount_,
        uint256 launchFee_,
        uint256 delayedTradingFee_,
        uint256 tradingDisableFee_,
        uint256 antiDumpFee_
    ) {
        require(servicePayAccount_ != address(0), "invalid pay account");
        _servicePayAccount = servicePayAccount_;
        _launchFee = launchFee_;
        _tradingDelayFee = delayedTradingFee_;
        _tradingDisableFee = tradingDisableFee_;
        _antiDumpFee = antiDumpFee_;
    }

    /// @notice Create token from the template
    /// @dev Token configuration parameters are passed as ABI-encoded values.
    function createERC20(
        IBase.TokenLaunchConf memory tokenLaunchConf
    ) external payable whenNotPaused returns (address) {
        uint256 ethAmount = msg.value;
        require(_tokens[tokenLaunchConf.uuid] == address(0), "duplicated uuid");

        IBase.InheritedConf memory inheritedConf = _buildInheritedConf(
            tokenLaunchConf.uuid
        );
        IERC20ByBankPad createdToken = _deployERC20(
            tokenLaunchConf,
            inheritedConf
        );

        (
            bool isTradingDelayed,
            bool isTradingDisabled,
            uint256 ethInLP,
            uint256 ethInLockFee
        ) = _initializeLP(createdToken, tokenLaunchConf);
        uint256 serviceFee = _launchFee +
            (isTradingDelayed ? _tradingDelayFee : 0) +
            (isTradingDisabled ? _tradingDisableFee : 0) +
            (createdToken.isAntiDumpEnabled() ? _antiDumpFee : 0);
        require(
            ethAmount >= serviceFee + ethInLP + ethInLockFee,
            "insufficient eth"
        );

        // send remained eth to the service pay account
        _servicePayAccount.sendValue(address(this).balance);
        createdToken.launch(isTradingDelayed, isTradingDisabled);

        emit NewTokenCreated(
            address(createdToken),
            _servicePayAccount,
            _msgSender(),
            createdToken.bankUUIDHash(),
            serviceFee,
            tokenLaunchConf,
            inheritedConf
        );

        return address(createdToken);
    }

    function _deployERC20(
        IBase.TokenLaunchConf memory tokenLaunchConf,
        IBase.InheritedConf memory inheritedConf
    ) private returns (IERC20ByBankPad) {
        address deployer = _msgSender();
        uint16 launchedCount = _launchedCounts[deployer];
        require(launchedCount < _maxLaunchesPerWallet, "over launched");
        _launchedCounts[deployer] = ++launchedCount;

        // validate some props in the factory, not to transfer attributes to the token
        _validateTaxProps(tokenLaunchConf.taxParam);

        bytes32 salt = keccak256(
            abi.encodePacked(tokenLaunchConf.uuid, block.timestamp)
        );
        bytes32 bankIdHash = keccak256(abi.encodePacked(tokenLaunchConf.uuid));
        bytes memory args = abi.encode(
            address(this),
            deployer,
            tokenLaunchConf,
            inheritedConf
        );

        address deployedAddress = IERC20MachineByBankPad(_machine).deploy(
            bankIdHash,
            salt,
            args
        );
        _tokens[tokenLaunchConf.uuid] = deployedAddress;

        return IERC20ByBankPad(deployedAddress);
    }

    function _initializeLP(
        IERC20ByBankPad createdToken,
        IBase.TokenLaunchConf memory param
    ) private returns (bool, bool, uint256, uint256) {
        (
            bool isLPBurn,
            bool isTradingDelayed,
            bool isTradingDisabled,
            uint256 pairedTokenAmount,
            uint256 lockPeriod
        ) = abi.decode(param.lpParam, (bool, bool, bool, uint256, uint256));
        require(pairedTokenAmount > 0, "invalid pair token amount");

        // add liquidity
        (uint256 lpAmount, uint256 ethInLP) = _addLP(
            createdToken,
            pairedTokenAmount,
            isLPBurn
        );

        // lock liquidity
        uint256 ethInLockFee;
        if (!isLPBurn)
            ethInLockFee = _lockLP(createdToken, lpAmount, lockPeriod);

        return (isTradingDelayed, isTradingDisabled, ethInLP, ethInLockFee);
    }

    /// @dev Add liquidity to the uniswap router
    /// LP is burnt if the burn flag is set
    /// @return uint256 created LP amount
    /// @return uint256 if pair is eth, return eth amount
    function _addLP(
        IERC20ByBankPad createdToken,
        uint256 pairedTokenAmount,
        bool isLPBurn
    ) private returns (uint256, uint256) {
        (address dexRouter_, address basePairedToken, ) = createdToken
            .ammAddresses();
        IDexRouter dexRouter = IDexRouter(dexRouter_);
        uint256 createdTokenAmount = createdToken.balanceOf(address(this));

        IERC20(address(createdToken)).safeApprove(
            address(dexRouter),
            createdTokenAmount
        );

        require(
            pairedTokenAmount >= _minPairTokenAmounts[basePairedToken],
            "too small pair amount"
        );

        if (basePairedToken == ETH_ADDRESS) {
            (, , uint256 lpAmount) = dexRouter.addLiquidityETH{
                value: pairedTokenAmount
            }(
                address(createdToken),
                createdTokenAmount,
                0,
                0,
                isLPBurn ? address(0xdead) : address(this),
                block.timestamp + 300
            );
            return (lpAmount, pairedTokenAmount);
        } else {
            IERC20(basePairedToken).safeTransferFrom(
                _msgSender(),
                address(this),
                pairedTokenAmount
            );
            IERC20(basePairedToken).safeApprove(
                address(dexRouter),
                pairedTokenAmount
            );
            (, , uint256 lpAmount) = dexRouter.addLiquidity(
                address(createdToken),
                basePairedToken,
                createdTokenAmount,
                pairedTokenAmount,
                0,
                0,
                isLPBurn ? address(0xdead) : address(this),
                block.timestamp + 300
            );
            return (lpAmount, 0);
        }
    }

    /// @dev Lock LP into unicrypt lp locker contract
    /// We pay fee in ETH
    /// @return uint256 fee amount
    function _lockLP(
        IERC20ByBankPad createdToken,
        uint256 lpAmount,
        uint256 lockPeriod
    ) private returns (uint256) {
        require(lockPeriod >= _minLockPeriod, "too short lock");
        (address dexRouter, , address baseAmmPair) = createdToken
            .ammAddresses();
        IUniLocker lockerForDex = IUniLocker(_lpLockers[dexRouter]);
        require(
            address(lockerForDex) != address(0),
            "unsupported dex for lock"
        );
        uint256 ethFee = lockerForDex.gFees().ethFee;

        IERC20(baseAmmPair).safeApprove(address(lockerForDex), lpAmount);
        lockerForDex.lockLPToken{value: ethFee}(
            baseAmmPair,
            lpAmount,
            block.timestamp + lockPeriod,
            payable(address(0)),
            true,
            payable(_msgSender())
            // ,
            // 11 // country code is used in the testnet
        );

        return ethFee;
    }

    /**
     * @notice function {pauseFactory}
     *
     * Pause factory for the maintenance
     */
    function pauseFactory(bool flag) external onlyOwner {
        if (flag) _pause();
        else _unpause();
    }

    /// @notice It allows the admin to recover tokens sent to the contract
    /// @param token_: the address of the token to withdraw
    /// @param amount_: the number of tokens to withdraw
    /// @dev Only owner can call this function
    function recoverToken(address token_, uint256 amount_) external onlyOwner {
        IERC20(token_).safeTransfer(_msgSender(), amount_);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"servicePayAccount_","type":"address"},{"internalType":"uint256","name":"launchFee_","type":"uint256"},{"internalType":"uint256","name":"delayedTradingFee_","type":"uint256"},{"internalType":"uint256","name":"tradingDisableFee_","type":"uint256"},{"internalType":"uint256","name":"antiDumpFee_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"bankPadTax","type":"uint16"}],"name":"BankPadTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"bool","name":"flag","type":"bool"}],"name":"ManualEnableTradingForUUIDUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxLaunches","type":"uint16"}],"name":"MaxLaunchesPerWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxTax","type":"uint16"}],"name":"MaxTaxToRenounceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"MaxTeamAllocUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"MaxTeamAllocUpdatedForUUID","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"MinLockPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pairToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinPairTokenAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"serviceAccount","type":"address"},{"indexed":false,"internalType":"address","name":"deployer","type":"address"},{"indexed":false,"internalType":"bytes32","name":"uuidHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"serviceFee","type":"uint256"},{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes","name":"distribParam","type":"bytes"},{"internalType":"bytes","name":"antiBotParam","type":"bytes"},{"internalType":"bytes","name":"taxParam","type":"bytes"},{"internalType":"bytes","name":"lpParam","type":"bytes"}],"indexed":false,"internalType":"struct IBase.TokenLaunchConf","name":"tokenLaunchConf","type":"tuple"},{"components":[{"internalType":"uint16","name":"autoBurnFirstPercent","type":"uint16"},{"internalType":"uint16","name":"autoBurnSecondPercent","type":"uint16"},{"internalType":"uint16","name":"autoBurnThirdPercent","type":"uint16"},{"internalType":"uint16","name":"maxBuyTaxAfter","type":"uint16"},{"internalType":"uint16","name":"maxSellTaxAfter","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTaxAfter","type":"uint16"},{"internalType":"uint16","name":"bankPadTax","type":"uint16"},{"internalType":"uint16","name":"maxTaxToRenounce","type":"uint16"},{"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"},{"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"internalType":"uint32","name":"tradingDisableTime","type":"uint32"}],"indexed":false,"internalType":"struct IBase.InheritedConf","name":"inheritedConf","type":"tuple"}],"name":"NewTokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"launchFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradingDelayFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradingDisableFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"antiDumpFee","type":"uint256"}],"name":"ServiceFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"account","type":"address"}],"name":"ServicePayAccountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"firstPercent","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"secondPercent","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"thirdPercent","type":"uint16"}],"name":"SnipeAutoBurnPercentsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"TaxAfterLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"TaxLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"tradingDisableTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"}],"name":"TimeConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"bankMachine","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bankPadTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes","name":"distribParam","type":"bytes"},{"internalType":"bytes","name":"antiBotParam","type":"bytes"},{"internalType":"bytes","name":"taxParam","type":"bytes"},{"internalType":"bytes","name":"lpParam","type":"bytes"}],"internalType":"struct IBase.TokenLaunchConf","name":"tokenLaunchConf","type":"tuple"}],"name":"createERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"isUUIDWhitelistedForManualEnableTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"launchedCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dexRouter","type":"address"}],"name":"lpLocker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLaunchesPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTaxToRenounce","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTeamAlloc","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"maxTeamAllocForUUID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pairToken","type":"address"}],"name":"minPairTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"pauseFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"servicePayAccount","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipeAutoBurnPercents","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxAfterLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConfiguration","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"machine","type":"address"}],"name":"updateBankMachine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"}],"name":"updateBankPadTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"address","name":"newLocker","type":"address"}],"name":"updateLPLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxLaunches","type":"uint16"}],"name":"updateMaxLaunchesPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxTax","type":"uint16"}],"name":"updateMaxTaxToRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"updateMaxTeamAlloc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"updateMaxTeamAllocForUUID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"updateMinLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinPairTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"launchFee","type":"uint256"},{"internalType":"uint256","name":"tradingDelayFee","type":"uint256"},{"internalType":"uint256","name":"tradingDisableFee","type":"uint256"},{"internalType":"uint256","name":"antiDumpFee","type":"uint256"}],"name":"updateServiceFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"updateServicePayAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"firstPercent","type":"uint16"},{"internalType":"uint16","name":"secondPercent","type":"uint16"},{"internalType":"uint16","name":"thirdPercent","type":"uint16"}],"name":"updateSnipeAutoBurnPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"updateTaxAfterLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"updateTaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"internalType":"uint32","name":"tradingDisableTime","type":"uint32"},{"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"}],"name":"updateTimeConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"whitelistUUIDForManualEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526107d05f60146101000a81548161ffff021916908361ffff1602179055506105355f60166101000a81548161ffff021916908361ffff16021790555061029a5f60186101000a81548161ffff021916908361ffff1602179055506105dc5f601a6101000a81548161ffff021916908361ffff1602179055506105dc5f601c6101000a81548161ffff021916908361ffff1602179055506101f45f601e6101000a81548161ffff021916908361ffff1602179055506103e860015f6101000a81548161ffff021916908361ffff1602179055506101f4600160026101000a81548161ffff021916908361ffff16021790555062278d00600160046101000a81548163ffffffff021916908363ffffffff1602179055506202a300600160086101000a81548163ffffffff021916908363ffffffff160217905550603c6001600c6101000a81548163ffffffff021916908363ffffffff16021790555062093a80600160106101000a81548163ffffffff021916908363ffffffff1602179055506103e8600260146101000a81548161ffff021916908361ffff160217905550600c600260166101000a81548161ffff021916908361ffff160217905550610dac600260186101000a81548161ffff021916908361ffff160217905550610dac6002601a6101000a81548161ffff021916908361ffff1602179055506101f46002601c6101000a81548161ffff021916908361ffff16021790555062278d0060045534801562000230575f80fd5b5060405162005c0138038062005c018339818101604052810190620002569190620004cc565b620002766200026a6200036760201b60201c565b6200036e60201b60201c565b5f600f5f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160362000300576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f790620005ae565b60405180910390fd5b8460025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836005819055508260068190555081600781905550806008819055505050505050620005ce565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200045e8262000433565b9050919050565b620004708162000452565b81146200047b575f80fd5b50565b5f815190506200048e8162000465565b92915050565b5f819050919050565b620004a88162000494565b8114620004b3575f80fd5b50565b5f81519050620004c6816200049d565b92915050565b5f805f805f60a08688031215620004e857620004e76200042f565b5b5f620004f7888289016200047e565b95505060206200050a88828901620004b6565b94505060406200051d88828901620004b6565b93505060606200053088828901620004b6565b92505060806200054388828901620004b6565b9150509295509295909350565b5f82825260208201905092915050565b7f696e76616c696420706179206163636f756e74000000000000000000000000005f82015250565b5f6200059660138362000550565b9150620005a38262000560565b602082019050919050565b5f6020820190508181035f830152620005c78162000588565b9050919050565b61562580620005dc5f395ff3fe608060405260043610610245575f3560e01c8063870f856811610138578063bcf48070116100b5578063cb2df41811610079578063cb2df4181461082f578063e602ab8b1461086b578063eb1c834914610893578063f1c71cd4146108cf578063f2fde38b146108f7578063fd109d771461091f57610245565b8063bcf480701461074f578063c1733f6814610777578063c2d4f942146107b3578063c524e82e146107dd578063c5d419151461080757610245565b8063a103657e116100fc578063a103657e14610683578063a3156826146106af578063acd33f31146106d7578063b29a8140146106ff578063b74e68a51461072757610245565b8063870f8568146105b157806387b27a95146105d95780638da5cb5b1461060957806397abb762146106335780639c030fc01461065b57610245565b806357824338116101c65780637c678b161161018a5780637c678b16146104c757806380857ffa146104f157806380c746531461051e57806381b31abd1461054b57806382b0f7d01461058757610245565b8063578243381461040d5780635c975abb146104355780635f57ef2c1461045f578063715018a61461048757806373ae54b51461049d57610245565b80632b1429181161020d5780632b1429181461033d5780632fdd75bf1461036557806349deaf4f146103915780634a1db646146103bb57806351186e9e146103e557610245565b806305860c24146102495780630d426b00146102715780630d7777581461029d57806313345cf9146102d957806329c66e3814610301575b5f80fd5b348015610254575f80fd5b5061026f600480360381019061026a9190613376565b610947565b005b34801561027c575f80fd5b50610285610a50565b604051610294939291906133d5565b60405180910390f35b3480156102a8575f80fd5b506102c360048036038101906102be9190613464565b610a8e565b6040516102d091906134a7565b60405180910390f35b3480156102e4575f80fd5b506102ff60048036038101906102fa91906134fb565b610ad4565b005b34801561030c575f80fd5b5061032760048036038101906103229190613587565b610bed565b60405161033491906135d2565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190613464565b610c4f565b005b348015610370575f80fd5b50610379610d08565b604051610388939291906133d5565b60405180910390f35b34801561039c575f80fd5b506103a5610d46565b6040516103b291906135d2565b60405180910390f35b3480156103c6575f80fd5b506103cf610d5d565b6040516103dc91906135d2565b60405180910390f35b3480156103f0575f80fd5b5061040b600480360381019061040691906135eb565b610d74565b005b348015610418575f80fd5b50610433600480360381019061042e9190613616565b610dd3565b005b348015610440575f80fd5b50610449610ea2565b604051610456919061368d565b60405180910390f35b34801561046a575f80fd5b50610485600480360381019061048091906136d0565b610eb7565b005b348015610492575f80fd5b5061049b610ede565b005b3480156104a8575f80fd5b506104b1610ef1565b6040516104be91906134a7565b60405180910390f35b3480156104d2575f80fd5b506104db610efa565b6040516104e8919061370a565b60405180910390f35b3480156104fc575f80fd5b50610505610f22565b6040516105159493929190613723565b60405180910390f35b348015610529575f80fd5b50610532610f40565b6040516105429493929190613784565b60405180910390f35b348015610556575f80fd5b50610571600480360381019061056c9190613464565b610f9e565b60405161057e919061370a565b60405180910390f35b348015610592575f80fd5b5061059b611003565b6040516105a891906135d2565b60405180910390f35b3480156105bc575f80fd5b506105d760048036038101906105d29190613376565b61101a565b005b6105f360048036038101906105ee9190613b1a565b611123565b604051610600919061370a565b60405180910390f35b348015610614575f80fd5b5061061d6114bf565b60405161062a919061370a565b60405180910390f35b34801561063e575f80fd5b5061065960048036038101906106549190613b8b565b6114e6565b005b348015610666575f80fd5b50610681600480360381019061067c9190613bc9565b61156d565b005b34801561068e575f80fd5b506106976115b6565b6040516106a6939291906133d5565b60405180910390f35b3480156106ba575f80fd5b506106d560048036038101906106d091906135eb565b6115f7565b005b3480156106e2575f80fd5b506106fd60048036038101906106f89190613bf4565b611656565b005b34801561070a575f80fd5b5061072560048036038101906107209190613b8b565b6116d5565b005b348015610732575f80fd5b5061074d60048036038101906107489190613c51565b611713565b005b34801561075a575f80fd5b5061077560048036038101906107709190613cdf565b61177a565b005b348015610782575f80fd5b5061079d60048036038101906107989190613d43565b611849565b6040516107aa919061370a565b60405180910390f35b3480156107be575f80fd5b506107c761188f565b6040516107d49190613d99565b60405180910390f35b3480156107e8575f80fd5b506107f16118b7565b6040516107fe91906135d2565b60405180910390f35b348015610812575f80fd5b5061082d60048036038101906108289190613376565b6118cd565b005b34801561083a575f80fd5b5061085560048036038101906108509190613587565b6119d9565b604051610862919061368d565b60405180910390f35b348015610876575f80fd5b50610891600480360381019061088c91906135eb565b611a0f565b005b34801561089e575f80fd5b506108b960048036038101906108b49190613464565b611a6d565b6040516108c691906135d2565b60405180910390f35b3480156108da575f80fd5b506108f560048036038101906108f091906135eb565b611ac0565b005b348015610902575f80fd5b5061091d60048036038101906109189190613464565b611b6c565b005b34801561092a575f80fd5b5061094560048036038101906109409190613db2565b611bee565b005b61094f611c75565b610dac8361ffff161115801561096b5750610dac8261ffff1611155b801561097d57506101f48161ffff1611155b6109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390613e4a565b60405180910390fd5b825f601a6101000a81548161ffff021916908361ffff160217905550815f601c6101000a81548161ffff021916908361ffff160217905550805f601e6101000a81548161ffff021916908361ffff1602179055507f8157027eb85fd89b2efb2911c47299c62a2f43927770288915a57ff5aa9aff78838383604051610a43939291906133d5565b60405180910390a1505050565b5f805f8060149054906101000a900461ffff165f60169054906101000a900461ffff165f60189054906101000a900461ffff16925092509250909192565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610adc611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613eb2565b60405180910390fd5b610b735f8273ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3625e9e992e84551991603867426211da9c3e048e19eb2aac8e5f1bda7e5f92b81604051610be29190613d99565b60405180910390a150565b5f80600b8484604051610c01929190613efe565b90815260200160405180910390205f9054906101000a900461ffff1690505f8161ffff161115610c345780915050610c49565b600260149054906101000a900461ffff169150505b92915050565b610c57611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90613f60565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f80601a9054906101000a900461ffff165f601c9054906101000a900461ffff165f601e9054906101000a900461ffff16925092509250909192565b5f600160029054906101000a900461ffff16905090565b5f600260149054906101000a900461ffff16905090565b610d7c611c75565b80600260166101000a81548161ffff021916908361ffff1602179055507f0d5dfa7e3ffdf0daca1d63bd5ab5c65827be4c580153bef4544eb2512afa12bf81604051610dc891906135d2565b60405180910390a150565b610ddb611c75565b61271061ffff168161ffff161115610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90613e4a565b60405180910390fd5b80600b8484604051610e3b929190613efe565b90815260200160405180910390205f6101000a81548161ffff021916908361ffff1602179055507fa9a9f157d989d2731dd74a16d2e9f7e9caacb51e0a7cd33b7ec6a1d3908f5520838383604051610e9593929190613faa565b60405180910390a1505050565b5f600f5f9054906101000a900460ff16905090565b610ebf611c75565b8015610ed257610ecd611de3565b610edb565b610eda611e45565b5b50565b610ee6611c75565b610eef5f611ea6565b565b5f600454905090565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f80600554600654600754600854935093509350935090919293565b5f805f806001600c9054906101000a900463ffffffff16600160109054906101000a900463ffffffff16600160049054906101000a900463ffffffff16600160089054906101000a900463ffffffff16935093509350935090919293565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f600260169054906101000a900461ffff16905090565b611022611c75565b610dac8361ffff161115801561103e57506107d08261ffff1611155b801561105057506103e88161ffff1611155b61108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690613e4a565b60405180910390fd5b825f60146101000a81548161ffff021916908361ffff160217905550815f60166101000a81548161ffff021916908361ffff160217905550805f60186101000a81548161ffff021916908361ffff1602179055507f5fa708f2b10f2c2a41a460fe7ec148a656813df1ea95b47e8161bc95166e5a92838383604051611116939291906133d5565b60405180910390a1505050565b5f61112c611f67565b5f3490505f73ffffffffffffffffffffffffffffffffffffffff16600a845f015160405161115a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d59061409c565b60405180910390fd5b5f6111eb845f0151611fb1565b90505f6111f885836121e4565b90505f805f80611208858a61249c565b93509350935093505f8573ffffffffffffffffffffffffffffffffffffffff16633e4042286040518163ffffffff1660e01b8152600401602060405180830381865afa15801561125a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127e91906140ce565b611288575f61128c565b6008545b84611297575f61129b565b6007545b866112a6575f6112aa565b6006545b6005546112b79190614126565b6112c19190614126565b6112cb9190614126565b90508183826112da9190614126565b6112e49190614126565b881015611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906141a3565b60405180910390fd5b6113704760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff1663f519b7d386866040518363ffffffff1660e01b81526004016113ab9291906141c1565b5f604051808303815f87803b1580156113c2575f80fd5b505af11580156113d4573d5f803e3d5ffd5b505050507fd6f6c63246dd4d36ff9d157c9159371381ee8be9d1475eab442af8743fdab6568660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661142461254b565b8973ffffffffffffffffffffffffffffffffffffffff1663b4b37bd26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611491919061421b565b858f8d6040516114a7979695949392919061451f565b60405180910390a18598505050505050505050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114ee611c75565b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f4fe473bd5cc90e6c73cf11d29f6cc091faa692024afacfdb69bc9a9abebfb6188282604051611561929190614594565b60405180910390a15050565b611575611c75565b806004819055507fe818ff6972bf8970ca14a893539e57452588b197b76e6afe29c40a31b3363c61816040516115ab91906134a7565b60405180910390a150565b5f805f600260189054906101000a900461ffff166002601a9054906101000a900461ffff166002601c9054906101000a900461ffff16925092509250909192565b6115ff611c75565b80600160026101000a81548161ffff021916908361ffff1602179055507f269f7677f1796af445e0c26473b7cede0cdee7ee422179b8b7b1438344a73af38160405161164b91906135d2565b60405180910390a150565b61165e611c75565b80600c8484604051611671929190613efe565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055507fc8729436e2f8fcb79ab0f757a04f56302b14f2f2c80b43f0caa626870ca115068383836040516116c8939291906145bb565b60405180910390a1505050565b6116dd611c75565b61170f6116e861254b565b828473ffffffffffffffffffffffffffffffffffffffff166125529092919063ffffffff16565b5050565b61171b611c75565b836005819055508260068190555081600781905550806008819055507f843719a8988f9a856dfa922ecd43b71c9dcfcedbd2d42f44fbf1ed39a93666068484848460405161176c9493929190613723565b60405180910390a150505050565b611782611c75565b836001600c6101000a81548163ffffffff021916908363ffffffff16021790555082600160106101000a81548163ffffffff021916908363ffffffff16021790555081600160046101000a81548163ffffffff021916908363ffffffff16021790555080600160086101000a81548163ffffffff021916908363ffffffff1602179055507fcac069ca087ac0dfda6b83c11d979488cb43699e375b64862130e9005b1c33e98484848460405161183b9493929190613784565b60405180910390a150505050565b5f600a8260405161185a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f9054906101000a900461ffff16905090565b6118d5611c75565b610dac8361ffff16111580156118f15750610dac8261ffff1611155b801561190357506101f48161ffff1611155b611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613e4a565b60405180910390fd5b82600260186101000a81548161ffff021916908361ffff160217905550816002601a6101000a81548161ffff021916908361ffff160217905550806002601c6101000a81548161ffff021916908361ffff1602179055507f29f254017ff4765c884ec3d1a19c84421b8afb55dc41de389a9869699b3a03858383836040516119cc939291906133d5565b60405180910390a1505050565b5f600c83836040516119ec929190613efe565b90815260200160405180910390205f9054906101000a900460ff16905092915050565b611a17611c75565b8060015f6101000a81548161ffff021916908361ffff1602179055507fa5d64adc4dabd69870f1a872d07b3d117150f1bfd0d046d7c35243f141fe081981604051611a6291906135d2565b60405180910390a150565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b611ac8611c75565b61271061ffff168161ffff161115611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613e4a565b60405180910390fd5b80600260146101000a81548161ffff021916908361ffff1602179055507f39bbc533273be90b6ca32ee9b59e96795cf54c48c5388c9c00af1e509d2ffbb981604051611b6191906135d2565b60405180910390a150565b611b74611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd99061465b565b60405180910390fd5b611beb81611ea6565b50565b611bf6611c75565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611c7d61254b565b73ffffffffffffffffffffffffffffffffffffffff16611c9b6114bf565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906146c3565b60405180910390fd5b565b80471015611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d9061472b565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611d5b90614776565b5f6040518083038185875af1925050503d805f8114611d95576040519150601f19603f3d011682016040523d82523d5f602084013e611d9a565b606091505b5050905080611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd5906147fa565b60405180910390fd5b505050565b611deb611f67565b6001600f5f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e2e61254b565b604051611e3b919061370a565b60405180910390a1565b611e4d6125d8565b5f600f5f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e8f61254b565b604051611e9c919061370a565b60405180910390a1565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f6f610ea2565b15611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614862565b60405180910390fd5b565b611fb96132a1565b611fc16132a1565b5f60149054906101000a900461ffff16815f019061ffff16908161ffff16815250505f60169054906101000a900461ffff16816020019061ffff16908161ffff16815250505f60189054906101000a900461ffff16816040019061ffff16908161ffff16815250505f601a9054906101000a900461ffff16816060019061ffff16908161ffff16815250505f601c9054906101000a900461ffff16816080019061ffff16908161ffff16815250505f601e9054906101000a900461ffff168160a0019061ffff16908161ffff168152505060015f9054906101000a900461ffff168160c0019061ffff16908161ffff1681525050600160029054906101000a900461ffff168160e0019061ffff16908161ffff1681525050600160049054906101000a900463ffffffff1681610100019063ffffffff16908163ffffffff1681525050600160089054906101000a900463ffffffff1681610120019063ffffffff16908163ffffffff16815250506001600c9054906101000a900463ffffffff1681610140019063ffffffff16908163ffffffff1681525050600c8360405161216a919061403c565b90815260200160405180910390205f9054906101000a900460ff166121a157600160109054906101000a900463ffffffff166121c3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b81610160019063ffffffff16908163ffffffff168152505080915050919050565b5f806121ee61254b565b90505f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050600260169054906101000a900461ffff1661ffff168161ffff1610612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f906148ca565b60405180910390fd5b806122a2906148e8565b905080600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055506123088560a00151612621565b5f855f01514260405160200161231f929190614931565b6040516020818303038152906040528051906020012090505f865f015160405160200161234c919061403c565b6040516020818303038152906040528051906020012090505f3085898960405160200161237c9493929190614958565b60405160208183030381529060405290505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d76fad238486856040518463ffffffff1660e01b81526004016123ec939291906149eb565b6020604051808303815f875af1158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c9190614a3b565b905080600a8a5f0151604051612442919061403c565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080965050505050505092915050565b5f805f805f805f805f8960c001518060200190518101906124bd9190614a7a565b945094509450945094505f8211612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614b3b565b60405180910390fd5b5f806125168d85896127d2565b915091505f8761252e5761252b8e8486612b88565b90505b868683839b509b509b509b50505050505050505092959194509250565b5f33905090565b6125d38363a9059cbb60e01b8484604051602401612571929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6125e0610ea2565b61261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690614ba3565b60405180910390fd5b565b5f805f838060200190518101906126389190614be9565b96509650965050505050600260189054906101000a900461ffff1661ffff168361ffff161115801561268257506002601a9054906101000a900461ffff1661ffff168261ffff1611155b80156126a657506002601c9054906101000a900461ffff1661ffff168161ffff1611155b6126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90614cd0565b60405180910390fd5b5f60015f9054906101000a900461ffff16905061271061ffff1661271061ffff16826127106127149190614cee565b61ffff1684876127249190614cee565b61ffff166127329190614d23565b61273c9190614d91565b1115801561278c575061271061ffff1661271061ffff16826127106127619190614cee565b61ffff1684866127719190614cee565b61ffff1661277f9190614d23565b6127899190614d91565b11155b6127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614e0b565b60405180910390fd5b5050505050565b5f805f808673ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa15801561281f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128439190614e29565b50915091505f8290505f8873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612886919061370a565b602060405180830381865afa1580156128a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c59190614e79565b90506128f282828b73ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054881015612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296990614eee565b60405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a6e575f8273ffffffffffffffffffffffffffffffffffffffff1663f305d7198a8c855f808e6129e657306129ea565b61dead5b61012c426129f89190614126565b6040518863ffffffff1660e01b8152600401612a1996959493929190614f45565b60606040518083038185885af1158015612a35573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a5a9190614fa4565b925050508089965096505050505050612b80565b612aa2612a7961254b565b308a8673ffffffffffffffffffffffffffffffffffffffff16613053909392919063ffffffff16565b612acd82898573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b5f8273ffffffffffffffffffffffffffffffffffffffff1663e8e337008b86858d5f808f612afb5730612aff565b61dead5b61012c42612b0d9190614126565b6040518963ffffffff1660e01b8152600401612b30989796959493929190614ff4565b6060604051808303815f875af1158015612b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b709190614fa4565b92505050805f9650965050505050505b935093915050565b5f600454821015612bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc5906150ba565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa158015612c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c3d9190614e29565b92505091505f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790615122565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa158015612d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d7f9190615258565b5f01519050612daf82888573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff16638af416f682858a8a42612dda9190614126565b5f6001612de561254b565b6040518863ffffffff1660e01b8152600401612e0696959493929190615284565b5f604051808303818588803b158015612e1d575f80fd5b505af1158015612e2f573d5f803e3d5ffd5b5050505050809450505050509392505050565b5f612ea3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130dc9092919063ffffffff16565b90505f81511480612ec4575080806020019051810190612ec391906140ce565b5b612f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa90615353565b60405180910390fd5b505050565b5f811480612f8e57505f8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612f4d929190615371565b602060405180830381865afa158015612f68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8c9190614e79565b145b612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc490615408565b60405180910390fd5b61304e8363095ea7b360e01b8484604051602401612fec929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6130d6846323b872dd60e01b85858560405160240161307493929190615426565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b50505050565b60606130ea84845f856130f3565b90509392505050565b606082471015613138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312f906154cb565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131609190615519565b5f6040518083038185875af1925050503d805f811461319a576040519150601f19603f3d011682016040523d82523d5f602084013e61319f565b606091505b50915091506131b0878383876131bc565b92505050949350505050565b6060831561321d575f835103613215576131d585613230565b613214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320b90615579565b60405180910390fd5b5b829050613228565b6132278383613252565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156132645781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329891906155cf565b60405180910390fd5b6040518061018001604052805f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6133558161333f565b811461335f575f80fd5b50565b5f813590506133708161334c565b92915050565b5f805f6060848603121561338d5761338c613337565b5b5f61339a86828701613362565b93505060206133ab86828701613362565b92505060406133bc86828701613362565b9150509250925092565b6133cf8161333f565b82525050565b5f6060820190506133e85f8301866133c6565b6133f560208301856133c6565b61340260408301846133c6565b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134338261340a565b9050919050565b61344381613429565b811461344d575f80fd5b50565b5f8135905061345e8161343a565b92915050565b5f6020828403121561347957613478613337565b5b5f61348684828501613450565b91505092915050565b5f819050919050565b6134a18161348f565b82525050565b5f6020820190506134ba5f830184613498565b92915050565b5f6134ca8261340a565b9050919050565b6134da816134c0565b81146134e4575f80fd5b50565b5f813590506134f5816134d1565b92915050565b5f602082840312156135105761350f613337565b5b5f61351d848285016134e7565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261354757613546613526565b5b8235905067ffffffffffffffff8111156135645761356361352a565b5b6020830191508360018202830111156135805761357f61352e565b5b9250929050565b5f806020838503121561359d5761359c613337565b5b5f83013567ffffffffffffffff8111156135ba576135b961333b565b5b6135c685828601613532565b92509250509250929050565b5f6020820190506135e55f8301846133c6565b92915050565b5f60208284031215613600576135ff613337565b5b5f61360d84828501613362565b91505092915050565b5f805f6040848603121561362d5761362c613337565b5b5f84013567ffffffffffffffff81111561364a5761364961333b565b5b61365686828701613532565b9350935050602061366986828701613362565b9150509250925092565b5f8115159050919050565b61368781613673565b82525050565b5f6020820190506136a05f83018461367e565b92915050565b6136af81613673565b81146136b9575f80fd5b50565b5f813590506136ca816136a6565b92915050565b5f602082840312156136e5576136e4613337565b5b5f6136f2848285016136bc565b91505092915050565b61370481613429565b82525050565b5f60208201905061371d5f8301846136fb565b92915050565b5f6080820190506137365f830187613498565b6137436020830186613498565b6137506040830185613498565b61375d6060830184613498565b95945050505050565b5f63ffffffff82169050919050565b61377e81613766565b82525050565b5f6080820190506137975f830187613775565b6137a46020830186613775565b6137b16040830185613775565b6137be6060830184613775565b95945050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613811826137cb565b810181811067ffffffffffffffff821117156138305761382f6137db565b5b80604052505050565b5f61384261332e565b905061384e8282613808565b919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115613875576138746137db565b5b61387e826137cb565b9050602081019050919050565b828183375f83830152505050565b5f6138ab6138a68461385b565b613839565b9050828152602081018484840111156138c7576138c6613857565b5b6138d284828561388b565b509392505050565b5f82601f8301126138ee576138ed613526565b5b81356138fe848260208601613899565b91505092915050565b5f67ffffffffffffffff821115613921576139206137db565b5b61392a826137cb565b9050602081019050919050565b5f61394961394484613907565b613839565b90508281526020810184848401111561396557613964613857565b5b61397084828561388b565b509392505050565b5f82601f83011261398c5761398b613526565b5b813561399c848260208601613937565b91505092915050565b5f60e082840312156139ba576139b96137c7565b5b6139c460e0613839565b90505f82013567ffffffffffffffff8111156139e3576139e2613853565b5b6139ef848285016138da565b5f83015250602082013567ffffffffffffffff811115613a1257613a11613853565b5b613a1e848285016138da565b602083015250604082013567ffffffffffffffff811115613a4257613a41613853565b5b613a4e848285016138da565b604083015250606082013567ffffffffffffffff811115613a7257613a71613853565b5b613a7e84828501613978565b606083015250608082013567ffffffffffffffff811115613aa257613aa1613853565b5b613aae84828501613978565b60808301525060a082013567ffffffffffffffff811115613ad257613ad1613853565b5b613ade84828501613978565b60a08301525060c082013567ffffffffffffffff811115613b0257613b01613853565b5b613b0e84828501613978565b60c08301525092915050565b5f60208284031215613b2f57613b2e613337565b5b5f82013567ffffffffffffffff811115613b4c57613b4b61333b565b5b613b58848285016139a5565b91505092915050565b613b6a8161348f565b8114613b74575f80fd5b50565b5f81359050613b8581613b61565b92915050565b5f8060408385031215613ba157613ba0613337565b5b5f613bae85828601613450565b9250506020613bbf85828601613b77565b9150509250929050565b5f60208284031215613bde57613bdd613337565b5b5f613beb84828501613b77565b91505092915050565b5f805f60408486031215613c0b57613c0a613337565b5b5f84013567ffffffffffffffff811115613c2857613c2761333b565b5b613c3486828701613532565b93509350506020613c47868287016136bc565b9150509250925092565b5f805f8060808587031215613c6957613c68613337565b5b5f613c7687828801613b77565b9450506020613c8787828801613b77565b9350506040613c9887828801613b77565b9250506060613ca987828801613b77565b91505092959194509250565b613cbe81613766565b8114613cc8575f80fd5b50565b5f81359050613cd981613cb5565b92915050565b5f805f8060808587031215613cf757613cf6613337565b5b5f613d0487828801613ccb565b9450506020613d1587828801613ccb565b9350506040613d2687828801613ccb565b9250506060613d3787828801613ccb565b91505092959194509250565b5f60208284031215613d5857613d57613337565b5b5f82013567ffffffffffffffff811115613d7557613d7461333b565b5b613d81848285016138da565b91505092915050565b613d93816134c0565b82525050565b5f602082019050613dac5f830184613d8a565b92915050565b5f8060408385031215613dc857613dc7613337565b5b5f613dd585828601613450565b9250506020613de685828601613450565b9150509250929050565b5f82825260208201905092915050565b7f6f7574206f662072616e676500000000000000000000000000000000000000005f82015250565b5f613e34600c83613df0565b9150613e3f82613e00565b602082019050919050565b5f6020820190508181035f830152613e6181613e28565b9050919050565b7f696e76616c696420706179206163636f756e74000000000000000000000000005f82015250565b5f613e9c601383613df0565b9150613ea782613e68565b602082019050919050565b5f6020820190508181035f830152613ec981613e90565b9050919050565b5f81905092915050565b5f613ee58385613ed0565b9350613ef283858461388b565b82840190509392505050565b5f613f0a828486613eda565b91508190509392505050565b7f696e76616c6964206d616368696e6500000000000000000000000000000000005f82015250565b5f613f4a600f83613df0565b9150613f5582613f16565b602082019050919050565b5f6020820190508181035f830152613f7781613f3e565b9050919050565b5f613f898385613df0565b9350613f9683858461388b565b613f9f836137cb565b840190509392505050565b5f6040820190508181035f830152613fc3818587613f7e565b9050613fd260208301846133c6565b949350505050565b5f81519050919050565b5f5b83811015614001578082015181840152602081019050613fe6565b5f8484015250505050565b5f61401682613fda565b6140208185613ed0565b9350614030818560208601613fe4565b80840191505092915050565b5f614047828461400c565b915081905092915050565b7f6475706c696361746564207575696400000000000000000000000000000000005f82015250565b5f614086600f83613df0565b915061409182614052565b602082019050919050565b5f6020820190508181035f8301526140b38161407a565b9050919050565b5f815190506140c8816136a6565b92915050565b5f602082840312156140e3576140e2613337565b5b5f6140f0848285016140ba565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141308261348f565b915061413b8361348f565b9250828201905080821115614153576141526140f9565b5b92915050565b7f696e73756666696369656e7420657468000000000000000000000000000000005f82015250565b5f61418d601083613df0565b915061419882614159565b602082019050919050565b5f6020820190508181035f8301526141ba81614181565b9050919050565b5f6040820190506141d45f83018561367e565b6141e1602083018461367e565b9392505050565b5f819050919050565b6141fa816141e8565b8114614204575f80fd5b50565b5f81519050614215816141f1565b92915050565b5f602082840312156142305761422f613337565b5b5f61423d84828501614207565b91505092915050565b5f819050919050565b5f61426961426461425f8461340a565b614246565b61340a565b9050919050565b5f61427a8261424f565b9050919050565b5f61428b82614270565b9050919050565b61429b81614281565b82525050565b6142aa816141e8565b82525050565b5f82825260208201905092915050565b5f6142ca82613fda565b6142d481856142b0565b93506142e4818560208601613fe4565b6142ed816137cb565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61431c826142f8565b6143268185614302565b9350614336818560208601613fe4565b61433f816137cb565b840191505092915050565b5f60e083015f8301518482035f86015261436482826142c0565b9150506020830151848203602086015261437e82826142c0565b9150506040830151848203604086015261439882826142c0565b915050606083015184820360608601526143b28282614312565b915050608083015184820360808601526143cc8282614312565b91505060a083015184820360a08601526143e68282614312565b91505060c083015184820360c08601526144008282614312565b9150508091505092915050565b6144168161333f565b82525050565b61442581613766565b82525050565b61018082015f8201516144405f85018261440d565b506020820151614453602085018261440d565b506040820151614466604085018261440d565b506060820151614479606085018261440d565b50608082015161448c608085018261440d565b5060a082015161449f60a085018261440d565b5060c08201516144b260c085018261440d565b5060e08201516144c560e085018261440d565b506101008201516144da61010085018261441c565b506101208201516144ef61012085018261441c565b5061014082015161450461014085018261441c565b5061016082015161451961016085018261441c565b50505050565b5f610240820190506145335f83018a6136fb565b6145406020830189614292565b61454d60408301886136fb565b61455a60608301876142a1565b6145676080830186613498565b81810360a0830152614579818561434a565b905061458860c083018461442b565b98975050505050505050565b5f6040820190506145a75f8301856136fb565b6145b46020830184613498565b9392505050565b5f6040820190508181035f8301526145d4818587613f7e565b90506145e3602083018461367e565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614645602683613df0565b9150614650826145eb565b604082019050919050565b5f6020820190508181035f83015261467281614639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6146ad602083613df0565b91506146b882614679565b602082019050919050565b5f6020820190508181035f8301526146da816146a1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f614715601d83613df0565b9150614720826146e1565b602082019050919050565b5f6020820190508181035f83015261474281614709565b9050919050565b5f81905092915050565b50565b5f6147615f83614749565b915061476c82614753565b5f82019050919050565b5f61478082614756565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f6147e4603a83613df0565b91506147ef8261478a565b604082019050919050565b5f6020820190508181035f830152614811816147d8565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f61484c601083613df0565b915061485782614818565b602082019050919050565b5f6020820190508181035f83015261487981614840565b9050919050565b7f6f766572206c61756e63686564000000000000000000000000000000000000005f82015250565b5f6148b4600d83613df0565b91506148bf82614880565b602082019050919050565b5f6020820190508181035f8301526148e1816148a8565b9050919050565b5f6148f28261333f565b915061ffff8203614906576149056140f9565b5b600182019050919050565b5f819050919050565b61492b6149268261348f565b614911565b82525050565b5f61493c828561400c565b9150614948828461491a565b6020820191508190509392505050565b5f6101e08201905061496c5f8301876136fb565b61497960208301866136fb565b818103604083015261498b818561434a565b905061499a606083018461442b565b95945050505050565b5f82825260208201905092915050565b5f6149bd826142f8565b6149c781856149a3565b93506149d7818560208601613fe4565b6149e0816137cb565b840191505092915050565b5f6060820190506149fe5f8301866142a1565b614a0b60208301856142a1565b8181036040830152614a1d81846149b3565b9050949350505050565b5f81519050614a358161343a565b92915050565b5f60208284031215614a5057614a4f613337565b5b5f614a5d84828501614a27565b91505092915050565b5f81519050614a7481613b61565b92915050565b5f805f805f60a08688031215614a9357614a92613337565b5b5f614aa0888289016140ba565b9550506020614ab1888289016140ba565b9450506040614ac2888289016140ba565b9350506060614ad388828901614a66565b9250506080614ae488828901614a66565b9150509295509295909350565b7f696e76616c6964207061697220746f6b656e20616d6f756e74000000000000005f82015250565b5f614b25601983613df0565b9150614b3082614af1565b602082019050919050565b5f6020820190508181035f830152614b5281614b19565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614b8d601483613df0565b9150614b9882614b59565b602082019050919050565b5f6020820190508181035f830152614bba81614b81565b9050919050565b5f81519050614bcf816134d1565b92915050565b5f81519050614be38161334c565b92915050565b5f805f805f805f60e0888a031215614c0457614c03613337565b5b5f614c118a828b01614bc1565b9750506020614c228a828b01614bc1565b9650506040614c338a828b01614bc1565b9550506060614c448a828b01614bc1565b9450506080614c558a828b01614bd5565b93505060a0614c668a828b01614bd5565b92505060c0614c778a828b01614bd5565b91505092959891949750929550565b7f746f6f206d7563682074617800000000000000000000000000000000000000005f82015250565b5f614cba600c83613df0565b9150614cc582614c86565b602082019050919050565b5f6020820190508181035f830152614ce781614cae565b9050919050565b5f614cf88261333f565b9150614d038361333f565b9250828201905061ffff811115614d1d57614d1c6140f9565b5b92915050565b5f614d2d8261348f565b9150614d388361348f565b9250828202614d468161348f565b91508282048414831517614d5d57614d5c6140f9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614d9b8261348f565b9150614da68361348f565b925082614db657614db5614d64565b5b828204905092915050565b7f746178206f7574206f662072616e6765000000000000000000000000000000005f82015250565b5f614df5601083613df0565b9150614e0082614dc1565b602082019050919050565b5f6020820190508181035f830152614e2281614de9565b9050919050565b5f805f60608486031215614e4057614e3f613337565b5b5f614e4d86828701614a27565b9350506020614e5e86828701614a27565b9250506040614e6f86828701614a27565b9150509250925092565b5f60208284031215614e8e57614e8d613337565b5b5f614e9b84828501614a66565b91505092915050565b7f746f6f20736d616c6c207061697220616d6f756e7400000000000000000000005f82015250565b5f614ed8601583613df0565b9150614ee382614ea4565b602082019050919050565b5f6020820190508181035f830152614f0581614ecc565b9050919050565b5f819050919050565b5f614f2f614f2a614f2584614f0c565b614246565b61348f565b9050919050565b614f3f81614f15565b82525050565b5f60c082019050614f585f8301896136fb565b614f656020830188613498565b614f726040830187614f36565b614f7f6060830186614f36565b614f8c60808301856136fb565b614f9960a0830184613498565b979650505050505050565b5f805f60608486031215614fbb57614fba613337565b5b5f614fc886828701614a66565b9350506020614fd986828701614a66565b9250506040614fea86828701614a66565b9150509250925092565b5f610100820190506150085f83018b6136fb565b615015602083018a6136fb565b6150226040830189613498565b61502f6060830188613498565b61503c6080830187614f36565b61504960a0830186614f36565b61505660c08301856136fb565b61506360e0830184613498565b9998505050505050505050565b7f746f6f2073686f7274206c6f636b0000000000000000000000000000000000005f82015250565b5f6150a4600e83613df0565b91506150af82615070565b602082019050919050565b5f6020820190508181035f8301526150d181615098565b9050919050565b7f756e737570706f727465642064657820666f72206c6f636b00000000000000005f82015250565b5f61510c601883613df0565b9150615117826150d8565b602082019050919050565b5f6020820190508181035f83015261513981615100565b9050919050565b5f61514a82613429565b9050919050565b61515a81615140565b8114615164575f80fd5b50565b5f8151905061517581615151565b92915050565b5f6101208284031215615191576151906137c7565b5b61519c610120613839565b90505f6151ab84828501614a66565b5f8301525060206151be84828501615167565b60208301525060406151d284828501614a66565b60408301525060606151e684828501614a66565b60608301525060806151fa84828501614a66565b60808301525060a061520e84828501614a66565b60a08301525060c061522284828501615167565b60c08301525060e061523684828501614a66565b60e08301525061010061524b84828501614a66565b6101008301525092915050565b5f610120828403121561526e5761526d613337565b5b5f61527b8482850161517b565b91505092915050565b5f60c0820190506152975f8301896136fb565b6152a46020830188613498565b6152b16040830187613498565b6152be6060830186613d8a565b6152cb608083018561367e565b6152d860a0830184613d8a565b979650505050505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f61533d602a83613df0565b9150615348826152e3565b604082019050919050565b5f6020820190508181035f83015261536a81615331565b9050919050565b5f6040820190506153845f8301856136fb565b61539160208301846136fb565b9392505050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f5f8201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b5f6153f2603683613df0565b91506153fd82615398565b604082019050919050565b5f6020820190508181035f83015261541f816153e6565b9050919050565b5f6060820190506154395f8301866136fb565b61544660208301856136fb565b6154536040830184613498565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6154b5602683613df0565b91506154c08261545b565b604082019050919050565b5f6020820190508181035f8301526154e2816154a9565b9050919050565b5f6154f3826142f8565b6154fd8185614749565b935061550d818560208601613fe4565b80840191505092915050565b5f61552482846154e9565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f615563601d83613df0565b915061556e8261552f565b602082019050919050565b5f6020820190508181035f83015261559081615557565b9050919050565b5f6155a182613fda565b6155ab8185613df0565b93506155bb818560208601613fe4565b6155c4816137cb565b840191505092915050565b5f6020820190508181035f8301526155e78184615597565b90509291505056fea2646970667358221220a8b97ddf370cb723016282196be486f5aa06e2377a5f32bc8731f57f78d0278764736f6c6343000818003300000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405260043610610245575f3560e01c8063870f856811610138578063bcf48070116100b5578063cb2df41811610079578063cb2df4181461082f578063e602ab8b1461086b578063eb1c834914610893578063f1c71cd4146108cf578063f2fde38b146108f7578063fd109d771461091f57610245565b8063bcf480701461074f578063c1733f6814610777578063c2d4f942146107b3578063c524e82e146107dd578063c5d419151461080757610245565b8063a103657e116100fc578063a103657e14610683578063a3156826146106af578063acd33f31146106d7578063b29a8140146106ff578063b74e68a51461072757610245565b8063870f8568146105b157806387b27a95146105d95780638da5cb5b1461060957806397abb762146106335780639c030fc01461065b57610245565b806357824338116101c65780637c678b161161018a5780637c678b16146104c757806380857ffa146104f157806380c746531461051e57806381b31abd1461054b57806382b0f7d01461058757610245565b8063578243381461040d5780635c975abb146104355780635f57ef2c1461045f578063715018a61461048757806373ae54b51461049d57610245565b80632b1429181161020d5780632b1429181461033d5780632fdd75bf1461036557806349deaf4f146103915780634a1db646146103bb57806351186e9e146103e557610245565b806305860c24146102495780630d426b00146102715780630d7777581461029d57806313345cf9146102d957806329c66e3814610301575b5f80fd5b348015610254575f80fd5b5061026f600480360381019061026a9190613376565b610947565b005b34801561027c575f80fd5b50610285610a50565b604051610294939291906133d5565b60405180910390f35b3480156102a8575f80fd5b506102c360048036038101906102be9190613464565b610a8e565b6040516102d091906134a7565b60405180910390f35b3480156102e4575f80fd5b506102ff60048036038101906102fa91906134fb565b610ad4565b005b34801561030c575f80fd5b5061032760048036038101906103229190613587565b610bed565b60405161033491906135d2565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190613464565b610c4f565b005b348015610370575f80fd5b50610379610d08565b604051610388939291906133d5565b60405180910390f35b34801561039c575f80fd5b506103a5610d46565b6040516103b291906135d2565b60405180910390f35b3480156103c6575f80fd5b506103cf610d5d565b6040516103dc91906135d2565b60405180910390f35b3480156103f0575f80fd5b5061040b600480360381019061040691906135eb565b610d74565b005b348015610418575f80fd5b50610433600480360381019061042e9190613616565b610dd3565b005b348015610440575f80fd5b50610449610ea2565b604051610456919061368d565b60405180910390f35b34801561046a575f80fd5b50610485600480360381019061048091906136d0565b610eb7565b005b348015610492575f80fd5b5061049b610ede565b005b3480156104a8575f80fd5b506104b1610ef1565b6040516104be91906134a7565b60405180910390f35b3480156104d2575f80fd5b506104db610efa565b6040516104e8919061370a565b60405180910390f35b3480156104fc575f80fd5b50610505610f22565b6040516105159493929190613723565b60405180910390f35b348015610529575f80fd5b50610532610f40565b6040516105429493929190613784565b60405180910390f35b348015610556575f80fd5b50610571600480360381019061056c9190613464565b610f9e565b60405161057e919061370a565b60405180910390f35b348015610592575f80fd5b5061059b611003565b6040516105a891906135d2565b60405180910390f35b3480156105bc575f80fd5b506105d760048036038101906105d29190613376565b61101a565b005b6105f360048036038101906105ee9190613b1a565b611123565b604051610600919061370a565b60405180910390f35b348015610614575f80fd5b5061061d6114bf565b60405161062a919061370a565b60405180910390f35b34801561063e575f80fd5b5061065960048036038101906106549190613b8b565b6114e6565b005b348015610666575f80fd5b50610681600480360381019061067c9190613bc9565b61156d565b005b34801561068e575f80fd5b506106976115b6565b6040516106a6939291906133d5565b60405180910390f35b3480156106ba575f80fd5b506106d560048036038101906106d091906135eb565b6115f7565b005b3480156106e2575f80fd5b506106fd60048036038101906106f89190613bf4565b611656565b005b34801561070a575f80fd5b5061072560048036038101906107209190613b8b565b6116d5565b005b348015610732575f80fd5b5061074d60048036038101906107489190613c51565b611713565b005b34801561075a575f80fd5b5061077560048036038101906107709190613cdf565b61177a565b005b348015610782575f80fd5b5061079d60048036038101906107989190613d43565b611849565b6040516107aa919061370a565b60405180910390f35b3480156107be575f80fd5b506107c761188f565b6040516107d49190613d99565b60405180910390f35b3480156107e8575f80fd5b506107f16118b7565b6040516107fe91906135d2565b60405180910390f35b348015610812575f80fd5b5061082d60048036038101906108289190613376565b6118cd565b005b34801561083a575f80fd5b5061085560048036038101906108509190613587565b6119d9565b604051610862919061368d565b60405180910390f35b348015610876575f80fd5b50610891600480360381019061088c91906135eb565b611a0f565b005b34801561089e575f80fd5b506108b960048036038101906108b49190613464565b611a6d565b6040516108c691906135d2565b60405180910390f35b3480156108da575f80fd5b506108f560048036038101906108f091906135eb565b611ac0565b005b348015610902575f80fd5b5061091d60048036038101906109189190613464565b611b6c565b005b34801561092a575f80fd5b5061094560048036038101906109409190613db2565b611bee565b005b61094f611c75565b610dac8361ffff161115801561096b5750610dac8261ffff1611155b801561097d57506101f48161ffff1611155b6109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390613e4a565b60405180910390fd5b825f601a6101000a81548161ffff021916908361ffff160217905550815f601c6101000a81548161ffff021916908361ffff160217905550805f601e6101000a81548161ffff021916908361ffff1602179055507f8157027eb85fd89b2efb2911c47299c62a2f43927770288915a57ff5aa9aff78838383604051610a43939291906133d5565b60405180910390a1505050565b5f805f8060149054906101000a900461ffff165f60169054906101000a900461ffff165f60189054906101000a900461ffff16925092509250909192565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610adc611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613eb2565b60405180910390fd5b610b735f8273ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3625e9e992e84551991603867426211da9c3e048e19eb2aac8e5f1bda7e5f92b81604051610be29190613d99565b60405180910390a150565b5f80600b8484604051610c01929190613efe565b90815260200160405180910390205f9054906101000a900461ffff1690505f8161ffff161115610c345780915050610c49565b600260149054906101000a900461ffff169150505b92915050565b610c57611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90613f60565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f80601a9054906101000a900461ffff165f601c9054906101000a900461ffff165f601e9054906101000a900461ffff16925092509250909192565b5f600160029054906101000a900461ffff16905090565b5f600260149054906101000a900461ffff16905090565b610d7c611c75565b80600260166101000a81548161ffff021916908361ffff1602179055507f0d5dfa7e3ffdf0daca1d63bd5ab5c65827be4c580153bef4544eb2512afa12bf81604051610dc891906135d2565b60405180910390a150565b610ddb611c75565b61271061ffff168161ffff161115610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90613e4a565b60405180910390fd5b80600b8484604051610e3b929190613efe565b90815260200160405180910390205f6101000a81548161ffff021916908361ffff1602179055507fa9a9f157d989d2731dd74a16d2e9f7e9caacb51e0a7cd33b7ec6a1d3908f5520838383604051610e9593929190613faa565b60405180910390a1505050565b5f600f5f9054906101000a900460ff16905090565b610ebf611c75565b8015610ed257610ecd611de3565b610edb565b610eda611e45565b5b50565b610ee6611c75565b610eef5f611ea6565b565b5f600454905090565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f80600554600654600754600854935093509350935090919293565b5f805f806001600c9054906101000a900463ffffffff16600160109054906101000a900463ffffffff16600160049054906101000a900463ffffffff16600160089054906101000a900463ffffffff16935093509350935090919293565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f600260169054906101000a900461ffff16905090565b611022611c75565b610dac8361ffff161115801561103e57506107d08261ffff1611155b801561105057506103e88161ffff1611155b61108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690613e4a565b60405180910390fd5b825f60146101000a81548161ffff021916908361ffff160217905550815f60166101000a81548161ffff021916908361ffff160217905550805f60186101000a81548161ffff021916908361ffff1602179055507f5fa708f2b10f2c2a41a460fe7ec148a656813df1ea95b47e8161bc95166e5a92838383604051611116939291906133d5565b60405180910390a1505050565b5f61112c611f67565b5f3490505f73ffffffffffffffffffffffffffffffffffffffff16600a845f015160405161115a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d59061409c565b60405180910390fd5b5f6111eb845f0151611fb1565b90505f6111f885836121e4565b90505f805f80611208858a61249c565b93509350935093505f8573ffffffffffffffffffffffffffffffffffffffff16633e4042286040518163ffffffff1660e01b8152600401602060405180830381865afa15801561125a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127e91906140ce565b611288575f61128c565b6008545b84611297575f61129b565b6007545b866112a6575f6112aa565b6006545b6005546112b79190614126565b6112c19190614126565b6112cb9190614126565b90508183826112da9190614126565b6112e49190614126565b881015611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906141a3565b60405180910390fd5b6113704760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff1663f519b7d386866040518363ffffffff1660e01b81526004016113ab9291906141c1565b5f604051808303815f87803b1580156113c2575f80fd5b505af11580156113d4573d5f803e3d5ffd5b505050507fd6f6c63246dd4d36ff9d157c9159371381ee8be9d1475eab442af8743fdab6568660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661142461254b565b8973ffffffffffffffffffffffffffffffffffffffff1663b4b37bd26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611491919061421b565b858f8d6040516114a7979695949392919061451f565b60405180910390a18598505050505050505050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114ee611c75565b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f4fe473bd5cc90e6c73cf11d29f6cc091faa692024afacfdb69bc9a9abebfb6188282604051611561929190614594565b60405180910390a15050565b611575611c75565b806004819055507fe818ff6972bf8970ca14a893539e57452588b197b76e6afe29c40a31b3363c61816040516115ab91906134a7565b60405180910390a150565b5f805f600260189054906101000a900461ffff166002601a9054906101000a900461ffff166002601c9054906101000a900461ffff16925092509250909192565b6115ff611c75565b80600160026101000a81548161ffff021916908361ffff1602179055507f269f7677f1796af445e0c26473b7cede0cdee7ee422179b8b7b1438344a73af38160405161164b91906135d2565b60405180910390a150565b61165e611c75565b80600c8484604051611671929190613efe565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055507fc8729436e2f8fcb79ab0f757a04f56302b14f2f2c80b43f0caa626870ca115068383836040516116c8939291906145bb565b60405180910390a1505050565b6116dd611c75565b61170f6116e861254b565b828473ffffffffffffffffffffffffffffffffffffffff166125529092919063ffffffff16565b5050565b61171b611c75565b836005819055508260068190555081600781905550806008819055507f843719a8988f9a856dfa922ecd43b71c9dcfcedbd2d42f44fbf1ed39a93666068484848460405161176c9493929190613723565b60405180910390a150505050565b611782611c75565b836001600c6101000a81548163ffffffff021916908363ffffffff16021790555082600160106101000a81548163ffffffff021916908363ffffffff16021790555081600160046101000a81548163ffffffff021916908363ffffffff16021790555080600160086101000a81548163ffffffff021916908363ffffffff1602179055507fcac069ca087ac0dfda6b83c11d979488cb43699e375b64862130e9005b1c33e98484848460405161183b9493929190613784565b60405180910390a150505050565b5f600a8260405161185a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f9054906101000a900461ffff16905090565b6118d5611c75565b610dac8361ffff16111580156118f15750610dac8261ffff1611155b801561190357506101f48161ffff1611155b611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613e4a565b60405180910390fd5b82600260186101000a81548161ffff021916908361ffff160217905550816002601a6101000a81548161ffff021916908361ffff160217905550806002601c6101000a81548161ffff021916908361ffff1602179055507f29f254017ff4765c884ec3d1a19c84421b8afb55dc41de389a9869699b3a03858383836040516119cc939291906133d5565b60405180910390a1505050565b5f600c83836040516119ec929190613efe565b90815260200160405180910390205f9054906101000a900460ff16905092915050565b611a17611c75565b8060015f6101000a81548161ffff021916908361ffff1602179055507fa5d64adc4dabd69870f1a872d07b3d117150f1bfd0d046d7c35243f141fe081981604051611a6291906135d2565b60405180910390a150565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b611ac8611c75565b61271061ffff168161ffff161115611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613e4a565b60405180910390fd5b80600260146101000a81548161ffff021916908361ffff1602179055507f39bbc533273be90b6ca32ee9b59e96795cf54c48c5388c9c00af1e509d2ffbb981604051611b6191906135d2565b60405180910390a150565b611b74611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd99061465b565b60405180910390fd5b611beb81611ea6565b50565b611bf6611c75565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611c7d61254b565b73ffffffffffffffffffffffffffffffffffffffff16611c9b6114bf565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906146c3565b60405180910390fd5b565b80471015611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d9061472b565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611d5b90614776565b5f6040518083038185875af1925050503d805f8114611d95576040519150601f19603f3d011682016040523d82523d5f602084013e611d9a565b606091505b5050905080611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd5906147fa565b60405180910390fd5b505050565b611deb611f67565b6001600f5f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e2e61254b565b604051611e3b919061370a565b60405180910390a1565b611e4d6125d8565b5f600f5f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e8f61254b565b604051611e9c919061370a565b60405180910390a1565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f6f610ea2565b15611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614862565b60405180910390fd5b565b611fb96132a1565b611fc16132a1565b5f60149054906101000a900461ffff16815f019061ffff16908161ffff16815250505f60169054906101000a900461ffff16816020019061ffff16908161ffff16815250505f60189054906101000a900461ffff16816040019061ffff16908161ffff16815250505f601a9054906101000a900461ffff16816060019061ffff16908161ffff16815250505f601c9054906101000a900461ffff16816080019061ffff16908161ffff16815250505f601e9054906101000a900461ffff168160a0019061ffff16908161ffff168152505060015f9054906101000a900461ffff168160c0019061ffff16908161ffff1681525050600160029054906101000a900461ffff168160e0019061ffff16908161ffff1681525050600160049054906101000a900463ffffffff1681610100019063ffffffff16908163ffffffff1681525050600160089054906101000a900463ffffffff1681610120019063ffffffff16908163ffffffff16815250506001600c9054906101000a900463ffffffff1681610140019063ffffffff16908163ffffffff1681525050600c8360405161216a919061403c565b90815260200160405180910390205f9054906101000a900460ff166121a157600160109054906101000a900463ffffffff166121c3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b81610160019063ffffffff16908163ffffffff168152505080915050919050565b5f806121ee61254b565b90505f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050600260169054906101000a900461ffff1661ffff168161ffff1610612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f906148ca565b60405180910390fd5b806122a2906148e8565b905080600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055506123088560a00151612621565b5f855f01514260405160200161231f929190614931565b6040516020818303038152906040528051906020012090505f865f015160405160200161234c919061403c565b6040516020818303038152906040528051906020012090505f3085898960405160200161237c9493929190614958565b60405160208183030381529060405290505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d76fad238486856040518463ffffffff1660e01b81526004016123ec939291906149eb565b6020604051808303815f875af1158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c9190614a3b565b905080600a8a5f0151604051612442919061403c565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080965050505050505092915050565b5f805f805f805f805f8960c001518060200190518101906124bd9190614a7a565b945094509450945094505f8211612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614b3b565b60405180910390fd5b5f806125168d85896127d2565b915091505f8761252e5761252b8e8486612b88565b90505b868683839b509b509b509b50505050505050505092959194509250565b5f33905090565b6125d38363a9059cbb60e01b8484604051602401612571929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6125e0610ea2565b61261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690614ba3565b60405180910390fd5b565b5f805f838060200190518101906126389190614be9565b96509650965050505050600260189054906101000a900461ffff1661ffff168361ffff161115801561268257506002601a9054906101000a900461ffff1661ffff168261ffff1611155b80156126a657506002601c9054906101000a900461ffff1661ffff168161ffff1611155b6126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90614cd0565b60405180910390fd5b5f60015f9054906101000a900461ffff16905061271061ffff1661271061ffff16826127106127149190614cee565b61ffff1684876127249190614cee565b61ffff166127329190614d23565b61273c9190614d91565b1115801561278c575061271061ffff1661271061ffff16826127106127619190614cee565b61ffff1684866127719190614cee565b61ffff1661277f9190614d23565b6127899190614d91565b11155b6127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614e0b565b60405180910390fd5b5050505050565b5f805f808673ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa15801561281f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128439190614e29565b50915091505f8290505f8873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612886919061370a565b602060405180830381865afa1580156128a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c59190614e79565b90506128f282828b73ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054881015612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296990614eee565b60405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a6e575f8273ffffffffffffffffffffffffffffffffffffffff1663f305d7198a8c855f808e6129e657306129ea565b61dead5b61012c426129f89190614126565b6040518863ffffffff1660e01b8152600401612a1996959493929190614f45565b60606040518083038185885af1158015612a35573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a5a9190614fa4565b925050508089965096505050505050612b80565b612aa2612a7961254b565b308a8673ffffffffffffffffffffffffffffffffffffffff16613053909392919063ffffffff16565b612acd82898573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b5f8273ffffffffffffffffffffffffffffffffffffffff1663e8e337008b86858d5f808f612afb5730612aff565b61dead5b61012c42612b0d9190614126565b6040518963ffffffff1660e01b8152600401612b30989796959493929190614ff4565b6060604051808303815f875af1158015612b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b709190614fa4565b92505050805f9650965050505050505b935093915050565b5f600454821015612bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc5906150ba565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa158015612c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c3d9190614e29565b92505091505f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790615122565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa158015612d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d7f9190615258565b5f01519050612daf82888573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff16638af416f682858a8a42612dda9190614126565b5f6001612de561254b565b6040518863ffffffff1660e01b8152600401612e0696959493929190615284565b5f604051808303818588803b158015612e1d575f80fd5b505af1158015612e2f573d5f803e3d5ffd5b5050505050809450505050509392505050565b5f612ea3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130dc9092919063ffffffff16565b90505f81511480612ec4575080806020019051810190612ec391906140ce565b5b612f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa90615353565b60405180910390fd5b505050565b5f811480612f8e57505f8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612f4d929190615371565b602060405180830381865afa158015612f68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8c9190614e79565b145b612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc490615408565b60405180910390fd5b61304e8363095ea7b360e01b8484604051602401612fec929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6130d6846323b872dd60e01b85858560405160240161307493929190615426565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b50505050565b60606130ea84845f856130f3565b90509392505050565b606082471015613138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312f906154cb565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131609190615519565b5f6040518083038185875af1925050503d805f811461319a576040519150601f19603f3d011682016040523d82523d5f602084013e61319f565b606091505b50915091506131b0878383876131bc565b92505050949350505050565b6060831561321d575f835103613215576131d585613230565b613214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320b90615579565b60405180910390fd5b5b829050613228565b6132278383613252565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156132645781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329891906155cf565b60405180910390fd5b6040518061018001604052805f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6133558161333f565b811461335f575f80fd5b50565b5f813590506133708161334c565b92915050565b5f805f6060848603121561338d5761338c613337565b5b5f61339a86828701613362565b93505060206133ab86828701613362565b92505060406133bc86828701613362565b9150509250925092565b6133cf8161333f565b82525050565b5f6060820190506133e85f8301866133c6565b6133f560208301856133c6565b61340260408301846133c6565b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134338261340a565b9050919050565b61344381613429565b811461344d575f80fd5b50565b5f8135905061345e8161343a565b92915050565b5f6020828403121561347957613478613337565b5b5f61348684828501613450565b91505092915050565b5f819050919050565b6134a18161348f565b82525050565b5f6020820190506134ba5f830184613498565b92915050565b5f6134ca8261340a565b9050919050565b6134da816134c0565b81146134e4575f80fd5b50565b5f813590506134f5816134d1565b92915050565b5f602082840312156135105761350f613337565b5b5f61351d848285016134e7565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261354757613546613526565b5b8235905067ffffffffffffffff8111156135645761356361352a565b5b6020830191508360018202830111156135805761357f61352e565b5b9250929050565b5f806020838503121561359d5761359c613337565b5b5f83013567ffffffffffffffff8111156135ba576135b961333b565b5b6135c685828601613532565b92509250509250929050565b5f6020820190506135e55f8301846133c6565b92915050565b5f60208284031215613600576135ff613337565b5b5f61360d84828501613362565b91505092915050565b5f805f6040848603121561362d5761362c613337565b5b5f84013567ffffffffffffffff81111561364a5761364961333b565b5b61365686828701613532565b9350935050602061366986828701613362565b9150509250925092565b5f8115159050919050565b61368781613673565b82525050565b5f6020820190506136a05f83018461367e565b92915050565b6136af81613673565b81146136b9575f80fd5b50565b5f813590506136ca816136a6565b92915050565b5f602082840312156136e5576136e4613337565b5b5f6136f2848285016136bc565b91505092915050565b61370481613429565b82525050565b5f60208201905061371d5f8301846136fb565b92915050565b5f6080820190506137365f830187613498565b6137436020830186613498565b6137506040830185613498565b61375d6060830184613498565b95945050505050565b5f63ffffffff82169050919050565b61377e81613766565b82525050565b5f6080820190506137975f830187613775565b6137a46020830186613775565b6137b16040830185613775565b6137be6060830184613775565b95945050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613811826137cb565b810181811067ffffffffffffffff821117156138305761382f6137db565b5b80604052505050565b5f61384261332e565b905061384e8282613808565b919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115613875576138746137db565b5b61387e826137cb565b9050602081019050919050565b828183375f83830152505050565b5f6138ab6138a68461385b565b613839565b9050828152602081018484840111156138c7576138c6613857565b5b6138d284828561388b565b509392505050565b5f82601f8301126138ee576138ed613526565b5b81356138fe848260208601613899565b91505092915050565b5f67ffffffffffffffff821115613921576139206137db565b5b61392a826137cb565b9050602081019050919050565b5f61394961394484613907565b613839565b90508281526020810184848401111561396557613964613857565b5b61397084828561388b565b509392505050565b5f82601f83011261398c5761398b613526565b5b813561399c848260208601613937565b91505092915050565b5f60e082840312156139ba576139b96137c7565b5b6139c460e0613839565b90505f82013567ffffffffffffffff8111156139e3576139e2613853565b5b6139ef848285016138da565b5f83015250602082013567ffffffffffffffff811115613a1257613a11613853565b5b613a1e848285016138da565b602083015250604082013567ffffffffffffffff811115613a4257613a41613853565b5b613a4e848285016138da565b604083015250606082013567ffffffffffffffff811115613a7257613a71613853565b5b613a7e84828501613978565b606083015250608082013567ffffffffffffffff811115613aa257613aa1613853565b5b613aae84828501613978565b60808301525060a082013567ffffffffffffffff811115613ad257613ad1613853565b5b613ade84828501613978565b60a08301525060c082013567ffffffffffffffff811115613b0257613b01613853565b5b613b0e84828501613978565b60c08301525092915050565b5f60208284031215613b2f57613b2e613337565b5b5f82013567ffffffffffffffff811115613b4c57613b4b61333b565b5b613b58848285016139a5565b91505092915050565b613b6a8161348f565b8114613b74575f80fd5b50565b5f81359050613b8581613b61565b92915050565b5f8060408385031215613ba157613ba0613337565b5b5f613bae85828601613450565b9250506020613bbf85828601613b77565b9150509250929050565b5f60208284031215613bde57613bdd613337565b5b5f613beb84828501613b77565b91505092915050565b5f805f60408486031215613c0b57613c0a613337565b5b5f84013567ffffffffffffffff811115613c2857613c2761333b565b5b613c3486828701613532565b93509350506020613c47868287016136bc565b9150509250925092565b5f805f8060808587031215613c6957613c68613337565b5b5f613c7687828801613b77565b9450506020613c8787828801613b77565b9350506040613c9887828801613b77565b9250506060613ca987828801613b77565b91505092959194509250565b613cbe81613766565b8114613cc8575f80fd5b50565b5f81359050613cd981613cb5565b92915050565b5f805f8060808587031215613cf757613cf6613337565b5b5f613d0487828801613ccb565b9450506020613d1587828801613ccb565b9350506040613d2687828801613ccb565b9250506060613d3787828801613ccb565b91505092959194509250565b5f60208284031215613d5857613d57613337565b5b5f82013567ffffffffffffffff811115613d7557613d7461333b565b5b613d81848285016138da565b91505092915050565b613d93816134c0565b82525050565b5f602082019050613dac5f830184613d8a565b92915050565b5f8060408385031215613dc857613dc7613337565b5b5f613dd585828601613450565b9250506020613de685828601613450565b9150509250929050565b5f82825260208201905092915050565b7f6f7574206f662072616e676500000000000000000000000000000000000000005f82015250565b5f613e34600c83613df0565b9150613e3f82613e00565b602082019050919050565b5f6020820190508181035f830152613e6181613e28565b9050919050565b7f696e76616c696420706179206163636f756e74000000000000000000000000005f82015250565b5f613e9c601383613df0565b9150613ea782613e68565b602082019050919050565b5f6020820190508181035f830152613ec981613e90565b9050919050565b5f81905092915050565b5f613ee58385613ed0565b9350613ef283858461388b565b82840190509392505050565b5f613f0a828486613eda565b91508190509392505050565b7f696e76616c6964206d616368696e6500000000000000000000000000000000005f82015250565b5f613f4a600f83613df0565b9150613f5582613f16565b602082019050919050565b5f6020820190508181035f830152613f7781613f3e565b9050919050565b5f613f898385613df0565b9350613f9683858461388b565b613f9f836137cb565b840190509392505050565b5f6040820190508181035f830152613fc3818587613f7e565b9050613fd260208301846133c6565b949350505050565b5f81519050919050565b5f5b83811015614001578082015181840152602081019050613fe6565b5f8484015250505050565b5f61401682613fda565b6140208185613ed0565b9350614030818560208601613fe4565b80840191505092915050565b5f614047828461400c565b915081905092915050565b7f6475706c696361746564207575696400000000000000000000000000000000005f82015250565b5f614086600f83613df0565b915061409182614052565b602082019050919050565b5f6020820190508181035f8301526140b38161407a565b9050919050565b5f815190506140c8816136a6565b92915050565b5f602082840312156140e3576140e2613337565b5b5f6140f0848285016140ba565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141308261348f565b915061413b8361348f565b9250828201905080821115614153576141526140f9565b5b92915050565b7f696e73756666696369656e7420657468000000000000000000000000000000005f82015250565b5f61418d601083613df0565b915061419882614159565b602082019050919050565b5f6020820190508181035f8301526141ba81614181565b9050919050565b5f6040820190506141d45f83018561367e565b6141e1602083018461367e565b9392505050565b5f819050919050565b6141fa816141e8565b8114614204575f80fd5b50565b5f81519050614215816141f1565b92915050565b5f602082840312156142305761422f613337565b5b5f61423d84828501614207565b91505092915050565b5f819050919050565b5f61426961426461425f8461340a565b614246565b61340a565b9050919050565b5f61427a8261424f565b9050919050565b5f61428b82614270565b9050919050565b61429b81614281565b82525050565b6142aa816141e8565b82525050565b5f82825260208201905092915050565b5f6142ca82613fda565b6142d481856142b0565b93506142e4818560208601613fe4565b6142ed816137cb565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61431c826142f8565b6143268185614302565b9350614336818560208601613fe4565b61433f816137cb565b840191505092915050565b5f60e083015f8301518482035f86015261436482826142c0565b9150506020830151848203602086015261437e82826142c0565b9150506040830151848203604086015261439882826142c0565b915050606083015184820360608601526143b28282614312565b915050608083015184820360808601526143cc8282614312565b91505060a083015184820360a08601526143e68282614312565b91505060c083015184820360c08601526144008282614312565b9150508091505092915050565b6144168161333f565b82525050565b61442581613766565b82525050565b61018082015f8201516144405f85018261440d565b506020820151614453602085018261440d565b506040820151614466604085018261440d565b506060820151614479606085018261440d565b50608082015161448c608085018261440d565b5060a082015161449f60a085018261440d565b5060c08201516144b260c085018261440d565b5060e08201516144c560e085018261440d565b506101008201516144da61010085018261441c565b506101208201516144ef61012085018261441c565b5061014082015161450461014085018261441c565b5061016082015161451961016085018261441c565b50505050565b5f610240820190506145335f83018a6136fb565b6145406020830189614292565b61454d60408301886136fb565b61455a60608301876142a1565b6145676080830186613498565b81810360a0830152614579818561434a565b905061458860c083018461442b565b98975050505050505050565b5f6040820190506145a75f8301856136fb565b6145b46020830184613498565b9392505050565b5f6040820190508181035f8301526145d4818587613f7e565b90506145e3602083018461367e565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614645602683613df0565b9150614650826145eb565b604082019050919050565b5f6020820190508181035f83015261467281614639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6146ad602083613df0565b91506146b882614679565b602082019050919050565b5f6020820190508181035f8301526146da816146a1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f614715601d83613df0565b9150614720826146e1565b602082019050919050565b5f6020820190508181035f83015261474281614709565b9050919050565b5f81905092915050565b50565b5f6147615f83614749565b915061476c82614753565b5f82019050919050565b5f61478082614756565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f6147e4603a83613df0565b91506147ef8261478a565b604082019050919050565b5f6020820190508181035f830152614811816147d8565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f61484c601083613df0565b915061485782614818565b602082019050919050565b5f6020820190508181035f83015261487981614840565b9050919050565b7f6f766572206c61756e63686564000000000000000000000000000000000000005f82015250565b5f6148b4600d83613df0565b91506148bf82614880565b602082019050919050565b5f6020820190508181035f8301526148e1816148a8565b9050919050565b5f6148f28261333f565b915061ffff8203614906576149056140f9565b5b600182019050919050565b5f819050919050565b61492b6149268261348f565b614911565b82525050565b5f61493c828561400c565b9150614948828461491a565b6020820191508190509392505050565b5f6101e08201905061496c5f8301876136fb565b61497960208301866136fb565b818103604083015261498b818561434a565b905061499a606083018461442b565b95945050505050565b5f82825260208201905092915050565b5f6149bd826142f8565b6149c781856149a3565b93506149d7818560208601613fe4565b6149e0816137cb565b840191505092915050565b5f6060820190506149fe5f8301866142a1565b614a0b60208301856142a1565b8181036040830152614a1d81846149b3565b9050949350505050565b5f81519050614a358161343a565b92915050565b5f60208284031215614a5057614a4f613337565b5b5f614a5d84828501614a27565b91505092915050565b5f81519050614a7481613b61565b92915050565b5f805f805f60a08688031215614a9357614a92613337565b5b5f614aa0888289016140ba565b9550506020614ab1888289016140ba565b9450506040614ac2888289016140ba565b9350506060614ad388828901614a66565b9250506080614ae488828901614a66565b9150509295509295909350565b7f696e76616c6964207061697220746f6b656e20616d6f756e74000000000000005f82015250565b5f614b25601983613df0565b9150614b3082614af1565b602082019050919050565b5f6020820190508181035f830152614b5281614b19565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614b8d601483613df0565b9150614b9882614b59565b602082019050919050565b5f6020820190508181035f830152614bba81614b81565b9050919050565b5f81519050614bcf816134d1565b92915050565b5f81519050614be38161334c565b92915050565b5f805f805f805f60e0888a031215614c0457614c03613337565b5b5f614c118a828b01614bc1565b9750506020614c228a828b01614bc1565b9650506040614c338a828b01614bc1565b9550506060614c448a828b01614bc1565b9450506080614c558a828b01614bd5565b93505060a0614c668a828b01614bd5565b92505060c0614c778a828b01614bd5565b91505092959891949750929550565b7f746f6f206d7563682074617800000000000000000000000000000000000000005f82015250565b5f614cba600c83613df0565b9150614cc582614c86565b602082019050919050565b5f6020820190508181035f830152614ce781614cae565b9050919050565b5f614cf88261333f565b9150614d038361333f565b9250828201905061ffff811115614d1d57614d1c6140f9565b5b92915050565b5f614d2d8261348f565b9150614d388361348f565b9250828202614d468161348f565b91508282048414831517614d5d57614d5c6140f9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614d9b8261348f565b9150614da68361348f565b925082614db657614db5614d64565b5b828204905092915050565b7f746178206f7574206f662072616e6765000000000000000000000000000000005f82015250565b5f614df5601083613df0565b9150614e0082614dc1565b602082019050919050565b5f6020820190508181035f830152614e2281614de9565b9050919050565b5f805f60608486031215614e4057614e3f613337565b5b5f614e4d86828701614a27565b9350506020614e5e86828701614a27565b9250506040614e6f86828701614a27565b9150509250925092565b5f60208284031215614e8e57614e8d613337565b5b5f614e9b84828501614a66565b91505092915050565b7f746f6f20736d616c6c207061697220616d6f756e7400000000000000000000005f82015250565b5f614ed8601583613df0565b9150614ee382614ea4565b602082019050919050565b5f6020820190508181035f830152614f0581614ecc565b9050919050565b5f819050919050565b5f614f2f614f2a614f2584614f0c565b614246565b61348f565b9050919050565b614f3f81614f15565b82525050565b5f60c082019050614f585f8301896136fb565b614f656020830188613498565b614f726040830187614f36565b614f7f6060830186614f36565b614f8c60808301856136fb565b614f9960a0830184613498565b979650505050505050565b5f805f60608486031215614fbb57614fba613337565b5b5f614fc886828701614a66565b9350506020614fd986828701614a66565b9250506040614fea86828701614a66565b9150509250925092565b5f610100820190506150085f83018b6136fb565b615015602083018a6136fb565b6150226040830189613498565b61502f6060830188613498565b61503c6080830187614f36565b61504960a0830186614f36565b61505660c08301856136fb565b61506360e0830184613498565b9998505050505050505050565b7f746f6f2073686f7274206c6f636b0000000000000000000000000000000000005f82015250565b5f6150a4600e83613df0565b91506150af82615070565b602082019050919050565b5f6020820190508181035f8301526150d181615098565b9050919050565b7f756e737570706f727465642064657820666f72206c6f636b00000000000000005f82015250565b5f61510c601883613df0565b9150615117826150d8565b602082019050919050565b5f6020820190508181035f83015261513981615100565b9050919050565b5f61514a82613429565b9050919050565b61515a81615140565b8114615164575f80fd5b50565b5f8151905061517581615151565b92915050565b5f6101208284031215615191576151906137c7565b5b61519c610120613839565b90505f6151ab84828501614a66565b5f8301525060206151be84828501615167565b60208301525060406151d284828501614a66565b60408301525060606151e684828501614a66565b60608301525060806151fa84828501614a66565b60808301525060a061520e84828501614a66565b60a08301525060c061522284828501615167565b60c08301525060e061523684828501614a66565b60e08301525061010061524b84828501614a66565b6101008301525092915050565b5f610120828403121561526e5761526d613337565b5b5f61527b8482850161517b565b91505092915050565b5f60c0820190506152975f8301896136fb565b6152a46020830188613498565b6152b16040830187613498565b6152be6060830186613d8a565b6152cb608083018561367e565b6152d860a0830184613d8a565b979650505050505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f61533d602a83613df0565b9150615348826152e3565b604082019050919050565b5f6020820190508181035f83015261536a81615331565b9050919050565b5f6040820190506153845f8301856136fb565b61539160208301846136fb565b9392505050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f5f8201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b5f6153f2603683613df0565b91506153fd82615398565b604082019050919050565b5f6020820190508181035f83015261541f816153e6565b9050919050565b5f6060820190506154395f8301866136fb565b61544660208301856136fb565b6154536040830184613498565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6154b5602683613df0565b91506154c08261545b565b604082019050919050565b5f6020820190508181035f8301526154e2816154a9565b9050919050565b5f6154f3826142f8565b6154fd8185614749565b935061550d818560208601613fe4565b80840191505092915050565b5f61552482846154e9565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f615563601d83613df0565b915061556e8261552f565b602082019050919050565b5f6020820190508181035f83015261559081615557565b9050919050565b5f6155a182613fda565b6155ab8185613df0565b93506155bb818560208601613fe4565b6155c4816137cb565b840191505092915050565b5f6020820190508181035f8301526155e78184615597565b90509291505056fea2646970667358221220a8b97ddf370cb723016282196be486f5aa06e2377a5f32bc8731f57f78d0278764736f6c63430008180033

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

00000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : servicePayAccount_ (address): 0x67262A61c0A459Fff172c22E60DBC730393BF790
Arg [1] : launchFee_ (uint256): 100000000000000000
Arg [2] : delayedTradingFee_ (uint256): 50000000000000000
Arg [3] : tradingDisableFee_ (uint256): 100000000000000000
Arg [4] : antiDumpFee_ (uint256): 0

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790
Arg [1] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [2] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [3] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.