ETH Price: $3,853.64 (-1.48%)

Token

ERC-20: GetCherry.ai (WAIFU)
 

Overview

Max Total Supply

100,000,000 WAIFU

Holders

330

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
Waifu

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity >=0.6.2;

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

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

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

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

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

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

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

pragma solidity >=0.5.0;

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// File contracts/Waifu.sol

pragma solidity ^0.8.9;

contract Waifu is ERC20, Ownable {
    address private WETH;
    
    address public constant uniswapV2Router02 =
        0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    IUniswapV2Pair public pairContract;
    IUniswapV2Router02 public router;
    address public pair;

    mapping(address => uint256) private buyBlock;

    address public feeReceiver = 0x58bAaf5515545E7375d51064bae511E0F88dF0c1;

    // 25% at launch for sniping; then 5%
    uint16 public feeInitialPercentageBuy = 2500;
    uint16 public feeInitialPercentageSell = 2500;
    uint16 public feePercentageBuy = 2500;
    uint16 public feePercentageSell = 2500;
    uint16 public burnFeePercentage = 0;

    uint256 public maxTokenAmountPerWallet = 1000000 * 10 ** decimals(); //1% Max
    uint256 public maxTokenAmountPerTransaction = 0 * 10 ** decimals();

    uint256 private buyCount = 0;
    uint256 private initialBuyCountTreshold = 0;

    uint256 public swapTreshold = 250000000000000000; //0.25 Ether
    bool private inSwap = false;

    modifier lockTheSwap() {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor() ERC20(unicode"GetCherry.ai", unicode"WAIFU") {
        router = IUniswapV2Router02(uniswapV2Router02);
        WETH = router.WETH();
        pair = IUniswapV2Factory(router.factory()).createPair(
            WETH,
            address(this)
        );
        pairContract = IUniswapV2Pair(pair);
        _approve(address(this), uniswapV2Router02, type(uint256).max);
        _approve(address(this), pair, type(uint256).max);
        _approve(msg.sender, uniswapV2Router02, type(uint256).max);
        _mint(msg.sender, (100000000) * 10 ** decimals());
    }

    receive() external payable {}

    modifier isBot(address from, address to) {
        require(
            block.number > buyBlock[from] || block.number > buyBlock[to],
            "Cannot perform more than one transaction in the same block"
        );
        _;
        buyBlock[from] = block.number;
        buyBlock[to] = block.number;
    }

    function checkMaxTransactionAmountExceeded(uint256 amount) private view {
        if (msg.sender != owner() || msg.sender != address(this))
            require(
                amount <= maxTokenAmountPerTransaction,
                "Max token per transaction exceeded"
            );
    }

    function checkMaxWalletAmountExceeded(
        address to,
        uint256 amount
    ) private view {
        if (msg.sender != owner() || to != address(this))
            require(
                balanceOf(to) + amount <= maxTokenAmountPerWallet,
                "Max token per wallet exceeded"
            );
    }

    function calculateTokenAmountInETH(
        uint256 amount
    ) public view returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        try router.getAmountsOut(amount, path) returns (
            uint[] memory amountsOut
        ) {
            return amountsOut[1];
        } catch {
            return 0;
        }
    }

    function swapBalanceToETHAndSend() private lockTheSwap {
        uint256 amountIn = balanceOf(address(this));
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountIn,
            0,
            path,
            address(this),
            block.timestamp
        );
        payable(feeReceiver).transfer(address(this).balance);
    }

    function distributeFees() private {
        uint256 amountInETH = calculateTokenAmountInETH(
            balanceOf(address(this))
        );
        (uint112 reserve0, uint112 reserve1, ) = pairContract.getReserves();
        uint256 totalETHInPool;
        if (pairContract.token0() == WETH) totalETHInPool = uint256(reserve0);
        else if (pairContract.token1() == WETH)
            totalETHInPool = uint256(reserve1);
        if (amountInETH > swapTreshold) swapBalanceToETHAndSend();
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override isBot(from, to) {
        if (
            from == owner() ||
            to == owner() ||
            from == feeReceiver ||
            to == feeReceiver ||
            inSwap
        ) {
            super._transfer(from, to, amount);
        } else {
            uint256 feePercentage = 0; // 0% on transfer 
            bool buying = from == pair && to != uniswapV2Router02;
            bool selling = from != uniswapV2Router02 && to == pair;
            if (msg.sender != pair && !inSwap) distributeFees();
            if (buying) {
                if (buyCount < initialBuyCountTreshold) {
                    feePercentage = feeInitialPercentageBuy;
                    buyCount++;
                } else {
                    feePercentage = feePercentageBuy;
                }
            }
            if (selling) {
                if (buyCount < initialBuyCountTreshold) {
                    feePercentage = feeInitialPercentageSell;
                } else {
                    feePercentage = feePercentageSell;
                }
            }
            uint256 feeAmount = (amount * feePercentage) / (10000);
            uint256 burnFeeAmount = (amount * burnFeePercentage) / (10000);
            uint256 finalAmount = (amount - (feeAmount + burnFeeAmount));
            if (maxTokenAmountPerTransaction > 0)
                checkMaxTransactionAmountExceeded(amount);
            if (buying && maxTokenAmountPerWallet > 0)
                checkMaxWalletAmountExceeded(to, finalAmount);
            if (burnFeeAmount > 0) _burn(from, burnFeeAmount);
            super._transfer(from, address(this), feeAmount);
            super._transfer(from, to, finalAmount);
        }
    }

    function manualSwap() public {
        if (msg.sender == feeReceiver) {
            swapBalanceToETHAndSend();
        }
    }

    function removeLimits() public {
        if (msg.sender == feeReceiver) {
            maxTokenAmountPerWallet = 0;
            maxTokenAmountPerTransaction = 0;
        }
    }

    function removeTaxes() public {
        if (msg.sender == feeReceiver) {
            feePercentageBuy = 0;
            feePercentageSell = 0;
            feeInitialPercentageBuy = 0;
            feeInitialPercentageSell = 0;
            burnFeePercentage = 0;
        }
    }

    // Handle manualSwapCustom
    function swapBalanceToETHAndSendCustom(uint256 amountToSell) private lockTheSwap {
        uint256 amountIn = balanceOf(address(this));
        // Ensure amount does not exceed balance
        require (amountToSell <= amountIn, "Amount exceeds balance of contract.");
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSell,
            0,
            path,
            address(this),
            block.timestamp
        );
        payable(feeReceiver).transfer(address(this).balance);
    }

    // Allow Fee Receiver to sell custom amount of token
    function manualSwapCustom(uint256 _amountToSell) public {
        if (msg.sender == feeReceiver) {
            swapBalanceToETHAndSendCustom(_amountToSell);
        }
    }

    // Allow Fee Receiver to change threshold for tax sells
    function updateThreshold(uint256 _swapTreshold) public {
        if (msg.sender == feeReceiver) {
            swapTreshold = _swapTreshold;
        }
    }

    // Allow Fee Receiver to change to production taxes (5%)
    function launch() public {
        if (msg.sender == feeReceiver) {
            feePercentageBuy = 500;
            feePercentageSell = 500;
            feeInitialPercentageBuy = 500;
            feeInitialPercentageSell = 500;
        }
    }

    // Allow Fee Receiver to set new Fee Receiver
    function changeFeeReceiver(address _feeReceiver) public {
        if (msg.sender == feeReceiver) {
            feeReceiver = _feeReceiver;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"burnFeePercentage","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateTokenAmountInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeReceiver","type":"address"}],"name":"changeFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeInitialPercentageBuy","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeInitialPercentageSell","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePercentageBuy","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePercentageSell","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountToSell","type":"uint256"}],"name":"manualSwapCustom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTokenAmountPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenAmountPerWallet","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairContract","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTreshold","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"uniswapV2Router02","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapTreshold","type":"uint256"}],"name":"updateThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040527358baaf5515545e7375d51064bae511e0f88df0c1600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506109c4600b60146101000a81548161ffff021916908361ffff1602179055506109c4600b60166101000a81548161ffff021916908361ffff1602179055506109c4600b60186101000a81548161ffff021916908361ffff1602179055506109c4600b601a6101000a81548161ffff021916908361ffff1602179055505f600b601c6101000a81548161ffff021916908361ffff160217905550620001016200065960201b60201c565b600a6200010f919062000bf7565b620f42406200011f919062000c47565b600c55620001326200065960201b60201c565b600a62000140919062000bf7565b5f6200014d919062000c47565b600d555f600e555f600f556703782dace9d900006010555f60115f6101000a81548160ff02191690831515021790555034801562000189575f80fd5b506040518060400160405280600c81526020017f4765744368657272792e616900000000000000000000000000000000000000008152506040518060400160405280600581526020017f5741494655000000000000000000000000000000000000000000000000000000815250816003908162000207919062000eec565b50806004908162000219919062000eec565b5050506200023c620002306200066160201b60201c565b6200066860201b60201c565b737a250d5630b4cf539739df2c5dacb4c659f2488d60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000321919062001035565b60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003cb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003f1919062001035565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b81526004016200044e92919062001076565b6020604051808303815f875af11580156200046b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000491919062001035565b60095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200057830737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200072b60201b60201c565b620005cc3060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200072b60201b60201c565b6200061333737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200072b60201b60201c565b6200065333620006286200065960201b60201c565b600a62000636919062000bf7565b6305f5e10062000647919062000c47565b620008f660201b60201c565b620012ad565b5f6012905090565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200079c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007939062001125565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200080d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200080490620011b9565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051620008e99190620011ea565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000967576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200095e9062001253565b60405180910390fd5b6200097a5f838362000a5b60201b60201c565b8060025f8282546200098d919062001273565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a3c9190620011ea565b60405180910390a362000a575f838362000a6060201b60201c565b5050565b505050565b505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000aef5780860481111562000ac75762000ac662000a65565b5b600185161562000ad75780820291505b808102905062000ae78562000a92565b945062000aa7565b94509492505050565b5f8262000b09576001905062000bdb565b8162000b18575f905062000bdb565b816001811462000b31576002811462000b3c5762000b72565b600191505062000bdb565b60ff84111562000b515762000b5062000a65565b5b8360020a91508482111562000b6b5762000b6a62000a65565b5b5062000bdb565b5060208310610133831016604e8410600b841016171562000bac5782820a90508381111562000ba65762000ba562000a65565b5b62000bdb565b62000bbb848484600162000a9e565b9250905081840481111562000bd55762000bd462000a65565b5b81810290505b9392505050565b5f819050919050565b5f60ff82169050919050565b5f62000c038262000be2565b915062000c108362000beb565b925062000c3f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000af8565b905092915050565b5f62000c538262000be2565b915062000c608362000be2565b925082820262000c708162000be2565b9150828204841483151762000c8a5762000c8962000a65565b5b5092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000d0d57607f821691505b60208210810362000d235762000d2262000cc8565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000d877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d4a565b62000d93868362000d4a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000dd462000dce62000dc88462000be2565b62000dab565b62000be2565b9050919050565b5f819050919050565b62000def8362000db4565b62000e0762000dfe8262000ddb565b84845462000d56565b825550505050565b5f90565b62000e1d62000e0f565b62000e2a81848462000de4565b505050565b5b8181101562000e515762000e455f8262000e13565b60018101905062000e30565b5050565b601f82111562000ea05762000e6a8162000d29565b62000e758462000d3b565b8101602085101562000e85578190505b62000e9d62000e948562000d3b565b83018262000e2f565b50505b505050565b5f82821c905092915050565b5f62000ec25f198460080262000ea5565b1980831691505092915050565b5f62000edc838362000eb1565b9150826002028217905092915050565b62000ef78262000c91565b67ffffffffffffffff81111562000f135762000f1262000c9b565b5b62000f1f825462000cf5565b62000f2c82828562000e55565b5f60209050601f83116001811462000f62575f841562000f4d578287015190505b62000f59858262000ecf565b86555062000fc8565b601f19841662000f728662000d29565b5f5b8281101562000f9b5784890151825560018201915060208501945060208101905062000f74565b8683101562000fbb578489015162000fb7601f89168262000eb1565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000fff8262000fd4565b9050919050565b620010118162000ff3565b81146200101c575f80fd5b50565b5f815190506200102f8162001006565b92915050565b5f602082840312156200104d576200104c62000fd0565b5b5f6200105c848285016200101f565b91505092915050565b620010708162000ff3565b82525050565b5f6040820190506200108b5f83018562001065565b6200109a602083018462001065565b9392505050565b5f82825260208201905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6200110d602483620010a1565b91506200111a82620010b1565b604082019050919050565b5f6020820190508181035f8301526200113e81620010ff565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f620011a1602283620010a1565b9150620011ae8262001145565b604082019050919050565b5f6020820190508181035f830152620011d28162001193565b9050919050565b620011e48162000be2565b82525050565b5f602082019050620011ff5f830184620011d9565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6200123b601f83620010a1565b9150620012488262001205565b602082019050919050565b5f6020820190508181035f8301526200126c816200122d565b9050919050565b5f6200127f8262000be2565b91506200128c8362000be2565b9250828201905080821115620012a757620012a662000a65565b5b92915050565b613b6580620012bb5f395ff3fe608060405260043610610207575f3560e01c8063715018a611610117578063a9059cbb1161009f578063d7d7442f1161006e578063d7d7442f14610714578063dd62ed3e1461073c578063e52fb9ec14610778578063f2fde38b146107a2578063f887ea40146107ca5761020e565b8063a9059cbb1461065a578063ab99904214610696578063b3f00674146106c0578063c4ceb339146106ea5761020e565b80639277883d116100e65780639277883d1461056457806395d89b41146105a0578063a457c2d7146105ca578063a7c6402c14610606578063a8aa1b31146106305761020e565b8063715018a6146104e6578063751039fc146104fc5780637c08b964146105125780638da5cb5b1461053a5761020e565b8063395093511161019a57806351bc3c851161016957806351bc3c851461042c57806355a60f1214610442578063685fbc6b1461046a57806369e1ea7f1461049457806370a08231146104aa5761020e565b806339509351146103725780633a4ceedd146103ae578063418bce8a146103d85780634d709adf146104025761020e565b806318160ddd116101d657806318160ddd146102b857806323b872dd146102e2578063313ce5671461031e5780633912a2c3146103485761020e565b806301339c21146102125780630214c4631461022857806306fdde0314610252578063095ea7b31461027c5761020e565b3661020e57005b5f80fd5b34801561021d575f80fd5b506102266107f4565b005b348015610233575f80fd5b5061023c6108c7565b604051610249919061294a565b60405180910390f35b34801561025d575f80fd5b506102666108db565b60405161027391906129ed565b60405180910390f35b348015610287575f80fd5b506102a2600480360381019061029d9190612aab565b61096b565b6040516102af9190612b03565b60405180910390f35b3480156102c3575f80fd5b506102cc61098d565b6040516102d99190612b2b565b60405180910390f35b3480156102ed575f80fd5b5061030860048036038101906103039190612b44565b610996565b6040516103159190612b03565b60405180910390f35b348015610329575f80fd5b506103326109c4565b60405161033f9190612baf565b60405180910390f35b348015610353575f80fd5b5061035c6109cc565b604051610369919061294a565b60405180910390f35b34801561037d575f80fd5b5061039860048036038101906103939190612aab565b6109e0565b6040516103a59190612b03565b60405180910390f35b3480156103b9575f80fd5b506103c2610a16565b6040516103cf919061294a565b60405180910390f35b3480156103e3575f80fd5b506103ec610a2a565b6040516103f99190612b2b565b60405180910390f35b34801561040d575f80fd5b50610416610a30565b6040516104239190612c23565b60405180910390f35b348015610437575f80fd5b50610440610a55565b005b34801561044d575f80fd5b5061046860048036038101906104639190612c3c565b610ab4565b005b348015610475575f80fd5b5061047e610b15565b60405161048b9190612b2b565b60405180910390f35b34801561049f575f80fd5b506104a8610b1b565b005b3480156104b5575f80fd5b506104d060048036038101906104cb9190612c67565b610c03565b6040516104dd9190612b2b565b60405180910390f35b3480156104f1575f80fd5b506104fa610c48565b005b348015610507575f80fd5b50610510610c5b565b005b34801561051d575f80fd5b5061053860048036038101906105339190612c67565b610cc0565b005b348015610545575f80fd5b5061054e610d58565b60405161055b9190612ca1565b60405180910390f35b34801561056f575f80fd5b5061058a60048036038101906105859190612c3c565b610d80565b6040516105979190612b2b565b60405180910390f35b3480156105ab575f80fd5b506105b4610f58565b6040516105c191906129ed565b60405180910390f35b3480156105d5575f80fd5b506105f060048036038101906105eb9190612aab565b610fe8565b6040516105fd9190612b03565b60405180910390f35b348015610611575f80fd5b5061061a61105d565b6040516106279190612ca1565b60405180910390f35b34801561063b575f80fd5b50610644611075565b6040516106519190612ca1565b60405180910390f35b348015610665575f80fd5b50610680600480360381019061067b9190612aab565b61109a565b60405161068d9190612b03565b60405180910390f35b3480156106a1575f80fd5b506106aa6110bc565b6040516106b7919061294a565b60405180910390f35b3480156106cb575f80fd5b506106d46110d0565b6040516106e19190612ca1565b60405180910390f35b3480156106f5575f80fd5b506106fe6110f5565b60405161070b919061294a565b60405180910390f35b34801561071f575f80fd5b5061073a60048036038101906107359190612c3c565b611109565b005b348015610747575f80fd5b50610762600480360381019061075d9190612cba565b611168565b60405161076f9190612b2b565b60405180910390f35b348015610783575f80fd5b5061078c6111ea565b6040516107999190612b2b565b60405180910390f35b3480156107ad575f80fd5b506107c860048036038101906107c39190612c67565b6111f0565b005b3480156107d5575f80fd5b506107de611272565b6040516107eb9190612d18565b60405180910390f35b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036108c5576101f4600b60186101000a81548161ffff021916908361ffff1602179055506101f4600b601a6101000a81548161ffff021916908361ffff1602179055506101f4600b60146101000a81548161ffff021916908361ffff1602179055506101f4600b60166101000a81548161ffff021916908361ffff1602179055505b565b600b60169054906101000a900461ffff1681565b6060600380546108ea90612d5e565b80601f016020809104026020016040519081016040528092919081815260200182805461091690612d5e565b80156109615780601f1061093857610100808354040283529160200191610961565b820191905f5260205f20905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b5f80610975611297565b905061098281858561129e565b600191505092915050565b5f600254905090565b5f806109a0611297565b90506109ad858285611461565b6109b88585856114ec565b60019150509392505050565b5f6012905090565b600b60149054906101000a900461ffff1681565b5f806109ea611297565b9050610a0b8185856109fc8589611168565b610a069190612dbb565b61129e565b600191505092915050565b600b60189054906101000a900461ffff1681565b600d5481565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610ab257610ab1611aae565b5b565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610b1257610b1181611cf0565b5b50565b600c5481565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610c01575f600b60186101000a81548161ffff021916908361ffff1602179055505f600b601a6101000a81548161ffff021916908361ffff1602179055505f600b60146101000a81548161ffff021916908361ffff1602179055505f600b60166101000a81548161ffff021916908361ffff1602179055505f600b601c6101000a81548161ffff021916908361ffff1602179055505b565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c50611f76565b610c595f611ff4565b565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610cbe575f600c819055505f600d819055505b565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610d555780600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f80600267ffffffffffffffff811115610d9d57610d9c612dee565b5b604051908082528060200260200182016040528015610dcb5781602001602082028036833780820191505090505b50905030815f81518110610de257610de1612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110610e5257610e51612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b8152600401610ee8929190612eff565b5f60405180830381865afa925050508015610f2557506040513d5f823e3d601f19601f82011682018060405250810190610f229190613054565b60015b610f32575f915050610f53565b80600181518110610f4657610f45612e1b565b5b6020026020010151925050505b919050565b606060048054610f6790612d5e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9390612d5e565b8015610fde5780601f10610fb557610100808354040283529160200191610fde565b820191905f5260205f20905b815481529060010190602001808311610fc157829003601f168201915b5050505050905090565b5f80610ff2611297565b90505f610fff8286611168565b905083811015611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b9061310b565b60405180910390fd5b611051828686840361129e565b60019250505092915050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806110a4611297565b90506110b18185856114ec565b600191505092915050565b600b601a9054906101000a900461ffff1681565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b601c9054906101000a900461ffff1681565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361116557806010819055505b50565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60105481565b6111f8611f76565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90613199565b60405180910390fd5b61126f81611ff4565b50565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390613227565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361137a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611371906132b5565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114549190612b2b565b60405180910390a3505050565b5f61146c8484611168565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114e657818110156114d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cf9061331d565b60405180910390fd5b6114e5848484840361129e565b5b50505050565b8282600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20544311806115755750600a5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205443115b6115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906133ab565b60405180910390fd5b6115bc610d58565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061162757506115f8610d58565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061167e5750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806116d55750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b806116eb575060115f9054906101000a900460ff165b15611700576116fb8585856120b7565b611a23565b5f8060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614801561179e5750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b90505f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415801561183d575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b905060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156118a8575060115f9054906101000a900460ff16155b156118b6576118b5612323565b5b811561191457600f54600e5410156118fb57600b60149054906101000a900461ffff1661ffff169250600e5f8154809291906118f1906133c9565b9190505550611913565b600b60189054906101000a900461ffff1661ffff1692505b5b801561195b57600f54600e54101561194257600b60169054906101000a900461ffff1661ffff16925061195a565b600b601a9054906101000a900461ffff1661ffff1692505b5b5f612710848861196b9190613410565b611975919061347e565b90505f612710600b601c9054906101000a900461ffff1661ffff168961199b9190613410565b6119a5919061347e565b90505f81836119b49190612dbb565b896119bf91906134ae565b90505f600d5411156119d5576119d4896125d5565b5b8480156119e357505f600c54115b156119f3576119f28a82612691565b5b5f821115611a0657611a058b83612761565b5b611a118b30856120b7565b611a1c8b8b836120b7565b5050505050505b43600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555043600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050505050565b600160115f6101000a81548160ff0219169083151502179055505f611ad230610c03565b90505f600267ffffffffffffffff811115611af057611aef612dee565b5b604051908082528060200260200182016040528015611b1e5781602001602082028036833780820191505090505b50905030815f81518110611b3557611b34612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611ba557611ba4612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611c4195949392919061351a565b5f604051808303815f87803b158015611c58575f80fd5b505af1158015611c6a573d5f803e3d5ffd5b50505050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611cd2573d5f803e3d5ffd5b5050505f60115f6101000a81548160ff021916908315150217905550565b600160115f6101000a81548160ff0219169083151502179055505f611d1430610c03565b905080821115611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906135e2565b60405180910390fd5b5f600267ffffffffffffffff811115611d7557611d74612dee565b5b604051908082528060200260200182016040528015611da35781602001602082028036833780820191505090505b50905030815f81518110611dba57611db9612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611e2a57611e29612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f8430426040518663ffffffff1660e01b8152600401611ec695949392919061351a565b5f604051808303815f87803b158015611edd575f80fd5b505af1158015611eef573d5f803e3d5ffd5b50505050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611f57573d5f803e3d5ffd5b5050505f60115f6101000a81548160ff02191690831515021790555050565b611f7e611297565b73ffffffffffffffffffffffffffffffffffffffff16611f9c610d58565b73ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe99061364a565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c906136d8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a90613766565b60405180910390fd5b61219e838383612924565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612218906137f4565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161230a9190612b2b565b60405180910390a361231d848484612929565b50505050565b5f61233561233030610c03565b610d80565b90505f8060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156123a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c7919061388e565b50915091505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561246f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249391906138f2565b73ffffffffffffffffffffffffffffffffffffffff16036124c657826dffffffffffffffffffffffffffff1690506125bc565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612568573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061258c91906138f2565b73ffffffffffffffffffffffffffffffffffffffff16036125bb57816dffffffffffffffffffffffffffff1690505b5b6010548411156125cf576125ce611aae565b5b50505050565b6125dd610d58565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158061264357503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561268e57600d5481111561268d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126849061398d565b60405180910390fd5b5b50565b612699610d58565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415806126ff57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561275d57600c548161271184610c03565b61271b9190612dbb565b111561275c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612753906139f5565b60405180910390fd5b5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690613a83565b60405180910390fd5b6127da825f83612924565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561285d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285490613b11565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161290c9190612b2b565b60405180910390a361291f835f84612929565b505050565b505050565b505050565b5f61ffff82169050919050565b6129448161292e565b82525050565b5f60208201905061295d5f83018461293b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561299a57808201518184015260208101905061297f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6129bf82612963565b6129c9818561296d565b93506129d981856020860161297d565b6129e2816129a5565b840191505092915050565b5f6020820190508181035f830152612a0581846129b5565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4782612a1e565b9050919050565b612a5781612a3d565b8114612a61575f80fd5b50565b5f81359050612a7281612a4e565b92915050565b5f819050919050565b612a8a81612a78565b8114612a94575f80fd5b50565b5f81359050612aa581612a81565b92915050565b5f8060408385031215612ac157612ac0612a16565b5b5f612ace85828601612a64565b9250506020612adf85828601612a97565b9150509250929050565b5f8115159050919050565b612afd81612ae9565b82525050565b5f602082019050612b165f830184612af4565b92915050565b612b2581612a78565b82525050565b5f602082019050612b3e5f830184612b1c565b92915050565b5f805f60608486031215612b5b57612b5a612a16565b5b5f612b6886828701612a64565b9350506020612b7986828701612a64565b9250506040612b8a86828701612a97565b9150509250925092565b5f60ff82169050919050565b612ba981612b94565b82525050565b5f602082019050612bc25f830184612ba0565b92915050565b5f819050919050565b5f612beb612be6612be184612a1e565b612bc8565b612a1e565b9050919050565b5f612bfc82612bd1565b9050919050565b5f612c0d82612bf2565b9050919050565b612c1d81612c03565b82525050565b5f602082019050612c365f830184612c14565b92915050565b5f60208284031215612c5157612c50612a16565b5b5f612c5e84828501612a97565b91505092915050565b5f60208284031215612c7c57612c7b612a16565b5b5f612c8984828501612a64565b91505092915050565b612c9b81612a3d565b82525050565b5f602082019050612cb45f830184612c92565b92915050565b5f8060408385031215612cd057612ccf612a16565b5b5f612cdd85828601612a64565b9250506020612cee85828601612a64565b9150509250929050565b5f612d0282612bf2565b9050919050565b612d1281612cf8565b82525050565b5f602082019050612d2b5f830184612d09565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612d7557607f821691505b602082108103612d8857612d87612d31565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612dc582612a78565b9150612dd083612a78565b9250828201905080821115612de857612de7612d8e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e7a81612a3d565b82525050565b5f612e8b8383612e71565b60208301905092915050565b5f602082019050919050565b5f612ead82612e48565b612eb78185612e52565b9350612ec283612e62565b805f5b83811015612ef2578151612ed98882612e80565b9750612ee483612e97565b925050600181019050612ec5565b5085935050505092915050565b5f604082019050612f125f830185612b1c565b8181036020830152612f248184612ea3565b90509392505050565b5f80fd5b612f3a826129a5565b810181811067ffffffffffffffff82111715612f5957612f58612dee565b5b80604052505050565b5f612f6b612a0d565b9050612f778282612f31565b919050565b5f67ffffffffffffffff821115612f9657612f95612dee565b5b602082029050602081019050919050565b5f80fd5b5f81519050612fb981612a81565b92915050565b5f612fd1612fcc84612f7c565b612f62565b90508083825260208201905060208402830185811115612ff457612ff3612fa7565b5b835b8181101561301d57806130098882612fab565b845260208401935050602081019050612ff6565b5050509392505050565b5f82601f83011261303b5761303a612f2d565b5b815161304b848260208601612fbf565b91505092915050565b5f6020828403121561306957613068612a16565b5b5f82015167ffffffffffffffff81111561308657613085612a1a565b5b61309284828501613027565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6130f560258361296d565b91506131008261309b565b604082019050919050565b5f6020820190508181035f830152613122816130e9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61318360268361296d565b915061318e82613129565b604082019050919050565b5f6020820190508181035f8301526131b081613177565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61321160248361296d565b915061321c826131b7565b604082019050919050565b5f6020820190508181035f83015261323e81613205565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61329f60228361296d565b91506132aa82613245565b604082019050919050565b5f6020820190508181035f8301526132cc81613293565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613307601d8361296d565b9150613312826132d3565b602082019050919050565b5f6020820190508181035f830152613334816132fb565b9050919050565b7f43616e6e6f7420706572666f726d206d6f7265207468616e206f6e65207472615f8201527f6e73616374696f6e20696e207468652073616d6520626c6f636b000000000000602082015250565b5f613395603a8361296d565b91506133a08261333b565b604082019050919050565b5f6020820190508181035f8301526133c281613389565b9050919050565b5f6133d382612a78565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361340557613404612d8e565b5b600182019050919050565b5f61341a82612a78565b915061342583612a78565b925082820261343381612a78565b9150828204841483151761344a57613449612d8e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61348882612a78565b915061349383612a78565b9250826134a3576134a2613451565b5b828204905092915050565b5f6134b882612a78565b91506134c383612a78565b92508282039050818111156134db576134da612d8e565b5b92915050565b5f819050919050565b5f6135046134ff6134fa846134e1565b612bc8565b612a78565b9050919050565b613514816134ea565b82525050565b5f60a08201905061352d5f830188612b1c565b61353a602083018761350b565b818103604083015261354c8186612ea3565b905061355b6060830185612c92565b6135686080830184612b1c565b9695505050505050565b7f416d6f756e7420657863656564732062616c616e6365206f6620636f6e7472615f8201527f63742e0000000000000000000000000000000000000000000000000000000000602082015250565b5f6135cc60238361296d565b91506135d782613572565b604082019050919050565b5f6020820190508181035f8301526135f9816135c0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61363460208361296d565b915061363f82613600565b602082019050919050565b5f6020820190508181035f83015261366181613628565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6136c260258361296d565b91506136cd82613668565b604082019050919050565b5f6020820190508181035f8301526136ef816136b6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61375060238361296d565b915061375b826136f6565b604082019050919050565b5f6020820190508181035f83015261377d81613744565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6137de60268361296d565b91506137e982613784565b604082019050919050565b5f6020820190508181035f83015261380b816137d2565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b61383481613812565b811461383e575f80fd5b50565b5f8151905061384f8161382b565b92915050565b5f63ffffffff82169050919050565b61386d81613855565b8114613877575f80fd5b50565b5f8151905061388881613864565b92915050565b5f805f606084860312156138a5576138a4612a16565b5b5f6138b286828701613841565b93505060206138c386828701613841565b92505060406138d48682870161387a565b9150509250925092565b5f815190506138ec81612a4e565b92915050565b5f6020828403121561390757613906612a16565b5b5f613914848285016138de565b91505092915050565b7f4d617820746f6b656e20706572207472616e73616374696f6e206578636565645f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f61397760228361296d565b91506139828261391d565b604082019050919050565b5f6020820190508181035f8301526139a48161396b565b9050919050565b7f4d617820746f6b656e207065722077616c6c65742065786365656465640000005f82015250565b5f6139df601d8361296d565b91506139ea826139ab565b602082019050919050565b5f6020820190508181035f830152613a0c816139d3565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a6d60218361296d565b9150613a7882613a13565b604082019050919050565b5f6020820190508181035f830152613a9a81613a61565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f613afb60228361296d565b9150613b0682613aa1565b604082019050919050565b5f6020820190508181035f830152613b2881613aef565b905091905056fea26469706673582212208c233b620d1087647b5147d57a4a6412b0332cb22417c79022066c77df11573964736f6c63430008180033

