ETH Price: $2,634.50 (+6.74%)

Token

Recession (REC)
 

Overview

Max Total Supply

420,690,000,000,000 REC

Holders

104

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
6,612,465,652,628.755310380991679623 REC

Value
$0.00
0xe8a1eefa7a01cbfa0e08f17dd3975cffa0dbe108
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Recession

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// 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]

// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

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

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-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/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.8.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
     * ====
     *
     * [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://diligence.consensys.net/posts/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.5.11/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]

// OpenZeppelin Contracts (last updated v4.8.0) (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;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    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)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    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"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    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"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

pragma solidity >=0.6.2;

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }
}

// File @uniswap/v2-core/contracts/interfaces/[email protected]

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// File contracts/Recession.sol

pragma solidity 0.8.18;

// import "hardhat/console.sol";

interface IStaking {
    function injectRewards() external payable;
}

contract Recession is ERC20, Ownable {
    using SafeERC20 for IERC20;
    using Address for address payable;
    using EnumerableSet for EnumerableSet.AddressSet;

    bool public swapEnabled = true;
    uint256 public swapThreshold = 1000 ether;
    uint256 public maxHoldingAmount;

    bool public inSwap;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public canAddLiquidityBeforeLaunch;

    uint256 private devFee;
    uint256 private burnFee;
    uint256 private stakingFee;
    uint256 private totalFee;
    uint256 public feeDenominator = 10000;

    // Buy Fees
    uint256 public devFeeBuy = 225;
    uint256 public burnFeeBuy = 100;
    uint256 public stakingFeeBuy = 200;
    uint256 public totalFeeBuy = 525;
    // Sell Fees
    uint256 public devFeeSell = 225;
    uint256 public burnFeeSell = 100;
    uint256 public stakingFeeSell = 200;
    uint256 public totalFeeSell = 525;

    // Fees receivers
    address payable private dev1Wallet;
    address payable private dev2Wallet;
    IStaking private stakingContract;

    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;
    bool private initialized;

    IUniswapV2Factory private immutable factory;
    IUniswapV2Router02 private immutable swapRouter;
    address private immutable WETH;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;

    EnumerableSet.AddressSet private pairs;

    constructor(address _swapRouter) ERC20("Recession", "REC") {
        uint256 _totalSupply = 420_690_000_000_000 * 1e18;
        maxHoldingAmount = _totalSupply / 100;
        canAddLiquidityBeforeLaunch[_msgSender()] = true;
        canAddLiquidityBeforeLaunch[address(this)] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        swapRouter = IUniswapV2Router02(_swapRouter);
        factory = IUniswapV2Factory(swapRouter.factory());
        WETH = swapRouter.WETH();

        address pair = factory.createPair(WETH, address(this));
        pairs.add(pair);
        _mint(_msgSender(), _totalSupply);
    }

    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        return _RecessionTransfer(_msgSender(), to, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(sender, spender, amount);
        return _RecessionTransfer(sender, recipient, amount);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        if (isPair(to) || to == owner() || to == address(this)) {
            return;
        } else {
            require(super.balanceOf(to) + amount <= maxHoldingAmount, "Forbid");
        }
    }

    function _RecessionTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        if (inSwap) {
            _transfer(sender, recipient, amount);
            return true;
        }
        if (!canAddLiquidityBeforeLaunch[sender]) {
            require(launched(), "Trading not open yet");
        }

        bool shouldTakeFee = (!isFeeExempt[sender] &&
            !isFeeExempt[recipient]) && launched();

        // Set Fees
        if (isPair(sender)) {
            buyFees();
        } else if (isPair(recipient)) {
            sellFees();
        } else {
            shouldTakeFee = false;
        }
        if (shouldSwapBack()) {
            swapBack();
        }

        uint256 amountReceived = shouldTakeFee
            ? takeFee(sender, amount)
            : amount;
        _transfer(sender, recipient, amountReceived);
        return true;
    }

    function shouldSwapBack() internal view returns (bool) {
        return
            !inSwap &&
            swapEnabled &&
            launched() &&
            balanceOf(address(this)) > swapThreshold &&
            !isPair(_msgSender());
    }

    function swapBack() internal swapping {
        uint256 taxAmount = balanceOf(address(this));

        uint256 amountToBurn = (taxAmount * burnFee) / (totalFee);

        taxAmount -= amountToBurn;

        _transfer(address(this), DEAD, amountToBurn);
        _approve(address(this), address(swapRouter), taxAmount);
        uint256 ethAmount = _swapRECToETH(taxAmount);
        _distributeETH(ethAmount);
    }

    function doSwapBack() public onlyOwner {
        swapBack();
    }

    function _swapRECToETH(
        uint256 recAmount
    ) internal returns (uint256 amountBought) {
        uint256 ethAmountBefore = address(this).balance;
        address[] memory pathEth = new address[](2);
        pathEth[0] = address(this);
        pathEth[1] = WETH;
        swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            recAmount,
            0,
            pathEth,
            address(this),
            block.timestamp
        );
        amountBought = address(this).balance - ethAmountBefore;
    }

    function _distributeETH(uint256 ethAmount) internal {
        uint256 amountForDev = (ethAmount * devFee) / (totalFee - burnFee);
        uint256 amountForStaking = (ethAmount * stakingFee) /
            (totalFee - burnFee);

        dev1Wallet.sendValue(amountForDev / 2);
        dev2Wallet.sendValue(amountForDev / 2);
        stakingContract.injectRewards{value: amountForStaking}();
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function buyFees() internal {
        devFee = devFeeBuy;
        burnFee = burnFeeBuy;
        stakingFee = stakingFeeBuy;
        totalFee = totalFeeBuy;
    }

    function sellFees() internal {
        devFee = devFeeSell;
        burnFee = burnFeeSell;
        stakingFee = stakingFeeSell;
        totalFee = totalFeeSell;
    }

    function takeFee(
        address sender,
        uint256 amount
    ) internal returns (uint256) {
        uint256 feeAmount = (amount * totalFee) / feeDenominator;
        _transfer(sender, address(this), feeAmount);
        return amount - feeAmount;
    }

    function rescueToken(address tokenAddress) external onlyOwner {
        IERC20(tokenAddress).safeTransfer(
            msg.sender,
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

    function clearStuckEthBalance() external onlyOwner {
        uint256 amountETH = address(this).balance;
        (bool success, ) = payable(_msgSender()).call{value: amountETH}(
            new bytes(0)
        );
        require(success, "AIDRIP: ETH_TRANSFER_FAILED");
    }

    function getCirculatingSupply() public view returns (uint256) {
        return totalSupply() - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /*** ADMIN FUNCTIONS ***/
    function launch() public onlyOwner {
        require(launchedAt == 0, "Already launched");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }

    function setBuyFees(
        uint256 _devFeeBuy,
        uint256 _burnFeeBuy,
        uint256 _stakingFeeBuy
    ) external onlyOwner {
        devFeeBuy = _devFeeBuy;
        burnFeeBuy = _burnFeeBuy;
        stakingFeeBuy = _stakingFeeBuy;
        totalFeeBuy = _devFeeBuy + _burnFeeBuy + _stakingFeeBuy;
    }

    function setSellFees(
        uint256 _devFeeSell,
        uint256 _burnFeeSell,
        uint256 _stakingFeeSell
    ) external onlyOwner {
        devFeeSell = _devFeeSell;
        burnFeeSell = _burnFeeSell;
        stakingFeeSell = _stakingFeeSell;
        totalFeeSell = _devFeeSell + _burnFeeSell + _stakingFeeSell;
    }

    function setFeeReceivers(
        address _dev1Wallet,
        address _dev2Wallet,
        address _stakingContract
    ) external onlyOwner {
        dev1Wallet = payable(_dev1Wallet);
        dev2Wallet = payable(_dev2Wallet);
        stakingContract = IStaking(_stakingContract);
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setSwapBackEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    function setSwapThreshold(uint256 _swapThreshold) external onlyOwner {
        swapThreshold = _swapThreshold;
    }

    function setMaxHoldingAmount(uint256 _maxHoldingAmount) external onlyOwner {
        maxHoldingAmount = _maxHoldingAmount;
    }

    function isPair(address account) public view returns (bool) {
        return pairs.contains(account);
    }

    function addPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "AIDRIP: pair is the zero address");
        return pairs.add(pair);
    }

    function delPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "AIDRIP: pair is the zero address");
        return pairs.remove(pair);
    }

    function getPairsLength() public view returns (uint256) {
        return pairs.length();
    }

    function getPair(uint256 index) public view returns (address) {
        require(index <= pairs.length() - 1, "AIDRIP: index out of bounds");
        return pairs.at(index);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_swapRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHoldingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_burnFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_stakingFeeBuy","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dev1Wallet","type":"address"},{"internalType":"address","name":"_dev2Wallet","type":"address"},{"internalType":"address","name":"_stakingContract","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxHoldingAmount","type":"uint256"}],"name":"setMaxHoldingAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFeeSell","type":"uint256"},{"internalType":"uint256","name":"_burnFeeSell","type":"uint256"},{"internalType":"uint256","name":"_stakingFeeSell","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapBackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapThreshold","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526001600560146101000a81548160ff021916908315150217905550683635c9adc5dea00000600655612710600f5560e1601055606460115560c860125561020d60135560e1601455606460155560c860165561020d6017553480156200006957600080fd5b5060405162004e9338038062004e9383398181016040528101906200008f919062000a7b565b6040518060400160405280600981526020017f526563657373696f6e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524543000000000000000000000000000000000000000000000000000000000081525081600390816200010c919062000d27565b5080600490816200011e919062000d27565b50505062000141620001356200052b60201b60201c565b6200053360201b60201c565b60006d14bddab3e51a57cff87a50000000905060648162000163919062000e6c565b6007819055506001600a60006200017f6200052b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000a7b565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000401573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000427919062000a7b565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050600060805173ffffffffffffffffffffffffffffffffffffffff1663c9c6539660c051306040518363ffffffff1660e01b81526004016200049d92919062000eb5565b6020604051808303816000875af1158015620004bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004e3919062000a7b565b90506200050081601e620005f960201b620015fe1790919060201c565b5062000522620005156200052b60201b60201c565b836200063160201b60201c565b50505062001040565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600062000629836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200079e60201b60201c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620006a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069a9062000f43565b60405180910390fd5b620006b7600083836200081860201b60201c565b8060026000828254620006cb919062000f65565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200077e919062000fb1565b60405180910390a36200079a600083836200091b60201b60201c565b5050565b6000620007b283836200092060201b60201c565b6200080d57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000812565b600090505b92915050565b62000829826200094360201b60201c565b806200086f5750620008406200096760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80620008a657503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b620009165760075481620008c5846200099160201b62000f0e1760201c565b620008d1919062000f65565b111562000915576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200090c906200101e565b60405180910390fd5b5b505050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60006200096082601e620009d960201b6200162e1790919060201c565b9050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600062000a09836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200092060201b60201c565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a438262000a16565b9050919050565b62000a558162000a36565b811462000a6157600080fd5b50565b60008151905062000a758162000a4a565b92915050565b60006020828403121562000a945762000a9362000a11565b5b600062000aa48482850162000a64565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b2f57607f821691505b60208210810362000b455762000b4462000ae7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000baf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b70565b62000bbb868362000b70565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000c0862000c0262000bfc8462000bd3565b62000bdd565b62000bd3565b9050919050565b6000819050919050565b62000c248362000be7565b62000c3c62000c338262000c0f565b84845462000b7d565b825550505050565b600090565b62000c5362000c44565b62000c6081848462000c19565b505050565b5b8181101562000c885762000c7c60008262000c49565b60018101905062000c66565b5050565b601f82111562000cd75762000ca18162000b4b565b62000cac8462000b60565b8101602085101562000cbc578190505b62000cd462000ccb8562000b60565b83018262000c65565b50505b505050565b600082821c905092915050565b600062000cfc6000198460080262000cdc565b1980831691505092915050565b600062000d17838362000ce9565b9150826002028217905092915050565b62000d328262000aad565b67ffffffffffffffff81111562000d4e5762000d4d62000ab8565b5b62000d5a825462000b16565b62000d6782828562000c8c565b600060209050601f83116001811462000d9f576000841562000d8a578287015190505b62000d96858262000d09565b86555062000e06565b601f19841662000daf8662000b4b565b60005b8281101562000dd95784890151825560018201915060208501945060208101905062000db2565b8683101562000df9578489015162000df5601f89168262000ce9565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e798262000bd3565b915062000e868362000bd3565b92508262000e995762000e9862000e0e565b5b828204905092915050565b62000eaf8162000a36565b82525050565b600060408201905062000ecc600083018562000ea4565b62000edb602083018462000ea4565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000f2b601f8362000ee2565b915062000f388262000ef3565b602082019050919050565b6000602082019050818103600083015262000f5e8162000f1c565b9050919050565b600062000f728262000bd3565b915062000f7f8362000bd3565b925082820190508082111562000f9a5762000f9962000e3d565b5b92915050565b62000fab8162000bd3565b82525050565b600060208201905062000fc8600083018462000fa0565b92915050565b7f466f726269640000000000000000000000000000000000000000000000000000600082015250565b60006200100660068362000ee2565b9150620010138262000fce565b602082019050919050565b60006020820190508181036000830152620010398162000ff7565b9050919050565b60805160a05160c051613e1f620010746000396000612335015260008181611d0301526123a4015260005050613e1f6000f3fe6080604052600436106102975760003560e01c80638072250b1161015a578063bdf391cc116100c1578063d7c010321161007a578063d7c0103214610a19578063d830678614610a42578063dd62ed3e14610a6d578063e5e31b1314610aaa578063f2fde38b14610ae7578063fb5f27fb14610b105761029e565b8063bdf391cc14610907578063bf56b37114610944578063bfa382b51461096f578063c2b7bbb614610986578063c6d2577d146109c3578063cdba31fd146109ee5761029e565b806395d89b411161011357806395d89b41146107d35780639d0014b1146107fe578063a457c2d714610827578063a5bc508514610864578063a9059cbb146108a1578063bded89fb146108de5761029e565b80638072250b146106d3578063880e75f21461071057806389f9a1d31461073b5780638da5cb5b146107665780638fbbd750146107915780639397106f146107a85761029e565b806323b872dd116101fe57806353148416116101b757806353148416146105d5578063658d4b7f146106005780636871fc76146106295780636ddd17131461065457806370a082311461067f578063715018a6146106bc5761029e565b806323b872dd1461049f5780632b112e49146104dc578063313ce5671461050757806339509351146105325780633f4218e01461056f5780634460d3cf146105ac5761029e565b806312835c5e1161025057806312835c5e1461039f57806315674e8e146103ca578063180b0d7e146103f557806318160ddd146104205780631e53dbe91461044b578063234a2daa146104745761029e565b806301339c21146102a35780630445b667146102ba57806306fdde03146102e5578063095ea7b3146103105780630d075d9c1461034d5780630f683e90146103765761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b3b565b005b3480156102c657600080fd5b506102cf610b98565b6040516102dc9190612ad5565b60405180910390f35b3480156102f157600080fd5b506102fa610b9e565b6040516103079190612b80565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612c31565b610c30565b6040516103449190612c8c565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190612ca7565b610c53565b005b34801561038257600080fd5b5061039d60048036038101906103989190612ca7565b610c92565b005b3480156103ab57600080fd5b506103b4610cd1565b6040516103c19190612ad5565b60405180910390f35b3480156103d657600080fd5b506103df610cd7565b6040516103ec9190612ad5565b60405180910390f35b34801561040157600080fd5b5061040a610cdd565b6040516104179190612ad5565b60405180910390f35b34801561042c57600080fd5b50610435610ce3565b6040516104429190612ad5565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190612d26565b610ced565b005b34801561048057600080fd5b50610489610d12565b6040516104969190612ad5565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190612d53565b610d18565b6040516104d39190612c8c565b60405180910390f35b3480156104e857600080fd5b506104f1610d45565b6040516104fe9190612ad5565b60405180910390f35b34801561051357600080fd5b5061051c610d7d565b6040516105299190612dc2565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190612c31565b610d86565b6040516105669190612c8c565b60405180910390f35b34801561057b57600080fd5b5061059660048036038101906105919190612ddd565b610dbd565b6040516105a39190612c8c565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612ddd565b610ddd565b005b3480156105e157600080fd5b506105ea610e8c565b6040516105f79190612ad5565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190612e0a565b610e92565b005b34801561063557600080fd5b5061063e610ef5565b60405161064b9190612ad5565b60405180910390f35b34801561066057600080fd5b50610669610efb565b6040516106769190612c8c565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190612ddd565b610f0e565b6040516106b39190612ad5565b60405180910390f35b3480156106c857600080fd5b506106d1610f56565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190612ddd565b610f6a565b6040516107079190612c8c565b60405180910390f35b34801561071c57600080fd5b50610725610f8a565b6040516107329190612ad5565b60405180910390f35b34801561074757600080fd5b50610750610f9b565b60405161075d9190612ad5565b60405180910390f35b34801561077257600080fd5b5061077b610fa1565b6040516107889190612e59565b60405180910390f35b34801561079d57600080fd5b506107a6610fcb565b005b3480156107b457600080fd5b506107bd610fdd565b6040516107ca9190612ad5565b60405180910390f35b3480156107df57600080fd5b506107e8610fe3565b6040516107f59190612b80565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190612e74565b611075565b005b34801561083357600080fd5b5061084e60048036038101906108499190612c31565b611087565b60405161085b9190612c8c565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190612ddd565b6110fe565b6040516108989190612c8c565b60405180910390f35b3480156108ad57600080fd5b506108c860048036038101906108c39190612c31565b611192565b6040516108d59190612c8c565b60405180910390f35b3480156108ea57600080fd5b5061090560048036038101906109009190612e74565b6111ae565b005b34801561091357600080fd5b5061092e60048036038101906109299190612e74565b6111c0565b60405161093b9190612e59565b60405180910390f35b34801561095057600080fd5b50610959611235565b6040516109669190612ad5565b60405180910390f35b34801561097b57600080fd5b5061098461123b565b005b34801561099257600080fd5b506109ad60048036038101906109a89190612ddd565b61134e565b6040516109ba9190612c8c565b60405180910390f35b3480156109cf57600080fd5b506109d86113e2565b6040516109e59190612ad5565b60405180910390f35b3480156109fa57600080fd5b50610a036113e8565b604051610a109190612ad5565b60405180910390f35b348015610a2557600080fd5b50610a406004803603810190610a3b9190612ea1565b6113ee565b005b348015610a4e57600080fd5b50610a576114be565b604051610a649190612c8c565b60405180910390f35b348015610a7957600080fd5b50610a946004803603810190610a8f9190612ef4565b6114d1565b604051610aa19190612ad5565b60405180910390f35b348015610ab657600080fd5b50610ad16004803603810190610acc9190612ddd565b611558565b604051610ade9190612c8c565b60405180910390f35b348015610af357600080fd5b50610b0e6004803603810190610b099190612ddd565b611575565b005b348015610b1c57600080fd5b50610b256115f8565b604051610b329190612ad5565b60405180910390f35b610b4361165e565b6000601b5414610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90612f80565b60405180910390fd5b43601b8190555042601c81905550565b60065481565b606060038054610bad90612fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd990612fcf565b8015610c265780601f10610bfb57610100808354040283529160200191610c26565b820191906000526020600020905b815481529060010190602001808311610c0957829003601f168201915b5050505050905090565b600080610c3b6116dc565b9050610c488185856116e4565b600191505092915050565b610c5b61165e565b826010819055508160118190555080601281905550808284610c7d919061302f565b610c87919061302f565b601381905550505050565b610c9a61165e565b826014819055508160158190555080601681905550808284610cbc919061302f565b610cc6919061302f565b601781905550505050565b60145481565b60115481565b600f5481565b6000600254905090565b610cf561165e565b80600560146101000a81548160ff02191690831515021790555050565b60155481565b600080610d236116dc565b9050610d308582856118ad565b610d3b858585611939565b9150509392505050565b6000610d516000610f0e565b610d5c61dead610f0e565b610d64610ce3565b610d6e9190613063565b610d789190613063565b905090565b60006012905090565b600080610d916116dc565b9050610db2818585610da385896114d1565b610dad919061302f565b6116e4565b600191505092915050565b60096020528060005260406000206000915054906101000a900460ff1681565b610de561165e565b610e89338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e229190612e59565b602060405180830381865afa158015610e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6391906130ac565b8373ffffffffffffffffffffffffffffffffffffffff16611b3a9092919063ffffffff16565b50565b60175481565b610e9a61165e565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60125481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f5e61165e565b610f686000611bc0565b565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000610f96601e611c86565b905090565b60075481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fd361165e565b610fdb611c9b565b565b60165481565b606060048054610ff290612fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461101e90612fcf565b801561106b5780601f106110405761010080835404028352916020019161106b565b820191906000526020600020905b81548152906001019060200180831161104e57829003601f168201915b5050505050905090565b61107d61165e565b8060068190555050565b6000806110926116dc565b905060006110a082866114d1565b9050838110156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dc9061314b565b60405180910390fd5b6110f282868684036116e4565b60019250505092915050565b600061110861165e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e906131b7565b60405180910390fd5b61118b82601e611d5e90919063ffffffff16565b9050919050565b60006111a661119f6116dc565b8484611939565b905092915050565b6111b661165e565b8060078190555050565b600060016111ce601e611c86565b6111d89190613063565b82111561121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190613223565b60405180910390fd5b61122e82601e611d8e90919063ffffffff16565b9050919050565b601b5481565b61124361165e565b600047905060006112526116dc565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff81111561128457611283613243565b5b6040519080825280601f01601f1916602001820160405280156112b65781602001600182028036833780820191505090505b506040516112c491906132b9565b60006040518083038185875af1925050503d8060008114611301576040519150601f19603f3d011682016040523d82523d6000602084013e611306565b606091505b505090508061134a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113419061331c565b60405180910390fd5b5050565b600061135861165e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be906131b7565b60405180910390fd5b6113db82601e6115fe90919063ffffffff16565b9050919050565b601c5481565b60105481565b6113f661165e565b82601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600860009054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061156e82601e61162e90919063ffffffff16565b9050919050565b61157d61165e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e3906133ae565b60405180910390fd5b6115f581611bc0565b50565b60135481565b6000611626836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611da8565b905092915050565b6000611656836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e18565b905092915050565b6116666116dc565b73ffffffffffffffffffffffffffffffffffffffff16611684610fa1565b73ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d19061341a565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906134ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b99061353e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516118a09190612ad5565b60405180910390a3505050565b60006118b984846114d1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146119335781811015611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c906135aa565b60405180910390fd5b61193284848484036116e4565b5b50505050565b6000600860009054906101000a900460ff16156119645761195b848484611e3b565b60019050611b33565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119fd576119bd6120b1565b6119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390613616565b60405180910390fd5b5b6000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611aa35750600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611ab35750611ab26120b1565b5b9050611abe85611558565b15611ad057611acb6120be565b611af1565b611ad984611558565b15611aeb57611ae66120e4565b611af0565b600090505b5b611af961210a565b15611b0757611b06611c9b565b5b600081611b145783611b1f565b611b1e8685612178565b5b9050611b2c868683611e3b565b6001925050505b9392505050565b611bbb8363a9059cbb60e01b8484604051602401611b59929190613636565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506121b8565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611c948260000161227f565b9050919050565b6001600860006101000a81548160ff0219169083151502179055506000611cc130610f0e565b90506000600e54600c5483611cd6919061365f565b611ce091906136d0565b90508082611cee9190613063565b9150611cfd3061dead83611e3b565b611d28307f0000000000000000000000000000000000000000000000000000000000000000846116e4565b6000611d3383612290565b9050611d3e8161244b565b5050506000600860006101000a81548160ff021916908315150217905550565b6000611d86836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6125d9565b905092915050565b6000611d9d83600001836126ed565b60001c905092915050565b6000611db48383611e18565b611e0d578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e12565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190613773565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1090613805565b60405180910390fd5b611f24838383612718565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613897565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120989190612ad5565b60405180910390a36120ab8484846127f6565b50505050565b600080601b541415905090565b601054600b81905550601154600c81905550601254600d81905550601354600e81905550565b601454600b81905550601554600c81905550601654600d81905550601754600e81905550565b6000600860009054906101000a900460ff161580156121355750600560149054906101000a900460ff165b801561214557506121446120b1565b5b801561215a575060065461215830610f0e565b115b8015612173575061217161216c6116dc565b611558565b155b905090565b600080600f54600e548461218c919061365f565b61219691906136d0565b90506121a3843083611e3b565b80836121af9190613063565b91505092915050565b600061221a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127fb9092919063ffffffff16565b905060008151111561227a578080602001905181019061223a91906138cc565b612279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122709061396b565b60405180910390fd5b5b505050565b600081600001805490509050919050565b6000804790506000600267ffffffffffffffff8111156122b3576122b2613243565b5b6040519080825280602002602001820160405280156122e15781602001602082028036833780820191505090505b50905030816000815181106122f9576122f861398b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106123685761236761398b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478560008430426040518663ffffffff1660e01b8152600401612404959493929190613abd565b600060405180830381600087803b15801561241e57600080fd5b505af1158015612432573d6000803e3d6000fd5b5050505081476124429190613063565b92505050919050565b6000600c54600e5461245d9190613063565b600b548361246b919061365f565b61247591906136d0565b90506000600c54600e546124899190613063565b600d5484612497919061365f565b6124a191906136d0565b90506124fa6002836124b391906136d0565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661281390919063ffffffff16565b61255160028361250a91906136d0565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661281390919063ffffffff16565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399c722bc826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125bb57600080fd5b505af11580156125cf573d6000803e3d6000fd5b5050505050505050565b600080836001016000848152602001908152602001600020549050600081146126e157600060018261260b9190613063565b90506000600186600001805490506126239190613063565b90508181146126925760008660000182815481106126445761264361398b565b5b90600052602060002001549050808760000184815481106126685761266761398b565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806126a6576126a5613b17565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126e7565b60009150505b92915050565b60008260000182815481106127055761270461398b565b5b9060005260206000200154905092915050565b61272182611558565b8061275e575061272f610fa1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061279457503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6127f157600754816127a584610f0e565b6127af919061302f565b11156127f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e790613b92565b60405180910390fd5b5b505050565b505050565b606061280a8484600085612907565b90509392505050565b80471015612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d90613bfe565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161287c90613c44565b60006040518083038185875af1925050503d80600081146128b9576040519150601f19603f3d011682016040523d82523d6000602084013e6128be565b606091505b5050905080612902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f990613ccb565b60405180910390fd5b505050565b60608247101561294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390613d5d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161297591906132b9565b60006040518083038185875af1925050503d80600081146129b2576040519150601f19603f3d011682016040523d82523d6000602084013e6129b7565b606091505b50915091506129c8878383876129d4565b92505050949350505050565b60608315612a36576000835103612a2e576129ee85612a49565b612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2490613dc9565b60405180910390fd5b5b829050612a41565b612a408383612a6c565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612a7f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab39190612b80565b60405180910390fd5b6000819050919050565b612acf81612abc565b82525050565b6000602082019050612aea6000830184612ac6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b2a578082015181840152602081019050612b0f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b5282612af0565b612b5c8185612afb565b9350612b6c818560208601612b0c565b612b7581612b36565b840191505092915050565b60006020820190508181036000830152612b9a8184612b47565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd282612ba7565b9050919050565b612be281612bc7565b8114612bed57600080fd5b50565b600081359050612bff81612bd9565b92915050565b612c0e81612abc565b8114612c1957600080fd5b50565b600081359050612c2b81612c05565b92915050565b60008060408385031215612c4857612c47612ba2565b5b6000612c5685828601612bf0565b9250506020612c6785828601612c1c565b9150509250929050565b60008115159050919050565b612c8681612c71565b82525050565b6000602082019050612ca16000830184612c7d565b92915050565b600080600060608486031215612cc057612cbf612ba2565b5b6000612cce86828701612c1c565b9350506020612cdf86828701612c1c565b9250506040612cf086828701612c1c565b9150509250925092565b612d0381612c71565b8114612d0e57600080fd5b50565b600081359050612d2081612cfa565b92915050565b600060208284031215612d3c57612d3b612ba2565b5b6000612d4a84828501612d11565b91505092915050565b600080600060608486031215612d6c57612d6b612ba2565b5b6000612d7a86828701612bf0565b9350506020612d8b86828701612bf0565b9250506040612d9c86828701612c1c565b9150509250925092565b600060ff82169050919050565b612dbc81612da6565b82525050565b6000602082019050612dd76000830184612db3565b92915050565b600060208284031215612df357612df2612ba2565b5b6000612e0184828501612bf0565b91505092915050565b60008060408385031215612e2157612e20612ba2565b5b6000612e2f85828601612bf0565b9250506020612e4085828601612d11565b9150509250929050565b612e5381612bc7565b82525050565b6000602082019050612e6e6000830184612e4a565b92915050565b600060208284031215612e8a57612e89612ba2565b5b6000612e9884828501612c1c565b91505092915050565b600080600060608486031215612eba57612eb9612ba2565b5b6000612ec886828701612bf0565b9350506020612ed986828701612bf0565b9250506040612eea86828701612bf0565b9150509250925092565b60008060408385031215612f0b57612f0a612ba2565b5b6000612f1985828601612bf0565b9250506020612f2a85828601612bf0565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000612f6a601083612afb565b9150612f7582612f34565b602082019050919050565b60006020820190508181036000830152612f9981612f5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fe757607f821691505b602082108103612ffa57612ff9612fa0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061303a82612abc565b915061304583612abc565b925082820190508082111561305d5761305c613000565b5b92915050565b600061306e82612abc565b915061307983612abc565b925082820390508181111561309157613090613000565b5b92915050565b6000815190506130a681612c05565b92915050565b6000602082840312156130c2576130c1612ba2565b5b60006130d084828501613097565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613135602583612afb565b9150613140826130d9565b604082019050919050565b6000602082019050818103600083015261316481613128565b9050919050565b7f4149445249503a207061697220697320746865207a65726f2061646472657373600082015250565b60006131a1602083612afb565b91506131ac8261316b565b602082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b7f4149445249503a20696e646578206f7574206f6620626f756e64730000000000600082015250565b600061320d601b83612afb565b9150613218826131d7565b602082019050919050565b6000602082019050818103600083015261323c81613200565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061329382613272565b61329d818561327d565b93506132ad818560208601612b0c565b80840191505092915050565b60006132c58284613288565b915081905092915050565b7f4149445249503a204554485f5452414e534645525f4641494c45440000000000600082015250565b6000613306601b83612afb565b9150613311826132d0565b602082019050919050565b60006020820190508181036000830152613335816132f9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613398602683612afb565b91506133a38261333c565b604082019050919050565b600060208201905081810360008301526133c78161338b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613404602083612afb565b915061340f826133ce565b602082019050919050565b60006020820190508181036000830152613433816133f7565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613496602483612afb565b91506134a18261343a565b604082019050919050565b600060208201905081810360008301526134c581613489565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613528602283612afb565b9150613533826134cc565b604082019050919050565b600060208201905081810360008301526135578161351b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613594601d83612afb565b915061359f8261355e565b602082019050919050565b600060208201905081810360008301526135c381613587565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000613600601483612afb565b915061360b826135ca565b602082019050919050565b6000602082019050818103600083015261362f816135f3565b9050919050565b600060408201905061364b6000830185612e4a565b6136586020830184612ac6565b9392505050565b600061366a82612abc565b915061367583612abc565b925082820261368381612abc565b9150828204841483151761369a57613699613000565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136db82612abc565b91506136e683612abc565b9250826136f6576136f56136a1565b5b828204905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061375d602583612afb565b915061376882613701565b604082019050919050565b6000602082019050818103600083015261378c81613750565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006137ef602383612afb565b91506137fa82613793565b604082019050919050565b6000602082019050818103600083015261381e816137e2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613881602683612afb565b915061388c82613825565b604082019050919050565b600060208201905081810360008301526138b081613874565b9050919050565b6000815190506138c681612cfa565b92915050565b6000602082840312156138e2576138e1612ba2565b5b60006138f0848285016138b7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613955602a83612afb565b9150613960826138f9565b604082019050919050565b6000602082019050818103600083015261398481613948565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006139e96139e46139df846139ba565b6139c4565b612abc565b9050919050565b6139f9816139ce565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a3481612bc7565b82525050565b6000613a468383613a2b565b60208301905092915050565b6000602082019050919050565b6000613a6a826139ff565b613a748185613a0a565b9350613a7f83613a1b565b8060005b83811015613ab0578151613a978882613a3a565b9750613aa283613a52565b925050600181019050613a83565b5085935050505092915050565b600060a082019050613ad26000830188612ac6565b613adf60208301876139f0565b8181036040830152613af18186613a5f565b9050613b006060830185612e4a565b613b0d6080830184612ac6565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f466f726269640000000000000000000000000000000000000000000000000000600082015250565b6000613b7c600683612afb565b9150613b8782613b46565b602082019050919050565b60006020820190508181036000830152613bab81613b6f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613be8601d83612afb565b9150613bf382613bb2565b602082019050919050565b60006020820190508181036000830152613c1781613bdb565b9050919050565b50565b6000613c2e60008361327d565b9150613c3982613c1e565b600082019050919050565b6000613c4f82613c21565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613cb5603a83612afb565b9150613cc082613c59565b604082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613d47602683612afb565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613db3601d83612afb565b9150613dbe82613d7d565b602082019050919050565b60006020820190508181036000830152613de281613da6565b905091905056fea2646970667358221220a3637a5262cc93f723775143191c80cbdbd3a0a3b27b97cca44822b8631c745f64736f6c63430008120033000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f

Deployed Bytecode

0x6080604052600436106102975760003560e01c80638072250b1161015a578063bdf391cc116100c1578063d7c010321161007a578063d7c0103214610a19578063d830678614610a42578063dd62ed3e14610a6d578063e5e31b1314610aaa578063f2fde38b14610ae7578063fb5f27fb14610b105761029e565b8063bdf391cc14610907578063bf56b37114610944578063bfa382b51461096f578063c2b7bbb614610986578063c6d2577d146109c3578063cdba31fd146109ee5761029e565b806395d89b411161011357806395d89b41146107d35780639d0014b1146107fe578063a457c2d714610827578063a5bc508514610864578063a9059cbb146108a1578063bded89fb146108de5761029e565b80638072250b146106d3578063880e75f21461071057806389f9a1d31461073b5780638da5cb5b146107665780638fbbd750146107915780639397106f146107a85761029e565b806323b872dd116101fe57806353148416116101b757806353148416146105d5578063658d4b7f146106005780636871fc76146106295780636ddd17131461065457806370a082311461067f578063715018a6146106bc5761029e565b806323b872dd1461049f5780632b112e49146104dc578063313ce5671461050757806339509351146105325780633f4218e01461056f5780634460d3cf146105ac5761029e565b806312835c5e1161025057806312835c5e1461039f57806315674e8e146103ca578063180b0d7e146103f557806318160ddd146104205780631e53dbe91461044b578063234a2daa146104745761029e565b806301339c21146102a35780630445b667146102ba57806306fdde03146102e5578063095ea7b3146103105780630d075d9c1461034d5780630f683e90146103765761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b3b565b005b3480156102c657600080fd5b506102cf610b98565b6040516102dc9190612ad5565b60405180910390f35b3480156102f157600080fd5b506102fa610b9e565b6040516103079190612b80565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190612c31565b610c30565b6040516103449190612c8c565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190612ca7565b610c53565b005b34801561038257600080fd5b5061039d60048036038101906103989190612ca7565b610c92565b005b3480156103ab57600080fd5b506103b4610cd1565b6040516103c19190612ad5565b60405180910390f35b3480156103d657600080fd5b506103df610cd7565b6040516103ec9190612ad5565b60405180910390f35b34801561040157600080fd5b5061040a610cdd565b6040516104179190612ad5565b60405180910390f35b34801561042c57600080fd5b50610435610ce3565b6040516104429190612ad5565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d9190612d26565b610ced565b005b34801561048057600080fd5b50610489610d12565b6040516104969190612ad5565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190612d53565b610d18565b6040516104d39190612c8c565b60405180910390f35b3480156104e857600080fd5b506104f1610d45565b6040516104fe9190612ad5565b60405180910390f35b34801561051357600080fd5b5061051c610d7d565b6040516105299190612dc2565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190612c31565b610d86565b6040516105669190612c8c565b60405180910390f35b34801561057b57600080fd5b5061059660048036038101906105919190612ddd565b610dbd565b6040516105a39190612c8c565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612ddd565b610ddd565b005b3480156105e157600080fd5b506105ea610e8c565b6040516105f79190612ad5565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190612e0a565b610e92565b005b34801561063557600080fd5b5061063e610ef5565b60405161064b9190612ad5565b60405180910390f35b34801561066057600080fd5b50610669610efb565b6040516106769190612c8c565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190612ddd565b610f0e565b6040516106b39190612ad5565b60405180910390f35b3480156106c857600080fd5b506106d1610f56565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190612ddd565b610f6a565b6040516107079190612c8c565b60405180910390f35b34801561071c57600080fd5b50610725610f8a565b6040516107329190612ad5565b60405180910390f35b34801561074757600080fd5b50610750610f9b565b60405161075d9190612ad5565b60405180910390f35b34801561077257600080fd5b5061077b610fa1565b6040516107889190612e59565b60405180910390f35b34801561079d57600080fd5b506107a6610fcb565b005b3480156107b457600080fd5b506107bd610fdd565b6040516107ca9190612ad5565b60405180910390f35b3480156107df57600080fd5b506107e8610fe3565b6040516107f59190612b80565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190612e74565b611075565b005b34801561083357600080fd5b5061084e60048036038101906108499190612c31565b611087565b60405161085b9190612c8c565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190612ddd565b6110fe565b6040516108989190612c8c565b60405180910390f35b3480156108ad57600080fd5b506108c860048036038101906108c39190612c31565b611192565b6040516108d59190612c8c565b60405180910390f35b3480156108ea57600080fd5b5061090560048036038101906109009190612e74565b6111ae565b005b34801561091357600080fd5b5061092e60048036038101906109299190612e74565b6111c0565b60405161093b9190612e59565b60405180910390f35b34801561095057600080fd5b50610959611235565b6040516109669190612ad5565b60405180910390f35b34801561097b57600080fd5b5061098461123b565b005b34801561099257600080fd5b506109ad60048036038101906109a89190612ddd565b61134e565b6040516109ba9190612c8c565b60405180910390f35b3480156109cf57600080fd5b506109d86113e2565b6040516109e59190612ad5565b60405180910390f35b3480156109fa57600080fd5b50610a036113e8565b604051610a109190612ad5565b60405180910390f35b348015610a2557600080fd5b50610a406004803603810190610a3b9190612ea1565b6113ee565b005b348015610a4e57600080fd5b50610a576114be565b604051610a649190612c8c565b60405180910390f35b348015610a7957600080fd5b50610a946004803603810190610a8f9190612ef4565b6114d1565b604051610aa19190612ad5565b60405180910390f35b348015610ab657600080fd5b50610ad16004803603810190610acc9190612ddd565b611558565b604051610ade9190612c8c565b60405180910390f35b348015610af357600080fd5b50610b0e6004803603810190610b099190612ddd565b611575565b005b348015610b1c57600080fd5b50610b256115f8565b604051610b329190612ad5565b60405180910390f35b610b4361165e565b6000601b5414610b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7f90612f80565b60405180910390fd5b43601b8190555042601c81905550565b60065481565b606060038054610bad90612fcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd990612fcf565b8015610c265780601f10610bfb57610100808354040283529160200191610c26565b820191906000526020600020905b815481529060010190602001808311610c0957829003601f168201915b5050505050905090565b600080610c3b6116dc565b9050610c488185856116e4565b600191505092915050565b610c5b61165e565b826010819055508160118190555080601281905550808284610c7d919061302f565b610c87919061302f565b601381905550505050565b610c9a61165e565b826014819055508160158190555080601681905550808284610cbc919061302f565b610cc6919061302f565b601781905550505050565b60145481565b60115481565b600f5481565b6000600254905090565b610cf561165e565b80600560146101000a81548160ff02191690831515021790555050565b60155481565b600080610d236116dc565b9050610d308582856118ad565b610d3b858585611939565b9150509392505050565b6000610d516000610f0e565b610d5c61dead610f0e565b610d64610ce3565b610d6e9190613063565b610d789190613063565b905090565b60006012905090565b600080610d916116dc565b9050610db2818585610da385896114d1565b610dad919061302f565b6116e4565b600191505092915050565b60096020528060005260406000206000915054906101000a900460ff1681565b610de561165e565b610e89338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e229190612e59565b602060405180830381865afa158015610e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6391906130ac565b8373ffffffffffffffffffffffffffffffffffffffff16611b3a9092919063ffffffff16565b50565b60175481565b610e9a61165e565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60125481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f5e61165e565b610f686000611bc0565b565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000610f96601e611c86565b905090565b60075481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fd361165e565b610fdb611c9b565b565b60165481565b606060048054610ff290612fcf565b80601f016020809104026020016040519081016040528092919081815260200182805461101e90612fcf565b801561106b5780601f106110405761010080835404028352916020019161106b565b820191906000526020600020905b81548152906001019060200180831161104e57829003601f168201915b5050505050905090565b61107d61165e565b8060068190555050565b6000806110926116dc565b905060006110a082866114d1565b9050838110156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dc9061314b565b60405180910390fd5b6110f282868684036116e4565b60019250505092915050565b600061110861165e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e906131b7565b60405180910390fd5b61118b82601e611d5e90919063ffffffff16565b9050919050565b60006111a661119f6116dc565b8484611939565b905092915050565b6111b661165e565b8060078190555050565b600060016111ce601e611c86565b6111d89190613063565b82111561121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190613223565b60405180910390fd5b61122e82601e611d8e90919063ffffffff16565b9050919050565b601b5481565b61124361165e565b600047905060006112526116dc565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff81111561128457611283613243565b5b6040519080825280601f01601f1916602001820160405280156112b65781602001600182028036833780820191505090505b506040516112c491906132b9565b60006040518083038185875af1925050503d8060008114611301576040519150601f19603f3d011682016040523d82523d6000602084013e611306565b606091505b505090508061134a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113419061331c565b60405180910390fd5b5050565b600061135861165e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be906131b7565b60405180910390fd5b6113db82601e6115fe90919063ffffffff16565b9050919050565b601c5481565b60105481565b6113f661165e565b82601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600860009054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061156e82601e61162e90919063ffffffff16565b9050919050565b61157d61165e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e3906133ae565b60405180910390fd5b6115f581611bc0565b50565b60135481565b6000611626836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611da8565b905092915050565b6000611656836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e18565b905092915050565b6116666116dc565b73ffffffffffffffffffffffffffffffffffffffff16611684610fa1565b73ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d19061341a565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906134ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b99061353e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516118a09190612ad5565b60405180910390a3505050565b60006118b984846114d1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146119335781811015611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c906135aa565b60405180910390fd5b61193284848484036116e4565b5b50505050565b6000600860009054906101000a900460ff16156119645761195b848484611e3b565b60019050611b33565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119fd576119bd6120b1565b6119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390613616565b60405180910390fd5b5b6000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611aa35750600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611ab35750611ab26120b1565b5b9050611abe85611558565b15611ad057611acb6120be565b611af1565b611ad984611558565b15611aeb57611ae66120e4565b611af0565b600090505b5b611af961210a565b15611b0757611b06611c9b565b5b600081611b145783611b1f565b611b1e8685612178565b5b9050611b2c868683611e3b565b6001925050505b9392505050565b611bbb8363a9059cbb60e01b8484604051602401611b59929190613636565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506121b8565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611c948260000161227f565b9050919050565b6001600860006101000a81548160ff0219169083151502179055506000611cc130610f0e565b90506000600e54600c5483611cd6919061365f565b611ce091906136d0565b90508082611cee9190613063565b9150611cfd3061dead83611e3b565b611d28307f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f846116e4565b6000611d3383612290565b9050611d3e8161244b565b5050506000600860006101000a81548160ff021916908315150217905550565b6000611d86836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6125d9565b905092915050565b6000611d9d83600001836126ed565b60001c905092915050565b6000611db48383611e18565b611e0d578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611e12565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190613773565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1090613805565b60405180910390fd5b611f24838383612718565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613897565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120989190612ad5565b60405180910390a36120ab8484846127f6565b50505050565b600080601b541415905090565b601054600b81905550601154600c81905550601254600d81905550601354600e81905550565b601454600b81905550601554600c81905550601654600d81905550601754600e81905550565b6000600860009054906101000a900460ff161580156121355750600560149054906101000a900460ff165b801561214557506121446120b1565b5b801561215a575060065461215830610f0e565b115b8015612173575061217161216c6116dc565b611558565b155b905090565b600080600f54600e548461218c919061365f565b61219691906136d0565b90506121a3843083611e3b565b80836121af9190613063565b91505092915050565b600061221a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127fb9092919063ffffffff16565b905060008151111561227a578080602001905181019061223a91906138cc565b612279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122709061396b565b60405180910390fd5b5b505050565b600081600001805490509050919050565b6000804790506000600267ffffffffffffffff8111156122b3576122b2613243565b5b6040519080825280602002602001820160405280156122e15781602001602082028036833780820191505090505b50905030816000815181106122f9576122f861398b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106123685761236761398b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f73ffffffffffffffffffffffffffffffffffffffff1663791ac9478560008430426040518663ffffffff1660e01b8152600401612404959493929190613abd565b600060405180830381600087803b15801561241e57600080fd5b505af1158015612432573d6000803e3d6000fd5b5050505081476124429190613063565b92505050919050565b6000600c54600e5461245d9190613063565b600b548361246b919061365f565b61247591906136d0565b90506000600c54600e546124899190613063565b600d5484612497919061365f565b6124a191906136d0565b90506124fa6002836124b391906136d0565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661281390919063ffffffff16565b61255160028361250a91906136d0565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661281390919063ffffffff16565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399c722bc826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125bb57600080fd5b505af11580156125cf573d6000803e3d6000fd5b5050505050505050565b600080836001016000848152602001908152602001600020549050600081146126e157600060018261260b9190613063565b90506000600186600001805490506126239190613063565b90508181146126925760008660000182815481106126445761264361398b565b5b90600052602060002001549050808760000184815481106126685761266761398b565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806126a6576126a5613b17565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126e7565b60009150505b92915050565b60008260000182815481106127055761270461398b565b5b9060005260206000200154905092915050565b61272182611558565b8061275e575061272f610fa1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061279457503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6127f157600754816127a584610f0e565b6127af919061302f565b11156127f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e790613b92565b60405180910390fd5b5b505050565b505050565b606061280a8484600085612907565b90509392505050565b80471015612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d90613bfe565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161287c90613c44565b60006040518083038185875af1925050503d80600081146128b9576040519150601f19603f3d011682016040523d82523d6000602084013e6128be565b606091505b5050905080612902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f990613ccb565b60405180910390fd5b505050565b60608247101561294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390613d5d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161297591906132b9565b60006040518083038185875af1925050503d80600081146129b2576040519150601f19603f3d011682016040523d82523d6000602084013e6129b7565b606091505b50915091506129c8878383876129d4565b92505050949350505050565b60608315612a36576000835103612a2e576129ee85612a49565b612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2490613dc9565b60405180910390fd5b5b829050612a41565b612a408383612a6c565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612a7f5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab39190612b80565b60405180910390fd5b6000819050919050565b612acf81612abc565b82525050565b6000602082019050612aea6000830184612ac6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b2a578082015181840152602081019050612b0f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b5282612af0565b612b5c8185612afb565b9350612b6c818560208601612b0c565b612b7581612b36565b840191505092915050565b60006020820190508181036000830152612b9a8184612b47565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd282612ba7565b9050919050565b612be281612bc7565b8114612bed57600080fd5b50565b600081359050612bff81612bd9565b92915050565b612c0e81612abc565b8114612c1957600080fd5b50565b600081359050612c2b81612c05565b92915050565b60008060408385031215612c4857612c47612ba2565b5b6000612c5685828601612bf0565b9250506020612c6785828601612c1c565b9150509250929050565b60008115159050919050565b612c8681612c71565b82525050565b6000602082019050612ca16000830184612c7d565b92915050565b600080600060608486031215612cc057612cbf612ba2565b5b6000612cce86828701612c1c565b9350506020612cdf86828701612c1c565b9250506040612cf086828701612c1c565b9150509250925092565b612d0381612c71565b8114612d0e57600080fd5b50565b600081359050612d2081612cfa565b92915050565b600060208284031215612d3c57612d3b612ba2565b5b6000612d4a84828501612d11565b91505092915050565b600080600060608486031215612d6c57612d6b612ba2565b5b6000612d7a86828701612bf0565b9350506020612d8b86828701612bf0565b9250506040612d9c86828701612c1c565b9150509250925092565b600060ff82169050919050565b612dbc81612da6565b82525050565b6000602082019050612dd76000830184612db3565b92915050565b600060208284031215612df357612df2612ba2565b5b6000612e0184828501612bf0565b91505092915050565b60008060408385031215612e2157612e20612ba2565b5b6000612e2f85828601612bf0565b9250506020612e4085828601612d11565b9150509250929050565b612e5381612bc7565b82525050565b6000602082019050612e6e6000830184612e4a565b92915050565b600060208284031215612e8a57612e89612ba2565b5b6000612e9884828501612c1c565b91505092915050565b600080600060608486031215612eba57612eb9612ba2565b5b6000612ec886828701612bf0565b9350506020612ed986828701612bf0565b9250506040612eea86828701612bf0565b9150509250925092565b60008060408385031215612f0b57612f0a612ba2565b5b6000612f1985828601612bf0565b9250506020612f2a85828601612bf0565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000612f6a601083612afb565b9150612f7582612f34565b602082019050919050565b60006020820190508181036000830152612f9981612f5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fe757607f821691505b602082108103612ffa57612ff9612fa0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061303a82612abc565b915061304583612abc565b925082820190508082111561305d5761305c613000565b5b92915050565b600061306e82612abc565b915061307983612abc565b925082820390508181111561309157613090613000565b5b92915050565b6000815190506130a681612c05565b92915050565b6000602082840312156130c2576130c1612ba2565b5b60006130d084828501613097565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613135602583612afb565b9150613140826130d9565b604082019050919050565b6000602082019050818103600083015261316481613128565b9050919050565b7f4149445249503a207061697220697320746865207a65726f2061646472657373600082015250565b60006131a1602083612afb565b91506131ac8261316b565b602082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b7f4149445249503a20696e646578206f7574206f6620626f756e64730000000000600082015250565b600061320d601b83612afb565b9150613218826131d7565b602082019050919050565b6000602082019050818103600083015261323c81613200565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061329382613272565b61329d818561327d565b93506132ad818560208601612b0c565b80840191505092915050565b60006132c58284613288565b915081905092915050565b7f4149445249503a204554485f5452414e534645525f4641494c45440000000000600082015250565b6000613306601b83612afb565b9150613311826132d0565b602082019050919050565b60006020820190508181036000830152613335816132f9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613398602683612afb565b91506133a38261333c565b604082019050919050565b600060208201905081810360008301526133c78161338b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613404602083612afb565b915061340f826133ce565b602082019050919050565b60006020820190508181036000830152613433816133f7565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613496602483612afb565b91506134a18261343a565b604082019050919050565b600060208201905081810360008301526134c581613489565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613528602283612afb565b9150613533826134cc565b604082019050919050565b600060208201905081810360008301526135578161351b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613594601d83612afb565b915061359f8261355e565b602082019050919050565b600060208201905081810360008301526135c381613587565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000613600601483612afb565b915061360b826135ca565b602082019050919050565b6000602082019050818103600083015261362f816135f3565b9050919050565b600060408201905061364b6000830185612e4a565b6136586020830184612ac6565b9392505050565b600061366a82612abc565b915061367583612abc565b925082820261368381612abc565b9150828204841483151761369a57613699613000565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136db82612abc565b91506136e683612abc565b9250826136f6576136f56136a1565b5b828204905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061375d602583612afb565b915061376882613701565b604082019050919050565b6000602082019050818103600083015261378c81613750565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006137ef602383612afb565b91506137fa82613793565b604082019050919050565b6000602082019050818103600083015261381e816137e2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613881602683612afb565b915061388c82613825565b604082019050919050565b600060208201905081810360008301526138b081613874565b9050919050565b6000815190506138c681612cfa565b92915050565b6000602082840312156138e2576138e1612ba2565b5b60006138f0848285016138b7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613955602a83612afb565b9150613960826138f9565b604082019050919050565b6000602082019050818103600083015261398481613948565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006139e96139e46139df846139ba565b6139c4565b612abc565b9050919050565b6139f9816139ce565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a3481612bc7565b82525050565b6000613a468383613a2b565b60208301905092915050565b6000602082019050919050565b6000613a6a826139ff565b613a748185613a0a565b9350613a7f83613a1b565b8060005b83811015613ab0578151613a978882613a3a565b9750613aa283613a52565b925050600181019050613a83565b5085935050505092915050565b600060a082019050613ad26000830188612ac6565b613adf60208301876139f0565b8181036040830152613af18186613a5f565b9050613b006060830185612e4a565b613b0d6080830184612ac6565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f466f726269640000000000000000000000000000000000000000000000000000600082015250565b6000613b7c600683612afb565b9150613b8782613b46565b602082019050919050565b60006020820190508181036000830152613bab81613b6f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613be8601d83612afb565b9150613bf382613bb2565b602082019050919050565b60006020820190508181036000830152613c1781613bdb565b9050919050565b50565b6000613c2e60008361327d565b9150613c3982613c1e565b600082019050919050565b6000613c4f82613c21565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613cb5603a83612afb565b9150613cc082613c59565b604082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613d47602683612afb565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613db3601d83612afb565b9150613dbe82613d7d565b602082019050919050565b60006020820190508181036000830152613de281613da6565b905091905056fea2646970667358221220a3637a5262cc93f723775143191c80cbdbd3a0a3b27b97cca44822b8631c745f64736f6c63430008120033

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

000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f

-----Decoded View---------------
Arg [0] : _swapRouter (address): 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f


Deployed Bytecode Sourcemap

60130:9781:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67425:182;;;;;;;;;;;;;:::i;:::-;;60341:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9580:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11997:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67615:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67944:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61028:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60892;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60792:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10700:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68719:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61066:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62655:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67249:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10542:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13507:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60551:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66742:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61147:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68592:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60930:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60304:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10871:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2905:103;;;;;;;;;;;;;:::i;:::-;;60601:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69586:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60389:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2257:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64972:68;;;;;;;;;;;;;:::i;:::-;;61105:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9799:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68830:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14273:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69397:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62467:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68956:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69690:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61335:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66960:281;;;;;;;;;;;;;:::i;:::-;;69211:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61367:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60855:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68287:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60429:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11501:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69094:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3163:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60971:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67425:182;2143:13;:11;:13::i;:::-;67493:1:::1;67479:10;;:15;67471:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;67539:12;67526:10;:25;;;;67584:15;67562:19;:37;;;;67425:182::o:0;60341:41::-;;;;:::o;9580:100::-;9634:13;9667:5;9660:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9580:100;:::o;11997:226::-;12105:4;12122:13;12138:12;:10;:12::i;:::-;12122:28;;12161:32;12170:5;12177:7;12186:6;12161:8;:32::i;:::-;12211:4;12204:11;;;11997:226;;;;:::o;67615:321::-;2143:13;:11;:13::i;:::-;67776:10:::1;67764:9;:22;;;;67810:11;67797:10;:24;;;;67848:14;67832:13;:30;;;;67914:14;67900:11;67887:10;:24;;;;:::i;:::-;:41;;;;:::i;:::-;67873:11;:55;;;;67615:321:::0;;;:::o;67944:335::-;2143:13;:11;:13::i;:::-;68110:11:::1;68097:10;:24;;;;68146:12;68132:11;:26;;;;68186:15;68169:14;:32;;;;68256:15;68241:12;68227:11;:26;;;;:::i;:::-;:44;;;;:::i;:::-;68212:12;:59;;;;67944:335:::0;;;:::o;61028:31::-;;;;:::o;60892:::-;;;;:::o;60792:37::-;;;;:::o;10700:108::-;10761:7;10788:12;;10781:19;;10700:108;:::o;68719:103::-;2143:13;:11;:13::i;:::-;68806:8:::1;68792:11;;:22;;;;;;;;;;;;;;;;;;68719:103:::0;:::o;61066:32::-;;;;:::o;62655:309::-;62795:4;62812:15;62830:12;:10;:12::i;:::-;62812:30;;62853:40;62869:6;62877:7;62886:6;62853:15;:40::i;:::-;62911:45;62930:6;62938:9;62949:6;62911:18;:45::i;:::-;62904:52;;;62655:309;;;;;:::o;67249:137::-;67302:7;67363:15;61695:42;67363:9;:15::i;:::-;67345;61614:42;67345:9;:15::i;:::-;67329:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:49;;;;:::i;:::-;67322:56;;67249:137;:::o;10542:93::-;10600:5;10625:2;10618:9;;10542:93;:::o;13507:263::-;13620:4;13637:13;13653:12;:10;:12::i;:::-;13637:28;;13676:64;13685:5;13692:7;13729:10;13701:25;13711:5;13718:7;13701:9;:25::i;:::-;:38;;;;:::i;:::-;13676:8;:64::i;:::-;13758:4;13751:11;;;13507:263;;;;:::o;60551:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;66742:210::-;2143:13;:11;:13::i;:::-;66815:129:::1;66863:10;66895:12;66888:30;;;66927:4;66888:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66822:12;66815:33;;;;:129;;;;;:::i;:::-;66742:210:::0;:::o;61147:33::-;;;;:::o;68592:119::-;2143:13;:11;:13::i;:::-;68697:6:::1;68675:11;:19;68687:6;68675:19;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68592:119:::0;;:::o;60930:34::-;;;;:::o;60304:30::-;;;;;;;;;;;;;:::o;10871:143::-;10961:7;10988:9;:18;10998:7;10988:18;;;;;;;;;;;;;;;;10981:25;;10871:143;;;:::o;2905:103::-;2143:13;:11;:13::i;:::-;2970:30:::1;2997:1;2970:18;:30::i;:::-;2905:103::o:0;60601:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;69586:96::-;69633:7;69660:14;:5;:12;:14::i;:::-;69653:21;;69586:96;:::o;60389:31::-;;;;:::o;2257:87::-;2303:7;2330:6;;;;;;;;;;;2323:13;;2257:87;:::o;64972:68::-;2143:13;:11;:13::i;:::-;65022:10:::1;:8;:10::i;:::-;64972:68::o:0;61105:35::-;;;;:::o;9799:104::-;9855:13;9888:7;9881:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9799:104;:::o;68830:118::-;2143:13;:11;:13::i;:::-;68926:14:::1;68910:13;:30;;;;68830:118:::0;:::o;14273:498::-;14391:4;14408:13;14424:12;:10;:12::i;:::-;14408:28;;14447:24;14474:25;14484:5;14491:7;14474:9;:25::i;:::-;14447:52;;14552:15;14532:16;:35;;14510:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;14668:60;14677:5;14684:7;14712:15;14693:16;:34;14668:8;:60::i;:::-;14759:4;14752:11;;;;14273:498;;;;:::o;69397:181::-;69454:4;2143:13;:11;:13::i;:::-;69495:1:::1;69479:18;;:4;:18;;::::0;69471:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69552:18;69565:4;69552:5;:12;;:18;;;;:::i;:::-;69545:25;;69397:181:::0;;;:::o;62467:180::-;62571:4;62595:44;62614:12;:10;:12::i;:::-;62628:2;62632:6;62595:18;:44::i;:::-;62588:51;;62467:180;;;;:::o;68956:130::-;2143:13;:11;:13::i;:::-;69061:17:::1;69042:16;:36;;;;68956:130:::0;:::o;69690:181::-;69743:7;69797:1;69780:14;:5;:12;:14::i;:::-;:18;;;;:::i;:::-;69771:5;:27;;69763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;69848:15;69857:5;69848;:8;;:15;;;;:::i;:::-;69841:22;;69690:181;;;:::o;61335:25::-;;;;:::o;66960:281::-;2143:13;:11;:13::i;:::-;67022:17:::1;67042:21;67022:41;;67075:12;67101;:10;:12::i;:::-;67093:26;;67127:9;67162:1;67152:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67093:82;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67074:101;;;67194:7;67186:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;67011:230;;66960:281::o:0;69211:178::-;69268:4;2143:13;:11;:13::i;:::-;69309:1:::1;69293:18;;:4;:18;;::::0;69285:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69366:15;69376:4;69366:5;:9;;:15;;;;:::i;:::-;69359:22;;69211:178:::0;;;:::o;61367:34::-;;;;:::o;60855:30::-;;;;:::o;68287:297::-;2143:13;:11;:13::i;:::-;68465:11:::1;68444:10;;:33;;;;;;;;;;;;;;;;;;68509:11;68488:10;;:33;;;;;;;;;;;;;;;;;;68559:16;68532:15;;:44;;;;;;;;;;;;;;;;;;68287:297:::0;;;:::o;60429:18::-;;;;;;;;;;;;;:::o;11501:176::-;11615:7;11642:11;:18;11654:5;11642:18;;;;;;;;;;;;;;;:27;11661:7;11642:27;;;;;;;;;;;;;;;;11635:34;;11501:176;;;;:::o;69094:109::-;69148:4;69172:23;69187:7;69172:5;:14;;:23;;;;:::i;:::-;69165:30;;69094:109;;;:::o;3163:238::-;2143:13;:11;:13::i;:::-;3286:1:::1;3266:22;;:8;:22;;::::0;3244:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3365:28;3384:8;3365:18;:28::i;:::-;3163:238:::0;:::o;60971:32::-;;;;:::o;54098:177::-;54193:4;54217:50;54222:3;:10;;54258:5;54242:23;;54234:32;;54217:4;:50::i;:::-;54210:57;;54098:177;;;;:::o;54720:192::-;54825:4;54849:55;54859:3;:10;;54895:5;54879:23;;54871:32;;54849:9;:55::i;:::-;54842:62;;54720:192;;;;:::o;2422:132::-;2497:12;:10;:12::i;:::-;2486:23;;:7;:5;:7::i;:::-;:23;;;2478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2422:132::o;781:98::-;834:7;861:10;854:17;;781:98;:::o;18399:380::-;18552:1;18535:19;;:5;:19;;;18527:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18633:1;18614:21;;:7;:21;;;18606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18717:6;18687:11;:18;18699:5;18687:18;;;;;;;;;;;;;;;:27;18706:7;18687:27;;;;;;;;;;;;;;;:36;;;;18755:7;18739:32;;18748:5;18739:32;;;18764:6;18739:32;;;;;;:::i;:::-;;;;;;;;18399:380;;;:::o;19070:502::-;19205:24;19232:25;19242:5;19249:7;19232:9;:25::i;:::-;19205:52;;19292:17;19272:16;:37;19268:297;;19372:6;19352:16;:26;;19326:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;19487:51;19496:5;19503:7;19531:6;19512:16;:25;19487:8;:51::i;:::-;19268:297;19194:378;19070:502;;;:::o;63319:955::-;63450:4;63471:6;;;;;;;;;;;63467:101;;;63494:36;63504:6;63512:9;63523:6;63494:9;:36::i;:::-;63552:4;63545:11;;;;63467:101;63583:27;:35;63611:6;63583:35;;;;;;;;;;;;;;;;;;;;;;;;;63578:112;;63643:10;:8;:10::i;:::-;63635:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;63578:112;63702:18;63725:11;:19;63737:6;63725:19;;;;;;;;;;;;;;;;;;;;;;;;;63724:20;:60;;;;;63762:11;:22;63774:9;63762:22;;;;;;;;;;;;;;;;;;;;;;;;;63761:23;63724:60;63723:76;;;;;63789:10;:8;:10::i;:::-;63723:76;63702:97;;63837:14;63844:6;63837;:14::i;:::-;63833:176;;;63868:9;:7;:9::i;:::-;63833:176;;;63899:17;63906:9;63899:6;:17::i;:::-;63895:114;;;63933:10;:8;:10::i;:::-;63895:114;;;63992:5;63976:21;;63895:114;63833:176;64023:16;:14;:16::i;:::-;64019:59;;;64056:10;:8;:10::i;:::-;64019:59;64090:22;64115:13;:74;;64183:6;64115:74;;;64144:23;64152:6;64160;64144:7;:23::i;:::-;64115:74;64090:99;;64200:44;64210:6;64218:9;64229:14;64200:9;:44::i;:::-;64262:4;64255:11;;;;63319:955;;;;;;:::o;35582:214::-;35665:123;35699:5;35742:23;;;35767:2;35771:5;35719:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35665:19;:123::i;:::-;35582:214;;;:::o;3561:191::-;3635:16;3654:6;;;;;;;;;;;3635:25;;3680:8;3671:6;;:17;;;;;;;;;;;;;;;;;;3735:8;3704:40;;3725:8;3704:40;;;;;;;;;;;;3624:128;3561:191;:::o;54998:117::-;55061:7;55088:19;55096:3;:10;;55088:7;:19::i;:::-;55081:26;;54998:117;;;:::o;64541:423::-;60494:4;60485:6;;:13;;;;;;;;;;;;;;;;;;64590:17:::1;64610:24;64628:4;64610:9;:24::i;:::-;64590:44;;64647:20;64695:8;;64683:7;;64671:9;:19;;;;:::i;:::-;64670:34;;;;:::i;:::-;64647:57;;64730:12;64717:25;;;;;:::i;:::-;;;64755:44;64773:4;61614:42;64786:12;64755:9;:44::i;:::-;64810:55;64827:4;64842:10;64855:9;64810:8;:55::i;:::-;64876:17;64896:24;64910:9;64896:13;:24::i;:::-;64876:44;;64931:25;64946:9;64931:14;:25::i;:::-;64579:385;;;60530:5:::0;60521:6;;:14;;;;;;;;;;;;;;;;;;64541:423::o;54451:183::-;54549:4;54573:53;54581:3;:10;;54617:5;54601:23;;54593:32;;54573:7;:53::i;:::-;54566:60;;54451:183;;;;:::o;55469:::-;55568:7;55619:22;55623:3;:10;;55635:5;55619:3;:22::i;:::-;55611:31;;55588:56;;55469:183;;;;:::o;47663:414::-;47726:4;47748:21;47758:3;47763:5;47748:9;:21::i;:::-;47743:327;;47786:3;:11;;47803:5;47786:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47969:3;:11;;:18;;;;47947:3;:12;;:19;47960:5;47947:19;;;;;;;;;;;:40;;;;48009:4;48002:11;;;;47743:327;48053:5;48046:12;;47663:414;;;;;:::o;49759:154::-;49857:4;49904:1;49881:3;:12;;:19;49894:5;49881:19;;;;;;;;;;;;:24;;49874:31;;49759:154;;;;:::o;15241:877::-;15388:1;15372:18;;:4;:18;;;15364:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15465:1;15451:16;;:2;:16;;;15443:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;15520:38;15541:4;15547:2;15551:6;15520:20;:38::i;:::-;15571:19;15593:9;:15;15603:4;15593:15;;;;;;;;;;;;;;;;15571:37;;15656:6;15641:11;:21;;15619:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;15796:6;15782:11;:20;15764:9;:15;15774:4;15764:15;;;;;;;;;;;;;;;:38;;;;15999:6;15982:9;:13;15992:2;15982:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;16049:2;16034:26;;16043:4;16034:26;;;16053:6;16034:26;;;;;;:::i;:::-;;;;;;;;16073:37;16093:4;16099:2;16103:6;16073:19;:37::i;:::-;15353:765;15241:877;;;:::o;66017:90::-;66060:4;66098:1;66084:10;;:15;;66077:22;;66017:90;:::o;66115:166::-;66163:9;;66154:6;:18;;;;66193:10;;66183:7;:20;;;;66227:13;;66214:10;:26;;;;66262:11;;66251:8;:22;;;;66115:166::o;66289:171::-;66338:10;;66329:6;:19;;;;66369:11;;66359:7;:21;;;;66404:14;;66391:10;:27;;;;66440:12;;66429:8;:23;;;;66289:171::o;64282:251::-;64331:4;64369:6;;;;;;;;;;;64368:7;:35;;;;;64392:11;;;;;;;;;;;64368:35;:62;;;;;64420:10;:8;:10::i;:::-;64368:62;:119;;;;;64474:13;;64447:24;64465:4;64447:9;:24::i;:::-;:40;64368:119;:157;;;;;64505:20;64512:12;:10;:12::i;:::-;64505:6;:20::i;:::-;64504:21;64368:157;64348:177;;64282:251;:::o;66468:266::-;66560:7;66580:17;66622:14;;66610:8;;66601:6;:17;;;;:::i;:::-;66600:36;;;;:::i;:::-;66580:56;;66647:43;66657:6;66673:4;66680:9;66647;:43::i;:::-;66717:9;66708:6;:18;;;;:::i;:::-;66701:25;;;66468:266;;;;:::o;39046:802::-;39470:23;39496:106;39538:4;39496:106;;;;;;;;;;;;;;;;;39504:5;39496:27;;;;:106;;;;;:::i;:::-;39470:132;;39637:1;39617:10;:17;:21;39613:228;;;39732:10;39721:30;;;;;;;;;;;;:::i;:::-;39695:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;39613:228;39116:732;39046:802;;:::o;49999:109::-;50055:7;50082:3;:11;;:18;;;;50075:25;;49999:109;;;:::o;65048:551::-;65124:20;65157:23;65183:21;65157:47;;65215:24;65256:1;65242:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65215:43;;65290:4;65269:7;65277:1;65269:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;65319:4;65306:7;65314:1;65306:10;;;;;;;;:::i;:::-;;;;;;;:17;;;;;;;;;;;65334:10;:61;;;65410:9;65434:1;65450:7;65480:4;65500:15;65334:192;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65576:15;65552:21;:39;;;;:::i;:::-;65537:54;;65146:453;;65048:551;;;:::o;65607:402::-;65670:20;65728:7;;65717:8;;:18;;;;:::i;:::-;65706:6;;65694:9;:18;;;;:::i;:::-;65693:43;;;;:::i;:::-;65670:66;;65747:24;65826:7;;65815:8;;:18;;;;:::i;:::-;65787:10;;65775:9;:22;;;;:::i;:::-;65774:60;;;;:::i;:::-;65747:87;;65847:38;65883:1;65868:12;:16;;;;:::i;:::-;65847:10;;;;;;;;;;;:20;;;;:38;;;;:::i;:::-;65896;65932:1;65917:12;:16;;;;:::i;:::-;65896:10;;;;;;;;;;;:20;;;;:38;;;;:::i;:::-;65945:15;;;;;;;;;;;:29;;;65982:16;65945:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65659:350;;65607:402;:::o;48253:1420::-;48319:4;48437:18;48458:3;:12;;:19;48471:5;48458:19;;;;;;;;;;;;48437:40;;48508:1;48494:10;:15;48490:1176;;48869:21;48906:1;48893:10;:14;;;;:::i;:::-;48869:38;;48922:17;48963:1;48942:3;:11;;:18;;;;:22;;;;:::i;:::-;48922:42;;48998:13;48985:9;:26;48981:405;;49032:17;49052:3;:11;;49064:9;49052:22;;;;;;;;:::i;:::-;;;;;;;;;;49032:42;;49206:9;49177:3;:11;;49189:13;49177:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;49317:10;49291:3;:12;;:23;49304:9;49291:23;;;;;;;;;;;:36;;;;49013:373;48981:405;49467:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49562:3;:12;;:19;49575:5;49562:19;;;;;;;;;;;49555:26;;;49605:4;49598:11;;;;;;;48490:1176;49649:5;49642:12;;;48253:1420;;;;;:::o;50462:145::-;50554:7;50581:3;:11;;50593:5;50581:18;;;;;;;;:::i;:::-;;;;;;;;;;50574:25;;50462:145;;;;:::o;62972:339::-;63119:10;63126:2;63119:6;:10::i;:::-;:27;;;;63139:7;:5;:7::i;:::-;63133:13;;:2;:13;;;63119:27;:50;;;;63164:4;63150:19;;:2;:19;;;63119:50;63186:7;63115:189;63265:16;;63255:6;63233:19;63249:2;63233:15;:19::i;:::-;:28;;;;:::i;:::-;:48;;63225:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;62972:339;;;;:::o;20901:124::-;;;;:::o;28754:229::-;28891:12;28923:52;28945:6;28953:4;28959:1;28962:12;28923:21;:52::i;:::-;28916:59;;28754:229;;;;;:::o;27063:391::-;27192:6;27167:21;:31;;27145:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27269:12;27287:9;:14;;27309:6;27287:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27268:52;;;27353:7;27331:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;27134:320;27063:391;;:::o;29970:612::-;30140:12;30212:5;30187:21;:30;;30165:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;30295:12;30309:23;30336:6;:11;;30355:5;30376:4;30336:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30294:97;;;;30422:152;30467:6;30492:7;30518:10;30547:12;30422:26;:152::i;:::-;30402:172;;;;29970:612;;;;;;:::o;33100:644::-;33285:12;33314:7;33310:427;;;33363:1;33342:10;:17;:22;33338:290;;33560:18;33571:6;33560:10;:18::i;:::-;33552:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33338:290;33649:10;33642:17;;;;33310:427;33692:33;33700:10;33712:12;33692:7;:33::i;:::-;33100:644;;;;;;;:::o;25802:326::-;25862:4;26119:1;26097:7;:19;;;:23;26090:30;;25802:326;;;:::o;34286:577::-;34492:1;34472:10;:17;:21;34468:388;;;34704:10;34698:17;34761:15;34748:10;34744:2;34740:19;34733:44;34468:388;34831:12;34824:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:116::-;4493:21;4508:5;4493:21;:::i;:::-;4486:5;4483:32;4473:60;;4529:1;4526;4519:12;4473:60;4423:116;:::o;4545:133::-;4588:5;4626:6;4613:20;4604:29;;4642:30;4666:5;4642:30;:::i;:::-;4545:133;;;;:::o;4684:323::-;4740:6;4789:2;4777:9;4768:7;4764:23;4760:32;4757:119;;;4795:79;;:::i;:::-;4757:119;4915:1;4940:50;4982:7;4973:6;4962:9;4958:22;4940:50;:::i;:::-;4930:60;;4886:114;4684:323;;;;:::o;5013:619::-;5090:6;5098;5106;5155:2;5143:9;5134:7;5130:23;5126:32;5123:119;;;5161:79;;:::i;:::-;5123:119;5281:1;5306:53;5351:7;5342:6;5331:9;5327:22;5306:53;:::i;:::-;5296:63;;5252:117;5408:2;5434:53;5479:7;5470:6;5459:9;5455:22;5434:53;:::i;:::-;5424:63;;5379:118;5536:2;5562:53;5607:7;5598:6;5587:9;5583:22;5562:53;:::i;:::-;5552:63;;5507:118;5013:619;;;;;:::o;5638:86::-;5673:7;5713:4;5706:5;5702:16;5691:27;;5638:86;;;:::o;5730:112::-;5813:22;5829:5;5813:22;:::i;:::-;5808:3;5801:35;5730:112;;:::o;5848:214::-;5937:4;5975:2;5964:9;5960:18;5952:26;;5988:67;6052:1;6041:9;6037:17;6028:6;5988:67;:::i;:::-;5848:214;;;;:::o;6068:329::-;6127:6;6176:2;6164:9;6155:7;6151:23;6147:32;6144:119;;;6182:79;;:::i;:::-;6144:119;6302:1;6327:53;6372:7;6363:6;6352:9;6348:22;6327:53;:::i;:::-;6317:63;;6273:117;6068:329;;;;:::o;6403:468::-;6468:6;6476;6525:2;6513:9;6504:7;6500:23;6496:32;6493:119;;;6531:79;;:::i;:::-;6493:119;6651:1;6676:53;6721:7;6712:6;6701:9;6697:22;6676:53;:::i;:::-;6666:63;;6622:117;6778:2;6804:50;6846:7;6837:6;6826:9;6822:22;6804:50;:::i;:::-;6794:60;;6749:115;6403:468;;;;;:::o;6877:118::-;6964:24;6982:5;6964:24;:::i;:::-;6959:3;6952:37;6877:118;;:::o;7001:222::-;7094:4;7132:2;7121:9;7117:18;7109:26;;7145:71;7213:1;7202:9;7198:17;7189:6;7145:71;:::i;:::-;7001:222;;;;:::o;7229:329::-;7288:6;7337:2;7325:9;7316:7;7312:23;7308:32;7305:119;;;7343:79;;:::i;:::-;7305:119;7463:1;7488:53;7533:7;7524:6;7513:9;7509:22;7488:53;:::i;:::-;7478:63;;7434:117;7229:329;;;;:::o;7564:619::-;7641:6;7649;7657;7706:2;7694:9;7685:7;7681:23;7677:32;7674:119;;;7712:79;;:::i;:::-;7674:119;7832:1;7857:53;7902:7;7893:6;7882:9;7878:22;7857:53;:::i;:::-;7847:63;;7803:117;7959:2;7985:53;8030:7;8021:6;8010:9;8006:22;7985:53;:::i;:::-;7975:63;;7930:118;8087:2;8113:53;8158:7;8149:6;8138:9;8134:22;8113:53;:::i;:::-;8103:63;;8058:118;7564:619;;;;;:::o;8189:474::-;8257:6;8265;8314:2;8302:9;8293:7;8289:23;8285:32;8282:119;;;8320:79;;:::i;:::-;8282:119;8440:1;8465:53;8510:7;8501:6;8490:9;8486:22;8465:53;:::i;:::-;8455:63;;8411:117;8567:2;8593:53;8638:7;8629:6;8618:9;8614:22;8593:53;:::i;:::-;8583:63;;8538:118;8189:474;;;;;:::o;8669:166::-;8809:18;8805:1;8797:6;8793:14;8786:42;8669:166;:::o;8841:366::-;8983:3;9004:67;9068:2;9063:3;9004:67;:::i;:::-;8997:74;;9080:93;9169:3;9080:93;:::i;:::-;9198:2;9193:3;9189:12;9182:19;;8841:366;;;:::o;9213:419::-;9379:4;9417:2;9406:9;9402:18;9394:26;;9466:9;9460:4;9456:20;9452:1;9441:9;9437:17;9430:47;9494:131;9620:4;9494:131;:::i;:::-;9486:139;;9213:419;;;:::o;9638:180::-;9686:77;9683:1;9676:88;9783:4;9780:1;9773:15;9807:4;9804:1;9797:15;9824:320;9868:6;9905:1;9899:4;9895:12;9885:22;;9952:1;9946:4;9942:12;9973:18;9963:81;;10029:4;10021:6;10017:17;10007:27;;9963:81;10091:2;10083:6;10080:14;10060:18;10057:38;10054:84;;10110:18;;:::i;:::-;10054:84;9875:269;9824:320;;;:::o;10150:180::-;10198:77;10195:1;10188:88;10295:4;10292:1;10285:15;10319:4;10316:1;10309:15;10336:191;10376:3;10395:20;10413:1;10395:20;:::i;:::-;10390:25;;10429:20;10447:1;10429:20;:::i;:::-;10424:25;;10472:1;10469;10465:9;10458:16;;10493:3;10490:1;10487:10;10484:36;;;10500:18;;:::i;:::-;10484:36;10336:191;;;;:::o;10533:194::-;10573:4;10593:20;10611:1;10593:20;:::i;:::-;10588:25;;10627:20;10645:1;10627:20;:::i;:::-;10622:25;;10671:1;10668;10664:9;10656:17;;10695:1;10689:4;10686:11;10683:37;;;10700:18;;:::i;:::-;10683:37;10533:194;;;;:::o;10733:143::-;10790:5;10821:6;10815:13;10806:22;;10837:33;10864:5;10837:33;:::i;:::-;10733:143;;;;:::o;10882:351::-;10952:6;11001:2;10989:9;10980:7;10976:23;10972:32;10969:119;;;11007:79;;:::i;:::-;10969:119;11127:1;11152:64;11208:7;11199:6;11188:9;11184:22;11152:64;:::i;:::-;11142:74;;11098:128;10882:351;;;;:::o;11239:224::-;11379:34;11375:1;11367:6;11363:14;11356:58;11448:7;11443:2;11435:6;11431:15;11424:32;11239:224;:::o;11469:366::-;11611:3;11632:67;11696:2;11691:3;11632:67;:::i;:::-;11625:74;;11708:93;11797:3;11708:93;:::i;:::-;11826:2;11821:3;11817:12;11810:19;;11469:366;;;:::o;11841:419::-;12007:4;12045:2;12034:9;12030:18;12022:26;;12094:9;12088:4;12084:20;12080:1;12069:9;12065:17;12058:47;12122:131;12248:4;12122:131;:::i;:::-;12114:139;;11841:419;;;:::o;12266:182::-;12406:34;12402:1;12394:6;12390:14;12383:58;12266:182;:::o;12454:366::-;12596:3;12617:67;12681:2;12676:3;12617:67;:::i;:::-;12610:74;;12693:93;12782:3;12693:93;:::i;:::-;12811:2;12806:3;12802:12;12795:19;;12454:366;;;:::o;12826:419::-;12992:4;13030:2;13019:9;13015:18;13007:26;;13079:9;13073:4;13069:20;13065:1;13054:9;13050:17;13043:47;13107:131;13233:4;13107:131;:::i;:::-;13099:139;;12826:419;;;:::o;13251:177::-;13391:29;13387:1;13379:6;13375:14;13368:53;13251:177;:::o;13434:366::-;13576:3;13597:67;13661:2;13656:3;13597:67;:::i;:::-;13590:74;;13673:93;13762:3;13673:93;:::i;:::-;13791:2;13786:3;13782:12;13775:19;;13434:366;;;:::o;13806:419::-;13972:4;14010:2;13999:9;13995:18;13987:26;;14059:9;14053:4;14049:20;14045:1;14034:9;14030:17;14023:47;14087:131;14213:4;14087:131;:::i;:::-;14079:139;;13806:419;;;:::o;14231:180::-;14279:77;14276:1;14269:88;14376:4;14373:1;14366:15;14400:4;14397:1;14390:15;14417:98;14468:6;14502:5;14496:12;14486:22;;14417:98;;;:::o;14521:147::-;14622:11;14659:3;14644:18;;14521:147;;;;:::o;14674:386::-;14778:3;14806:38;14838:5;14806:38;:::i;:::-;14860:88;14941:6;14936:3;14860:88;:::i;:::-;14853:95;;14957:65;15015:6;15010:3;15003:4;14996:5;14992:16;14957:65;:::i;:::-;15047:6;15042:3;15038:16;15031:23;;14782:278;14674:386;;;;:::o;15066:271::-;15196:3;15218:93;15307:3;15298:6;15218:93;:::i;:::-;15211:100;;15328:3;15321:10;;15066:271;;;;:::o;15343:177::-;15483:29;15479:1;15471:6;15467:14;15460:53;15343:177;:::o;15526:366::-;15668:3;15689:67;15753:2;15748:3;15689:67;:::i;:::-;15682:74;;15765:93;15854:3;15765:93;:::i;:::-;15883:2;15878:3;15874:12;15867:19;;15526:366;;;:::o;15898:419::-;16064:4;16102:2;16091:9;16087:18;16079:26;;16151:9;16145:4;16141:20;16137:1;16126:9;16122:17;16115:47;16179:131;16305:4;16179:131;:::i;:::-;16171:139;;15898:419;;;:::o;16323:225::-;16463:34;16459:1;16451:6;16447:14;16440:58;16532:8;16527:2;16519:6;16515:15;16508:33;16323:225;:::o;16554:366::-;16696:3;16717:67;16781:2;16776:3;16717:67;:::i;:::-;16710:74;;16793:93;16882:3;16793:93;:::i;:::-;16911:2;16906:3;16902:12;16895:19;;16554:366;;;:::o;16926:419::-;17092:4;17130:2;17119:9;17115:18;17107:26;;17179:9;17173:4;17169:20;17165:1;17154:9;17150:17;17143:47;17207:131;17333:4;17207:131;:::i;:::-;17199:139;;16926:419;;;:::o;17351:182::-;17491:34;17487:1;17479:6;17475:14;17468:58;17351:182;:::o;17539:366::-;17681:3;17702:67;17766:2;17761:3;17702:67;:::i;:::-;17695:74;;17778:93;17867:3;17778:93;:::i;:::-;17896:2;17891:3;17887:12;17880:19;;17539:366;;;:::o;17911:419::-;18077:4;18115:2;18104:9;18100:18;18092:26;;18164:9;18158:4;18154:20;18150:1;18139:9;18135:17;18128:47;18192:131;18318:4;18192:131;:::i;:::-;18184:139;;17911:419;;;:::o;18336:223::-;18476:34;18472:1;18464:6;18460:14;18453:58;18545:6;18540:2;18532:6;18528:15;18521:31;18336:223;:::o;18565:366::-;18707:3;18728:67;18792:2;18787:3;18728:67;:::i;:::-;18721:74;;18804:93;18893:3;18804:93;:::i;:::-;18922:2;18917:3;18913:12;18906:19;;18565:366;;;:::o;18937:419::-;19103:4;19141:2;19130:9;19126:18;19118:26;;19190:9;19184:4;19180:20;19176:1;19165:9;19161:17;19154:47;19218:131;19344:4;19218:131;:::i;:::-;19210:139;;18937:419;;;:::o;19362:221::-;19502:34;19498:1;19490:6;19486:14;19479:58;19571:4;19566:2;19558:6;19554:15;19547:29;19362:221;:::o;19589:366::-;19731:3;19752:67;19816:2;19811:3;19752:67;:::i;:::-;19745:74;;19828:93;19917:3;19828:93;:::i;:::-;19946:2;19941:3;19937:12;19930:19;;19589:366;;;:::o;19961:419::-;20127:4;20165:2;20154:9;20150:18;20142:26;;20214:9;20208:4;20204:20;20200:1;20189:9;20185:17;20178:47;20242:131;20368:4;20242:131;:::i;:::-;20234:139;;19961:419;;;:::o;20386:179::-;20526:31;20522:1;20514:6;20510:14;20503:55;20386:179;:::o;20571:366::-;20713:3;20734:67;20798:2;20793:3;20734:67;:::i;:::-;20727:74;;20810:93;20899:3;20810:93;:::i;:::-;20928:2;20923:3;20919:12;20912:19;;20571:366;;;:::o;20943:419::-;21109:4;21147:2;21136:9;21132:18;21124:26;;21196:9;21190:4;21186:20;21182:1;21171:9;21167:17;21160:47;21224:131;21350:4;21224:131;:::i;:::-;21216:139;;20943:419;;;:::o;21368:170::-;21508:22;21504:1;21496:6;21492:14;21485:46;21368:170;:::o;21544:366::-;21686:3;21707:67;21771:2;21766:3;21707:67;:::i;:::-;21700:74;;21783:93;21872:3;21783:93;:::i;:::-;21901:2;21896:3;21892:12;21885:19;;21544:366;;;:::o;21916:419::-;22082:4;22120:2;22109:9;22105:18;22097:26;;22169:9;22163:4;22159:20;22155:1;22144:9;22140:17;22133:47;22197:131;22323:4;22197:131;:::i;:::-;22189:139;;21916:419;;;:::o;22341:332::-;22462:4;22500:2;22489:9;22485:18;22477:26;;22513:71;22581:1;22570:9;22566:17;22557:6;22513:71;:::i;:::-;22594:72;22662:2;22651:9;22647:18;22638:6;22594:72;:::i;:::-;22341:332;;;;;:::o;22679:410::-;22719:7;22742:20;22760:1;22742:20;:::i;:::-;22737:25;;22776:20;22794:1;22776:20;:::i;:::-;22771:25;;22831:1;22828;22824:9;22853:30;22871:11;22853:30;:::i;:::-;22842:41;;23032:1;23023:7;23019:15;23016:1;23013:22;22993:1;22986:9;22966:83;22943:139;;23062:18;;:::i;:::-;22943:139;22727:362;22679:410;;;;:::o;23095:180::-;23143:77;23140:1;23133:88;23240:4;23237:1;23230:15;23264:4;23261:1;23254:15;23281:185;23321:1;23338:20;23356:1;23338:20;:::i;:::-;23333:25;;23372:20;23390:1;23372:20;:::i;:::-;23367:25;;23411:1;23401:35;;23416:18;;:::i;:::-;23401:35;23458:1;23455;23451:9;23446:14;;23281:185;;;;:::o;23472:224::-;23612:34;23608:1;23600:6;23596:14;23589:58;23681:7;23676:2;23668:6;23664:15;23657:32;23472:224;:::o;23702:366::-;23844:3;23865:67;23929:2;23924:3;23865:67;:::i;:::-;23858:74;;23941:93;24030:3;23941:93;:::i;:::-;24059:2;24054:3;24050:12;24043:19;;23702:366;;;:::o;24074:419::-;24240:4;24278:2;24267:9;24263:18;24255:26;;24327:9;24321:4;24317:20;24313:1;24302:9;24298:17;24291:47;24355:131;24481:4;24355:131;:::i;:::-;24347:139;;24074:419;;;:::o;24499:222::-;24639:34;24635:1;24627:6;24623:14;24616:58;24708:5;24703:2;24695:6;24691:15;24684:30;24499:222;:::o;24727:366::-;24869:3;24890:67;24954:2;24949:3;24890:67;:::i;:::-;24883:74;;24966:93;25055:3;24966:93;:::i;:::-;25084:2;25079:3;25075:12;25068:19;;24727:366;;;:::o;25099:419::-;25265:4;25303:2;25292:9;25288:18;25280:26;;25352:9;25346:4;25342:20;25338:1;25327:9;25323:17;25316:47;25380:131;25506:4;25380:131;:::i;:::-;25372:139;;25099:419;;;:::o;25524:225::-;25664:34;25660:1;25652:6;25648:14;25641:58;25733:8;25728:2;25720:6;25716:15;25709:33;25524:225;:::o;25755:366::-;25897:3;25918:67;25982:2;25977:3;25918:67;:::i;:::-;25911:74;;25994:93;26083:3;25994:93;:::i;:::-;26112:2;26107:3;26103:12;26096:19;;25755:366;;;:::o;26127:419::-;26293:4;26331:2;26320:9;26316:18;26308:26;;26380:9;26374:4;26370:20;26366:1;26355:9;26351:17;26344:47;26408:131;26534:4;26408:131;:::i;:::-;26400:139;;26127:419;;;:::o;26552:137::-;26606:5;26637:6;26631:13;26622:22;;26653:30;26677:5;26653:30;:::i;:::-;26552:137;;;;:::o;26695:345::-;26762:6;26811:2;26799:9;26790:7;26786:23;26782:32;26779:119;;;26817:79;;:::i;:::-;26779:119;26937:1;26962:61;27015:7;27006:6;26995:9;26991:22;26962:61;:::i;:::-;26952:71;;26908:125;26695:345;;;;:::o;27046:229::-;27186:34;27182:1;27174:6;27170:14;27163:58;27255:12;27250:2;27242:6;27238:15;27231:37;27046:229;:::o;27281:366::-;27423:3;27444:67;27508:2;27503:3;27444:67;:::i;:::-;27437:74;;27520:93;27609:3;27520:93;:::i;:::-;27638:2;27633:3;27629:12;27622:19;;27281:366;;;:::o;27653:419::-;27819:4;27857:2;27846:9;27842:18;27834:26;;27906:9;27900:4;27896:20;27892:1;27881:9;27877:17;27870:47;27934:131;28060:4;27934:131;:::i;:::-;27926:139;;27653:419;;;:::o;28078:180::-;28126:77;28123:1;28116:88;28223:4;28220:1;28213:15;28247:4;28244:1;28237:15;28264:85;28309:7;28338:5;28327:16;;28264:85;;;:::o;28355:60::-;28383:3;28404:5;28397:12;;28355:60;;;:::o;28421:158::-;28479:9;28512:61;28530:42;28539:32;28565:5;28539:32;:::i;:::-;28530:42;:::i;:::-;28512:61;:::i;:::-;28499:74;;28421:158;;;:::o;28585:147::-;28680:45;28719:5;28680:45;:::i;:::-;28675:3;28668:58;28585:147;;:::o;28738:114::-;28805:6;28839:5;28833:12;28823:22;;28738:114;;;:::o;28858:184::-;28957:11;28991:6;28986:3;28979:19;29031:4;29026:3;29022:14;29007:29;;28858:184;;;;:::o;29048:132::-;29115:4;29138:3;29130:11;;29168:4;29163:3;29159:14;29151:22;;29048:132;;;:::o;29186:108::-;29263:24;29281:5;29263:24;:::i;:::-;29258:3;29251:37;29186:108;;:::o;29300:179::-;29369:10;29390:46;29432:3;29424:6;29390:46;:::i;:::-;29468:4;29463:3;29459:14;29445:28;;29300:179;;;;:::o;29485:113::-;29555:4;29587;29582:3;29578:14;29570:22;;29485:113;;;:::o;29634:732::-;29753:3;29782:54;29830:5;29782:54;:::i;:::-;29852:86;29931:6;29926:3;29852:86;:::i;:::-;29845:93;;29962:56;30012:5;29962:56;:::i;:::-;30041:7;30072:1;30057:284;30082:6;30079:1;30076:13;30057:284;;;30158:6;30152:13;30185:63;30244:3;30229:13;30185:63;:::i;:::-;30178:70;;30271:60;30324:6;30271:60;:::i;:::-;30261:70;;30117:224;30104:1;30101;30097:9;30092:14;;30057:284;;;30061:14;30357:3;30350:10;;29758:608;;;29634:732;;;;:::o;30372:831::-;30635:4;30673:3;30662:9;30658:19;30650:27;;30687:71;30755:1;30744:9;30740:17;30731:6;30687:71;:::i;:::-;30768:80;30844:2;30833:9;30829:18;30820:6;30768:80;:::i;:::-;30895:9;30889:4;30885:20;30880:2;30869:9;30865:18;30858:48;30923:108;31026:4;31017:6;30923:108;:::i;:::-;30915:116;;31041:72;31109:2;31098:9;31094:18;31085:6;31041:72;:::i;:::-;31123:73;31191:3;31180:9;31176:19;31167:6;31123:73;:::i;:::-;30372:831;;;;;;;;:::o;31209:180::-;31257:77;31254:1;31247:88;31354:4;31351:1;31344:15;31378:4;31375:1;31368:15;31395:156;31535:8;31531:1;31523:6;31519:14;31512:32;31395:156;:::o;31557:365::-;31699:3;31720:66;31784:1;31779:3;31720:66;:::i;:::-;31713:73;;31795:93;31884:3;31795:93;:::i;:::-;31913:2;31908:3;31904:12;31897:19;;31557:365;;;:::o;31928:419::-;32094:4;32132:2;32121:9;32117:18;32109:26;;32181:9;32175:4;32171:20;32167:1;32156:9;32152:17;32145:47;32209:131;32335:4;32209:131;:::i;:::-;32201:139;;31928:419;;;:::o;32353:179::-;32493:31;32489:1;32481:6;32477:14;32470:55;32353:179;:::o;32538:366::-;32680:3;32701:67;32765:2;32760:3;32701:67;:::i;:::-;32694:74;;32777:93;32866:3;32777:93;:::i;:::-;32895:2;32890:3;32886:12;32879:19;;32538:366;;;:::o;32910:419::-;33076:4;33114:2;33103:9;33099:18;33091:26;;33163:9;33157:4;33153:20;33149:1;33138:9;33134:17;33127:47;33191:131;33317:4;33191:131;:::i;:::-;33183:139;;32910:419;;;:::o;33335:114::-;;:::o;33455:398::-;33614:3;33635:83;33716:1;33711:3;33635:83;:::i;:::-;33628:90;;33727:93;33816:3;33727:93;:::i;:::-;33845:1;33840:3;33836:11;33829:18;;33455:398;;;:::o;33859:379::-;34043:3;34065:147;34208:3;34065:147;:::i;:::-;34058:154;;34229:3;34222:10;;33859:379;;;:::o;34244:245::-;34384:34;34380:1;34372:6;34368:14;34361:58;34453:28;34448:2;34440:6;34436:15;34429:53;34244:245;:::o;34495:366::-;34637:3;34658:67;34722:2;34717:3;34658:67;:::i;:::-;34651:74;;34734:93;34823:3;34734:93;:::i;:::-;34852:2;34847:3;34843:12;34836:19;;34495:366;;;:::o;34867:419::-;35033:4;35071:2;35060:9;35056:18;35048:26;;35120:9;35114:4;35110:20;35106:1;35095:9;35091:17;35084:47;35148:131;35274:4;35148:131;:::i;:::-;35140:139;;34867:419;;;:::o;35292:225::-;35432:34;35428:1;35420:6;35416:14;35409:58;35501:8;35496:2;35488:6;35484:15;35477:33;35292:225;:::o;35523:366::-;35665:3;35686:67;35750:2;35745:3;35686:67;:::i;:::-;35679:74;;35762:93;35851:3;35762:93;:::i;:::-;35880:2;35875:3;35871:12;35864:19;;35523:366;;;:::o;35895:419::-;36061:4;36099:2;36088:9;36084:18;36076:26;;36148:9;36142:4;36138:20;36134:1;36123:9;36119:17;36112:47;36176:131;36302:4;36176:131;:::i;:::-;36168:139;;35895:419;;;:::o;36320:179::-;36460:31;36456:1;36448:6;36444:14;36437:55;36320:179;:::o;36505:366::-;36647:3;36668:67;36732:2;36727:3;36668:67;:::i;:::-;36661:74;;36744:93;36833:3;36744:93;:::i;:::-;36862:2;36857:3;36853:12;36846:19;;36505:366;;;:::o;36877:419::-;37043:4;37081:2;37070:9;37066:18;37058:26;;37130:9;37124:4;37120:20;37116:1;37105:9;37101:17;37094:47;37158:131;37284:4;37158:131;:::i;:::-;37150:139;;36877:419;;;:::o

Swarm Source

ipfs://a3637a5262cc93f723775143191c80cbdbd3a0a3b27b97cca44822b8631c745f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.