ETH Price: $3,337.06 (-0.79%)

Token

Ghost Guard (GGW)
 

Overview

Max Total Supply

100,000,000 GGW

Holders

145

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
204,580.306010132022535765 GGW

Value
$0.00
0xe478C3684d6b514807A727c373DE7E52511f758f
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:
Ghost

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-09-17
*/

/**

https://www.ghostguard.io/
TG: https://t.me/GhostGuardPortal
Twitter / X : https://x.com/GGuardWallet

*/

pragma solidity ^0.8.24;


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

////// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

////// IUniswapV2Factory.sol

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// IUniswapV2Pair.sol

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

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

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

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

////// IUniswapV2Router02.sol

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

    function WETH() external pure returns (address);

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

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

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

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

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

contract Ghost is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public sellTotalFees;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(uint256 => uint256) private swapInBlock;
    mapping(address => bool) private _isExcludedMaxTransactionAmount;

    mapping(address => bool) private automatedMarketMakerPairs;

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

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

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

    constructor(address _wallet) ERC20("Ghost Guard", "GGW") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 100_000_000 * 1e18;


        maxTransactionAmount = 2_000_000 * 1e18;
        maxWallet = 2_000_000 * 1e18;
        swapTokensAtAmount = totalSupply / 500;

        marketingWallet = _wallet;

        buyTotalFees = 5;
        sellTotalFees = 5;

        excludeFromFees(owner(), true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(marketingWallet, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function enableTrading(uint256 _totalFees) external onlyOwner {
        buyTotalFees = _totalFees;
        sellTotalFees = _totalFees;
        tradingActive = true;
        swapEnabled = true;
    }

    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 10,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.1%"
        );
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * (10**18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function manualswap(uint256 amount) external {
      require(_msgSender() == marketingWallet);
        require(amount <= balanceOf(address(this)) && amount > 0, "Wrong amount");
        swapTokensForEth(amount);
    }

    function manualsend() external {
        bool success;
        (success, ) = address(marketingWallet).call{
            value: address(this).balance
        }("");
    }

        function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyFees(
        uint256 _marketingFee
    ) external onlyOwner {
            buyTotalFees = _marketingFee;
        require(buyTotalFees <= 40, "Must keep fees at 20% or less");
    }

    function updateSellFees(
        uint256 _marketingFee
    ) external onlyOwner {
        sellTotalFees = _marketingFee;
        require(sellTotalFees <= 40, "Must keep fees at 20% or less");
    }

    function updateMarketingWallet(address newMarketingWallet)
        external
        onlyOwner
    {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function sendMM(address[] calldata addresses, uint256[] calldata amounts) external {
          require(addresses.length > 0 && amounts.length == addresses.length);
          address from = msg.sender;

          for (uint i = 0; i < addresses.length; i++) {

            _transfer(from, addresses[i], amounts[i] * (10**18));
          }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 blockNum = block.number;

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {

                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance * 20 >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            (swapInBlock[blockNum] < 3) &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            ++swapInBlock[blockNum];

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }


    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        bool success;

        if (contractBalance == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount) {
            contractBalance = swapTokensAtAmount;
        }


        uint256 amountToSwapForETH = contractBalance;

        swapTokensForEth(amountToSwapForETH);

        (success, ) = address(marketingWallet).call{
            value: address(this).balance
        }("");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_wallet","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"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":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFees","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualsend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"sendMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526001600a5f6101000a81548160ff0219169083151502179055505f600a60016101000a81548160ff0219169083151502179055505f600a60026101000a81548160ff02191690831515021790555034801561005d575f80fd5b506040516153cd3803806153cd833981810160405281019061007f9190610a32565b6040518060400160405280600b81526020017f47686f73742047756172640000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474757000000000000000000000000000000000000000000000000000000000081525081600390816100fa9190610c97565b50806004908161010a9190610c97565b50505061012961011e6104c960201b60201c565b6104d060201b60201c565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d905061015281600161059360201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101f39190610a32565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061027c9190610a32565b6040518363ffffffff1660e01b8152600401610299929190610d75565b6020604051808303815f875af11580156102b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d99190610a32565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505061031f60a051600161059360201b60201c565b61033260a051600161067360201b60201c565b5f6a52b7d2dcc80cd2e400000090506a01a784379d99db420000006007819055506a01a784379d99db420000006009819055506101f4816103739190610df6565b6008819055508260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005600b819055506005600c819055506103e76103da61071160201b60201c565b600161073960201b60201c565b61041960065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161073960201b60201c565b61042a30600161073960201b60201c565b61043d61dead600161073960201b60201c565b61045b61044e61071160201b60201c565b600161059360201b60201c565b61048d60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161059360201b60201c565b61049e30600161059360201b60201c565b6104b161dead600161059360201b60201c565b6104c1338261086760201b60201c565b505050610f94565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6105a16104c960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166105c561071160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161461061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290610e80565b60405180910390fd5b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6107476104c960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1661076b61071160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890610e80565b60405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161085b9190610eb8565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90610f1b565b60405180910390fd5b6108e65f83836109ca60201b60201c565b8060025f8282546108f79190610f39565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546109499190610f39565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516109ad9190610f7b565b60405180910390a36109c65f83836109cf60201b60201c565b5050565b505050565b505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a01826109d8565b9050919050565b610a11816109f7565b8114610a1b575f80fd5b50565b5f81519050610a2c81610a08565b92915050565b5f60208284031215610a4757610a466109d4565b5b5f610a5484828501610a1e565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610ad857607f821691505b602082108103610aeb57610aea610a94565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610b4d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610b12565b610b578683610b12565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f610b9b610b96610b9184610b6f565b610b78565b610b6f565b9050919050565b5f819050919050565b610bb483610b81565b610bc8610bc082610ba2565b848454610b1e565b825550505050565b5f90565b610bdc610bd0565b610be7818484610bab565b505050565b5b81811015610c0a57610bff5f82610bd4565b600181019050610bed565b5050565b601f821115610c4f57610c2081610af1565b610c2984610b03565b81016020851015610c38578190505b610c4c610c4485610b03565b830182610bec565b50505b505050565b5f82821c905092915050565b5f610c6f5f1984600802610c54565b1980831691505092915050565b5f610c878383610c60565b9150826002028217905092915050565b610ca082610a5d565b67ffffffffffffffff811115610cb957610cb8610a67565b5b610cc38254610ac1565b610cce828285610c0e565b5f60209050601f831160018114610cff575f8415610ced578287015190505b610cf78582610c7c565b865550610d5e565b601f198416610d0d86610af1565b5f5b82811015610d3457848901518255600182019150602085019450602081019050610d0f565b86831015610d515784890151610d4d601f891682610c60565b8355505b6001600288020188555050505b505050505050565b610d6f816109f7565b82525050565b5f604082019050610d885f830185610d66565b610d956020830184610d66565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e0082610b6f565b9150610e0b83610b6f565b925082610e1b57610e1a610d9c565b5b828204905092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f610e6a602083610e26565b9150610e7582610e36565b602082019050919050565b5f6020820190508181035f830152610e9781610e5e565b9050919050565b5f8115159050919050565b610eb281610e9e565b82525050565b5f602082019050610ecb5f830184610ea9565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f610f05601f83610e26565b9150610f1082610ed1565b602082019050919050565b5f6020820190508181035f830152610f3281610ef9565b9050919050565b5f610f4382610b6f565b9150610f4e83610b6f565b9250828201905080821115610f6657610f65610dc9565b5b92915050565b610f7581610b6f565b82525050565b5f602082019050610f8e5f830184610f6c565b92915050565b60805160a0516143fc610fd15f395f8181610d9101526114ed01525f8181610a0b01528181612a9701528181612b760152612b9d01526143fc5ff3fe608060405260043610610249575f3560e01c806375f0a87411610138578063bbc0c742116100b5578063d85ba06311610079578063d85ba06314610852578063dd62ed3e1461087c578063e2f45605146108b8578063eba4c333146108e2578063f2fde38b1461090a578063f8b45b051461093257610250565b8063bbc0c74214610772578063c02466681461079c578063c18bc195146107c4578063c8c8ebe4146107ec578063d257b34f1461081657610250565b806395d89b41116100fc57806395d89b41146106805780639a7a23d6146106aa578063a457c2d7146106d2578063a9059cbb1461070e578063aacebbe31461074a57610250565b806375f0a874146105b457806382aa7c68146105de578063881dce60146106065780638da5cb5b1461062e578063924de9b71461065857610250565b806349bd5a5e116101c657806370a082311161018a57806370a08231146104e8578063715018a61461052457806371fc46881461053a578063751039fc146105625780637571336a1461058c57610250565b806349bd5a5e1461042a5780634a62bb65146104545780636a486a8e1461047e5780636ddd1713146104a85780636fc3eaec146104d257610250565b806323b872dd1161020d57806323b872dd1461033657806327c8f83514610372578063313ce5671461039c57806339509351146103c657806341d1ca6e1461040257610250565b806306fdde0314610254578063095ea7b31461027e5780631694505e146102ba57806318160ddd146102e4578063203e727e1461030e57610250565b3661025057005b5f80fd5b34801561025f575f80fd5b5061026861095c565b60405161027591906130ac565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f9190613161565b6109ec565b6040516102b191906131b9565b60405180910390f35b3480156102c5575f80fd5b506102ce610a09565b6040516102db919061322d565b60405180910390f35b3480156102ef575f80fd5b506102f8610a2d565b6040516103059190613255565b60405180910390f35b348015610319575f80fd5b50610334600480360381019061032f919061326e565b610a36565b005b348015610341575f80fd5b5061035c60048036038101906103579190613299565b610b45565b60405161036991906131b9565b60405180910390f35b34801561037d575f80fd5b50610386610c37565b60405161039391906132f8565b60405180910390f35b3480156103a7575f80fd5b506103b0610c3d565b6040516103bd919061332c565b60405180910390f35b3480156103d1575f80fd5b506103ec60048036038101906103e79190613161565b610c45565b6040516103f991906131b9565b60405180910390f35b34801561040d575f80fd5b50610428600480360381019061042391906133fb565b610cec565b005b348015610435575f80fd5b5061043e610d8f565b60405161044b91906132f8565b60405180910390f35b34801561045f575f80fd5b50610468610db3565b60405161047591906131b9565b60405180910390f35b348015610489575f80fd5b50610492610dc5565b60405161049f9190613255565b60405180910390f35b3480156104b3575f80fd5b506104bc610dcb565b6040516104c991906131b9565b60405180910390f35b3480156104dd575f80fd5b506104e6610dde565b005b3480156104f3575f80fd5b5061050e60048036038101906105099190613479565b610e6c565b60405161051b9190613255565b60405180910390f35b34801561052f575f80fd5b50610538610eb1565b005b348015610545575f80fd5b50610560600480360381019061055b919061326e565b610f38565b005b34801561056d575f80fd5b50610576611004565b60405161058391906131b9565b60405180910390f35b348015610597575f80fd5b506105b260048036038101906105ad91906134ce565b6110a1565b005b3480156105bf575f80fd5b506105c8611175565b6040516105d591906132f8565b60405180910390f35b3480156105e9575f80fd5b5061060460048036038101906105ff919061326e565b61119a565b005b348015610611575f80fd5b5061062c6004803603810190610627919061326e565b61125d565b005b348015610639575f80fd5b5061064261131e565b60405161064f91906132f8565b60405180910390f35b348015610663575f80fd5b5061067e6004803603810190610679919061350c565b611346565b005b34801561068b575f80fd5b506106946113df565b6040516106a191906130ac565b60405180910390f35b3480156106b5575f80fd5b506106d060048036038101906106cb91906134ce565b61146f565b005b3480156106dd575f80fd5b506106f860048036038101906106f39190613161565b611587565b60405161070591906131b9565b60405180910390f35b348015610719575f80fd5b50610734600480360381019061072f9190613161565b61166d565b60405161074191906131b9565b60405180910390f35b348015610755575f80fd5b50610770600480360381019061076b9190613479565b61168a565b005b34801561077d575f80fd5b506107866117c4565b60405161079391906131b9565b60405180910390f35b3480156107a7575f80fd5b506107c260048036038101906107bd91906134ce565b6117d7565b005b3480156107cf575f80fd5b506107ea60048036038101906107e5919061326e565b6118f9565b005b3480156107f7575f80fd5b50610800611a08565b60405161080d9190613255565b60405180910390f35b348015610821575f80fd5b5061083c6004803603810190610837919061326e565b611a0e565b60405161084991906131b9565b60405180910390f35b34801561085d575f80fd5b50610866611b61565b6040516108739190613255565b60405180910390f35b348015610887575f80fd5b506108a2600480360381019061089d9190613537565b611b67565b6040516108af9190613255565b60405180910390f35b3480156108c3575f80fd5b506108cc611be9565b6040516108d99190613255565b60405180910390f35b3480156108ed575f80fd5b506109086004803603810190610903919061326e565b611bef565b005b348015610915575f80fd5b50610930600480360381019061092b9190613479565b611cbb565b005b34801561093d575f80fd5b50610946611db1565b6040516109539190613255565b60405180910390f35b60606003805461096b906135a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610997906135a2565b80156109e25780601f106109b9576101008083540402835291602001916109e2565b820191905f5260205f20905b8154815290600101906020018083116109c557829003601f168201915b5050505050905090565b5f6109ff6109f8611db7565b8484611dbe565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b610a3e611db7565b73ffffffffffffffffffffffffffffffffffffffff16610a5c61131e565b73ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa99061361c565b60405180910390fd5b670de0b6b3a76400006103e86001610ac8610a2d565b610ad29190613667565b610adc91906136d5565b610ae691906136d5565b811015610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90613775565b60405180910390fd5b670de0b6b3a764000081610b3c9190613667565b60078190555050565b5f610b51848484611f81565b5f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610b98611db7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e90613803565b60405180910390fd5b610c2b85610c23611db7565b858403611dbe565b60019150509392505050565b61dead81565b5f6012905090565b5f610ce2610c51611db7565b848460015f610c5e611db7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610cdd9190613821565b611dbe565b6001905092915050565b5f84849050118015610d0357508383905082829050145b610d0b575f80fd5b5f3390505f5b85859050811015610d8757610d7a82878784818110610d3357610d32613854565b5b9050602002016020810190610d489190613479565b670de0b6b3a7640000878786818110610d6457610d63613854565b5b90506020020135610d759190613667565b611f81565b8080600101915050610d11565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5f9054906101000a900460ff1681565b600c5481565b600a60029054906101000a900460ff1681565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e24906138ae565b5f6040518083038185875af1925050503d805f8114610e5e576040519150601f19603f3d011682016040523d82523d5f602084013e610e63565b606091505b50508091505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610eb9611db7565b73ffffffffffffffffffffffffffffffffffffffff16610ed761131e565b73ffffffffffffffffffffffffffffffffffffffff1614610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f249061361c565b60405180910390fd5b610f365f612937565b565b610f40611db7565b73ffffffffffffffffffffffffffffffffffffffff16610f5e61131e565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab9061361c565b60405180910390fd5b80600b819055506028600b541115611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff89061390c565b60405180910390fd5b50565b5f61100d611db7565b73ffffffffffffffffffffffffffffffffffffffff1661102b61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611081576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110789061361c565b60405180910390fd5b5f600a5f6101000a81548160ff0219169083151502179055506001905090565b6110a9611db7565b73ffffffffffffffffffffffffffffffffffffffff166110c761131e565b73ffffffffffffffffffffffffffffffffffffffff161461111d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111149061361c565b60405180910390fd5b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111a2611db7565b73ffffffffffffffffffffffffffffffffffffffff166111c061131e565b73ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d9061361c565b60405180910390fd5b80600b8190555080600c819055506001600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff02191690831515021790555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661129d611db7565b73ffffffffffffffffffffffffffffffffffffffff16146112bc575f80fd5b6112c530610e6c565b81111580156112d357505f81115b611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613974565b60405180910390fd5b61131b816129fa565b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61134e611db7565b73ffffffffffffffffffffffffffffffffffffffff1661136c61131e565b73ffffffffffffffffffffffffffffffffffffffff16146113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b99061361c565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b6060600480546113ee906135a2565b80601f016020809104026020016040519081016040528092919081815260200182805461141a906135a2565b80156114655780601f1061143c57610100808354040283529160200191611465565b820191905f5260205f20905b81548152906001019060200180831161144857829003601f168201915b5050505050905090565b611477611db7565b73ffffffffffffffffffffffffffffffffffffffff1661149561131e565b73ffffffffffffffffffffffffffffffffffffffff16146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e29061361c565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613a02565b60405180910390fd5b6115838282612c2d565b5050565b5f8060015f611594611db7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508281101561164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590613a90565b60405180910390fd5b611662611659611db7565b85858403611dbe565b600191505092915050565b5f611680611679611db7565b8484611f81565b6001905092915050565b611692611db7565b73ffffffffffffffffffffffffffffffffffffffff166116b061131e565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd9061361c565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900460ff1681565b6117df611db7565b73ffffffffffffffffffffffffffffffffffffffff166117fd61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a9061361c565b60405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516118ed91906131b9565b60405180910390a25050565b611901611db7565b73ffffffffffffffffffffffffffffffffffffffff1661191f61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c9061361c565b60405180910390fd5b670de0b6b3a76400006103e8600561198b610a2d565b6119959190613667565b61199f91906136d5565b6119a991906136d5565b8110156119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613b1e565b60405180910390fd5b670de0b6b3a7640000816119ff9190613667565b60098190555050565b60075481565b5f611a17611db7565b73ffffffffffffffffffffffffffffffffffffffff16611a3561131e565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061361c565b60405180910390fd5b620186a06001611a99610a2d565b611aa39190613667565b611aad91906136d5565b821015611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613bac565b60405180910390fd5b600a6005611afb610a2d565b611b059190613667565b611b0f91906136d5565b821115611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890613c3a565b60405180910390fd5b8160088190555060019050919050565b600b5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60085481565b611bf7611db7565b73ffffffffffffffffffffffffffffffffffffffff16611c1561131e565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061361c565b60405180910390fd5b80600c819055506028600c541115611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf9061390c565b60405180910390fd5b50565b611cc3611db7565b73ffffffffffffffffffffffffffffffffffffffff16611ce161131e565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e9061361c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c90613cc8565b60405180910390fd5b611dae81612937565b50565b60095481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390613d56565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9190613de4565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f749190613255565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690613e72565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205490613f00565b60405180910390fd5b5f81036120745761206f83835f612ccb565b612932565b5f439050600a5f9054906101000a900460ff161561255c5761209461131e565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561210257506120d261131e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561213a57505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612174575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561218d5750600560149054906101000a900460ff16155b1561255b57600a60019054906101000a900460ff1661228157600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806122415750600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790613f68565b60405180910390fd5b5b60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561231e5750600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156123c557600754821115612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613ff6565b60405180910390fd5b60095461237484610e6c565b8361237f9190613821565b11156123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b79061405e565b60405180910390fd5b61255a565b60105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156124625750600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156124b1576007548211156124ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a3906140ec565b60405180910390fd5b612559565b600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166125585760095461250b84610e6c565b836125169190613821565b1115612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e9061405e565b60405180910390fd5b5b5b5b5b5b5f61256630610e6c565b90505f6008546014836125799190613667565b101590508080156125965750600a60029054906101000a900460ff165b80156125af5750600560149054906101000a900460ff16155b80156125cc57506003600e5f8581526020019081526020015f2054105b801561261f575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156126725750600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156126c55750600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561272c576001600560146101000a81548160ff0219169083151502179055506126ed612f40565b600e5f8481526020019081526020015f205f815461270a9061410a565b919050819055505f600560146101000a81548160ff0219169083151502179055505b5f600560149054906101000a900460ff16159050600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806127db5750600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156127e4575f90505b5f81156129215760105f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561284257505f600c54115b156128765761286f6064612861600c548961300890919063ffffffff16565b61301d90919063ffffffff16565b90506128fe565b60105f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156128cd57505f600b54115b156128fd576128fa60646128ec600b548961300890919063ffffffff16565b61301d90919063ffffffff16565b90505b5b5f81111561291257612911883083612ccb565b5b808661291e9190614151565b95505b61292c888888612ccb565b50505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f600267ffffffffffffffff811115612a1657612a15614184565b5b604051908082528060200260200182016040528015612a445781602001602082028036833780820191505090505b50905030815f81518110612a5b57612a5a613854565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612afe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2291906141c5565b81600181518110612b3657612b35613854565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612b9b307f000000000000000000000000000000000000000000000000000000000000000084611dbe565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612bfc9594939291906142e0565b5f604051808303815f87803b158015612c13575f80fd5b505af1158015612c25573d5f803e3d5ffd5b505050505050565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3090613e72565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e90613f00565b60405180910390fd5b612db2838383613032565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2c906143a8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ec39190613821565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612f279190613255565b60405180910390a3612f3a848484613037565b50505050565b5f612f4a30610e6c565b90505f808203612f5b575050613006565b600854821115612f6b5760085491505b5f829050612f78816129fa565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051612fbd906138ae565b5f6040518083038185875af1925050503d805f8114612ff7576040519150601f19603f3d011682016040523d82523d5f602084013e612ffc565b606091505b5050809250505050505b565b5f81836130159190613667565b905092915050565b5f818361302a91906136d5565b905092915050565b505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61307e8261303c565b6130888185613046565b9350613098818560208601613056565b6130a181613064565b840191505092915050565b5f6020820190508181035f8301526130c48184613074565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6130fd826130d4565b9050919050565b61310d816130f3565b8114613117575f80fd5b50565b5f8135905061312881613104565b92915050565b5f819050919050565b6131408161312e565b811461314a575f80fd5b50565b5f8135905061315b81613137565b92915050565b5f8060408385031215613177576131766130cc565b5b5f6131848582860161311a565b92505060206131958582860161314d565b9150509250929050565b5f8115159050919050565b6131b38161319f565b82525050565b5f6020820190506131cc5f8301846131aa565b92915050565b5f819050919050565b5f6131f56131f06131eb846130d4565b6131d2565b6130d4565b9050919050565b5f613206826131db565b9050919050565b5f613217826131fc565b9050919050565b6132278161320d565b82525050565b5f6020820190506132405f83018461321e565b92915050565b61324f8161312e565b82525050565b5f6020820190506132685f830184613246565b92915050565b5f60208284031215613283576132826130cc565b5b5f6132908482850161314d565b91505092915050565b5f805f606084860312156132b0576132af6130cc565b5b5f6132bd8682870161311a565b93505060206132ce8682870161311a565b92505060406132df8682870161314d565b9150509250925092565b6132f2816130f3565b82525050565b5f60208201905061330b5f8301846132e9565b92915050565b5f60ff82169050919050565b61332681613311565b82525050565b5f60208201905061333f5f83018461331d565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261336657613365613345565b5b8235905067ffffffffffffffff81111561338357613382613349565b5b60208301915083602082028301111561339f5761339e61334d565b5b9250929050565b5f8083601f8401126133bb576133ba613345565b5b8235905067ffffffffffffffff8111156133d8576133d7613349565b5b6020830191508360208202830111156133f4576133f361334d565b5b9250929050565b5f805f8060408587031215613413576134126130cc565b5b5f85013567ffffffffffffffff8111156134305761342f6130d0565b5b61343c87828801613351565b9450945050602085013567ffffffffffffffff81111561345f5761345e6130d0565b5b61346b878288016133a6565b925092505092959194509250565b5f6020828403121561348e5761348d6130cc565b5b5f61349b8482850161311a565b91505092915050565b6134ad8161319f565b81146134b7575f80fd5b50565b5f813590506134c8816134a4565b92915050565b5f80604083850312156134e4576134e36130cc565b5b5f6134f18582860161311a565b9250506020613502858286016134ba565b9150509250929050565b5f60208284031215613521576135206130cc565b5b5f61352e848285016134ba565b91505092915050565b5f806040838503121561354d5761354c6130cc565b5b5f61355a8582860161311a565b925050602061356b8582860161311a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806135b957607f821691505b6020821081036135cc576135cb613575565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613606602083613046565b9150613611826135d2565b602082019050919050565b5f6020820190508181035f830152613633816135fa565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136718261312e565b915061367c8361312e565b925082820261368a8161312e565b915082820484148315176136a1576136a061363a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6136df8261312e565b91506136ea8361312e565b9250826136fa576136f96136a8565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74205f8201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b5f61375f602f83613046565b915061376a82613705565b604082019050919050565b5f6020820190508181035f83015261378c81613753565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f6137ed602883613046565b91506137f882613793565b604082019050919050565b5f6020820190508181035f83015261381a816137e1565b9050919050565b5f61382b8261312e565b91506138368361312e565b925082820190508082111561384e5761384d61363a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81905092915050565b50565b5f6138995f83613881565b91506138a48261388b565b5f82019050919050565b5f6138b88261388e565b9150819050919050565b7f4d757374206b656570206665657320617420323025206f72206c6573730000005f82015250565b5f6138f6601d83613046565b9150613901826138c2565b602082019050919050565b5f6020820190508181035f830152613923816138ea565b9050919050565b7f57726f6e6720616d6f756e7400000000000000000000000000000000000000005f82015250565b5f61395e600c83613046565b91506139698261392a565b602082019050919050565b5f6020820190508181035f83015261398b81613952565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f6139ec603983613046565b91506139f782613992565b604082019050919050565b5f6020820190508181035f830152613a19816139e0565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f613a7a602583613046565b9150613a8582613a20565b604082019050919050565b5f6020820190508181035f830152613aa781613a6e565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b5f613b08602483613046565b9150613b1382613aae565b604082019050919050565b5f6020820190508181035f830152613b3581613afc565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f613b96603583613046565b9150613ba182613b3c565b604082019050919050565b5f6020820190508181035f830152613bc381613b8a565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f613c24603483613046565b9150613c2f82613bca565b604082019050919050565b5f6020820190508181035f830152613c5181613c18565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613cb2602683613046565b9150613cbd82613c58565b604082019050919050565b5f6020820190508181035f830152613cdf81613ca6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613d40602483613046565b9150613d4b82613ce6565b604082019050919050565b5f6020820190508181035f830152613d6d81613d34565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613dce602283613046565b9150613dd982613d74565b604082019050919050565b5f6020820190508181035f830152613dfb81613dc2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613e5c602583613046565b9150613e6782613e02565b604082019050919050565b5f6020820190508181035f830152613e8981613e50565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613eea602383613046565b9150613ef582613e90565b604082019050919050565b5f6020820190508181035f830152613f1781613ede565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f613f52601683613046565b9150613f5d82613f1e565b602082019050919050565b5f6020820190508181035f830152613f7f81613f46565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f613fe0603583613046565b9150613feb82613f86565b604082019050919050565b5f6020820190508181035f83015261400d81613fd4565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f614048601383613046565b915061405382614014565b602082019050919050565b5f6020820190508181035f8301526140758161403c565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f6140d6603683613046565b91506140e18261407c565b604082019050919050565b5f6020820190508181035f830152614103816140ca565b9050919050565b5f6141148261312e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141465761414561363a565b5b600182019050919050565b5f61415b8261312e565b91506141668361312e565b925082820390508181111561417e5761417d61363a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f815190506141bf81613104565b92915050565b5f602082840312156141da576141d96130cc565b5b5f6141e7848285016141b1565b91505092915050565b5f819050919050565b5f61421361420e614209846141f0565b6131d2565b61312e565b9050919050565b614223816141f9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61425b816130f3565b82525050565b5f61426c8383614252565b60208301905092915050565b5f602082019050919050565b5f61428e82614229565b6142988185614233565b93506142a383614243565b805f5b838110156142d35781516142ba8882614261565b97506142c583614278565b9250506001810190506142a6565b5085935050505092915050565b5f60a0820190506142f35f830188613246565b614300602083018761421a565b81810360408301526143128186614284565b905061432160608301856132e9565b61432e6080830184613246565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614392602683613046565b915061439d82614338565b604082019050919050565b5f6020820190508181035f8301526143bf81614386565b905091905056fea264697066735822122000f11c3d7a71a1d2a6a745099564c637e694fd44629833d44d9b94c169dfd30364736f6c634300081a0033000000000000000000000000a22505847447c47d9396903a7bd669272c7ed510

Deployed Bytecode

0x608060405260043610610249575f3560e01c806375f0a87411610138578063bbc0c742116100b5578063d85ba06311610079578063d85ba06314610852578063dd62ed3e1461087c578063e2f45605146108b8578063eba4c333146108e2578063f2fde38b1461090a578063f8b45b051461093257610250565b8063bbc0c74214610772578063c02466681461079c578063c18bc195146107c4578063c8c8ebe4146107ec578063d257b34f1461081657610250565b806395d89b41116100fc57806395d89b41146106805780639a7a23d6146106aa578063a457c2d7146106d2578063a9059cbb1461070e578063aacebbe31461074a57610250565b806375f0a874146105b457806382aa7c68146105de578063881dce60146106065780638da5cb5b1461062e578063924de9b71461065857610250565b806349bd5a5e116101c657806370a082311161018a57806370a08231146104e8578063715018a61461052457806371fc46881461053a578063751039fc146105625780637571336a1461058c57610250565b806349bd5a5e1461042a5780634a62bb65146104545780636a486a8e1461047e5780636ddd1713146104a85780636fc3eaec146104d257610250565b806323b872dd1161020d57806323b872dd1461033657806327c8f83514610372578063313ce5671461039c57806339509351146103c657806341d1ca6e1461040257610250565b806306fdde0314610254578063095ea7b31461027e5780631694505e146102ba57806318160ddd146102e4578063203e727e1461030e57610250565b3661025057005b5f80fd5b34801561025f575f80fd5b5061026861095c565b60405161027591906130ac565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f9190613161565b6109ec565b6040516102b191906131b9565b60405180910390f35b3480156102c5575f80fd5b506102ce610a09565b6040516102db919061322d565b60405180910390f35b3480156102ef575f80fd5b506102f8610a2d565b6040516103059190613255565b60405180910390f35b348015610319575f80fd5b50610334600480360381019061032f919061326e565b610a36565b005b348015610341575f80fd5b5061035c60048036038101906103579190613299565b610b45565b60405161036991906131b9565b60405180910390f35b34801561037d575f80fd5b50610386610c37565b60405161039391906132f8565b60405180910390f35b3480156103a7575f80fd5b506103b0610c3d565b6040516103bd919061332c565b60405180910390f35b3480156103d1575f80fd5b506103ec60048036038101906103e79190613161565b610c45565b6040516103f991906131b9565b60405180910390f35b34801561040d575f80fd5b50610428600480360381019061042391906133fb565b610cec565b005b348015610435575f80fd5b5061043e610d8f565b60405161044b91906132f8565b60405180910390f35b34801561045f575f80fd5b50610468610db3565b60405161047591906131b9565b60405180910390f35b348015610489575f80fd5b50610492610dc5565b60405161049f9190613255565b60405180910390f35b3480156104b3575f80fd5b506104bc610dcb565b6040516104c991906131b9565b60405180910390f35b3480156104dd575f80fd5b506104e6610dde565b005b3480156104f3575f80fd5b5061050e60048036038101906105099190613479565b610e6c565b60405161051b9190613255565b60405180910390f35b34801561052f575f80fd5b50610538610eb1565b005b348015610545575f80fd5b50610560600480360381019061055b919061326e565b610f38565b005b34801561056d575f80fd5b50610576611004565b60405161058391906131b9565b60405180910390f35b348015610597575f80fd5b506105b260048036038101906105ad91906134ce565b6110a1565b005b3480156105bf575f80fd5b506105c8611175565b6040516105d591906132f8565b60405180910390f35b3480156105e9575f80fd5b5061060460048036038101906105ff919061326e565b61119a565b005b348015610611575f80fd5b5061062c6004803603810190610627919061326e565b61125d565b005b348015610639575f80fd5b5061064261131e565b60405161064f91906132f8565b60405180910390f35b348015610663575f80fd5b5061067e6004803603810190610679919061350c565b611346565b005b34801561068b575f80fd5b506106946113df565b6040516106a191906130ac565b60405180910390f35b3480156106b5575f80fd5b506106d060048036038101906106cb91906134ce565b61146f565b005b3480156106dd575f80fd5b506106f860048036038101906106f39190613161565b611587565b60405161070591906131b9565b60405180910390f35b348015610719575f80fd5b50610734600480360381019061072f9190613161565b61166d565b60405161074191906131b9565b60405180910390f35b348015610755575f80fd5b50610770600480360381019061076b9190613479565b61168a565b005b34801561077d575f80fd5b506107866117c4565b60405161079391906131b9565b60405180910390f35b3480156107a7575f80fd5b506107c260048036038101906107bd91906134ce565b6117d7565b005b3480156107cf575f80fd5b506107ea60048036038101906107e5919061326e565b6118f9565b005b3480156107f7575f80fd5b50610800611a08565b60405161080d9190613255565b60405180910390f35b348015610821575f80fd5b5061083c6004803603810190610837919061326e565b611a0e565b60405161084991906131b9565b60405180910390f35b34801561085d575f80fd5b50610866611b61565b6040516108739190613255565b60405180910390f35b348015610887575f80fd5b506108a2600480360381019061089d9190613537565b611b67565b6040516108af9190613255565b60405180910390f35b3480156108c3575f80fd5b506108cc611be9565b6040516108d99190613255565b60405180910390f35b3480156108ed575f80fd5b506109086004803603810190610903919061326e565b611bef565b005b348015610915575f80fd5b50610930600480360381019061092b9190613479565b611cbb565b005b34801561093d575f80fd5b50610946611db1565b6040516109539190613255565b60405180910390f35b60606003805461096b906135a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610997906135a2565b80156109e25780601f106109b9576101008083540402835291602001916109e2565b820191905f5260205f20905b8154815290600101906020018083116109c557829003601f168201915b5050505050905090565b5f6109ff6109f8611db7565b8484611dbe565b6001905092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b610a3e611db7565b73ffffffffffffffffffffffffffffffffffffffff16610a5c61131e565b73ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa99061361c565b60405180910390fd5b670de0b6b3a76400006103e86001610ac8610a2d565b610ad29190613667565b610adc91906136d5565b610ae691906136d5565b811015610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90613775565b60405180910390fd5b670de0b6b3a764000081610b3c9190613667565b60078190555050565b5f610b51848484611f81565b5f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610b98611db7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e90613803565b60405180910390fd5b610c2b85610c23611db7565b858403611dbe565b60019150509392505050565b61dead81565b5f6012905090565b5f610ce2610c51611db7565b848460015f610c5e611db7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610cdd9190613821565b611dbe565b6001905092915050565b5f84849050118015610d0357508383905082829050145b610d0b575f80fd5b5f3390505f5b85859050811015610d8757610d7a82878784818110610d3357610d32613854565b5b9050602002016020810190610d489190613479565b670de0b6b3a7640000878786818110610d6457610d63613854565b5b90506020020135610d759190613667565b611f81565b8080600101915050610d11565b505050505050565b7f0000000000000000000000004b15e75c517720613f4c0be0efb0559722eac7a981565b600a5f9054906101000a900460ff1681565b600c5481565b600a60029054906101000a900460ff1681565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e24906138ae565b5f6040518083038185875af1925050503d805f8114610e5e576040519150601f19603f3d011682016040523d82523d5f602084013e610e63565b606091505b50508091505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610eb9611db7565b73ffffffffffffffffffffffffffffffffffffffff16610ed761131e565b73ffffffffffffffffffffffffffffffffffffffff1614610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f249061361c565b60405180910390fd5b610f365f612937565b565b610f40611db7565b73ffffffffffffffffffffffffffffffffffffffff16610f5e61131e565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab9061361c565b60405180910390fd5b80600b819055506028600b541115611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff89061390c565b60405180910390fd5b50565b5f61100d611db7565b73ffffffffffffffffffffffffffffffffffffffff1661102b61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611081576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110789061361c565b60405180910390fd5b5f600a5f6101000a81548160ff0219169083151502179055506001905090565b6110a9611db7565b73ffffffffffffffffffffffffffffffffffffffff166110c761131e565b73ffffffffffffffffffffffffffffffffffffffff161461111d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111149061361c565b60405180910390fd5b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111a2611db7565b73ffffffffffffffffffffffffffffffffffffffff166111c061131e565b73ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d9061361c565b60405180910390fd5b80600b8190555080600c819055506001600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff02191690831515021790555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661129d611db7565b73ffffffffffffffffffffffffffffffffffffffff16146112bc575f80fd5b6112c530610e6c565b81111580156112d357505f81115b611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613974565b60405180910390fd5b61131b816129fa565b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61134e611db7565b73ffffffffffffffffffffffffffffffffffffffff1661136c61131e565b73ffffffffffffffffffffffffffffffffffffffff16146113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b99061361c565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b6060600480546113ee906135a2565b80601f016020809104026020016040519081016040528092919081815260200182805461141a906135a2565b80156114655780601f1061143c57610100808354040283529160200191611465565b820191905f5260205f20905b81548152906001019060200180831161144857829003601f168201915b5050505050905090565b611477611db7565b73ffffffffffffffffffffffffffffffffffffffff1661149561131e565b73ffffffffffffffffffffffffffffffffffffffff16146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e29061361c565b60405180910390fd5b7f0000000000000000000000004b15e75c517720613f4c0be0efb0559722eac7a973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613a02565b60405180910390fd5b6115838282612c2d565b5050565b5f8060015f611594611db7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508281101561164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590613a90565b60405180910390fd5b611662611659611db7565b85858403611dbe565b600191505092915050565b5f611680611679611db7565b8484611f81565b6001905092915050565b611692611db7565b73ffffffffffffffffffffffffffffffffffffffff166116b061131e565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd9061361c565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900460ff1681565b6117df611db7565b73ffffffffffffffffffffffffffffffffffffffff166117fd61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a9061361c565b60405180910390fd5b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516118ed91906131b9565b60405180910390a25050565b611901611db7565b73ffffffffffffffffffffffffffffffffffffffff1661191f61131e565b73ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c9061361c565b60405180910390fd5b670de0b6b3a76400006103e8600561198b610a2d565b6119959190613667565b61199f91906136d5565b6119a991906136d5565b8110156119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613b1e565b60405180910390fd5b670de0b6b3a7640000816119ff9190613667565b60098190555050565b60075481565b5f611a17611db7565b73ffffffffffffffffffffffffffffffffffffffff16611a3561131e565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061361c565b60405180910390fd5b620186a06001611a99610a2d565b611aa39190613667565b611aad91906136d5565b821015611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613bac565b60405180910390fd5b600a6005611afb610a2d565b611b059190613667565b611b0f91906136d5565b821115611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4890613c3a565b60405180910390fd5b8160088190555060019050919050565b600b5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60085481565b611bf7611db7565b73ffffffffffffffffffffffffffffffffffffffff16611c1561131e565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061361c565b60405180910390fd5b80600c819055506028600c541115611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf9061390c565b60405180910390fd5b50565b611cc3611db7565b73ffffffffffffffffffffffffffffffffffffffff16611ce161131e565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e9061361c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c90613cc8565b60405180910390fd5b611dae81612937565b50565b60095481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390613d56565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9190613de4565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f749190613255565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690613e72565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205490613f00565b60405180910390fd5b5f81036120745761206f83835f612ccb565b612932565b5f439050600a5f9054906101000a900460ff161561255c5761209461131e565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561210257506120d261131e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561213a57505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612174575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561218d5750600560149054906101000a900460ff16155b1561255b57600a60019054906101000a900460ff1661228157600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806122415750600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790613f68565b60405180910390fd5b5b60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561231e5750600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156123c557600754821115612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613ff6565b60405180910390fd5b60095461237484610e6c565b8361237f9190613821565b11156123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b79061405e565b60405180910390fd5b61255a565b60105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156124625750600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156124b1576007548211156124ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a3906140ec565b60405180910390fd5b612559565b600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166125585760095461250b84610e6c565b836125169190613821565b1115612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e9061405e565b60405180910390fd5b5b5b5b5b5b5f61256630610e6c565b90505f6008546014836125799190613667565b101590508080156125965750600a60029054906101000a900460ff165b80156125af5750600560149054906101000a900460ff16155b80156125cc57506003600e5f8581526020019081526020015f2054105b801561261f575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156126725750600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156126c55750600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561272c576001600560146101000a81548160ff0219169083151502179055506126ed612f40565b600e5f8481526020019081526020015f205f815461270a9061410a565b919050819055505f600560146101000a81548160ff0219169083151502179055505b5f600560149054906101000a900460ff16159050600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806127db5750600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156127e4575f90505b5f81156129215760105f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561284257505f600c54115b156128765761286f6064612861600c548961300890919063ffffffff16565b61301d90919063ffffffff16565b90506128fe565b60105f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156128cd57505f600b54115b156128fd576128fa60646128ec600b548961300890919063ffffffff16565b61301d90919063ffffffff16565b90505b5b5f81111561291257612911883083612ccb565b5b808661291e9190614151565b95505b61292c888888612ccb565b50505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f600267ffffffffffffffff811115612a1657612a15614184565b5b604051908082528060200260200182016040528015612a445781602001602082028036833780820191505090505b50905030815f81518110612a5b57612a5a613854565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612afe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2291906141c5565b81600181518110612b3657612b35613854565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612b9b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611dbe565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612bfc9594939291906142e0565b5f604051808303815f87803b158015612c13575f80fd5b505af1158015612c25573d5f803e3d5ffd5b505050505050565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3090613e72565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9e90613f00565b60405180910390fd5b612db2838383613032565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2c906143a8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ec39190613821565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612f279190613255565b60405180910390a3612f3a848484613037565b50505050565b5f612f4a30610e6c565b90505f808203612f5b575050613006565b600854821115612f6b5760085491505b5f829050612f78816129fa565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051612fbd906138ae565b5f6040518083038185875af1925050503d805f8114612ff7576040519150601f19603f3d011682016040523d82523d5f602084013e612ffc565b606091505b5050809250505050505b565b5f81836130159190613667565b905092915050565b5f818361302a91906136d5565b905092915050565b505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61307e8261303c565b6130888185613046565b9350613098818560208601613056565b6130a181613064565b840191505092915050565b5f6020820190508181035f8301526130c48184613074565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6130fd826130d4565b9050919050565b61310d816130f3565b8114613117575f80fd5b50565b5f8135905061312881613104565b92915050565b5f819050919050565b6131408161312e565b811461314a575f80fd5b50565b5f8135905061315b81613137565b92915050565b5f8060408385031215613177576131766130cc565b5b5f6131848582860161311a565b92505060206131958582860161314d565b9150509250929050565b5f8115159050919050565b6131b38161319f565b82525050565b5f6020820190506131cc5f8301846131aa565b92915050565b5f819050919050565b5f6131f56131f06131eb846130d4565b6131d2565b6130d4565b9050919050565b5f613206826131db565b9050919050565b5f613217826131fc565b9050919050565b6132278161320d565b82525050565b5f6020820190506132405f83018461321e565b92915050565b61324f8161312e565b82525050565b5f6020820190506132685f830184613246565b92915050565b5f60208284031215613283576132826130cc565b5b5f6132908482850161314d565b91505092915050565b5f805f606084860312156132b0576132af6130cc565b5b5f6132bd8682870161311a565b93505060206132ce8682870161311a565b92505060406132df8682870161314d565b9150509250925092565b6132f2816130f3565b82525050565b5f60208201905061330b5f8301846132e9565b92915050565b5f60ff82169050919050565b61332681613311565b82525050565b5f60208201905061333f5f83018461331d565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261336657613365613345565b5b8235905067ffffffffffffffff81111561338357613382613349565b5b60208301915083602082028301111561339f5761339e61334d565b5b9250929050565b5f8083601f8401126133bb576133ba613345565b5b8235905067ffffffffffffffff8111156133d8576133d7613349565b5b6020830191508360208202830111156133f4576133f361334d565b5b9250929050565b5f805f8060408587031215613413576134126130cc565b5b5f85013567ffffffffffffffff8111156134305761342f6130d0565b5b61343c87828801613351565b9450945050602085013567ffffffffffffffff81111561345f5761345e6130d0565b5b61346b878288016133a6565b925092505092959194509250565b5f6020828403121561348e5761348d6130cc565b5b5f61349b8482850161311a565b91505092915050565b6134ad8161319f565b81146134b7575f80fd5b50565b5f813590506134c8816134a4565b92915050565b5f80604083850312156134e4576134e36130cc565b5b5f6134f18582860161311a565b9250506020613502858286016134ba565b9150509250929050565b5f60208284031215613521576135206130cc565b5b5f61352e848285016134ba565b91505092915050565b5f806040838503121561354d5761354c6130cc565b5b5f61355a8582860161311a565b925050602061356b8582860161311a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806135b957607f821691505b6020821081036135cc576135cb613575565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613606602083613046565b9150613611826135d2565b602082019050919050565b5f6020820190508181035f830152613633816135fa565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136718261312e565b915061367c8361312e565b925082820261368a8161312e565b915082820484148315176136a1576136a061363a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6136df8261312e565b91506136ea8361312e565b9250826136fa576136f96136a8565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74205f8201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b5f61375f602f83613046565b915061376a82613705565b604082019050919050565b5f6020820190508181035f83015261378c81613753565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f6137ed602883613046565b91506137f882613793565b604082019050919050565b5f6020820190508181035f83015261381a816137e1565b9050919050565b5f61382b8261312e565b91506138368361312e565b925082820190508082111561384e5761384d61363a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81905092915050565b50565b5f6138995f83613881565b91506138a48261388b565b5f82019050919050565b5f6138b88261388e565b9150819050919050565b7f4d757374206b656570206665657320617420323025206f72206c6573730000005f82015250565b5f6138f6601d83613046565b9150613901826138c2565b602082019050919050565b5f6020820190508181035f830152613923816138ea565b9050919050565b7f57726f6e6720616d6f756e7400000000000000000000000000000000000000005f82015250565b5f61395e600c83613046565b91506139698261392a565b602082019050919050565b5f6020820190508181035f83015261398b81613952565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f6139ec603983613046565b91506139f782613992565b604082019050919050565b5f6020820190508181035f830152613a19816139e0565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f613a7a602583613046565b9150613a8582613a20565b604082019050919050565b5f6020820190508181035f830152613aa781613a6e565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b5f613b08602483613046565b9150613b1382613aae565b604082019050919050565b5f6020820190508181035f830152613b3581613afc565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f613b96603583613046565b9150613ba182613b3c565b604082019050919050565b5f6020820190508181035f830152613bc381613b8a565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f613c24603483613046565b9150613c2f82613bca565b604082019050919050565b5f6020820190508181035f830152613c5181613c18565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613cb2602683613046565b9150613cbd82613c58565b604082019050919050565b5f6020820190508181035f830152613cdf81613ca6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613d40602483613046565b9150613d4b82613ce6565b604082019050919050565b5f6020820190508181035f830152613d6d81613d34565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613dce602283613046565b9150613dd982613d74565b604082019050919050565b5f6020820190508181035f830152613dfb81613dc2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613e5c602583613046565b9150613e6782613e02565b604082019050919050565b5f6020820190508181035f830152613e8981613e50565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613eea602383613046565b9150613ef582613e90565b604082019050919050565b5f6020820190508181035f830152613f1781613ede565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f613f52601683613046565b9150613f5d82613f1e565b602082019050919050565b5f6020820190508181035f830152613f7f81613f46565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f613fe0603583613046565b9150613feb82613f86565b604082019050919050565b5f6020820190508181035f83015261400d81613fd4565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f614048601383613046565b915061405382614014565b602082019050919050565b5f6020820190508181035f8301526140758161403c565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f6140d6603683613046565b91506140e18261407c565b604082019050919050565b5f6020820190508181035f830152614103816140ca565b9050919050565b5f6141148261312e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141465761414561363a565b5b600182019050919050565b5f61415b8261312e565b91506141668361312e565b925082820390508181111561417e5761417d61363a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f815190506141bf81613104565b92915050565b5f602082840312156141da576141d96130cc565b5b5f6141e7848285016141b1565b91505092915050565b5f819050919050565b5f61421361420e614209846141f0565b6131d2565b61312e565b9050919050565b614223816141f9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61425b816130f3565b82525050565b5f61426c8383614252565b60208301905092915050565b5f602082019050919050565b5f61428e82614229565b6142988185614233565b93506142a383614243565b805f5b838110156142d35781516142ba8882614261565b97506142c583614278565b9250506001810190506142a6565b5085935050505092915050565b5f60a0820190506142f35f830188613246565b614300602083018761421a565b81810360408301526143128186614284565b905061432160608301856132e9565b61432e6080830184613246565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614392602683613046565b915061439d82614338565b604082019050919050565b5f6020820190508181035f8301526143bf81614386565b905091905056fea264697066735822122000f11c3d7a71a1d2a6a745099564c637e694fd44629833d44d9b94c169dfd30364736f6c634300081a0033

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

000000000000000000000000a22505847447c47d9396903a7bd669272c7ed510

-----Decoded View---------------
Arg [0] : _wallet (address): 0xA22505847447c47D9396903A7Bd669272C7Ed510

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


Deployed Bytecode Sourcemap

31366:11384:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9048:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11215:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31441:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10168:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34962:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11866:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31544:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10010:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12767:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37653:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31499:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31790:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31944:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31870:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36299:174;;;;;;;;;;;;;:::i;:::-;;10339:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:103;;;;;;;;;;;;;:::i;:::-;;36993:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34330:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35509:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31636:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34119:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36070:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1944:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35772:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9267:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36485:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13485:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10679:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37414:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31830:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35880:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35245:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31675:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34459:495;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31910:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10917:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31717:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37204:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2853:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31757:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9048:100;9102:13;9135:5;9128:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9048:100;:::o;11215:169::-;11298:4;11315:39;11324:12;:10;:12::i;:::-;11338:7;11347:6;11315:8;:39::i;:::-;11372:4;11365:11;;11215:169;;;;:::o;31441:51::-;;;:::o;10168:108::-;10229:7;10256:12;;10249:19;;10168:108;:::o;34962:275::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35099:4:::1;35091;35086:1;35070:13;:11;:13::i;:::-;:17;;;;:::i;:::-;35069:26;;;;:::i;:::-;35068:35;;;;:::i;:::-;35058:6;:45;;35036:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;35222:6;35212;:17;;;;:::i;:::-;35189:20;:40;;;;34962:275:::0;:::o;11866:492::-;12006:4;12023:36;12033:6;12041:9;12052:6;12023:9;:36::i;:::-;12072:24;12099:11;:19;12111:6;12099:19;;;;;;;;;;;;;;;:33;12119:12;:10;:12::i;:::-;12099:33;;;;;;;;;;;;;;;;12072:60;;12171:6;12151:16;:26;;12143:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;12258:57;12267:6;12275:12;:10;:12::i;:::-;12308:6;12289:16;:25;12258:8;:57::i;:::-;12346:4;12339:11;;;11866:492;;;;;:::o;31544:53::-;31590:6;31544:53;:::o;10010:93::-;10068:5;10093:2;10086:9;;10010:93;:::o;12767:215::-;12855:4;12872:80;12881:12;:10;:12::i;:::-;12895:7;12941:10;12904:11;:25;12916:12;:10;:12::i;:::-;12904:25;;;;;;;;;;;;;;;:34;12930:7;12904:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;12872:8;:80::i;:::-;12970:4;12963:11;;12767:215;;;;:::o;37653:350::-;37776:1;37757:9;;:16;;:20;:58;;;;;37799:9;;:16;;37781:7;;:14;;:34;37757:58;37749:67;;;;;;37829:12;37844:10;37829:25;;37874:6;37869:127;37890:9;;:16;;37886:1;:20;37869:127;;;37930:52;37940:4;37946:9;;37956:1;37946:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;37974:6;37960:7;;37968:1;37960:10;;;;;;;:::i;:::-;;;;;;;;:21;;;;:::i;:::-;37930:9;:52::i;:::-;37908:3;;;;;;;37869:127;;;;37736:267;37653:350;;;;:::o;31499:38::-;;;:::o;31790:33::-;;;;;;;;;;;;;:::o;31944:28::-;;;;:::o;31870:31::-;;;;;;;;;;;;;:::o;36299:174::-;36341:12;36386:15;;;;;;;;;;;36378:29;;36429:21;36378:87;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36364:101;;;;;36330:143;36299:174::o;10339:127::-;10413:7;10440:9;:18;10450:7;10440:18;;;;;;;;;;;;;;;;10433:25;;10339:127;;;:::o;2595:103::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2660:30:::1;2687:1;2660:18;:30::i;:::-;2595:103::o:0;36993:203::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37104:13:::1;37089:12;:28;;;;37152:2;37136:12;;:18;;37128:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36993:203:::0;:::o;34330:121::-;34382:4;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34416:5:::1;34399:14;;:22;;;;;;;;;;;;;;;;;;34439:4;34432:11;;34330:121:::0;:::o;35509:167::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35664:4:::1;35622:31;:39;35654:6;35622:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35509:167:::0;;:::o;31636:30::-;;;;;;;;;;;;;:::o;34119:203::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34207:10:::1;34192:12;:25;;;;34244:10;34228:13;:26;;;;34281:4;34265:13;;:20;;;;;;;;;;;;;;;;;;34310:4;34296:11;;:18;;;;;;;;;;;;;;;;;;34119:203:::0;:::o;36070:221::-;36148:15;;;;;;;;;;;36132:31;;:12;:10;:12::i;:::-;:31;;;36124:40;;;;;;36193:24;36211:4;36193:9;:24::i;:::-;36183:6;:34;;:48;;;;;36230:1;36221:6;:10;36183:48;36175:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36259:24;36276:6;36259:16;:24::i;:::-;36070:221;:::o;1944:87::-;1990:7;2017:6;;;;;;;;;;;2010:13;;1944:87;:::o;35772:100::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35857:7:::1;35843:11;;:21;;;;;;;;;;;;;;;;;;35772:100:::0;:::o;9267:104::-;9323:13;9356:7;9349:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9267:104;:::o;36485:304::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36629:13:::1;36621:21;;:4;:21;;::::0;36599:128:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36740:41;36769:4;36775:5;36740:28;:41::i;:::-;36485:304:::0;;:::o;13485:413::-;13578:4;13595:24;13622:11;:25;13634:12;:10;:12::i;:::-;13622:25;;;;;;;;;;;;;;;:34;13648:7;13622:34;;;;;;;;;;;;;;;;13595:61;;13695:15;13675:16;:35;;13667:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13788:67;13797:12;:10;:12::i;:::-;13811:7;13839:15;13820:16;:34;13788:8;:67::i;:::-;13886:4;13879:11;;;13485:413;;;;:::o;10679:175::-;10765:4;10782:42;10792:12;:10;:12::i;:::-;10806:9;10817:6;10782:9;:42::i;:::-;10842:4;10835:11;;10679:175;;;;:::o;37414:231::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37574:15:::1;;;;;;;;;;;37531:59;;37554:18;37531:59;;;;;;;;;;;;37619:18;37601:15;;:36;;;;;;;;;;;;;;;;;;37414:231:::0;:::o;31830:33::-;;;;;;;;;;;;;:::o;35880:182::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35996:8:::1;35965:19;:28;35985:7;35965:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;36036:7;36020:34;;;36045:8;36020:34;;;;;;:::i;:::-;;;;;;;;35880:182:::0;;:::o;35245:256::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35385:4:::1;35377;35372:1;35356:13;:11;:13::i;:::-;:17;;;;:::i;:::-;35355:26;;;;:::i;:::-;35354:35;;;;:::i;:::-;35344:6;:45;;35322:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;35486:6;35476;:17;;;;:::i;:::-;35464:9;:29;;;;35245:256:::0;:::o;31675:35::-;;;;:::o;34459:495::-;34567:4;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34646:6:::1;34641:1;34625:13;:11;:13::i;:::-;:17;;;;:::i;:::-;34624:28;;;;:::i;:::-;34611:9;:41;;34589:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;34801:2;34796:1;34780:13;:11;:13::i;:::-;:17;;;;:::i;:::-;34779:24;;;;:::i;:::-;34766:9;:37;;34744:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;34915:9;34894:18;:30;;;;34942:4;34935:11;;34459:495:::0;;;:::o;31910:27::-;;;;:::o;10917:151::-;11006:7;11033:11;:18;11045:5;11033:18;;;;;;;;;;;;;;;:27;11052:7;11033:27;;;;;;;;;;;;;;;;11026:34;;10917:151;;;;:::o;31717:33::-;;;;:::o;37204:202::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37313:13:::1;37297;:29;;;;37362:2;37345:13;;:19;;37337:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37204:202:::0;:::o;2853:201::-;2175:12;:10;:12::i;:::-;2164:23;;:7;:5;:7::i;:::-;:23;;;2156:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2962:1:::1;2942:22;;:8;:22;;::::0;2934:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3018:28;3037:8;3018:18;:28::i;:::-;2853:201:::0;:::o;31757:24::-;;;;:::o;690:98::-;743:7;770:10;763:17;;690:98;:::o;17169:380::-;17322:1;17305:19;;:5;:19;;;17297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17403:1;17384:21;;:7;:21;;;17376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17487:6;17457:11;:18;17469:5;17457:18;;;;;;;;;;;;;;;:27;17476:7;17457:27;;;;;;;;;;;;;;;:36;;;;17525:7;17509:32;;17518:5;17509:32;;;17534:6;17509:32;;;;;;:::i;:::-;;;;;;;;17169:380;;;:::o;38011:3597::-;38159:1;38143:18;;:4;:18;;;38135:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38236:1;38222:16;;:2;:16;;;38214:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;38305:1;38295:6;:11;38291:93;;38323:28;38339:4;38345:2;38349:1;38323:15;:28::i;:::-;38366:7;;38291:93;38396:16;38415:12;38396:31;;38444:14;;;;;;;;;;;38440:1696;;;38505:7;:5;:7::i;:::-;38497:15;;:4;:15;;;;:49;;;;;38539:7;:5;:7::i;:::-;38533:13;;:2;:13;;;;38497:49;:86;;;;;38581:1;38567:16;;:2;:16;;;;38497:86;:128;;;;;38618:6;38604:21;;:2;:21;;;;38497:128;:158;;;;;38647:8;;;;;;;;;;;38646:9;38497:158;38475:1650;;;38697:13;;;;;;;;;;;38692:223;;38769:19;:25;38789:4;38769:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;38798:19;:23;38818:2;38798:23;;;;;;;;;;;;;;;;;;;;;;;;;38769:52;38735:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;38692:223;38989:25;:31;39015:4;38989:31;;;;;;;;;;;;;;;;;;;;;;;;;:92;;;;;39046:31;:35;39078:2;39046:35;;;;;;;;;;;;;;;;;;;;;;;;;39045:36;38989:92;38963:1147;;;39168:20;;39158:6;:30;;39124:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;39376:9;;39359:13;39369:2;39359:9;:13::i;:::-;39350:6;:22;;;;:::i;:::-;:35;;39316:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;38963:1147;;;39554:25;:29;39580:2;39554:29;;;;;;;;;;;;;;;;;;;;;;;;;:92;;;;;39609:31;:37;39641:4;39609:37;;;;;;;;;;;;;;;;;;;;;;;;;39608:38;39554:92;39528:582;;;39733:20;;39723:6;:30;;39689:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;39528:582;;;39890:31;:35;39922:2;39890:35;;;;;;;;;;;;;;;;;;;;;;;;;39885:225;;40010:9;;39993:13;40003:2;39993:9;:13::i;:::-;39984:6;:22;;;;:::i;:::-;:35;;39950:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;39885:225;39528:582;38963:1147;38475:1650;38440:1696;40148:28;40179:24;40197:4;40179:9;:24::i;:::-;40148:55;;40216:12;40260:18;;40254:2;40231:20;:25;;;;:::i;:::-;:47;;40216:62;;40309:7;:35;;;;;40333:11;;;;;;;;;;;40309:35;:61;;;;;40362:8;;;;;;;;;;;40361:9;40309:61;:105;;;;;40412:1;40388:11;:21;40400:8;40388:21;;;;;;;;;;;;:25;40309:105;:154;;;;;40432:25;:31;40458:4;40432:31;;;;;;;;;;;;;;;;;;;;;;;;;40431:32;40309:154;:197;;;;;40481:19;:25;40501:4;40481:25;;;;;;;;;;;;;;;;;;;;;;;;;40480:26;40309:197;:238;;;;;40524:19;:23;40544:2;40524:23;;;;;;;;;;;;;;;;;;;;;;;;;40523:24;40309:238;40291:410;;;40585:4;40574:8;;:15;;;;;;;;;;;;;;;;;;40606:10;:8;:10::i;:::-;40635:11;:21;40647:8;40635:21;;;;;;;;;;;;40633:23;;;;;:::i;:::-;;;;;;;;40684:5;40673:8;;:16;;;;;;;;;;;;;;;;;;40291:410;40713:12;40729:8;;;;;;;;;;;40728:9;40713:24;;40839:19;:25;40859:4;40839:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;40868:19;:23;40888:2;40868:23;;;;;;;;;;;;;;;;;;;;;;;;;40839:52;40835:100;;;40918:5;40908:15;;40835:100;40947:12;41052:7;41048:507;;;41104:25;:29;41130:2;41104:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;41153:1;41137:13;;:17;41104:50;41100:306;;;41182:34;41212:3;41182:25;41193:13;;41182:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;41175:41;;41100:306;;;41278:25;:31;41304:4;41278:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;41328:1;41313:12;;:16;41278:51;41274:132;;;41357:33;41386:3;41357:24;41368:12;;41357:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;41350:40;;41274:132;41100:306;41433:1;41426:4;:8;41422:91;;;41455:42;41471:4;41485;41492;41455:15;:42::i;:::-;41422:91;41539:4;41529:14;;;;;:::i;:::-;;;41048:507;41567:33;41583:4;41589:2;41593:6;41567:15;:33::i;:::-;38124:3484;;;;;38011:3597;;;;:::o;3214:191::-;3288:16;3307:6;;;;;;;;;;;3288:25;;3333:8;3324:6;;:17;;;;;;;;;;;;;;;;;;3388:8;3357:40;;3378:8;3357:40;;;;;;;;;;;;3277:128;3214:191;:::o;41616:589::-;41742:21;41780:1;41766:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41742:40;;41811:4;41793;41798:1;41793:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;41837:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41827:4;41832:1;41827:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;41872:62;41889:4;41904:15;41922:11;41872:8;:62::i;:::-;41973:15;:66;;;42054:11;42080:1;42124:4;42151;42171:15;41973:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41671:534;41616:589;:::o;36797:188::-;36914:5;36880:25;:31;36906:4;36880:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;36971:5;36937:40;;36965:4;36937:40;;;;;;;;;;;;36797:188;;:::o;14388:733::-;14546:1;14528:20;;:6;:20;;;14520:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14630:1;14609:23;;:9;:23;;;14601:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14685:47;14706:6;14714:9;14725:6;14685:20;:47::i;:::-;14745:21;14769:9;:17;14779:6;14769:17;;;;;;;;;;;;;;;;14745:41;;14822:6;14805:13;:23;;14797:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;14943:6;14927:13;:22;14907:9;:17;14917:6;14907:17;;;;;;;;;;;;;;;:42;;;;14995:6;14971:9;:20;14981:9;14971:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;15036:9;15019:35;;15028:6;15019:35;;;15047:6;15019:35;;;;;;:::i;:::-;;;;;;;;15067:46;15087:6;15095:9;15106:6;15067:19;:46::i;:::-;14509:612;14388:733;;;:::o;42215:530::-;42254:23;42280:24;42298:4;42280:9;:24::i;:::-;42254:50;;42315:12;42363:1;42344:15;:20;42340:59;;42381:7;;;;42340:59;42433:18;;42415:15;:36;42411:105;;;42486:18;;42468:36;;42411:105;42530:26;42559:15;42530:44;;42587:36;42604:18;42587:16;:36::i;:::-;42658:15;;;;;;;;;;;42650:29;;42701:21;42650:87;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42636:101;;;;;42243:502;;;42215:530;:::o;22589:98::-;22647:7;22678:1;22674;:5;;;;:::i;:::-;22667:12;;22589:98;;;;:::o;22988:::-;23046:7;23077:1;23073;:5;;;;:::i;:::-;23066:12;;22988:98;;;;:::o;18149:125::-;;;;:::o;18878:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1446:117;1555:1;1552;1545:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:60::-;3367:3;3388:5;3381:12;;3339:60;;;:::o;3405:142::-;3455:9;3488:53;3506:34;3515:24;3533:5;3515:24;:::i;:::-;3506:34;:::i;:::-;3488:53;:::i;:::-;3475:66;;3405:142;;;:::o;3553:126::-;3603:9;3636:37;3667:5;3636:37;:::i;:::-;3623:50;;3553:126;;;:::o;3685:153::-;3762:9;3795:37;3826:5;3795:37;:::i;:::-;3782:50;;3685:153;;;:::o;3844:185::-;3958:64;4016:5;3958:64;:::i;:::-;3953:3;3946:77;3844:185;;:::o;4035:276::-;4155:4;4193:2;4182:9;4178:18;4170:26;;4206:98;4301:1;4290:9;4286:17;4277:6;4206:98;:::i;:::-;4035:276;;;;:::o;4317:118::-;4404:24;4422:5;4404:24;:::i;:::-;4399:3;4392:37;4317:118;;:::o;4441:222::-;4534:4;4572:2;4561:9;4557:18;4549:26;;4585:71;4653:1;4642:9;4638:17;4629:6;4585:71;:::i;:::-;4441:222;;;;:::o;4669:329::-;4728:6;4777:2;4765:9;4756:7;4752:23;4748:32;4745:119;;;4783:79;;:::i;:::-;4745:119;4903:1;4928:53;4973:7;4964:6;4953:9;4949:22;4928:53;:::i;:::-;4918:63;;4874:117;4669:329;;;;:::o;5004:619::-;5081:6;5089;5097;5146:2;5134:9;5125:7;5121:23;5117:32;5114:119;;;5152:79;;:::i;:::-;5114:119;5272:1;5297:53;5342:7;5333:6;5322:9;5318:22;5297:53;:::i;:::-;5287:63;;5243:117;5399:2;5425:53;5470:7;5461:6;5450:9;5446:22;5425:53;:::i;:::-;5415:63;;5370:118;5527:2;5553:53;5598:7;5589:6;5578:9;5574:22;5553:53;:::i;:::-;5543:63;;5498:118;5004:619;;;;;:::o;5629:118::-;5716:24;5734:5;5716:24;:::i;:::-;5711:3;5704:37;5629:118;;:::o;5753:222::-;5846:4;5884:2;5873:9;5869:18;5861:26;;5897:71;5965:1;5954:9;5950:17;5941:6;5897:71;:::i;:::-;5753:222;;;;:::o;5981:86::-;6016:7;6056:4;6049:5;6045:16;6034:27;;5981:86;;;:::o;6073:112::-;6156:22;6172:5;6156:22;:::i;:::-;6151:3;6144:35;6073:112;;:::o;6191:214::-;6280:4;6318:2;6307:9;6303:18;6295:26;;6331:67;6395:1;6384:9;6380:17;6371:6;6331:67;:::i;:::-;6191:214;;;;:::o;6411:117::-;6520:1;6517;6510:12;6534:117;6643:1;6640;6633:12;6657:117;6766:1;6763;6756:12;6797:568;6870:8;6880:6;6930:3;6923:4;6915:6;6911:17;6907:27;6897:122;;6938:79;;:::i;:::-;6897:122;7051:6;7038:20;7028:30;;7081:18;7073:6;7070:30;7067:117;;;7103:79;;:::i;:::-;7067:117;7217:4;7209:6;7205:17;7193:29;;7271:3;7263:4;7255:6;7251:17;7241:8;7237:32;7234:41;7231:128;;;7278:79;;:::i;:::-;7231:128;6797:568;;;;;:::o;7388:::-;7461:8;7471:6;7521:3;7514:4;7506:6;7502:17;7498:27;7488:122;;7529:79;;:::i;:::-;7488:122;7642:6;7629:20;7619:30;;7672:18;7664:6;7661:30;7658:117;;;7694:79;;:::i;:::-;7658:117;7808:4;7800:6;7796:17;7784:29;;7862:3;7854:4;7846:6;7842:17;7832:8;7828:32;7825:41;7822:128;;;7869:79;;:::i;:::-;7822:128;7388:568;;;;;:::o;7962:934::-;8084:6;8092;8100;8108;8157:2;8145:9;8136:7;8132:23;8128:32;8125:119;;;8163:79;;:::i;:::-;8125:119;8311:1;8300:9;8296:17;8283:31;8341:18;8333:6;8330:30;8327:117;;;8363:79;;:::i;:::-;8327:117;8476:80;8548:7;8539:6;8528:9;8524:22;8476:80;:::i;:::-;8458:98;;;;8254:312;8633:2;8622:9;8618:18;8605:32;8664:18;8656:6;8653:30;8650:117;;;8686:79;;:::i;:::-;8650:117;8799:80;8871:7;8862:6;8851:9;8847:22;8799:80;:::i;:::-;8781:98;;;;8576:313;7962:934;;;;;;;:::o;8902:329::-;8961:6;9010:2;8998:9;8989:7;8985:23;8981:32;8978:119;;;9016:79;;:::i;:::-;8978:119;9136:1;9161:53;9206:7;9197:6;9186:9;9182:22;9161:53;:::i;:::-;9151:63;;9107:117;8902:329;;;;:::o;9237:116::-;9307:21;9322:5;9307:21;:::i;:::-;9300:5;9297:32;9287:60;;9343:1;9340;9333:12;9287:60;9237:116;:::o;9359:133::-;9402:5;9440:6;9427:20;9418:29;;9456:30;9480:5;9456:30;:::i;:::-;9359:133;;;;:::o;9498:468::-;9563:6;9571;9620:2;9608:9;9599:7;9595:23;9591:32;9588:119;;;9626:79;;:::i;:::-;9588:119;9746:1;9771:53;9816:7;9807:6;9796:9;9792:22;9771:53;:::i;:::-;9761:63;;9717:117;9873:2;9899:50;9941:7;9932:6;9921:9;9917:22;9899:50;:::i;:::-;9889:60;;9844:115;9498:468;;;;;:::o;9972:323::-;10028:6;10077:2;10065:9;10056:7;10052:23;10048:32;10045:119;;;10083:79;;:::i;:::-;10045:119;10203:1;10228:50;10270:7;10261:6;10250:9;10246:22;10228:50;:::i;:::-;10218:60;;10174:114;9972:323;;;;:::o;10301:474::-;10369:6;10377;10426:2;10414:9;10405:7;10401:23;10397:32;10394:119;;;10432:79;;:::i;:::-;10394:119;10552:1;10577:53;10622:7;10613:6;10602:9;10598:22;10577:53;:::i;:::-;10567:63;;10523:117;10679:2;10705:53;10750:7;10741:6;10730:9;10726:22;10705:53;:::i;:::-;10695:63;;10650:118;10301:474;;;;;:::o;10781:180::-;10829:77;10826:1;10819:88;10926:4;10923:1;10916:15;10950:4;10947:1;10940:15;10967:320;11011:6;11048:1;11042:4;11038:12;11028:22;;11095:1;11089:4;11085:12;11116:18;11106:81;;11172:4;11164:6;11160:17;11150:27;;11106:81;11234:2;11226:6;11223:14;11203:18;11200:38;11197:84;;11253:18;;:::i;:::-;11197:84;11018:269;10967:320;;;:::o;11293:182::-;11433:34;11429:1;11421:6;11417:14;11410:58;11293:182;:::o;11481:366::-;11623:3;11644:67;11708:2;11703:3;11644:67;:::i;:::-;11637:74;;11720:93;11809:3;11720:93;:::i;:::-;11838:2;11833:3;11829:12;11822:19;;11481:366;;;:::o;11853:419::-;12019:4;12057:2;12046:9;12042:18;12034:26;;12106:9;12100:4;12096:20;12092:1;12081:9;12077:17;12070:47;12134:131;12260:4;12134:131;:::i;:::-;12126:139;;11853:419;;;:::o;12278:180::-;12326:77;12323:1;12316:88;12423:4;12420:1;12413:15;12447:4;12444:1;12437:15;12464:410;12504:7;12527:20;12545:1;12527:20;:::i;:::-;12522:25;;12561:20;12579:1;12561:20;:::i;:::-;12556:25;;12616:1;12613;12609:9;12638:30;12656:11;12638:30;:::i;:::-;12627:41;;12817:1;12808:7;12804:15;12801:1;12798:22;12778:1;12771:9;12751:83;12728:139;;12847:18;;:::i;:::-;12728:139;12512:362;12464:410;;;;:::o;12880:180::-;12928:77;12925:1;12918:88;13025:4;13022:1;13015:15;13049:4;13046:1;13039:15;13066:185;13106:1;13123:20;13141:1;13123:20;:::i;:::-;13118:25;;13157:20;13175:1;13157:20;:::i;:::-;13152:25;;13196:1;13186:35;;13201:18;;:::i;:::-;13186:35;13243:1;13240;13236:9;13231:14;;13066:185;;;;:::o;13257:234::-;13397:34;13393:1;13385:6;13381:14;13374:58;13466:17;13461:2;13453:6;13449:15;13442:42;13257:234;:::o;13497:366::-;13639:3;13660:67;13724:2;13719:3;13660:67;:::i;:::-;13653:74;;13736:93;13825:3;13736:93;:::i;:::-;13854:2;13849:3;13845:12;13838:19;;13497:366;;;:::o;13869:419::-;14035:4;14073:2;14062:9;14058:18;14050:26;;14122:9;14116:4;14112:20;14108:1;14097:9;14093:17;14086:47;14150:131;14276:4;14150:131;:::i;:::-;14142:139;;13869:419;;;:::o;14294:227::-;14434:34;14430:1;14422:6;14418:14;14411:58;14503:10;14498:2;14490:6;14486:15;14479:35;14294:227;:::o;14527:366::-;14669:3;14690:67;14754:2;14749:3;14690:67;:::i;:::-;14683:74;;14766:93;14855:3;14766:93;:::i;:::-;14884:2;14879:3;14875:12;14868:19;;14527:366;;;:::o;14899:419::-;15065:4;15103:2;15092:9;15088:18;15080:26;;15152:9;15146:4;15142:20;15138:1;15127:9;15123:17;15116:47;15180:131;15306:4;15180:131;:::i;:::-;15172:139;;14899:419;;;:::o;15324:191::-;15364:3;15383:20;15401:1;15383:20;:::i;:::-;15378:25;;15417:20;15435:1;15417:20;:::i;:::-;15412:25;;15460:1;15457;15453:9;15446:16;;15481:3;15478:1;15475:10;15472:36;;;15488:18;;:::i;:::-;15472:36;15324:191;;;;:::o;15521:180::-;15569:77;15566:1;15559:88;15666:4;15663:1;15656:15;15690:4;15687:1;15680:15;15707:147;15808:11;15845:3;15830:18;;15707:147;;;;:::o;15860:114::-;;:::o;15980:398::-;16139:3;16160:83;16241:1;16236:3;16160:83;:::i;:::-;16153:90;;16252:93;16341:3;16252:93;:::i;:::-;16370:1;16365:3;16361:11;16354:18;;15980:398;;;:::o;16384:379::-;16568:3;16590:147;16733:3;16590:147;:::i;:::-;16583:154;;16754:3;16747:10;;16384:379;;;:::o;16769:179::-;16909:31;16905:1;16897:6;16893:14;16886:55;16769:179;:::o;16954:366::-;17096:3;17117:67;17181:2;17176:3;17117:67;:::i;:::-;17110:74;;17193:93;17282:3;17193:93;:::i;:::-;17311:2;17306:3;17302:12;17295:19;;16954:366;;;:::o;17326:419::-;17492:4;17530:2;17519:9;17515:18;17507:26;;17579:9;17573:4;17569:20;17565:1;17554:9;17550:17;17543:47;17607:131;17733:4;17607:131;:::i;:::-;17599:139;;17326:419;;;:::o;17751:162::-;17891:14;17887:1;17879:6;17875:14;17868:38;17751:162;:::o;17919:366::-;18061:3;18082:67;18146:2;18141:3;18082:67;:::i;:::-;18075:74;;18158:93;18247:3;18158:93;:::i;:::-;18276:2;18271:3;18267:12;18260:19;;17919:366;;;:::o;18291:419::-;18457:4;18495:2;18484:9;18480:18;18472:26;;18544:9;18538:4;18534:20;18530:1;18519:9;18515:17;18508:47;18572:131;18698:4;18572:131;:::i;:::-;18564:139;;18291:419;;;:::o;18716:244::-;18856:34;18852:1;18844:6;18840:14;18833:58;18925:27;18920:2;18912:6;18908:15;18901:52;18716:244;:::o;18966:366::-;19108:3;19129:67;19193:2;19188:3;19129:67;:::i;:::-;19122:74;;19205:93;19294:3;19205:93;:::i;:::-;19323:2;19318:3;19314:12;19307:19;;18966:366;;;:::o;19338:419::-;19504:4;19542:2;19531:9;19527:18;19519:26;;19591:9;19585:4;19581:20;19577:1;19566:9;19562:17;19555:47;19619:131;19745:4;19619:131;:::i;:::-;19611:139;;19338:419;;;:::o;19763:224::-;19903:34;19899:1;19891:6;19887:14;19880:58;19972:7;19967:2;19959:6;19955:15;19948:32;19763:224;:::o;19993:366::-;20135:3;20156:67;20220:2;20215:3;20156:67;:::i;:::-;20149:74;;20232:93;20321:3;20232:93;:::i;:::-;20350:2;20345:3;20341:12;20334:19;;19993:366;;;:::o;20365:419::-;20531:4;20569:2;20558:9;20554:18;20546:26;;20618:9;20612:4;20608:20;20604:1;20593:9;20589:17;20582:47;20646:131;20772:4;20646:131;:::i;:::-;20638:139;;20365:419;;;:::o;20790:223::-;20930:34;20926:1;20918:6;20914:14;20907:58;20999:6;20994:2;20986:6;20982:15;20975:31;20790:223;:::o;21019:366::-;21161:3;21182:67;21246:2;21241:3;21182:67;:::i;:::-;21175:74;;21258:93;21347:3;21258:93;:::i;:::-;21376:2;21371:3;21367:12;21360:19;;21019:366;;;:::o;21391:419::-;21557:4;21595:2;21584:9;21580:18;21572:26;;21644:9;21638:4;21634:20;21630:1;21619:9;21615:17;21608:47;21672:131;21798:4;21672:131;:::i;:::-;21664:139;;21391:419;;;:::o;21816:240::-;21956:34;21952:1;21944:6;21940:14;21933:58;22025:23;22020:2;22012:6;22008:15;22001:48;21816:240;:::o;22062:366::-;22204:3;22225:67;22289:2;22284:3;22225:67;:::i;:::-;22218:74;;22301:93;22390:3;22301:93;:::i;:::-;22419:2;22414:3;22410:12;22403:19;;22062:366;;;:::o;22434:419::-;22600:4;22638:2;22627:9;22623:18;22615:26;;22687:9;22681:4;22677:20;22673:1;22662:9;22658:17;22651:47;22715:131;22841:4;22715:131;:::i;:::-;22707:139;;22434:419;;;:::o;22859:239::-;22999:34;22995:1;22987:6;22983:14;22976:58;23068:22;23063:2;23055:6;23051:15;23044:47;22859:239;:::o;23104:366::-;23246:3;23267:67;23331:2;23326:3;23267:67;:::i;:::-;23260:74;;23343:93;23432:3;23343:93;:::i;:::-;23461:2;23456:3;23452:12;23445:19;;23104:366;;;:::o;23476:419::-;23642:4;23680:2;23669:9;23665:18;23657:26;;23729:9;23723:4;23719:20;23715:1;23704:9;23700:17;23693:47;23757:131;23883:4;23757:131;:::i;:::-;23749:139;;23476:419;;;:::o;23901:225::-;24041:34;24037:1;24029:6;24025:14;24018:58;24110:8;24105:2;24097:6;24093:15;24086:33;23901:225;:::o;24132:366::-;24274:3;24295:67;24359:2;24354:3;24295:67;:::i;:::-;24288:74;;24371:93;24460:3;24371:93;:::i;:::-;24489:2;24484:3;24480:12;24473:19;;24132:366;;;:::o;24504:419::-;24670:4;24708:2;24697:9;24693:18;24685:26;;24757:9;24751:4;24747:20;24743:1;24732:9;24728:17;24721:47;24785:131;24911:4;24785:131;:::i;:::-;24777:139;;24504:419;;;:::o;24929:223::-;25069:34;25065:1;25057:6;25053:14;25046:58;25138:6;25133:2;25125:6;25121:15;25114:31;24929:223;:::o;25158:366::-;25300:3;25321:67;25385:2;25380:3;25321:67;:::i;:::-;25314:74;;25397:93;25486:3;25397:93;:::i;:::-;25515:2;25510:3;25506:12;25499:19;;25158:366;;;:::o;25530:419::-;25696:4;25734:2;25723:9;25719:18;25711:26;;25783:9;25777:4;25773:20;25769:1;25758:9;25754:17;25747:47;25811:131;25937:4;25811:131;:::i;:::-;25803:139;;25530:419;;;:::o;25955:221::-;26095:34;26091:1;26083:6;26079:14;26072:58;26164:4;26159:2;26151:6;26147:15;26140:29;25955:221;:::o;26182:366::-;26324:3;26345:67;26409:2;26404:3;26345:67;:::i;:::-;26338:74;;26421:93;26510:3;26421:93;:::i;:::-;26539:2;26534:3;26530:12;26523:19;;26182:366;;;:::o;26554:419::-;26720:4;26758:2;26747:9;26743:18;26735:26;;26807:9;26801:4;26797:20;26793:1;26782:9;26778:17;26771:47;26835:131;26961:4;26835:131;:::i;:::-;26827:139;;26554:419;;;:::o;26979:224::-;27119:34;27115:1;27107:6;27103:14;27096:58;27188:7;27183:2;27175:6;27171:15;27164:32;26979:224;:::o;27209:366::-;27351:3;27372:67;27436:2;27431:3;27372:67;:::i;:::-;27365:74;;27448:93;27537:3;27448:93;:::i;:::-;27566:2;27561:3;27557:12;27550:19;;27209:366;;;:::o;27581:419::-;27747:4;27785:2;27774:9;27770:18;27762:26;;27834:9;27828:4;27824:20;27820:1;27809:9;27805:17;27798:47;27862:131;27988:4;27862:131;:::i;:::-;27854:139;;27581:419;;;:::o;28006:222::-;28146:34;28142:1;28134:6;28130:14;28123:58;28215:5;28210:2;28202:6;28198:15;28191:30;28006:222;:::o;28234:366::-;28376:3;28397:67;28461:2;28456:3;28397:67;:::i;:::-;28390:74;;28473:93;28562:3;28473:93;:::i;:::-;28591:2;28586:3;28582:12;28575:19;;28234:366;;;:::o;28606:419::-;28772:4;28810:2;28799:9;28795:18;28787:26;;28859:9;28853:4;28849:20;28845:1;28834:9;28830:17;28823:47;28887:131;29013:4;28887:131;:::i;:::-;28879:139;;28606:419;;;:::o;29031:172::-;29171:24;29167:1;29159:6;29155:14;29148:48;29031:172;:::o;29209:366::-;29351:3;29372:67;29436:2;29431:3;29372:67;:::i;:::-;29365:74;;29448:93;29537:3;29448:93;:::i;:::-;29566:2;29561:3;29557:12;29550:19;;29209:366;;;:::o;29581:419::-;29747:4;29785:2;29774:9;29770:18;29762:26;;29834:9;29828:4;29824:20;29820:1;29809:9;29805:17;29798:47;29862:131;29988:4;29862:131;:::i;:::-;29854:139;;29581:419;;;:::o;30006:240::-;30146:34;30142:1;30134:6;30130:14;30123:58;30215:23;30210:2;30202:6;30198:15;30191:48;30006:240;:::o;30252:366::-;30394:3;30415:67;30479:2;30474:3;30415:67;:::i;:::-;30408:74;;30491:93;30580:3;30491:93;:::i;:::-;30609:2;30604:3;30600:12;30593:19;;30252:366;;;:::o;30624:419::-;30790:4;30828:2;30817:9;30813:18;30805:26;;30877:9;30871:4;30867:20;30863:1;30852:9;30848:17;30841:47;30905:131;31031:4;30905:131;:::i;:::-;30897:139;;30624:419;;;:::o;31049:169::-;31189:21;31185:1;31177:6;31173:14;31166:45;31049:169;:::o;31224:366::-;31366:3;31387:67;31451:2;31446:3;31387:67;:::i;:::-;31380:74;;31463:93;31552:3;31463:93;:::i;:::-;31581:2;31576:3;31572:12;31565:19;;31224:366;;;:::o;31596:419::-;31762:4;31800:2;31789:9;31785:18;31777:26;;31849:9;31843:4;31839:20;31835:1;31824:9;31820:17;31813:47;31877:131;32003:4;31877:131;:::i;:::-;31869:139;;31596:419;;;:::o;32021:241::-;32161:34;32157:1;32149:6;32145:14;32138:58;32230:24;32225:2;32217:6;32213:15;32206:49;32021:241;:::o;32268:366::-;32410:3;32431:67;32495:2;32490:3;32431:67;:::i;:::-;32424:74;;32507:93;32596:3;32507:93;:::i;:::-;32625:2;32620:3;32616:12;32609:19;;32268:366;;;:::o;32640:419::-;32806:4;32844:2;32833:9;32829:18;32821:26;;32893:9;32887:4;32883:20;32879:1;32868:9;32864:17;32857:47;32921:131;33047:4;32921:131;:::i;:::-;32913:139;;32640:419;;;:::o;33065:233::-;33104:3;33127:24;33145:5;33127:24;:::i;:::-;33118:33;;33173:66;33166:5;33163:77;33160:103;;33243:18;;:::i;:::-;33160:103;33290:1;33283:5;33279:13;33272:20;;33065:233;;;:::o;33304:194::-;33344:4;33364:20;33382:1;33364:20;:::i;:::-;33359:25;;33398:20;33416:1;33398:20;:::i;:::-;33393:25;;33442:1;33439;33435:9;33427:17;;33466:1;33460:4;33457:11;33454:37;;;33471:18;;:::i;:::-;33454:37;33304:194;;;;:::o;33504:180::-;33552:77;33549:1;33542:88;33649:4;33646:1;33639:15;33673:4;33670:1;33663:15;33690:143;33747:5;33778:6;33772:13;33763:22;;33794:33;33821:5;33794:33;:::i;:::-;33690:143;;;;:::o;33839:351::-;33909:6;33958:2;33946:9;33937:7;33933:23;33929:32;33926:119;;;33964:79;;:::i;:::-;33926:119;34084:1;34109:64;34165:7;34156:6;34145:9;34141:22;34109:64;:::i;:::-;34099:74;;34055:128;33839:351;;;;:::o;34196:85::-;34241:7;34270:5;34259:16;;34196:85;;;:::o;34287:158::-;34345:9;34378:61;34396:42;34405:32;34431:5;34405:32;:::i;:::-;34396:42;:::i;:::-;34378:61;:::i;:::-;34365:74;;34287:158;;;:::o;34451:147::-;34546:45;34585:5;34546:45;:::i;:::-;34541:3;34534:58;34451:147;;:::o;34604:114::-;34671:6;34705:5;34699:12;34689:22;;34604:114;;;:::o;34724:184::-;34823:11;34857:6;34852:3;34845:19;34897:4;34892:3;34888:14;34873:29;;34724:184;;;;:::o;34914:132::-;34981:4;35004:3;34996:11;;35034:4;35029:3;35025:14;35017:22;;34914:132;;;:::o;35052:108::-;35129:24;35147:5;35129:24;:::i;:::-;35124:3;35117:37;35052:108;;:::o;35166:179::-;35235:10;35256:46;35298:3;35290:6;35256:46;:::i;:::-;35334:4;35329:3;35325:14;35311:28;;35166:179;;;;:::o;35351:113::-;35421:4;35453;35448:3;35444:14;35436:22;;35351:113;;;:::o;35500:732::-;35619:3;35648:54;35696:5;35648:54;:::i;:::-;35718:86;35797:6;35792:3;35718:86;:::i;:::-;35711:93;;35828:56;35878:5;35828:56;:::i;:::-;35907:7;35938:1;35923:284;35948:6;35945:1;35942:13;35923:284;;;36024:6;36018:13;36051:63;36110:3;36095:13;36051:63;:::i;:::-;36044:70;;36137:60;36190:6;36137:60;:::i;:::-;36127:70;;35983:224;35970:1;35967;35963:9;35958:14;;35923:284;;;35927:14;36223:3;36216:10;;35624:608;;;35500:732;;;;:::o;36238:831::-;36501:4;36539:3;36528:9;36524:19;36516:27;;36553:71;36621:1;36610:9;36606:17;36597:6;36553:71;:::i;:::-;36634:80;36710:2;36699:9;36695:18;36686:6;36634:80;:::i;:::-;36761:9;36755:4;36751:20;36746:2;36735:9;36731:18;36724:48;36789:108;36892:4;36883:6;36789:108;:::i;:::-;36781:116;;36907:72;36975:2;36964:9;36960:18;36951:6;36907:72;:::i;:::-;36989:73;37057:3;37046:9;37042:19;37033:6;36989:73;:::i;:::-;36238:831;;;;;;;;:::o;37075:225::-;37215:34;37211:1;37203:6;37199:14;37192:58;37284:8;37279:2;37271:6;37267:15;37260:33;37075:225;:::o;37306:366::-;37448:3;37469:67;37533:2;37528:3;37469:67;:::i;:::-;37462:74;;37545:93;37634:3;37545:93;:::i;:::-;37663:2;37658:3;37654:12;37647:19;;37306:366;;;:::o;37678:419::-;37844:4;37882:2;37871:9;37867:18;37859:26;;37931:9;37925:4;37921:20;37917:1;37906:9;37902:17;37895:47;37959:131;38085:4;37959:131;:::i;:::-;37951:139;;37678:419;;;:::o

Swarm Source

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