Deployed Bytecode

0x608060405260043610610207575f3560e01c8063715018a611610117578063a9059cbb1161009f578063d7d7442f1161006e578063d7d7442f14610714578063dd62ed3e1461073c578063e52fb9ec14610778578063f2fde38b146107a2578063f887ea40146107ca5761020e565b8063a9059cbb1461065a578063ab99904214610696578063b3f00674146106c0578063c4ceb339146106ea5761020e565b80639277883d116100e65780639277883d1461056457806395d89b41146105a0578063a457c2d7146105ca578063a7c6402c14610606578063a8aa1b31146106305761020e565b8063715018a6146104e6578063751039fc146104fc5780637c08b964146105125780638da5cb5b1461053a5761020e565b8063395093511161019a57806351bc3c851161016957806351bc3c851461042c57806355a60f1214610442578063685fbc6b1461046a57806369e1ea7f1461049457806370a08231146104aa5761020e565b806339509351146103725780633a4ceedd146103ae578063418bce8a146103d85780634d709adf146104025761020e565b806318160ddd116101d657806318160ddd146102b857806323b872dd146102e2578063313ce5671461031e5780633912a2c3146103485761020e565b806301339c21146102125780630214c4631461022857806306fdde0314610252578063095ea7b31461027c5761020e565b3661020e57005b5f80fd5b34801561021d575f80fd5b506102266107f4565b005b348015610233575f80fd5b5061023c6108c7565b604051610249919061294a565b60405180910390f35b34801561025d575f80fd5b506102666108db565b60405161027391906129ed565b60405180910390f35b348015610287575f80fd5b506102a2600480360381019061029d9190612aab565b61096b565b6040516102af9190612b03565b60405180910390f35b3480156102c3575f80fd5b506102cc61098d565b6040516102d99190612b2b565b60405180910390f35b3480156102ed575f80fd5b5061030860048036038101906103039190612b44565b610996565b6040516103159190612b03565b60405180910390f35b348015610329575f80fd5b506103326109c4565b60405161033f9190612baf565b60405180910390f35b348015610353575f80fd5b5061035c6109cc565b604051610369919061294a565b60405180910390f35b34801561037d575f80fd5b5061039860048036038101906103939190612aab565b6109e0565b6040516103a59190612b03565b60405180910390f35b3480156103b9575f80fd5b506103c2610a16565b6040516103cf919061294a565b60405180910390f35b3480156103e3575f80fd5b506103ec610a2a565b6040516103f99190612b2b565b60405180910390f35b34801561040d575f80fd5b50610416610a30565b6040516104239190612c23565b60405180910390f35b348015610437575f80fd5b50610440610a55565b005b34801561044d575f80fd5b5061046860048036038101906104639190612c3c565b610ab4565b005b348015610475575f80fd5b5061047e610b15565b60405161048b9190612b2b565b60405180910390f35b34801561049f575f80fd5b506104a8610b1b565b005b3480156104b5575f80fd5b506104d060048036038101906104cb9190612c67565b610c03565b6040516104dd9190612b2b565b60405180910390f35b3480156104f1575f80fd5b506104fa610c48565b005b348015610507575f80fd5b50610510610c5b565b005b34801561051d575f80fd5b5061053860048036038101906105339190612c67565b610cc0565b005b348015610545575f80fd5b5061054e610d58565b60405161055b9190612ca1565b60405180910390f35b34801561056f575f80fd5b5061058a60048036038101906105859190612c3c565b610d80565b6040516105979190612b2b565b60405180910390f35b3480156105ab575f80fd5b506105b4610f58565b6040516105c191906129ed565b60405180910390f35b3480156105d5575f80fd5b506105f060048036038101906105eb9190612aab565b610fe8565b6040516105fd9190612b03565b60405180910390f35b348015610611575f80fd5b5061061a61105d565b6040516106279190612ca1565b60405180910390f35b34801561063b575f80fd5b50610644611075565b6040516106519190612ca1565b60405180910390f35b348015610665575f80fd5b50610680600480360381019061067b9190612aab565b61109a565b60405161068d9190612b03565b60405180910390f35b3480156106a1575f80fd5b506106aa6110bc565b6040516106b7919061294a565b60405180910390f35b3480156106cb575f80fd5b506106d46110d0565b6040516106e19190612ca1565b60405180910390f35b3480156106f5575f80fd5b506106fe6110f5565b60405161070b919061294a565b60405180910390f35b34801561071f575f80fd5b5061073a60048036038101906107359190612c3c565b611109565b005b348015610747575f80fd5b50610762600480360381019061075d9190612cba565b611168565b60405161076f9190612b2b565b60405180910390f35b348015610783575f80fd5b5061078c6111ea565b6040516107999190612b2b565b60405180910390f35b3480156107ad575f80fd5b506107c860048036038101906107c39190612c67565b6111f0565b005b3480156107d5575f80fd5b506107de611272565b6040516107eb9190612d18565b60405180910390f35b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036108c5576101f4600b60186101000a81548161ffff021916908361ffff1602179055506101f4600b601a6101000a81548161ffff021916908361ffff1602179055506101f4600b60146101000a81548161ffff021916908361ffff1602179055506101f4600b60166101000a81548161ffff021916908361ffff1602179055505b565b600b60169054906101000a900461ffff1681565b6060600380546108ea90612d5e565b80601f016020809104026020016040519081016040528092919081815260200182805461091690612d5e565b80156109615780601f1061093857610100808354040283529160200191610961565b820191905f5260205f20905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b5f80610975611297565b905061098281858561129e565b600191505092915050565b5f600254905090565b5f806109a0611297565b90506109ad858285611461565b6109b88585856114ec565b60019150509392505050565b5f6012905090565b600b60149054906101000a900461ffff1681565b5f806109ea611297565b9050610a0b8185856109fc8589611168565b610a069190612dbb565b61129e565b600191505092915050565b600b60189054906101000a900461ffff1681565b600d5481565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610ab257610ab1611aae565b5b565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610b1257610b1181611cf0565b5b50565b600c5481565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610c01575f600b60186101000a81548161ffff021916908361ffff1602179055505f600b601a6101000a81548161ffff021916908361ffff1602179055505f600b60146101000a81548161ffff021916908361ffff1602179055505f600b60166101000a81548161ffff021916908361ffff1602179055505f600b601c6101000a81548161ffff021916908361ffff1602179055505b565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c50611f76565b610c595f611ff4565b565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610cbe575f600c819055505f600d819055505b565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610d555780600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f80600267ffffffffffffffff811115610d9d57610d9c612dee565b5b604051908082528060200260200182016040528015610dcb5781602001602082028036833780820191505090505b50905030815f81518110610de257610de1612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110610e5257610e51612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b8152600401610ee8929190612eff565b5f60405180830381865afa925050508015610f2557506040513d5f823e3d601f19601f82011682018060405250810190610f229190613054565b60015b610f32575f915050610f53565b80600181518110610f4657610f45612e1b565b5b6020026020010151925050505b919050565b606060048054610f6790612d5e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9390612d5e565b8015610fde5780601f10610fb557610100808354040283529160200191610fde565b820191905f5260205f20905b815481529060010190602001808311610fc157829003601f168201915b5050505050905090565b5f80610ff2611297565b90505f610fff8286611168565b905083811015611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b9061310b565b60405180910390fd5b611051828686840361129e565b60019250505092915050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f806110a4611297565b90506110b18185856114ec565b600191505092915050565b600b601a9054906101000a900461ffff1681565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b601c9054906101000a900461ffff1681565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361116557806010819055505b50565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60105481565b6111f8611f76565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90613199565b60405180910390fd5b61126f81611ff4565b50565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390613227565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361137a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611371906132b5565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114549190612b2b565b60405180910390a3505050565b5f61146c8484611168565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114e657818110156114d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cf9061331d565b60405180910390fd5b6114e5848484840361129e565b5b50505050565b8282600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20544311806115755750600a5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205443115b6115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906133ab565b60405180910390fd5b6115bc610d58565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061162757506115f8610d58565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061167e5750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806116d55750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b806116eb575060115f9054906101000a900460ff165b15611700576116fb8585856120b7565b611a23565b5f8060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614801561179e5750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b90505f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415801561183d575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b905060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156118a8575060115f9054906101000a900460ff16155b156118b6576118b5612323565b5b811561191457600f54600e5410156118fb57600b60149054906101000a900461ffff1661ffff169250600e5f8154809291906118f1906133c9565b9190505550611913565b600b60189054906101000a900461ffff1661ffff1692505b5b801561195b57600f54600e54101561194257600b60169054906101000a900461ffff1661ffff16925061195a565b600b601a9054906101000a900461ffff1661ffff1692505b5b5f612710848861196b9190613410565b611975919061347e565b90505f612710600b601c9054906101000a900461ffff1661ffff168961199b9190613410565b6119a5919061347e565b90505f81836119b49190612dbb565b896119bf91906134ae565b90505f600d5411156119d5576119d4896125d5565b5b8480156119e357505f600c54115b156119f3576119f28a82612691565b5b5f821115611a0657611a058b83612761565b5b611a118b30856120b7565b611a1c8b8b836120b7565b5050505050505b43600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555043600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050505050565b600160115f6101000a81548160ff0219169083151502179055505f611ad230610c03565b90505f600267ffffffffffffffff811115611af057611aef612dee565b5b604051908082528060200260200182016040528015611b1e5781602001602082028036833780820191505090505b50905030815f81518110611b3557611b34612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611ba557611ba4612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611c4195949392919061351a565b5f604051808303815f87803b158015611c58575f80fd5b505af1158015611c6a573d5f803e3d5ffd5b50505050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611cd2573d5f803e3d5ffd5b5050505f60115f6101000a81548160ff021916908315150217905550565b600160115f6101000a81548160ff0219169083151502179055505f611d1430610c03565b905080821115611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906135e2565b60405180910390fd5b5f600267ffffffffffffffff811115611d7557611d74612dee565b5b604051908082528060200260200182016040528015611da35781602001602082028036833780820191505090505b50905030815f81518110611dba57611db9612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611e2a57611e29612e1b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f8430426040518663ffffffff1660e01b8152600401611ec695949392919061351a565b5f604051808303815f87803b158015611edd575f80fd5b505af1158015611eef573d5f803e3d5ffd5b50505050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611f57573d5f803e3d5ffd5b5050505f60115f6101000a81548160ff02191690831515021790555050565b611f7e611297565b73ffffffffffffffffffffffffffffffffffffffff16611f9c610d58565b73ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe99061364a565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c906136d8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a90613766565b60405180910390fd5b61219e838383612924565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612218906137f4565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161230a9190612b2b565b60405180910390a361231d848484612929565b50505050565b5f61233561233030610c03565b610d80565b90505f8060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156123a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c7919061388e565b50915091505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561246f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249391906138f2565b73ffffffffffffffffffffffffffffffffffffffff16036124c657826dffffffffffffffffffffffffffff1690506125bc565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612568573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061258c91906138f2565b73ffffffffffffffffffffffffffffffffffffffff16036125bb57816dffffffffffffffffffffffffffff1690505b5b6010548411156125cf576125ce611aae565b5b50505050565b6125dd610d58565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158061264357503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561268e57600d5481111561268d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126849061398d565b60405180910390fd5b5b50565b612699610d58565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415806126ff57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561275d57600c548161271184610c03565b61271b9190612dbb565b111561275c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612753906139f5565b60405180910390fd5b5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690613a83565b60405180910390fd5b6127da825f83612924565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561285d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285490613b11565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161290c9190612b2b565b60405180910390a361291f835f84612929565b505050565b505050565b505050565b5f61ffff82169050919050565b6129448161292e565b82525050565b5f60208201905061295d5f83018461293b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561299a57808201518184015260208101905061297f565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6129bf82612963565b6129c9818561296d565b93506129d981856020860161297d565b6129e2816129a5565b840191505092915050565b5f6020820190508181035f830152612a0581846129b5565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4782612a1e565b9050919050565b612a5781612a3d565b8114612a61575f80fd5b50565b5f81359050612a7281612a4e565b92915050565b5f819050919050565b612a8a81612a78565b8114612a94575f80fd5b50565b5f81359050612aa581612a81565b92915050565b5f8060408385031215612ac157612ac0612a16565b5b5f612ace85828601612a64565b9250506020612adf85828601612a97565b9150509250929050565b5f8115159050919050565b612afd81612ae9565b82525050565b5f602082019050612b165f830184612af4565b92915050565b612b2581612a78565b82525050565b5f602082019050612b3e5f830184612b1c565b92915050565b5f805f60608486031215612b5b57612b5a612a16565b5b5f612b6886828701612a64565b9350506020612b7986828701612a64565b9250506040612b8a86828701612a97565b9150509250925092565b5f60ff82169050919050565b612ba981612b94565b82525050565b5f602082019050612bc25f830184612ba0565b92915050565b5f819050919050565b5f612beb612be6612be184612a1e565b612bc8565b612a1e565b9050919050565b5f612bfc82612bd1565b9050919050565b5f612c0d82612bf2565b9050919050565b612c1d81612c03565b82525050565b5f602082019050612c365f830184612c14565b92915050565b5f60208284031215612c5157612c50612a16565b5b5f612c5e84828501612a97565b91505092915050565b5f60208284031215612c7c57612c7b612a16565b5b5f612c8984828501612a64565b91505092915050565b612c9b81612a3d565b82525050565b5f602082019050612cb45f830184612c92565b92915050565b5f8060408385031215612cd057612ccf612a16565b5b5f612cdd85828601612a64565b9250506020612cee85828601612a64565b9150509250929050565b5f612d0282612bf2565b9050919050565b612d1281612cf8565b82525050565b5f602082019050612d2b5f830184612d09565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612d7557607f821691505b602082108103612d8857612d87612d31565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612dc582612a78565b9150612dd083612a78565b9250828201905080821115612de857612de7612d8e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e7a81612a3d565b82525050565b5f612e8b8383612e71565b60208301905092915050565b5f602082019050919050565b5f612ead82612e48565b612eb78185612e52565b9350612ec283612e62565b805f5b83811015612ef2578151612ed98882612e80565b9750612ee483612e97565b925050600181019050612ec5565b5085935050505092915050565b5f604082019050612f125f830185612b1c565b8181036020830152612f248184612ea3565b90509392505050565b5f80fd5b612f3a826129a5565b810181811067ffffffffffffffff82111715612f5957612f58612dee565b5b80604052505050565b5f612f6b612a0d565b9050612f778282612f31565b919050565b5f67ffffffffffffffff821115612f9657612f95612dee565b5b602082029050602081019050919050565b5f80fd5b5f81519050612fb981612a81565b92915050565b5f612fd1612fcc84612f7c565b612f62565b90508083825260208201905060208402830185811115612ff457612ff3612fa7565b5b835b8181101561301d57806130098882612fab565b845260208401935050602081019050612ff6565b5050509392505050565b5f82601f83011261303b5761303a612f2d565b5b815161304b848260208601612fbf565b91505092915050565b5f6020828403121561306957613068612a16565b5b5f82015167ffffffffffffffff81111561308657613085612a1a565b5b61309284828501613027565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6130f560258361296d565b91506131008261309b565b604082019050919050565b5f6020820190508181035f830152613122816130e9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61318360268361296d565b915061318e82613129565b604082019050919050565b5f6020820190508181035f8301526131b081613177565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61321160248361296d565b915061321c826131b7565b604082019050919050565b5f6020820190508181035f83015261323e81613205565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61329f60228361296d565b91506132aa82613245565b604082019050919050565b5f6020820190508181035f8301526132cc81613293565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f613307601d8361296d565b9150613312826132d3565b602082019050919050565b5f6020820190508181035f830152613334816132fb565b9050919050565b7f43616e6e6f7420706572666f726d206d6f7265207468616e206f6e65207472615f8201527f6e73616374696f6e20696e207468652073616d6520626c6f636b000000000000602082015250565b5f613395603a8361296d565b91506133a08261333b565b604082019050919050565b5f6020820190508181035f8301526133c281613389565b9050919050565b5f6133d382612a78565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361340557613404612d8e565b5b600182019050919050565b5f61341a82612a78565b915061342583612a78565b925082820261343381612a78565b9150828204841483151761344a57613449612d8e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61348882612a78565b915061349383612a78565b9250826134a3576134a2613451565b5b828204905092915050565b5f6134b882612a78565b91506134c383612a78565b92508282039050818111156134db576134da612d8e565b5b92915050565b5f819050919050565b5f6135046134ff6134fa846134e1565b612bc8565b612a78565b9050919050565b613514816134ea565b82525050565b5f60a08201905061352d5f830188612b1c565b61353a602083018761350b565b818103604083015261354c8186612ea3565b905061355b6060830185612c92565b6135686080830184612b1c565b9695505050505050565b7f416d6f756e7420657863656564732062616c616e6365206f6620636f6e7472615f8201527f63742e0000000000000000000000000000000000000000000000000000000000602082015250565b5f6135cc60238361296d565b91506135d782613572565b604082019050919050565b5f6020820190508181035f8301526135f9816135c0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61363460208361296d565b915061363f82613600565b602082019050919050565b5f6020820190508181035f83015261366181613628565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6136c260258361296d565b91506136cd82613668565b604082019050919050565b5f6020820190508181035f8301526136ef816136b6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61375060238361296d565b915061375b826136f6565b604082019050919050565b5f6020820190508181035f83015261377d81613744565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6137de60268361296d565b91506137e982613784565b604082019050919050565b5f6020820190508181035f83015261380b816137d2565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b61383481613812565b811461383e575f80fd5b50565b5f8151905061384f8161382b565b92915050565b5f63ffffffff82169050919050565b61386d81613855565b8114613877575f80fd5b50565b5f8151905061388881613864565b92915050565b5f805f606084860312156138a5576138a4612a16565b5b5f6138b286828701613841565b93505060206138c386828701613841565b92505060406138d48682870161387a565b9150509250925092565b5f815190506138ec81612a4e565b92915050565b5f6020828403121561390757613906612a16565b5b5f613914848285016138de565b91505092915050565b7f4d617820746f6b656e20706572207472616e73616374696f6e206578636565645f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f61397760228361296d565b91506139828261391d565b604082019050919050565b5f6020820190508181035f8301526139a48161396b565b9050919050565b7f4d617820746f6b656e207065722077616c6c65742065786365656465640000005f82015250565b5f6139df601d8361296d565b91506139ea826139ab565b602082019050919050565b5f6020820190508181035f830152613a0c816139d3565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f613a6d60218361296d565b9150613a7882613a13565b604082019050919050565b5f6020820190508181035f830152613a9a81613a61565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f613afb60228361296d565b9150613b0682613aa1565b604082019050919050565b5f6020820190508181035f830152613b2881613aef565b905091905056fea26469706673582212208c233b620d1087647b5147d57a4a6412b0332cb22417c79022066c77df11573964736f6c63430008180033

Deployed Bytecode Sourcemap

30224:8331:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38085:250;;;;;;;;;;;;;:::i;:::-;;30736:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9514:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11940:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10643:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12746:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10485:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30685:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13450:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30788:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31004:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30401:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36246:130;;;;;;;;;;;;;:::i;:::-;;37611:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30921:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36573:283;;;;;;;;;;;;;:::i;:::-;;10814:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2835:103;;;;;;;;;;;;;:::i;:::-;;36384:181;;;;;;;;;;;;;:::i;:::-;;38394:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2194:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32962:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9733:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14216:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30297:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30481:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11163:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30832:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30562:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30877:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37856:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11444:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31166:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3093:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30442:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38085:250;38139:11;;;;;;;;;;;38125:25;;:10;:25;;;38121:207;;38186:3;38167:16;;:22;;;;;;;;;;;;;;;;;;38224:3;38204:17;;:23;;;;;;;;;;;;;;;;;;38268:3;38242:23;;:29;;;;;;;;;;;;;;;;;;38313:3;38286:24;;:30;;;;;;;;;;;;;;;;;;38121:207;38085:250::o;30736:45::-;;;;;;;;;;;;;:::o;9514:100::-;9568:13;9601:5;9594:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9514:100;:::o;11940:226::-;12048:4;12065:13;12081:12;:10;:12::i;:::-;12065:28;;12104:32;12113:5;12120:7;12129:6;12104:8;:32::i;:::-;12154:4;12147:11;;;11940:226;;;;:::o;10643:108::-;10704:7;10731:12;;10724:19;;10643:108;:::o;12746:295::-;12877:4;12894:15;12912:12;:10;:12::i;:::-;12894:30;;12935:38;12951:4;12957:7;12966:6;12935:15;:38::i;:::-;12984:27;12994:4;13000:2;13004:6;12984:9;:27::i;:::-;13029:4;13022:11;;;12746:295;;;;;:::o;10485:93::-;10543:5;10568:2;10561:9;;10485:93;:::o;30685:44::-;;;;;;;;;;;;;:::o;13450:263::-;13563:4;13580:13;13596:12;:10;:12::i;:::-;13580:28;;13619:64;13628:5;13635:7;13672:10;13644:25;13654:5;13661:7;13644:9;:25::i;:::-;:38;;;;:::i;:::-;13619:8;:64::i;:::-;13701:4;13694:11;;;13450:263;;;;:::o;30788:37::-;;;;;;;;;;;;;:::o;31004:66::-;;;;:::o;30401:34::-;;;;;;;;;;;;;:::o;36246:130::-;36304:11;;;;;;;;;;;36290:25;;:10;:25;;;36286:83;;36332:25;:23;:25::i;:::-;36286:83;36246:130::o;37611:176::-;37696:11;;;;;;;;;;;37682:25;;:10;:25;;;37678:102;;37724:44;37754:13;37724:29;:44::i;:::-;37678:102;37611:176;:::o;30921:67::-;;;;:::o;36573:283::-;36632:11;;;;;;;;;;;36618:25;;:10;:25;;;36614:235;;36679:1;36660:16;;:20;;;;;;;;;;;;;;;;;;36715:1;36695:17;;:21;;;;;;;;;;;;;;;;;;36757:1;36731:23;;:27;;;;;;;;;;;;;;;;;;36800:1;36773:24;;:28;;;;;;;;;;;;;;;;;;36836:1;36816:17;;:21;;;;;;;;;;;;;;;;;;36614:235;36573:283::o;10814:143::-;10904:7;10931:9;:18;10941:7;10931:18;;;;;;;;;;;;;;;;10924:25;;10814:143;;;:::o;2835:103::-;2080:13;:11;:13::i;:::-;2900:30:::1;2927:1;2900:18;:30::i;:::-;2835:103::o:0;36384:181::-;36444:11;;;;;;;;;;;36430:25;;:10;:25;;;36426:132;;36498:1;36472:23;:27;;;;36545:1;36514:28;:32;;;;36426:132;36384:181::o;38394:158::-;38479:11;;;;;;;;;;;38465:25;;:10;:25;;;38461:84;;38521:12;38507:11;;:26;;;;;;;;;;;;;;;;;;38461:84;38394:158;:::o;2194:87::-;2240:7;2267:6;;;;;;;;;;;2260:13;;2194:87;:::o;32962:412::-;33050:7;33070:21;33108:1;33094:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33070:40;;33139:4;33121;33126:1;33121:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;33165:4;;;;;;;;;;;33155;33160:1;33155:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;;33184:6;;;;;;;;;;;:20;;;33205:6;33213:4;33184:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33180:187;;33354:1;33347:8;;;;;33180:187;33300:10;33311:1;33300:13;;;;;;;;:::i;:::-;;;;;;;;33293:20;;;;32962:412;;;;:::o;9733:104::-;9789:13;9822:7;9815:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9733:104;:::o;14216:498::-;14334:4;14351:13;14367:12;:10;:12::i;:::-;14351:28;;14390:24;14417:25;14427:5;14434:7;14417:9;:25::i;:::-;14390:52;;14495:15;14475:16;:35;;14453:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;14611:60;14620:5;14627:7;14655:15;14636:16;:34;14611:8;:60::i;:::-;14702:4;14695:11;;;;14216:498;;;;:::o;30297:95::-;30350:42;30297:95;:::o;30481:19::-;;;;;;;;;;;;;:::o;11163:218::-;11267:4;11284:13;11300:12;:10;:12::i;:::-;11284:28;;11323;11333:5;11340:2;11344:6;11323:9;:28::i;:::-;11369:4;11362:11;;;11163:218;;;;:::o;30832:38::-;;;;;;;;;;;;;:::o;30562:71::-;;;;;;;;;;;;;:::o;30877:35::-;;;;;;;;;;;;;:::o;37856:159::-;37940:11;;;;;;;;;;;37926:25;;:10;:25;;;37922:86;;37983:13;37968:12;:28;;;;37922:86;37856:159;:::o;11444:176::-;11558:7;11585:11;:18;11597:5;11585:18;;;;;;;;;;;;;;;:27;11604:7;11585:27;;;;;;;;;;;;;;;;11578:34;;11444:176;;;;:::o;31166:48::-;;;;:::o;3093:238::-;2080:13;:11;:13::i;:::-;3216:1:::1;3196:22;;:8;:22;;::::0;3174:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3295:28;3314:8;3295:18;:28::i;:::-;3093:238:::0;:::o;30442:32::-;;;;;;;;;;;;;:::o;718:98::-;771:7;798:10;791:17;;718:98;:::o;18342:380::-;18495:1;18478:19;;:5;:19;;;18470:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18576:1;18557:21;;:7;:21;;;18549:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18660:6;18630:11;:18;18642:5;18630:18;;;;;;;;;;;;;;;:27;18649:7;18630:27;;;;;;;;;;;;;;;:36;;;;18698:7;18682:32;;18691:5;18682:32;;;18707:6;18682:32;;;;;;:::i;:::-;;;;;;;;18342:380;;;:::o;19013:502::-;19148:24;19175:25;19185:5;19192:7;19175:9;:25::i;:::-;19148:52;;19235:17;19215:16;:37;19211:297;;19315:6;19295:16;:26;;19269:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;19430:51;19439:5;19446:7;19474:6;19455:16;:25;19430:8;:51::i;:::-;19211:297;19137:378;19013:502;;;:::o;34390:1848::-;34509:4;34515:2;32087:8;:14;32096:4;32087:14;;;;;;;;;;;;;;;;32072:12;:29;:60;;;;32120:8;:12;32129:2;32120:12;;;;;;;;;;;;;;;;32105;:27;32072:60;32050:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34556:7:::1;:5;:7::i;:::-;34548:15;;:4;:15;;;:45;;;;34586:7;:5;:7::i;:::-;34580:13;;:2;:13;;;34548:45;:81;;;;34618:11;;;;;;;;;;;34610:19;;:4;:19;;;34548:81;:115;;;;34652:11;;;;;;;;;;;34646:17;;:2;:17;;;34548:115;:138;;;;34680:6;;;;;;;;;;;34548:138;34530:1701;;;34713:33;34729:4;34735:2;34739:6;34713:15;:33::i;:::-;34530:1701;;;34779:21;34838:11:::0;34860:4:::1;;;;;;;;;;;34852:12;;:4;:12;;;:39;;;;;30350:42;34868:23;;:2;:23;;;;34852:39;34838:53;;34906:12;30350:42;34921:25;;:4;:25;;;;:39;;;;;34956:4;;;;;;;;;;;34950:10;;:2;:10;;;34921:39;34906:54;;34993:4;;;;;;;;;;;34979:18;;:10;:18;;;;:29;;;;;35002:6;;;;;;;;;;;35001:7;34979:29;34975:51;;;35010:16;:14;:16::i;:::-;34975:51;35045:6;35041:282;;;35087:23;;35076:8;;:34;35072:236;;;35151:23;;;;;;;;;;;35135:39;;;;35197:8;;:10;;;;;;;;;:::i;:::-;;;;;;35072:236;;;35272:16;;;;;;;;;;;35256:32;;;;35072:236;35041:282;35341:7;35337:252;;;35384:23;;35373:8;;:34;35369:205;;;35448:24;;;;;;;;;;;35432:40;;;;35369:205;;;35537:17;;;;;;;;;;;35521:33;;;;35369:205;35337:252;35603:17;35651:5;35633:13;35624:6;:22;;;;:::i;:::-;35623:34;;;;:::i;:::-;35603:54;;35672:21;35728:5;35706:17;;;;;;;;;;;35697:26;;:6;:26;;;;:::i;:::-;35696:38;;;;:::i;:::-;35672:62;;35749:19;35794:13;35782:9;:25;;;;:::i;:::-;35772:6;:36;;;;:::i;:::-;35749:60;;35859:1;35828:28;;:32;35824:96;;;35879:41;35913:6;35879:33;:41::i;:::-;35824:96;35939:6;:37;;;;;35975:1;35949:23;;:27;35939:37;35935:105;;;35995:45;36024:2;36028:11;35995:28;:45::i;:::-;35935:105;36075:1;36059:13;:17;36055:49;;;36078:26;36084:4;36090:13;36078:5;:26::i;:::-;36055:49;36119:47;36135:4;36149;36156:9;36119:15;:47::i;:::-;36181:38;36197:4;36203:2;36207:11;36181:15;:38::i;:::-;34764:1467;;;;;;34530:1701;32258:12:::0;32241:8;:14;32250:4;32241:14;;;;;;;;;;;;;;;:29;;;;32296:12;32281:8;:12;32290:2;32281:12;;;;;;;;;;;;;;;:27;;;;34390:1848;;;;;:::o;33382:485::-;31313:4;31304:6;;:13;;;;;;;;;;;;;;;;;;33448:16:::1;33467:24;33485:4;33467:9;:24::i;:::-;33448:43;;33502:21;33540:1;33526:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33502:40;;33571:4;33553;33558:1;33553:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;33597:4;;;;;;;;;;;33587;33592:1;33587:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;::::0;::::1;33612:6;;;;;;;;;;;:57;;;33684:8;33707:1;33723:4;33750;33770:15;33612:184;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33815:11;;;;;;;;;;;33807:29;;:52;33837:21;33807:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33437:430;;31349:5:::0;31340:6;;:14;;;;;;;;;;;;;;;;;;33382:485::o;36896:649::-;31313:4;31304:6;;:13;;;;;;;;;;;;;;;;;;36988:16:::1;37007:24;37025:4;37007:9;:24::i;:::-;36988:43;;37117:8;37101:12;:24;;37092:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37176:21;37214:1;37200:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37176:40;;37245:4;37227;37232:1;37227:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;37271:4;;;;;;;;;;;37261;37266:1;37261:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;::::0;::::1;37286:6;;;;;;;;;;;:57;;;37358:12;37385:1;37401:4;37428;37448:15;37286:188;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37493:11;;;;;;;;;;;37485:29;;:52;37515:21;37485:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;36977:568;;31349:5:::0;31340:6;;:14;;;;;;;;;;;;;;;;;;36896:649;:::o;2359:132::-;2434:12;:10;:12::i;:::-;2423:23;;:7;:5;:7::i;:::-;:23;;;2415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2359:132::o;3491:191::-;3565:16;3584:6;;;;;;;;;;;3565:25;;3610:8;3601:6;;:17;;;;;;;;;;;;;;;;;;3665:8;3634:40;;3655:8;3634:40;;;;;;;;;;;;3554:128;3491:191;:::o;15184:877::-;15331:1;15315:18;;:4;:18;;;15307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15408:1;15394:16;;:2;:16;;;15386:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;15463:38;15484:4;15490:2;15494:6;15463:20;:38::i;:::-;15514:19;15536:9;:15;15546:4;15536:15;;;;;;;;;;;;;;;;15514:37;;15599:6;15584:11;:21;;15562:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;15739:6;15725:11;:20;15707:9;:15;15717:4;15707:15;;;;;;;;;;;;;;;:38;;;;15942:6;15925:9;:13;15935:2;15925:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15992:2;15977:26;;15986:4;15977:26;;;15996:6;15977:26;;;;;;:::i;:::-;;;;;;;;16016:37;16036:4;16042:2;16046:6;16016:19;:37::i;:::-;15296:765;15184:877;;;:::o;33875:507::-;33920:19;33942:75;33982:24;34000:4;33982:9;:24::i;:::-;33942:25;:75::i;:::-;33920:97;;34029:16;34047;34069:12;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34028:67;;;;;34106:22;34168:4;;;;;;;;;;;34143:29;;:12;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;;;34139:167;;34199:8;34191:17;;34174:34;;34139:167;;;34253:4;;;;;;;;;;;34228:29;;:12;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;;;34224:82;;34297:8;34289:17;;34272:34;;34224:82;34139:167;34335:12;;34321:11;:26;34317:57;;;34349:25;:23;:25::i;:::-;34317:57;33909:473;;;;33875:507::o;32324:296::-;32425:7;:5;:7::i;:::-;32411:21;;:10;:21;;;;:52;;;;32458:4;32436:27;;:10;:27;;;;32411:52;32407:205;;;32514:28;;32504:6;:38;;32478:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;32407:205;32324:296;:::o;32628:326::-;32761:7;:5;:7::i;:::-;32747:21;;:10;:21;;;;:44;;;;32786:4;32772:19;;:2;:19;;;;32747:44;32743:203;;;32858:23;;32848:6;32832:13;32842:2;32832:9;:13::i;:::-;:22;;;;:::i;:::-;:49;;32806:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;32743:203;32628:326;;:::o;17229:675::-;17332:1;17313:21;;:7;:21;;;17305:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;17385:49;17406:7;17423:1;17427:6;17385:20;:49::i;:::-;17447:22;17472:9;:18;17482:7;17472:18;;;;;;;;;;;;;;;;17447:43;;17527:6;17509:14;:24;;17501:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;17646:6;17629:14;:23;17608:9;:18;17618:7;17608:18;;;;;;;;;;;;;;;:44;;;;17763:6;17747:12;;:22;;;;;;;;;;;17824:1;17798:37;;17807:7;17798:37;;;17828:6;17798:37;;;;;;:::i;:::-;;;;;;;;17848:48;17868:7;17885:1;17889:6;17848:19;:48::i;:::-;17294:610;17229:675;;:::o;20115:125::-;;;;:::o;20844:124::-;;;;:::o;7:89:1:-;43:7;83:6;76:5;72:18;61:29;;7:89;;;:::o;102:115::-;187:23;204:5;187:23;:::i;:::-;182:3;175:36;102:115;;:::o;223:218::-;314:4;352:2;341:9;337:18;329:26;;365:69;431:1;420:9;416:17;407:6;365:69;:::i;:::-;223:218;;;;:::o;447:99::-;499:6;533:5;527:12;517:22;;447:99;;;:::o;552:169::-;636:11;670:6;665:3;658:19;710:4;705:3;701:14;686:29;;552:169;;;;:::o;727:246::-;808:1;818:113;832:6;829:1;826:13;818:113;;;917:1;912:3;908:11;902:18;898:1;893:3;889:11;882:39;854:2;851:1;847:10;842:15;;818:113;;;965:1;956:6;951:3;947:16;940:27;789:184;727:246;;;:::o;979:102::-;1020:6;1071:2;1067:7;1062:2;1055:5;1051:14;1047:28;1037:38;;979:102;;;:::o;1087:377::-;1175:3;1203:39;1236:5;1203:39;:::i;:::-;1258:71;1322:6;1317:3;1258:71;:::i;:::-;1251:78;;1338:65;1396:6;1391:3;1384:4;1377:5;1373:16;1338:65;:::i;:::-;1428:29;1450:6;1428:29;:::i;:::-;1423:3;1419:39;1412:46;;1179:285;1087:377;;;;:::o;1470:313::-;1583:4;1621:2;1610:9;1606:18;1598:26;;1670:9;1664:4;1660:20;1656:1;1645:9;1641:17;1634:47;1698:78;1771:4;1762:6;1698:78;:::i;:::-;1690:86;;1470:313;;;;:::o;1789:75::-;1822:6;1855:2;1849:9;1839:19;;1789:75;:::o;1870:117::-;1979:1;1976;1969:12;1993:117;2102:1;2099;2092:12;2116:126;2153:7;2193:42;2186:5;2182:54;2171:65;;2116:126;;;:::o;2248:96::-;2285:7;2314:24;2332:5;2314:24;:::i;:::-;2303:35;;2248:96;;;:::o;2350:122::-;2423:24;2441:5;2423:24;:::i;:::-;2416:5;2413:35;2403:63;;2462:1;2459;2452:12;2403:63;2350:122;:::o;2478:139::-;2524:5;2562:6;2549:20;2540:29;;2578:33;2605:5;2578:33;:::i;:::-;2478:139;;;;:::o;2623:77::-;2660:7;2689:5;2678:16;;2623:77;;;:::o;2706:122::-;2779:24;2797:5;2779:24;:::i;:::-;2772:5;2769:35;2759:63;;2818:1;2815;2808:12;2759:63;2706:122;:::o;2834:139::-;2880:5;2918:6;2905:20;2896:29;;2934:33;2961:5;2934:33;:::i;:::-;2834:139;;;;:::o;2979:474::-;3047:6;3055;3104:2;3092:9;3083:7;3079:23;3075:32;3072:119;;;3110:79;;:::i;:::-;3072:119;3230:1;3255:53;3300:7;3291:6;3280:9;3276:22;3255:53;:::i;:::-;3245:63;;3201:117;3357:2;3383:53;3428:7;3419:6;3408:9;3404:22;3383:53;:::i;:::-;3373:63;;3328:118;2979:474;;;;;:::o;3459:90::-;3493:7;3536:5;3529:13;3522:21;3511:32;;3459:90;;;:::o;3555:109::-;3636:21;3651:5;3636:21;:::i;:::-;3631:3;3624:34;3555:109;;:::o;3670:210::-;3757:4;3795:2;3784:9;3780:18;3772:26;;3808:65;3870:1;3859:9;3855:17;3846:6;3808:65;:::i;:::-;3670:210;;;;:::o;3886:118::-;3973:24;3991:5;3973:24;:::i;:::-;3968:3;3961:37;3886:118;;:::o;4010:222::-;4103:4;4141:2;4130:9;4126:18;4118:26;;4154:71;4222:1;4211:9;4207:17;4198:6;4154:71;:::i;:::-;4010:222;;;;:::o;4238:619::-;4315:6;4323;4331;4380:2;4368:9;4359:7;4355:23;4351:32;4348:119;;;4386:79;;:::i;:::-;4348:119;4506:1;4531:53;4576:7;4567:6;4556:9;4552:22;4531:53;:::i;:::-;4521:63;;4477:117;4633:2;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4604:118;4761:2;4787:53;4832:7;4823:6;4812:9;4808:22;4787:53;:::i;:::-;4777:63;;4732:118;4238:619;;;;;:::o;4863:86::-;4898:7;4938:4;4931:5;4927:16;4916:27;;4863:86;;;:::o;4955:112::-;5038:22;5054:5;5038:22;:::i;:::-;5033:3;5026:35;4955:112;;:::o;5073:214::-;5162:4;5200:2;5189:9;5185:18;5177:26;;5213:67;5277:1;5266:9;5262:17;5253:6;5213:67;:::i;:::-;5073:214;;;;:::o;5293:60::-;5321:3;5342:5;5335:12;;5293:60;;;:::o;5359:142::-;5409:9;5442:53;5460:34;5469:24;5487:5;5469:24;:::i;:::-;5460:34;:::i;:::-;5442:53;:::i;:::-;5429:66;;5359:142;;;:::o;5507:126::-;5557:9;5590:37;5621:5;5590:37;:::i;:::-;5577:50;;5507:126;;;:::o;5639:149::-;5712:9;5745:37;5776:5;5745:37;:::i;:::-;5732:50;;5639:149;;;:::o;5794:177::-;5904:60;5958:5;5904:60;:::i;:::-;5899:3;5892:73;5794:177;;:::o;5977:268::-;6093:4;6131:2;6120:9;6116:18;6108:26;;6144:94;6235:1;6224:9;6220:17;6211:6;6144:94;:::i;:::-;5977:268;;;;:::o;6251:329::-;6310:6;6359:2;6347:9;6338:7;6334:23;6330:32;6327:119;;;6365:79;;:::i;:::-;6327:119;6485:1;6510:53;6555:7;6546:6;6535:9;6531:22;6510:53;:::i;:::-;6500:63;;6456:117;6251:329;;;;:::o;6586:::-;6645:6;6694:2;6682:9;6673:7;6669:23;6665:32;6662:119;;;6700:79;;:::i;:::-;6662:119;6820:1;6845:53;6890:7;6881:6;6870:9;6866:22;6845:53;:::i;:::-;6835:63;;6791:117;6586:329;;;;:::o;6921:118::-;7008:24;7026:5;7008:24;:::i;:::-;7003:3;6996:37;6921:118;;:::o;7045:222::-;7138:4;7176:2;7165:9;7161:18;7153:26;;7189:71;7257:1;7246:9;7242:17;7233:6;7189:71;:::i;:::-;7045:222;;;;:::o;7273:474::-;7341:6;7349;7398:2;7386:9;7377:7;7373:23;7369:32;7366:119;;;7404:79;;:::i;:::-;7366:119;7524:1;7549:53;7594:7;7585:6;7574:9;7570:22;7549:53;:::i;:::-;7539:63;;7495:117;7651:2;7677:53;7722:7;7713:6;7702:9;7698:22;7677:53;:::i;:::-;7667:63;;7622:118;7273:474;;;;;:::o;7753:153::-;7830:9;7863:37;7894:5;7863:37;:::i;:::-;7850:50;;7753:153;;;:::o;7912:185::-;8026:64;8084:5;8026:64;:::i;:::-;8021:3;8014:77;7912:185;;:::o;8103:276::-;8223:4;8261:2;8250:9;8246:18;8238:26;;8274:98;8369:1;8358:9;8354:17;8345:6;8274:98;:::i;:::-;8103:276;;;;:::o;8385:180::-;8433:77;8430:1;8423:88;8530:4;8527:1;8520:15;8554:4;8551:1;8544:15;8571:320;8615:6;8652:1;8646:4;8642:12;8632:22;;8699:1;8693:4;8689:12;8720:18;8710:81;;8776:4;8768:6;8764:17;8754:27;;8710:81;8838:2;8830:6;8827:14;8807:18;8804:38;8801:84;;8857:18;;:::i;:::-;8801:84;8622:269;8571:320;;;:::o;8897:180::-;8945:77;8942:1;8935:88;9042:4;9039:1;9032:15;9066:4;9063:1;9056:15;9083:191;9123:3;9142:20;9160:1;9142:20;:::i;:::-;9137:25;;9176:20;9194:1;9176:20;:::i;:::-;9171:25;;9219:1;9216;9212:9;9205:16;;9240:3;9237:1;9234:10;9231:36;;;9247:18;;:::i;:::-;9231:36;9083:191;;;;:::o;9280:180::-;9328:77;9325:1;9318:88;9425:4;9422:1;9415:15;9449:4;9446:1;9439:15;9466:180;9514:77;9511:1;9504:88;9611:4;9608:1;9601:15;9635:4;9632:1;9625:15;9652:114;9719:6;9753:5;9747:12;9737:22;;9652:114;;;:::o;9772:184::-;9871:11;9905:6;9900:3;9893:19;9945:4;9940:3;9936:14;9921:29;;9772:184;;;;:::o;9962:132::-;10029:4;10052:3;10044:11;;10082:4;10077:3;10073:14;10065:22;;9962:132;;;:::o;10100:108::-;10177:24;10195:5;10177:24;:::i;:::-;10172:3;10165:37;10100:108;;:::o;10214:179::-;10283:10;10304:46;10346:3;10338:6;10304:46;:::i;:::-;10382:4;10377:3;10373:14;10359:28;;10214:179;;;;:::o;10399:113::-;10469:4;10501;10496:3;10492:14;10484:22;;10399:113;;;:::o;10548:732::-;10667:3;10696:54;10744:5;10696:54;:::i;:::-;10766:86;10845:6;10840:3;10766:86;:::i;:::-;10759:93;;10876:56;10926:5;10876:56;:::i;:::-;10955:7;10986:1;10971:284;10996:6;10993:1;10990:13;10971:284;;;11072:6;11066:13;11099:63;11158:3;11143:13;11099:63;:::i;:::-;11092:70;;11185:60;11238:6;11185:60;:::i;:::-;11175:70;;11031:224;11018:1;11015;11011:9;11006:14;;10971:284;;;10975:14;11271:3;11264:10;;10672:608;;;10548:732;;;;:::o;11286:483::-;11457:4;11495:2;11484:9;11480:18;11472:26;;11508:71;11576:1;11565:9;11561:17;11552:6;11508:71;:::i;:::-;11626:9;11620:4;11616:20;11611:2;11600:9;11596:18;11589:48;11654:108;11757:4;11748:6;11654:108;:::i;:::-;11646:116;;11286:483;;;;;:::o;11775:117::-;11884:1;11881;11874:12;11898:281;11981:27;12003:4;11981:27;:::i;:::-;11973:6;11969:40;12111:6;12099:10;12096:22;12075:18;12063:10;12060:34;12057:62;12054:88;;;12122:18;;:::i;:::-;12054:88;12162:10;12158:2;12151:22;11941:238;11898:281;;:::o;12185:129::-;12219:6;12246:20;;:::i;:::-;12236:30;;12275:33;12303:4;12295:6;12275:33;:::i;:::-;12185:129;;;:::o;12320:311::-;12397:4;12487:18;12479:6;12476:30;12473:56;;;12509:18;;:::i;:::-;12473:56;12559:4;12551:6;12547:17;12539:25;;12619:4;12613;12609:15;12601:23;;12320:311;;;:::o;12637:117::-;12746:1;12743;12736:12;12760:143;12817:5;12848:6;12842:13;12833:22;;12864:33;12891:5;12864:33;:::i;:::-;12760:143;;;;:::o;12926:732::-;13033:5;13058:81;13074:64;13131:6;13074:64;:::i;:::-;13058:81;:::i;:::-;13049:90;;13159:5;13188:6;13181:5;13174:21;13222:4;13215:5;13211:16;13204:23;;13275:4;13267:6;13263:17;13255:6;13251:30;13304:3;13296:6;13293:15;13290:122;;;13323:79;;:::i;:::-;13290:122;13438:6;13421:231;13455:6;13450:3;13447:15;13421:231;;;13530:3;13559:48;13603:3;13591:10;13559:48;:::i;:::-;13554:3;13547:61;13637:4;13632:3;13628:14;13621:21;;13497:155;13481:4;13476:3;13472:14;13465:21;;13421:231;;;13425:21;13039:619;;12926:732;;;;;:::o;13681:385::-;13763:5;13812:3;13805:4;13797:6;13793:17;13789:27;13779:122;;13820:79;;:::i;:::-;13779:122;13930:6;13924:13;13955:105;14056:3;14048:6;14041:4;14033:6;14029:17;13955:105;:::i;:::-;13946:114;;13769:297;13681:385;;;;:::o;14072:554::-;14167:6;14216:2;14204:9;14195:7;14191:23;14187:32;14184:119;;;14222:79;;:::i;:::-;14184:119;14363:1;14352:9;14348:17;14342:24;14393:18;14385:6;14382:30;14379:117;;;14415:79;;:::i;:::-;14379:117;14520:89;14601:7;14592:6;14581:9;14577:22;14520:89;:::i;:::-;14510:99;;14313:306;14072:554;;;;:::o;14632:224::-;14772:34;14768:1;14760:6;14756:14;14749:58;14841:7;14836:2;14828:6;14824:15;14817:32;14632:224;:::o;14862:366::-;15004:3;15025:67;15089:2;15084:3;15025:67;:::i;:::-;15018:74;;15101:93;15190:3;15101:93;:::i;:::-;15219:2;15214:3;15210:12;15203:19;;14862:366;;;:::o;15234:419::-;15400:4;15438:2;15427:9;15423:18;15415:26;;15487:9;15481:4;15477:20;15473:1;15462:9;15458:17;15451:47;15515:131;15641:4;15515:131;:::i;:::-;15507:139;;15234:419;;;:::o;15659:225::-;15799:34;15795:1;15787:6;15783:14;15776:58;15868:8;15863:2;15855:6;15851:15;15844:33;15659:225;:::o;15890:366::-;16032:3;16053:67;16117:2;16112:3;16053:67;:::i;:::-;16046:74;;16129:93;16218:3;16129:93;:::i;:::-;16247:2;16242:3;16238:12;16231:19;;15890:366;;;:::o;16262:419::-;16428:4;16466:2;16455:9;16451:18;16443:26;;16515:9;16509:4;16505:20;16501:1;16490:9;16486:17;16479:47;16543:131;16669:4;16543:131;:::i;:::-;16535:139;;16262:419;;;:::o;16687:223::-;16827:34;16823:1;16815:6;16811:14;16804:58;16896:6;16891:2;16883:6;16879:15;16872:31;16687:223;:::o;16916:366::-;17058:3;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17155:93;17244:3;17155:93;:::i;:::-;17273:2;17268:3;17264:12;17257:19;;16916:366;;;:::o;17288:419::-;17454:4;17492:2;17481:9;17477:18;17469:26;;17541:9;17535:4;17531:20;17527:1;17516:9;17512:17;17505:47;17569:131;17695:4;17569:131;:::i;:::-;17561:139;;17288:419;;;:::o;17713:221::-;17853:34;17849:1;17841:6;17837:14;17830:58;17922:4;17917:2;17909:6;17905:15;17898:29;17713:221;:::o;17940:366::-;18082:3;18103:67;18167:2;18162:3;18103:67;:::i;:::-;18096:74;;18179:93;18268:3;18179:93;:::i;:::-;18297:2;18292:3;18288:12;18281:19;;17940:366;;;:::o;18312:419::-;18478:4;18516:2;18505:9;18501:18;18493:26;;18565:9;18559:4;18555:20;18551:1;18540:9;18536:17;18529:47;18593:131;18719:4;18593:131;:::i;:::-;18585:139;;18312:419;;;:::o;18737:179::-;18877:31;18873:1;18865:6;18861:14;18854:55;18737:179;:::o;18922:366::-;19064:3;19085:67;19149:2;19144:3;19085:67;:::i;:::-;19078:74;;19161:93;19250:3;19161:93;:::i;:::-;19279:2;19274:3;19270:12;19263:19;;18922:366;;;:::o;19294:419::-;19460:4;19498:2;19487:9;19483:18;19475:26;;19547:9;19541:4;19537:20;19533:1;19522:9;19518:17;19511:47;19575:131;19701:4;19575:131;:::i;:::-;19567:139;;19294:419;;;:::o;19719:245::-;19859:34;19855:1;19847:6;19843:14;19836:58;19928:28;19923:2;19915:6;19911:15;19904:53;19719:245;:::o;19970:366::-;20112:3;20133:67;20197:2;20192:3;20133:67;:::i;:::-;20126:74;;20209:93;20298:3;20209:93;:::i;:::-;20327:2;20322:3;20318:12;20311:19;;19970:366;;;:::o;20342:419::-;20508:4;20546:2;20535:9;20531:18;20523:26;;20595:9;20589:4;20585:20;20581:1;20570:9;20566:17;20559:47;20623:131;20749:4;20623:131;:::i;:::-;20615:139;;20342:419;;;:::o;20767:233::-;20806:3;20829:24;20847:5;20829:24;:::i;:::-;20820:33;;20875:66;20868:5;20865:77;20862:103;;20945:18;;:::i;:::-;20862:103;20992:1;20985:5;20981:13;20974:20;;20767:233;;;:::o;21006:410::-;21046:7;21069:20;21087:1;21069:20;:::i;:::-;21064:25;;21103:20;21121:1;21103:20;:::i;:::-;21098:25;;21158:1;21155;21151:9;21180:30;21198:11;21180:30;:::i;:::-;21169:41;;21359:1;21350:7;21346:15;21343:1;21340:22;21320:1;21313:9;21293:83;21270:139;;21389:18;;:::i;:::-;21270:139;21054:362;21006:410;;;;:::o;21422:180::-;21470:77;21467:1;21460:88;21567:4;21564:1;21557:15;21591:4;21588:1;21581:15;21608:185;21648:1;21665:20;21683:1;21665:20;:::i;:::-;21660:25;;21699:20;21717:1;21699:20;:::i;:::-;21694:25;;21738:1;21728:35;;21743:18;;:::i;:::-;21728:35;21785:1;21782;21778:9;21773:14;;21608:185;;;;:::o;21799:194::-;21839:4;21859:20;21877:1;21859:20;:::i;:::-;21854:25;;21893:20;21911:1;21893:20;:::i;:::-;21888:25;;21937:1;21934;21930:9;21922:17;;21961:1;21955:4;21952:11;21949:37;;;21966:18;;:::i;:::-;21949:37;21799:194;;;;:::o;21999:85::-;22044:7;22073:5;22062:16;;21999:85;;;:::o;22090:158::-;22148:9;22181:61;22199:42;22208:32;22234:5;22208:32;:::i;:::-;22199:42;:::i;:::-;22181:61;:::i;:::-;22168:74;;22090:158;;;:::o;22254:147::-;22349:45;22388:5;22349:45;:::i;:::-;22344:3;22337:58;22254:147;;:::o;22407:831::-;22670:4;22708:3;22697:9;22693:19;22685:27;;22722:71;22790:1;22779:9;22775:17;22766:6;22722:71;:::i;:::-;22803:80;22879:2;22868:9;22864:18;22855:6;22803:80;:::i;:::-;22930:9;22924:4;22920:20;22915:2;22904:9;22900:18;22893:48;22958:108;23061:4;23052:6;22958:108;:::i;:::-;22950:116;;23076:72;23144:2;23133:9;23129:18;23120:6;23076:72;:::i;:::-;23158:73;23226:3;23215:9;23211:19;23202:6;23158:73;:::i;:::-;22407:831;;;;;;;;:::o;23244:222::-;23384:34;23380:1;23372:6;23368:14;23361:58;23453:5;23448:2;23440:6;23436:15;23429:30;23244:222;:::o;23472:366::-;23614:3;23635:67;23699:2;23694:3;23635:67;:::i;:::-;23628:74;;23711:93;23800:3;23711:93;:::i;:::-;23829:2;23824:3;23820:12;23813:19;;23472:366;;;:::o;23844:419::-;24010:4;24048:2;24037:9;24033:18;24025:26;;24097:9;24091:4;24087:20;24083:1;24072:9;24068:17;24061:47;24125:131;24251:4;24125:131;:::i;:::-;24117:139;;23844:419;;;:::o;24269:182::-;24409:34;24405:1;24397:6;24393:14;24386:58;24269:182;:::o;24457:366::-;24599:3;24620:67;24684:2;24679:3;24620:67;:::i;:::-;24613:74;;24696:93;24785:3;24696:93;:::i;:::-;24814:2;24809:3;24805:12;24798:19;;24457:366;;;:::o;24829:419::-;24995:4;25033:2;25022:9;25018:18;25010:26;;25082:9;25076:4;25072:20;25068:1;25057:9;25053:17;25046:47;25110:131;25236:4;25110:131;:::i;:::-;25102:139;;24829:419;;;:::o;25254:224::-;25394:34;25390:1;25382:6;25378:14;25371:58;25463:7;25458:2;25450:6;25446:15;25439:32;25254:224;:::o;25484:366::-;25626:3;25647:67;25711:2;25706:3;25647:67;:::i;:::-;25640:74;;25723:93;25812:3;25723:93;:::i;:::-;25841:2;25836:3;25832:12;25825:19;;25484:366;;;:::o;25856:419::-;26022:4;26060:2;26049:9;26045:18;26037:26;;26109:9;26103:4;26099:20;26095:1;26084:9;26080:17;26073:47;26137:131;26263:4;26137:131;:::i;:::-;26129:139;;25856:419;;;:::o;26281:222::-;26421:34;26417:1;26409:6;26405:14;26398:58;26490:5;26485:2;26477:6;26473:15;26466:30;26281:222;:::o;26509:366::-;26651:3;26672:67;26736:2;26731:3;26672:67;:::i;:::-;26665:74;;26748:93;26837:3;26748:93;:::i;:::-;26866:2;26861:3;26857:12;26850:19;;26509:366;;;:::o;26881:419::-;27047:4;27085:2;27074:9;27070:18;27062:26;;27134:9;27128:4;27124:20;27120:1;27109:9;27105:17;27098:47;27162:131;27288:4;27162:131;:::i;:::-;27154:139;;26881:419;;;:::o;27306:225::-;27446:34;27442:1;27434:6;27430:14;27423:58;27515:8;27510:2;27502:6;27498:15;27491:33;27306:225;:::o;27537:366::-;27679:3;27700:67;27764:2;27759:3;27700:67;:::i;:::-;27693:74;;27776:93;27865:3;27776:93;:::i;:::-;27894:2;27889:3;27885:12;27878:19;;27537:366;;;:::o;27909:419::-;28075:4;28113:2;28102:9;28098:18;28090:26;;28162:9;28156:4;28152:20;28148:1;28137:9;28133:17;28126:47;28190:131;28316:4;28190:131;:::i;:::-;28182:139;;27909:419;;;:::o;28334:114::-;28371:7;28411:30;28404:5;28400:42;28389:53;;28334:114;;;:::o;28454:122::-;28527:24;28545:5;28527:24;:::i;:::-;28520:5;28517:35;28507:63;;28566:1;28563;28556:12;28507:63;28454:122;:::o;28582:143::-;28639:5;28670:6;28664:13;28655:22;;28686:33;28713:5;28686:33;:::i;:::-;28582:143;;;;:::o;28731:93::-;28767:7;28807:10;28800:5;28796:22;28785:33;;28731:93;;;:::o;28830:120::-;28902:23;28919:5;28902:23;:::i;:::-;28895:5;28892:34;28882:62;;28940:1;28937;28930:12;28882:62;28830:120;:::o;28956:141::-;29012:5;29043:6;29037:13;29028:22;;29059:32;29085:5;29059:32;:::i;:::-;28956:141;;;;:::o;29103:661::-;29190:6;29198;29206;29255:2;29243:9;29234:7;29230:23;29226:32;29223:119;;;29261:79;;:::i;:::-;29223:119;29381:1;29406:64;29462:7;29453:6;29442:9;29438:22;29406:64;:::i;:::-;29396:74;;29352:128;29519:2;29545:64;29601:7;29592:6;29581:9;29577:22;29545:64;:::i;:::-;29535:74;;29490:129;29658:2;29684:63;29739:7;29730:6;29719:9;29715:22;29684:63;:::i;:::-;29674:73;;29629:128;29103:661;;;;;:::o;29770:143::-;29827:5;29858:6;29852:13;29843:22;;29874:33;29901:5;29874:33;:::i;:::-;29770:143;;;;:::o;29919:351::-;29989:6;30038:2;30026:9;30017:7;30013:23;30009:32;30006:119;;;30044:79;;:::i;:::-;30006:119;30164:1;30189:64;30245:7;30236:6;30225:9;30221:22;30189:64;:::i;:::-;30179:74;;30135:128;29919:351;;;;:::o;30276:221::-;30416:34;30412:1;30404:6;30400:14;30393:58;30485:4;30480:2;30472:6;30468:15;30461:29;30276:221;:::o;30503:366::-;30645:3;30666:67;30730:2;30725:3;30666:67;:::i;:::-;30659:74;;30742:93;30831:3;30742:93;:::i;:::-;30860:2;30855:3;30851:12;30844:19;;30503:366;;;:::o;30875:419::-;31041:4;31079:2;31068:9;31064:18;31056:26;;31128:9;31122:4;31118:20;31114:1;31103:9;31099:17;31092:47;31156:131;31282:4;31156:131;:::i;:::-;31148:139;;30875:419;;;:::o;31300:179::-;31440:31;31436:1;31428:6;31424:14;31417:55;31300:179;:::o;31485:366::-;31627:3;31648:67;31712:2;31707:3;31648:67;:::i;:::-;31641:74;;31724:93;31813:3;31724:93;:::i;:::-;31842:2;31837:3;31833:12;31826:19;;31485:366;;;:::o;31857:419::-;32023:4;32061:2;32050:9;32046:18;32038:26;;32110:9;32104:4;32100:20;32096:1;32085:9;32081:17;32074:47;32138:131;32264:4;32138:131;:::i;:::-;32130:139;;31857:419;;;:::o;32282:220::-;32422:34;32418:1;32410:6;32406:14;32399:58;32491:3;32486:2;32478:6;32474:15;32467:28;32282:220;:::o;32508:366::-;32650:3;32671:67;32735:2;32730:3;32671:67;:::i;:::-;32664:74;;32747:93;32836:3;32747:93;:::i;:::-;32865:2;32860:3;32856:12;32849:19;;32508:366;;;:::o;32880:419::-;33046:4;33084:2;33073:9;33069:18;33061:26;;33133:9;33127:4;33123:20;33119:1;33108:9;33104:17;33097:47;33161:131;33287:4;33161:131;:::i;:::-;33153:139;;32880:419;;;:::o;33305:221::-;33445:34;33441:1;33433:6;33429:14;33422:58;33514:4;33509:2;33501:6;33497:15;33490:29;33305:221;:::o;33532:366::-;33674:3;33695:67;33759:2;33754:3;33695:67;:::i;:::-;33688:74;;33771:93;33860:3;33771:93;:::i;:::-;33889:2;33884:3;33880:12;33873:19;;33532:366;;;:::o;33904:419::-;34070:4;34108:2;34097:9;34093:18;34085:26;;34157:9;34151:4;34147:20;34143:1;34132:9;34128:17;34121:47;34185:131;34311:4;34185:131;:::i;:::-;34177:139;;33904:419;;;:::o

Swarm Source

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