ETH Price: $3,727.20 (+3.78%)

Token

ERC-20: ROCK (ROCK)
 

Overview

Max Total Supply

100,000,000,000 ROCK

Holders

1,274

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,419,047.205471532927957509 ROCK

Value
$0.00
0xa8b2e274643e56ce24444da214e1c32576d0a5af
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:
ROCK

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

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






// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)


/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}



// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)



/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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);
}





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



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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




abstract contract ERC20Base is ERC20 {
    uint8 private immutable _decimals;
    uint256 public immutable TOKEN_CODE;

    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_
            ) ERC20(name_, symbol_) {
        _decimals = decimals_;
    }

    function decimals() public view override returns (uint8) {
        return _decimals;
    }
}







/*
 * AntiWhaleToken: Limit the max wallet size
 */
abstract contract AntiWhaleToken is ERC20Base {
    uint256 public maxTokenPerWallet; // anti whale: max token per wallet (default to 1% of supply)

    event MaxTokenPerWalletUpdated(uint256 amount);

    modifier antiWhale(
        address sender,
        address recipient,
        uint256 amount
    ) {
        if (maxTokenPerWallet != 0 && !isExcludedFromAntiWhale(recipient)) {
            require(balanceOf(recipient) + amount <= maxTokenPerWallet, "Wallet exceeds max");
        }
        _;
    }

    constructor(uint256 maxTokenPerWallet_) {
        maxTokenPerWallet = maxTokenPerWallet_;
    }

    function isExcludedFromAntiWhale(address account) public view virtual returns (bool);

    /**
     * @dev Update the max token per wallet
     * set to 0 to disable
     */
    function _setMaxTokenPerWallet(uint256 amount) internal {
        require(amount == 0 || amount > (totalSupply() * 5) / 1000, "Amount too low"); // min 0.5% of supply

        maxTokenPerWallet = amount;
        emit MaxTokenPerWalletUpdated(amount);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override antiWhale(from, to, amount) {
        super._beforeTokenTransfer(from, to, amount);
    }
}










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



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

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

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

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

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

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

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

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

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







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





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




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

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


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

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

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

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

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

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

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

                // Move the lastValue to the index where the value to delete is
                set._values[valueIndex] = lastValue;
                // Update the tracked position of the lastValue (that was just moved)
                set._positions[lastValue] = position;
            }

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

            // Delete the tracked position for the deleted slot
            delete set._positions[value];

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

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

        return result;
    }
}






abstract contract TaxDistributor is ERC20Base {
    using EnumerableSet for EnumerableSet.AddressSet;

    EnumerableSet.AddressSet private _collectors;
    mapping(address => uint256) private _shares;
    uint256 public totalFeeCollectorsShares;

    event FeeCollectorAdded(address indexed account, uint256 share);
    event FeeCollectorUpdated(address indexed account, uint256 oldShare, uint256 newShare);
    event FeeCollectorRemoved(address indexed account);
    event FeeCollected(address indexed receiver, uint256 amount);

    constructor(address[] memory collectors_, uint256[] memory shares_) {
        require(collectors_.length == shares_.length, "Invalid fee collectors");
        for (uint256 i = 0; i < collectors_.length; i++) {
            _addFeeCollector(collectors_[i], shares_[i]);
        }
    }

    function isFeeCollector(address account) public view returns (bool) {
        return _collectors.contains(account);
    }

    function feeCollectorShare(address account) public view returns (uint256) {
        return _shares[account];
    }

    function _addFeeCollector(address account, uint256 share) internal {
        require(!_collectors.contains(account), "Already fee collector");
        require(share > 0, "Invalid share");

        _collectors.add(account);
        _shares[account] = share;
        totalFeeCollectorsShares += share;

        emit FeeCollectorAdded(account, share);
    }

    function _removeFeeCollector(address account) internal {
        require(_collectors.contains(account), "Not fee collector");
        _collectors.remove(account);
        totalFeeCollectorsShares -= _shares[account];
        delete _shares[account];

        emit FeeCollectorRemoved(account);
    }

    function _updateFeeCollectorShare(address account, uint256 share) internal {
        require(_collectors.contains(account), "Not fee collector");
        require(share > 0, "Invalid share");

        uint256 oldShare = _shares[account];
        totalFeeCollectorsShares -= oldShare;

        _shares[account] = share;
        totalFeeCollectorsShares += share;

        emit FeeCollectorUpdated(account, oldShare, share);
    }

    function _distributeFees(uint256 amount, bool inToken) internal returns (bool) {
        if (amount == 0) return false;
        if (totalFeeCollectorsShares == 0) return false;

        uint256 distributed = 0;
        uint256 len = _collectors.length();
        for (uint256 i = 0; i < len; i++) {
            address collector = _collectors.at(i);
            uint256 share = i == len - 1
                ? amount - distributed
                : (amount * _shares[collector]) / totalFeeCollectorsShares;

            if (inToken) {
                _transfer(address(this), collector, share);
            } else {
                payable(collector).transfer(share);
            }
            emit FeeCollected(collector, share);

            distributed += share;
        }

        return true;
    }

    function addFeeCollector(address account, uint256 share) external virtual;

    function removeFeeCollector(address account) external virtual;

    function updateFeeCollectorShare(address account, uint256 share) external virtual;

    function distributeFees(uint256 amount, bool inToken) external virtual;
}




/*
 * TaxableToken: Add a tax on buy, sell or transfer
 */
abstract contract TaxableToken is ERC20Base, TaxDistributor {
    struct FeeConfiguration {
        uint16 buyFees; // fees applied during buys, from 0 to 2000 (ie, 100 = 1%)
        uint16 sellFees; // fees applied during sells, from 0 to 2000 (ie, 100 = 1%)
        uint16 transferFees; // fees applied during transfers, from 0 to 2000 (ie, 100 = 1%)
        uint16 burnFeeRatio; // from 0 to 10000 (ie 8000 = 80% of the fee collected are burned)
        uint16 liquidityFeeRatio; // from 0 to 10000 (ie 8000 = 80% of the fee collected are added back to liquidity)
        uint16 collectorsFeeRatio; // from 0 to 10000 (ie 8000 = 80% of the fee collected are sent to fee collectors)
    }

    address public constant BURN_ADDRESS = address(0x000000000000000000000000000000000000dEaD);
    uint16 public constant MAX_FEE = 2000; // max 20% fees
    uint16 public constant FEE_PRECISION = 10000;

    // swap config
    IUniswapV2Router02 public swapRouter;
    address public swapPair;
    address public liquidityOwner;

    // fees
    bool private _processingFees;
    bool public autoProcessFees;
    uint256 public numTokensToSwap; // amount of tokens to collect before processing fees (default to 0.05% of supply)
    FeeConfiguration public feeConfiguration;

    mapping(address => bool) private _excludedFromFees;
    mapping(address => bool) private _lpPools;

    event FeeConfigurationUpdated(FeeConfiguration configuration);
    event SwapRouterUpdated(address indexed router, address indexed pair);
    event ExcludedFromFees(address indexed account, bool excluded);
    event SetLpPool(address indexed pairAddress, bool isLp);

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

    constructor(
        bool autoProcessFees_,
        uint256 numTokensToSwap_,
        address swapRouter_,
        FeeConfiguration memory feeConfiguration_
    ) {
        numTokensToSwap = numTokensToSwap_;
        autoProcessFees = autoProcessFees_;

        liquidityOwner = _msgSender();

        // Create a uniswap pair for this new token
        swapRouter = IUniswapV2Router02(swapRouter_);
        swapPair = _pairFor(swapRouter.factory(), address(this), swapRouter.WETH());
        _lpPools[swapPair] = true;

        // configure addresses excluded from fee
        _setIsExcludedFromFees(_msgSender(), true);
        _setIsExcludedFromFees(address(this), true);

        // configure fees
        _setFeeConfiguration(feeConfiguration_);
    }

    // receive ETH when swaping
    receive() external payable {}

    function isExcludedFromFees(address account) public view returns (bool) {
        return _excludedFromFees[account];
    }

    function _setIsExcludedFromFees(address account, bool excluded) internal {
        require(_excludedFromFees[account] != excluded, "Already set");
        _excludedFromFees[account] = excluded;
        emit ExcludedFromFees(account, excluded);
    }

    function _setIsLpPool(address pairAddress, bool isLp) internal {
        require(_lpPools[pairAddress] != isLp, "Already set");
        _lpPools[pairAddress] = isLp;
        emit SetLpPool(pairAddress, isLp);
    }

    function isLpPool(address pairAddress) public view returns (bool) {
        return _lpPools[pairAddress];
    }

    function _setSwapRouter(address _newRouter) internal {
        require(_newRouter != address(0), "Invalid router");

        swapRouter = IUniswapV2Router02(_newRouter);
        IUniswapV2Factory factory = IUniswapV2Factory(swapRouter.factory());
        require(address(factory) != address(0), "Invalid factory");

        address weth = swapRouter.WETH();
        swapPair = factory.getPair(address(this), weth);
        if (swapPair == address(0)) {
            swapPair = factory.createPair(address(this), weth);
        }

        require(swapPair != address(0), "Invalid pair address.");
        emit SwapRouterUpdated(address(swapRouter), swapPair);
    }

    function _setFeeConfiguration(FeeConfiguration memory configuration) internal {
        require(configuration.buyFees <= MAX_FEE, "Invalid buy fee");
        require(configuration.sellFees <= MAX_FEE, "Invalid sell fee");
        require(configuration.transferFees <= MAX_FEE, "Invalid transfer fee");

        uint16 totalShare = configuration.burnFeeRatio +
            configuration.liquidityFeeRatio +
            configuration.collectorsFeeRatio;
        require(totalShare == 0 || totalShare == FEE_PRECISION, "Invalid fee share");

        feeConfiguration = configuration;
        emit FeeConfigurationUpdated(configuration);
    }

    function _processFees(uint256 tokenAmount, uint256 minAmountOut) internal lockTheSwap {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance >= tokenAmount) {
            uint256 liquidityAmount = (tokenAmount * feeConfiguration.liquidityFeeRatio) /
                (FEE_PRECISION - feeConfiguration.burnFeeRatio);
            uint256 liquidityTokens = liquidityAmount / 2;

            uint256 collectorsAmount = tokenAmount - liquidityAmount;
            uint256 liquifyAmount = liquidityAmount - liquidityTokens;

       
                            liquifyAmount += collectorsAmount;


            // swap tokens
            if (liquifyAmount > 0) {
                if (balanceOf(swapPair) == 0) {
                    // do not swap before the pair has liquidity
                    return;
                }

                // capture the contract's current balance.
                uint256 initialBalance = address(this).balance;

                _swapTokensForEth(liquifyAmount, minAmountOut);

                // how much did we just swap into?
                uint256 swapBalance = address(this).balance - initialBalance;

                // add liquidity
                uint256 liquidityETH = (swapBalance * liquidityTokens) / liquifyAmount;
                if (liquidityETH > 0) {
                    _addLiquidity(liquidityTokens, liquidityETH);
                }
            }

      

                _distributeFees(address(this).balance, false);


        }
    }

    /// @dev Swap tokens for eth
    function _swapTokensForEth(uint256 tokenAmount, uint256 minAmountOut) private {
        // generate the swap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = swapRouter.WETH();

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

        // make the swap
        swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            minAmountOut,
            path,
            address(this),
            block.timestamp
        );
    }

    /// @dev Add liquidity
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(swapRouter), tokenAmount);

        // add the liquidity
        swapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityOwner,
            block.timestamp
        );
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function _pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        pair = address(
            uint160(
                uint(
                    keccak256(
                        abi.encodePacked(
                            hex"ff",
                            factory,
                            keccak256(abi.encodePacked(token0, token1)),
                            hex"96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" // init code hash
                        )
                    )
                )
            )
        );
    }

    function _transfer(address from, address to, uint256 amount) internal virtual override {
        require(amount >= 0, "Transfer < 0");

        uint256 taxFee = 0;
        bool processFee = !_processingFees && autoProcessFees;

        if (!_processingFees) {
            bool fromExcluded = isExcludedFromFees(from);
            bool toExcluded = isExcludedFromFees(to);

            bool fromLP = isLpPool(from);
            bool toLP = isLpPool(to);

            if (fromLP && !toLP && !toExcluded && to != address(swapRouter)) {
                // buy fee
                taxFee = feeConfiguration.buyFees;
            } else if (toLP && !fromExcluded && !toExcluded) {
                // sell fee
                taxFee = feeConfiguration.sellFees;
            } else if (!fromLP && !toLP && from != address(swapRouter) && !fromExcluded) {
                // transfer fee
                taxFee = feeConfiguration.transferFees;
            }
        }

        // process fees
        if (processFee && taxFee > 0 && !_lpPools[from]) {
            uint256 contractTokenBalance = balanceOf(address(this));
            if (contractTokenBalance >= numTokensToSwap) {
                _processFees(numTokensToSwap, 0);
            }
        }

        if (taxFee > 0) {
            uint256 taxAmount = (amount * taxFee) / FEE_PRECISION;
            uint256 sendAmount = amount - taxAmount;
            uint256 burnAmount = (taxAmount * feeConfiguration.burnFeeRatio) / FEE_PRECISION;

            if (burnAmount > 0) {
                taxAmount -= burnAmount;
                super._transfer(from, BURN_ADDRESS, burnAmount);
            }

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

            if (sendAmount > 0) {
                super._transfer(from, to, sendAmount);
            }
        } else {
            super._transfer(from, to, amount);
        }
    }

    function setAutoprocessFees(bool autoProcess) external virtual;

    function setIsLpPool(address pairAddress, bool isLp) external virtual;

    function setIsExcludedFromFees(address account, bool excluded) external virtual;

    function processFees(uint256 amount, uint256 minAmountOut) external virtual;

    function setLiquidityOwner(address newOwner) external virtual;

    function setNumTokensToSwap(uint256 amount) external virtual;

    function setFeeConfiguration(FeeConfiguration calldata configuration) external virtual;

    function setSwapRouter(address newRouter) external virtual;
}















/**
 * @dev ERC20Token implementation with AntiWhale, Tax capabilities
 */

contract ROCK is
    ERC20Base,
    AntiWhaleToken,
    Ownable,
    TaxableToken
{

    uint256 public constant initialSupply_ = 100_000_000_000 * 1 ether;
    address private constant swapRouter_ = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    
    address[] private collectors_ = [0x981F86615bEb230099fDC692cEB2E71c9908FD35];
    uint256[] private shares_ = [10000];

    mapping(address => bool) private _excludedFromAntiWhale;
    event ExcludedFromAntiWhale(address indexed account, bool excluded);

    constructor()
        ERC20Base(
            "ROCK",
            "ROCK",
            18)
        AntiWhaleToken(initialSupply_ / 100) 
        TaxableToken(
            true,
            initialSupply_ / 10000,
            swapRouter_,
            FeeConfiguration({
            buyFees: 500, 
            sellFees: 500, 
            transferFees: 0,
            burnFeeRatio: 0,
            liquidityFeeRatio: 0,
            collectorsFeeRatio: 10000
        })
        )

        TaxDistributor(collectors_, shares_)
    {
        _excludedFromAntiWhale[_msgSender()] = true;
        _excludedFromAntiWhale[swapPair] = true;
        _excludedFromAntiWhale[BURN_ADDRESS] = true;
        _mint(_msgSender(), initialSupply_);
    }


    /**
     * @dev Update the max token allowed per wallet.
     * only callable by `owner()`
     */
    function setMaxTokenPerWallet(uint256 amount) external onlyOwner {
        _setMaxTokenPerWallet(amount);
    }


  /**
     * @dev Update the pair token.
     * only callable by `owner()`
     */
    function setPairToken(address token) external onlyOwner {
        swapPair = token;
    }

    /**
     * @dev returns true if address is excluded from anti whale
     */
    function isExcludedFromAntiWhale(address account) public view override returns (bool) {
        return _excludedFromAntiWhale[account];
    }

    /**
     * @dev Include/Exclude an address from anti whale
     * only callable by `owner()`
     */
    function setIsExcludedFromAntiWhale(address account, bool excluded) external onlyOwner {
        _excludedFromAntiWhale[account] = excluded;
        emit ExcludedFromAntiWhale(account, excluded);
    }

  

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override(ERC20, AntiWhaleToken) {
        super._beforeTokenTransfer(from, to, amount);
    }

    /**
     * @dev Enable/Disable autoProcessFees on transfer
     * only callable by `owner()`
     */
    function setAutoprocessFees(bool autoProcess) external override onlyOwner {
        require(autoProcessFees != autoProcess, "Already set");
        autoProcessFees = autoProcess;
    }

    /**
     * @dev add a fee collector
     * only callable by `owner()`
     */
    function addFeeCollector(address account, uint256 share) external override onlyOwner {
        _addFeeCollector(account, share);
    }

    /**
     * @dev add/remove a LP
     * only callable by `owner()`
     */
    function setIsLpPool(address pairAddress, bool isLp) external override onlyOwner {
        _setIsLpPool(pairAddress, isLp);
    }

    /**
     * @dev add/remove an address to the tax exclusion list
     * only callable by `owner()`
     */
    function setIsExcludedFromFees(address account, bool excluded) external override onlyOwner {
        _setIsExcludedFromFees(account, excluded);
    }

    /**
     * @dev manually distribute fees to collectors
     * only callable by `owner()`
     */
    function distributeFees(uint256 amount, bool inToken) external override onlyOwner {
        if (inToken) {
            require(balanceOf(address(this)) >= amount, "Not enough balance");
        } else {
            require(address(this).balance >= amount, "Not enough balance");
        }
        _distributeFees(amount, inToken);
    }

    /**
     * @dev process fees
     * only callable by `owner()`
     */
    function processFees(uint256 amount, uint256 minAmountOut) external override onlyOwner {
        require(amount <= balanceOf(address(this)), "Amount too high");
        _processFees(amount, minAmountOut);
    }

    /**
     * @dev remove a fee collector
     * only callable by `owner()`
     */
    function removeFeeCollector(address account) external override onlyOwner {
        _removeFeeCollector(account);
    }

    /**
     * @dev set the liquidity owner
     * only callable by `owner()`
     */
    function setLiquidityOwner(address newOwner) external override onlyOwner {
        liquidityOwner = newOwner;
    }

    /**
     * @dev set the number of tokens to swap
     * only callable by `owner()`
     */
    function setNumTokensToSwap(uint256 amount) external override onlyOwner {
        numTokensToSwap = amount;
    }

    /**
     * @dev update a fee collector share
     * only callable by `owner()`
     */
    function updateFeeCollectorShare(address account, uint256 share) external override onlyOwner {
        _updateFeeCollectorShare(account, share);
    }

    /**
     * @dev update the fee configurations
     * only callable by `owner()`
     */
    function setFeeConfiguration(FeeConfiguration calldata configuration) external override onlyOwner {
        _setFeeConfiguration(configuration);
    }

    /**
     * @dev update the swap router
     * only callable by `owner()`
     */
    function setSwapRouter(address newRouter) external override onlyOwner {
        _setSwapRouter(newRouter);
    }

    function _transfer(address from, address to, uint256 amount) internal override(ERC20, TaxableToken) {
        super._transfer(from, to, amount);
    }
}

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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludedFromAntiWhale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludedFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"FeeCollectorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"FeeCollectorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newShare","type":"uint256"}],"name":"FeeCollectorUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint16","name":"buyFees","type":"uint16"},{"internalType":"uint16","name":"sellFees","type":"uint16"},{"internalType":"uint16","name":"transferFees","type":"uint16"},{"internalType":"uint16","name":"burnFeeRatio","type":"uint16"},{"internalType":"uint16","name":"liquidityFeeRatio","type":"uint16"},{"internalType":"uint16","name":"collectorsFeeRatio","type":"uint16"}],"indexed":false,"internalType":"struct TaxableToken.FeeConfiguration","name":"configuration","type":"tuple"}],"name":"FeeConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxTokenPerWalletUpdated","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":"pairAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isLp","type":"bool"}],"name":"SetLpPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"SwapRouterUpdated","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":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_PRECISION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_CODE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"addFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoProcessFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"inToken","type":"bool"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"feeCollectorShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeConfiguration","outputs":[{"internalType":"uint16","name":"buyFees","type":"uint16"},{"internalType":"uint16","name":"sellFees","type":"uint16"},{"internalType":"uint16","name":"transferFees","type":"uint16"},{"internalType":"uint16","name":"burnFeeRatio","type":"uint16"},{"internalType":"uint16","name":"liquidityFeeRatio","type":"uint16"},{"internalType":"uint16","name":"collectorsFeeRatio","type":"uint16"}],"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":"initialSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFeeCollector","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pairAddress","type":"address"}],"name":"isLpPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPerWallet","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":"numTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"processFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"autoProcess","type":"bool"}],"name":"setAutoprocessFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"buyFees","type":"uint16"},{"internalType":"uint16","name":"sellFees","type":"uint16"},{"internalType":"uint16","name":"transferFees","type":"uint16"},{"internalType":"uint16","name":"burnFeeRatio","type":"uint16"},{"internalType":"uint16","name":"liquidityFeeRatio","type":"uint16"},{"internalType":"uint16","name":"collectorsFeeRatio","type":"uint16"}],"internalType":"struct TaxableToken.FeeConfiguration","name":"configuration","type":"tuple"}],"name":"setFeeConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setIsExcludedFromAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setIsExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairAddress","type":"address"},{"internalType":"bool","name":"isLp","type":"bool"}],"name":"setIsLpPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setLiquidityOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTokenPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNumTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setPairToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeCollectorsShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"updateFeeCollectorShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052604051806020016040528073981f86615beb230099fdc692ceb2e71c9908fd3573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060129060016200006592919062001238565b50604051806020016040528061271061ffff1681525060139060016200008d929190620012c4565b503480156200009a575f80fd5b5060016127106c01431e0fae6d7217caa0000000620000ba91906200139a565b737a250d5630b4cf539739df2c5dacb4c659f2488d6040518060c001604052806101f461ffff1681526020016101f461ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff16815260200161271061ffff1681525060128054806020026020016040519081016040528092919081815260200182805480156200019b57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000151575b50505050506013805480602002602001604051908101604052809291908181526020018280548015620001ec57602002820191905f5260205f20905b815481526020019060010190808311620001d7575b505050505060646c01431e0fae6d7217caa00000006200020d91906200139a565b6040518060400160405280600481526020017f524f434b000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f524f434b000000000000000000000000000000000000000000000000000000008152506012828281600390816200028e91906200162c565b508060049081620002a091906200162c565b5050508060ff1660808160ff16815250505050508060058190555050620002dc620002d0620007d360201b60201c565b620007da60201b60201c565b805182511462000323576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031a906200176e565b60405180910390fd5b5f5b825181101562000389576200037b8382815181106200034957620003486200178e565b5b60200260200101518383815181106200036757620003666200178e565b5b60200260200101516200089d60201b60201c565b808060010191505062000325565b50505082600e8190555083600d60156101000a81548160ff021916908315150217905550620003bd620007d360201b60201c565b600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200056f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004ab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004d1919062001820565b30600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200053d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000563919062001820565b62000a0260201b60201c565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160115f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506200064662000638620007d360201b60201c565b600162000aaa60201b60201c565b6200065930600162000aaa60201b60201c565b6200066a8162000be460201b60201c565b50505050600160145f62000683620007d360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f61dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620007cd620007b3620007d360201b60201c565b6c01431e0fae6d7217caa000000062000e7460201b60201c565b62001f5d565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620008b382600762000fd960201b90919060201c565b15620008f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008ed906200189e565b60405180910390fd5b5f81116200093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000932906200190c565b60405180910390fd5b620009518260076200100e60201b90919060201c565b508060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080600a5f828254620009a791906200192c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f918584c21fe4a093f5014c0dabaed3e43b642781e27984aef122cae8245fbb2382604051620009f6919062001977565b60405180910390a25050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161062000a4157838562000a44565b84845b9150915085828260405160200162000a5e929190620019df565b6040516020818303038152906040528051906020012060405160200162000a8792919062001ae1565b604051602081830303815290604052805190602001205f1c925050509392505050565b80151560105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150362000b3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b339062001b78565b60405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb8260405162000bd8919062001bb4565b60405180910390a25050565b6107d061ffff16815f015161ffff16111562000c37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c2e9062001c1d565b60405180910390fd5b6107d061ffff16816020015161ffff16111562000c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c829062001c8b565b60405180910390fd5b6107d061ffff16816040015161ffff16111562000cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cd69062001cf9565b60405180910390fd5b5f8160a001518260800151836060015162000cfb919062001d26565b62000d07919062001d26565b90505f8161ffff16148062000d25575061271061ffff168161ffff16145b62000d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d5e9062001db0565b60405180910390fd5b81600f5f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548161ffff021916908361ffff1602179055506080820151815f0160086101000a81548161ffff021916908361ffff16021790555060a0820151815f01600a6101000a81548161ffff021916908361ffff1602179055509050507fc9632f3cf45264c46361b5340b78f8ef11e561d580a40379a966e3aa8f1f6d7c8260405162000e68919062001e66565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000edc9062001ecf565b60405180910390fd5b62000ef85f83836200104360201b60201c565b8060025f82825462000f0b91906200192c565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000fba919062001977565b60405180910390a362000fd55f83836200105b60201b60201c565b5050565b5f62001006835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6200106060201b60201c565b905092915050565b5f6200103b835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6200108060201b60201c565b905092915050565b62001056838383620010f160201b60201c565b505050565b505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f6200109383836200106060201b60201c565b620010e757825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050620010eb565b5f90505b92915050565b8282825f6005541415801562001115575062001113826200119c60201b60201c565b155b156200118157600554816200113084620011ee60201b60201c565b6200113c91906200192c565b111562001180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620011779062001f3d565b60405180910390fd5b5b620011948686866200123360201b60201c565b505050505050565b5f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b505050565b828054828255905f5260205f20908101928215620012b1579160200282015b82811115620012b0578251825f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062001257565b5b509050620012c091906200131a565b5090565b828054828255905f5260205f2090810192821562001307579160200282015b8281111562001306578251829061ffff16905591602001919060010190620012e3565b5b5090506200131691906200131a565b5090565b5b8082111562001333575f815f9055506001016200131b565b5090565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620013a68262001337565b9150620013b38362001337565b925082620013c657620013c562001340565b5b828204905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200144d57607f821691505b60208210810362001463576200146262001408565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620014c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200148a565b620014d386836200148a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f620015146200150e620015088462001337565b620014eb565b62001337565b9050919050565b5f819050919050565b6200152f83620014f4565b620015476200153e826200151b565b84845462001496565b825550505050565b5f90565b6200155d6200154f565b6200156a81848462001524565b505050565b5b818110156200159157620015855f8262001553565b60018101905062001570565b5050565b601f821115620015e057620015aa8162001469565b620015b5846200147b565b81016020851015620015c5578190505b620015dd620015d4856200147b565b8301826200156f565b50505b505050565b5f82821c905092915050565b5f620016025f1984600802620015e5565b1980831691505092915050565b5f6200161c8383620015f1565b9150826002028217905092915050565b6200163782620013d1565b67ffffffffffffffff811115620016535762001652620013db565b5b6200165f825462001435565b6200166c82828562001595565b5f60209050601f831160018114620016a2575f84156200168d578287015190505b6200169985826200160f565b86555062001708565b601f198416620016b28662001469565b5f5b82811015620016db57848901518255600182019150602085019450602081019050620016b4565b86831015620016fb5784890151620016f7601f891682620015f1565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f496e76616c69642066656520636f6c6c6563746f7273000000000000000000005f82015250565b5f6200175660168362001710565b9150620017638262001720565b602082019050919050565b5f6020820190508181035f830152620017878162001748565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620017ea82620017bf565b9050919050565b620017fc81620017de565b811462001807575f80fd5b50565b5f815190506200181a81620017f1565b92915050565b5f60208284031215620018385762001837620017bb565b5b5f62001847848285016200180a565b91505092915050565b7f416c72656164792066656520636f6c6c6563746f7200000000000000000000005f82015250565b5f6200188660158362001710565b9150620018938262001850565b602082019050919050565b5f6020820190508181035f830152620018b78162001878565b9050919050565b7f496e76616c6964207368617265000000000000000000000000000000000000005f82015250565b5f620018f4600d8362001710565b91506200190182620018be565b602082019050919050565b5f6020820190508181035f8301526200192581620018e6565b9050919050565b5f620019388262001337565b9150620019458362001337565b925082820190508082111562001960576200195f6200136d565b5b92915050565b620019718162001337565b82525050565b5f6020820190506200198c5f83018462001966565b92915050565b5f8160601b9050919050565b5f620019aa8262001992565b9050919050565b5f620019bd826200199e565b9050919050565b620019d9620019d382620017de565b620019b1565b82525050565b5f620019ec8285620019c4565b601482019150620019fe8284620019c4565b6014820191508190509392505050565b5f81905092915050565b7fff000000000000000000000000000000000000000000000000000000000000005f82015250565b5f62001a4e60018362001a0e565b915062001a5b8262001a18565b600182019050919050565b5f819050919050565b5f819050919050565b62001a8d62001a878262001a66565b62001a6f565b82525050565b7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f5f82015250565b5f62001ac960208362001a0e565b915062001ad68262001a93565b602082019050919050565b5f62001aed8262001a40565b915062001afb8285620019c4565b60148201915062001b0d828462001a78565b60208201915062001b1e8262001abb565b91508190509392505050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f62001b60600b8362001710565b915062001b6d8262001b2a565b602082019050919050565b5f6020820190508181035f83015262001b918162001b52565b9050919050565b5f8115159050919050565b62001bae8162001b98565b82525050565b5f60208201905062001bc95f83018462001ba3565b92915050565b7f496e76616c6964206275792066656500000000000000000000000000000000005f82015250565b5f62001c05600f8362001710565b915062001c128262001bcf565b602082019050919050565b5f6020820190508181035f83015262001c368162001bf7565b9050919050565b7f496e76616c69642073656c6c20666565000000000000000000000000000000005f82015250565b5f62001c7360108362001710565b915062001c808262001c3d565b602082019050919050565b5f6020820190508181035f83015262001ca48162001c65565b9050919050565b7f496e76616c6964207472616e73666572206665650000000000000000000000005f82015250565b5f62001ce160148362001710565b915062001cee8262001cab565b602082019050919050565b5f6020820190508181035f83015262001d128162001cd3565b9050919050565b5f61ffff82169050919050565b5f62001d328262001d19565b915062001d3f8362001d19565b9250828201905061ffff81111562001d5c5762001d5b6200136d565b5b92915050565b7f496e76616c6964206665652073686172650000000000000000000000000000005f82015250565b5f62001d9860118362001710565b915062001da58262001d62565b602082019050919050565b5f6020820190508181035f83015262001dc98162001d8a565b9050919050565b62001ddb8162001d19565b82525050565b60c082015f82015162001df75f85018262001dd0565b50602082015162001e0c602085018262001dd0565b50604082015162001e21604085018262001dd0565b50606082015162001e36606085018262001dd0565b50608082015162001e4b608085018262001dd0565b5060a082015162001e6060a085018262001dd0565b50505050565b5f60c08201905062001e7b5f83018462001de1565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62001eb7601f8362001710565b915062001ec48262001e81565b602082019050919050565b5f6020820190508181035f83015262001ee88162001ea9565b9050919050565b7f57616c6c65742065786365656473206d617800000000000000000000000000005f82015250565b5f62001f2560128362001710565b915062001f328262001eef565b602082019050919050565b5f6020820190508181035f83015262001f568162001f17565b9050919050565b60805160a051614eec62001f7f5f395f610c6d01525f610d540152614eec5ff3fe60806040526004361061028b575f3560e01c806372bc558311610159578063adf18693116100c0578063e55096b011610079578063e55096b014610a01578063e63a391f14610a29578063f2fde38b14610a53578063f4232d2514610a7b578063f725101d14610aa3578063fccc281314610acb57610292565b8063adf18693146108f7578063b3c6e9ee1461091f578063bc063e1a14610949578063bd82394314610973578063c31c9c071461099b578063dd62ed3e146109c557610292565b806394b8a7031161011257806394b8a703146107c057806395d89b41146107fc57806398c47e8c146108265780639b61f1d014610855578063a457c2d71461087f578063a9059cbb146108bb57610292565b806372bc5583146106ca5780637994606d146106f25780637a8baf521461071a5780637f5bbb2c146107445780638da5cb5b1461076c578063905358fe1461079657610292565b8063269f534c116101fd57806341273657116101b657806341273657146105b05780634569c445146105d85780634fbee193146106005780636f741f2a1461063c57806370a0823114610678578063715018a6146106b457610292565b8063269f534c14610480578063313ce567146104bc5780633502628a146104e65780633935ebf91461050e57806339509351146105385780633b90b9bf1461057457610292565b80630f569dad1161024f5780630f569dad1461037657806312363f4a1461039e57806318160ddd146103c85780631fa67b4d146103f257806323b872dd1461041a57806326991cc81461045657610292565b806301a6c43b1461029657806306fdde03146102c0578063093ed8ba146102ea578063095ea7b3146103125780630a4e42ef1461034e57610292565b3661029257005b5f80fd5b3480156102a1575f80fd5b506102aa610af5565b6040516102b79190613722565b60405180910390f35b3480156102cb575f80fd5b506102d4610afb565b6040516102e191906137c5565b60405180910390f35b3480156102f5575f80fd5b50610310600480360381019061030b919061384c565b610b8b565b005b34801561031d575f80fd5b50610338600480360381019061033391906138a1565b610bd6565b60405161034591906138f9565b60405180910390f35b348015610359575f80fd5b50610374600480360381019061036f9190613912565b610bf8565b005b348015610381575f80fd5b5061039c60048036038101906103979190613950565b610c59565b005b3480156103a9575f80fd5b506103b2610c6b565b6040516103bf9190613722565b60405180910390f35b3480156103d3575f80fd5b506103dc610c8f565b6040516103e99190613722565b60405180910390f35b3480156103fd575f80fd5b506104186004803603810190610413919061384c565b610c98565b005b348015610425575f80fd5b50610440600480360381019061043b919061397b565b610cac565b60405161044d91906138f9565b60405180910390f35b348015610461575f80fd5b5061046a610cda565b60405161047791906139da565b60405180910390f35b34801561048b575f80fd5b506104a660048036038101906104a1919061384c565b610cff565b6040516104b391906138f9565b60405180910390f35b3480156104c7575f80fd5b506104d0610d51565b6040516104dd9190613a0e565b60405180910390f35b3480156104f1575f80fd5b5061050c600480360381019061050791906138a1565b610d78565b005b348015610519575f80fd5b50610522610d8e565b60405161052f91906139da565b60405180910390f35b348015610543575f80fd5b5061055e600480360381019061055991906138a1565b610db3565b60405161056b91906138f9565b60405180910390f35b34801561057f575f80fd5b5061059a6004803603810190610595919061384c565b610de9565b6040516105a791906138f9565b60405180910390f35b3480156105bb575f80fd5b506105d660048036038101906105d1919061384c565b610e05565b005b3480156105e3575f80fd5b506105fe60048036038101906105f99190613a51565b610e19565b005b34801561060b575f80fd5b506106266004803603810190610621919061384c565b610eca565b60405161063391906138f9565b60405180910390f35b348015610647575f80fd5b50610662600480360381019061065d919061384c565b610f1c565b60405161066f91906138f9565b60405180910390f35b348015610683575f80fd5b5061069e6004803603810190610699919061384c565b610f6e565b6040516106ab9190613722565b60405180910390f35b3480156106bf575f80fd5b506106c8610fb3565b005b3480156106d5575f80fd5b506106f060048036038101906106eb919061384c565b610fc6565b005b3480156106fd575f80fd5b5061071860048036038101906107139190613ab1565b611011565b005b348015610725575f80fd5b5061072e611035565b60405161073b9190613722565b60405180910390f35b34801561074f575f80fd5b5061076a60048036038101906107659190613adc565b61103b565b005b348015610777575f80fd5b506107806110b5565b60405161078d91906139da565b60405180910390f35b3480156107a1575f80fd5b506107aa6110dd565b6040516107b79190613722565b60405180910390f35b3480156107cb575f80fd5b506107e660048036038101906107e1919061384c565b6110ee565b6040516107f39190613722565b60405180910390f35b348015610807575f80fd5b50610810611134565b60405161081d91906137c5565b60405180910390f35b348015610831575f80fd5b5061083a6111c4565b60405161084c96959493929190613b23565b60405180910390f35b348015610860575f80fd5b5061086961123b565b60405161087691906138f9565b60405180910390f35b34801561088a575f80fd5b506108a560048036038101906108a091906138a1565b61124e565b6040516108b291906138f9565b60405180910390f35b3480156108c6575f80fd5b506108e160048036038101906108dc91906138a1565b6112c3565b6040516108ee91906138f9565b60405180910390f35b348015610902575f80fd5b5061091d60048036038101906109189190613b82565b6112e5565b005b34801561092a575f80fd5b506109336112fb565b6040516109409190613722565b60405180910390f35b348015610954575f80fd5b5061095d611301565b60405161096a9190613bc0565b60405180910390f35b34801561097e575f80fd5b5061099960048036038101906109949190613950565b611307565b005b3480156109a6575f80fd5b506109af61131b565b6040516109bc9190613c34565b60405180910390f35b3480156109d0575f80fd5b506109eb60048036038101906109e69190613c4d565b611340565b6040516109f89190613722565b60405180910390f35b348015610a0c575f80fd5b50610a276004803603810190610a229190613b82565b6113c2565b005b348015610a34575f80fd5b50610a3d6113d8565b604051610a4a9190613bc0565b60405180910390f35b348015610a5e575f80fd5b50610a796004803603810190610a74919061384c565b6113de565b005b348015610a86575f80fd5b50610aa16004803603810190610a9c91906138a1565b611460565b005b348015610aae575f80fd5b50610ac96004803603810190610ac49190613b82565b611476565b005b348015610ad6575f80fd5b50610adf611524565b604051610aec91906139da565b60405180910390f35b600e5481565b606060038054610b0a90613cb8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3690613cb8565b8015610b815780601f10610b5857610100808354040283529160200191610b81565b820191905f5260205f20905b815481529060010190602001808311610b6457829003601f168201915b5050505050905090565b610b9361152a565b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f80610be06115a8565b9050610bed8185856115af565b600191505092915050565b610c0061152a565b610c0930610f6e565b821115610c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4290613d32565b60405180910390fd5b610c558282611772565b5050565b610c6161152a565b80600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b610ca061152a565b610ca9816118ef565b50565b5f80610cb66115a8565b9050610cc3858285611a32565b610cce858585611abd565b60019150509392505050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b610d8061152a565b610d8a8282611acd565b5050565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610dbd6115a8565b9050610dde818585610dcf8589611340565b610dd99190613d7d565b6115af565b600191505092915050565b5f610dfe826007611c2490919063ffffffff16565b9050919050565b610e0d61152a565b610e1681611c51565b50565b610e2161152a565b8015610e775781610e3130610f6e565b1015610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990613dfa565b60405180910390fd5b610ebb565b81471015610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190613dfa565b60405180910390fd5b5b610ec58282612187565b505050565b5f60105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60115f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610fbb61152a565b610fc45f612329565b565b610fce61152a565b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61101961152a565b6110328180360381019061102d9190613f5b565b6123ec565b50565b60055481565b61104361152a565b801515600d60159054906101000a900460ff16151503611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90613fd0565b60405180910390fd5b80600d60156101000a81548160ff02191690831515021790555050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6c01431e0fae6d7217caa000000081565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60606004805461114390613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461116f90613cb8565b80156111ba5780601f10611191576101008083540402835291602001916111ba565b820191905f5260205f20905b81548152906001019060200180831161119d57829003601f168201915b5050505050905090565b600f805f015f9054906101000a900461ffff1690805f0160029054906101000a900461ffff1690805f0160049054906101000a900461ffff1690805f0160069054906101000a900461ffff1690805f0160089054906101000a900461ffff1690805f01600a9054906101000a900461ffff16905086565b600d60159054906101000a900460ff1681565b5f806112586115a8565b90505f6112658286611340565b9050838110156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a19061405e565b60405180910390fd5b6112b782868684036115af565b60019250505092915050565b5f806112cd6115a8565b90506112da818585611abd565b600191505092915050565b6112ed61152a565b6112f78282612669565b5050565b600a5481565b6107d081565b61130f61152a565b6113188161279e565b50565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6113ca61152a565b6113d4828261284b565b5050565b61271081565b6113e661152a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b906140ec565b60405180910390fd5b61145d81612329565b50565b61146861152a565b6114728282612980565b5050565b61147e61152a565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f46e542c7dcc512f9d4c5ef6470efcb6729025d935367e1c2c8dc49d8e35eaa888260405161151891906138f9565b60405180910390a25050565b61dead81565b6115326115a8565b73ffffffffffffffffffffffffffffffffffffffff166115506110b5565b73ffffffffffffffffffffffffffffffffffffffff16146115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d90614154565b60405180910390fd5b565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906141e2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290614270565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117659190613722565b60405180910390a3505050565b6001600d60146101000a81548160ff0219169083151502179055505f61179730610f6e565b90508281106118cf575f600f5f0160069054906101000a900461ffff166127106117c1919061428e565b61ffff16600f5f0160089054906101000a900461ffff1661ffff16856117e791906142c3565b6117f19190614331565b90505f6002826118019190614331565b90505f82866118109190614361565b90505f828461181f9190614361565b9050818161182d9190613d7d565b90505f8111156118bf575f611862600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f6e565b036118715750505050506118d1565b5f47905061187f8288612b1d565b5f814761188c9190614361565b90505f83868361189c91906142c3565b6118a69190614331565b90505f8111156118bb576118ba8682612d54565b5b5050505b6118c9475f612187565b50505050505b505b5f600d60146101000a81548160ff0219169083151502179055505050565b611903816007611c2490919063ffffffff16565b611942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611939906143de565b60405180910390fd5b611956816007612e4e90919063ffffffff16565b5060095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600a5f8282546119a59190614361565b9250508190555060095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90558073ffffffffffffffffffffffffffffffffffffffff167f904316769e154356a5e4aad5d41591b55913c7717fab281d818c1fed7d80e81460405160405180910390a250565b5f611a3d8484611340565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ab75781811015611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090614446565b60405180910390fd5b611ab684848484036115af565b5b50505050565b611ac8838383612e7b565b505050565b611ae1826007611c2490919063ffffffff16565b15611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906144ae565b60405180910390fd5b5f8111611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a90614516565b60405180910390fd5b611b778260076131e890919063ffffffff16565b508060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080600a5f828254611bcb9190613d7d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f918584c21fe4a093f5014c0dabaed3e43b642781e27984aef122cae8245fbb2382604051611c189190613722565b60405180910390a25050565b5f611c49835f018373ffffffffffffffffffffffffffffffffffffffff165f1b613215565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb69061457e565b60405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8e91906145b0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590614625565b60405180910390fd5b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8d91906145b0565b90508173ffffffffffffffffffffffffffffffffffffffff1663e6a4390530836040518363ffffffff1660e01b8152600401611eca929190614643565b602060405180830381865afa158015611ee5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0991906145b0565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612057578173ffffffffffffffffffffffffffffffffffffffff1663c9c6539630836040518363ffffffff1660e01b8152600401611fd7929190614643565b6020604051808303815f875af1158015611ff3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201791906145b0565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120dd906146b4565b60405180910390fd5b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b60405160405180910390a3505050565b5f808303612197575f9050612323565b5f600a54036121a8575f9050612323565b5f806121b46007613235565b90505f5b8181101561231b575f6121d582600761324890919063ffffffff16565b90505f6001846121e59190614361565b831461224657600a5460095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548961223791906142c3565b6122419190614331565b612253565b84886122529190614361565b5b9050861561226b57612266308383611abd565b6122b0565b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156122ae573d5f803e3d5ffd5b505b8173ffffffffffffffffffffffffffffffffffffffff167f06c5efeff5c320943d265dc4e5f1af95ad523555ce0c1957e367dda5514572df826040516122f69190613722565b60405180910390a2808561230a9190613d7d565b9450505080806001019150506121b8565b506001925050505b92915050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6107d061ffff16815f015161ffff16111561243c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124339061471c565b60405180910390fd5b6107d061ffff16816020015161ffff16111561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614784565b60405180910390fd5b6107d061ffff16816040015161ffff1611156124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d5906147ec565b60405180910390fd5b5f8160a00151826080015183606001516124f8919061480a565b612502919061480a565b90505f8161ffff16148061251f575061271061ffff168161ffff16145b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590614889565b60405180910390fd5b81600f5f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548161ffff021916908361ffff1602179055506080820151815f0160086101000a81548161ffff021916908361ffff16021790555060a0820151815f01600a6101000a81548161ffff021916908361ffff1602179055509050507fc9632f3cf45264c46361b5340b78f8ef11e561d580a40379a966e3aa8f1f6d7c8260405161265d919061492f565b60405180910390a15050565b80151560105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef90613fd0565b60405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb8260405161279291906138f9565b60405180910390a25050565b5f8114806127cb57506103e860056127b4610c8f565b6127be91906142c3565b6127c89190614331565b81115b61280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190614992565b60405180910390fd5b806005819055507f0271c3ca991d8fa13fc3df55bfd888e9347a178a375ef6e0f63afa9639d144f4816040516128409190613722565b60405180910390a150565b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d190613fd0565b60405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f902b2ea0acdec5a260e398590d055fe29bd61ef5dd41e45db54a4cd98d5569e08260405161297491906138f9565b60405180910390a25050565b612994826007611c2490919063ffffffff16565b6129d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ca906143de565b60405180910390fd5b5f8111612a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0c90614516565b60405180910390fd5b5f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905080600a5f828254612a679190614361565b925050819055508160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555081600a5f828254612ac19190613d7d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167fd350c3685bdab1285c0b97ffb6e96d96ed0ad4578a135c38250e771e7cb831aa8284604051612b109291906149b0565b60405180910390a2505050565b5f600267ffffffffffffffff811115612b3957612b38613e1c565b5b604051908082528060200260200182016040528015612b675781602001602082028036833780820191505090505b50905030815f81518110612b7e57612b7d6149d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4691906145b0565b81600181518110612c5a57612c596149d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cc030600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856115af565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94784848430426040518663ffffffff1660e01b8152600401612d22959493929190614abb565b5f604051808303815f87803b158015612d39575f80fd5b505af1158015612d4b573d5f803e3d5ffd5b50505050505050565b612d8030600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846115af565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f80600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612e0696959493929190614b4c565b60606040518083038185885af1158015612e22573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612e479190614bbf565b5050505050565b5f612e73835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61325f565b905092915050565b5f811015612ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb590614c59565b60405180910390fd5b5f80600d60149054906101000a900460ff16158015612ee95750600d60159054906101000a900460ff165b9050600d60149054906101000a900460ff1661308c575f612f0986610eca565b90505f612f1586610eca565b90505f612f2188610f1c565b90505f612f2d88610f1c565b9050818015612f3a575080155b8015612f44575082155b8015612f9d5750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b15612fbf57600f5f015f9054906101000a900461ffff1661ffff169550613087565b808015612fca575083155b8015612fd4575082155b15612ff757600f5f0160029054906101000a900461ffff1661ffff169550613086565b81158015613003575080155b801561305c5750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b8015613066575083155b1561308557600f5f0160049054906101000a900461ffff1661ffff1695505b5b5b505050505b80801561309857505f82115b80156130eb575060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15613114575f6130fa30610f6e565b9050600e54811061311257613111600e545f611772565b5b505b5f8211156131d5575f61271061ffff16838561313091906142c3565b61313a9190614331565b90505f81856131499190614361565b90505f61271061ffff16600f5f0160069054906101000a900461ffff1661ffff168461317591906142c3565b61317f9190614331565b90505f8111156131a55780836131959190614361565b92506131a48861dead8361335b565b5b5f8311156131b9576131b888308561335b565b5b5f8211156131cd576131cc88888461335b565b5b5050506131e1565b6131e085858561335b565b5b5050505050565b5f61320d835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6135c7565b905092915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f613241825f0161362e565b9050919050565b5f613255835f018361363d565b5f1c905092915050565b5f80836001015f8481526020019081526020015f205490505f8114613350575f60018261328c9190614361565b90505f6001865f01805490506132a29190614361565b9050808214613308575f865f0182815481106132c1576132c06149d7565b5b905f5260205f200154905080875f0184815481106132e2576132e16149d7565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f0180548061331b5761331a614c77565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050613355565b5f9150505b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c090614d14565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342e90614da2565b60405180910390fd5b613442838383613664565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156134c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134bc90614e30565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516135ae9190613722565b60405180910390a36135c1848484613674565b50505050565b5f6135d28383613215565b61362457825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050613628565b5f90505b92915050565b5f815f01805490509050919050565b5f825f018281548110613653576136526149d7565b5b905f5260205f200154905092915050565b61366f838383613679565b505050565b505050565b8282825f60055414158015613694575061369282610cff565b155b156136f257600554816136a684610f6e565b6136b09190613d7d565b11156136f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e890614e98565b60405180910390fd5b5b6136fd868686613705565b505050505050565b505050565b5f819050919050565b61371c8161370a565b82525050565b5f6020820190506137355f830184613713565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613772578082015181840152602081019050613757565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6137978261373b565b6137a18185613745565b93506137b1818560208601613755565b6137ba8161377d565b840191505092915050565b5f6020820190508181035f8301526137dd818461378d565b905092915050565b5f604051905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61381b826137f2565b9050919050565b61382b81613811565b8114613835575f80fd5b50565b5f8135905061384681613822565b92915050565b5f60208284031215613861576138606137ee565b5b5f61386e84828501613838565b91505092915050565b6138808161370a565b811461388a575f80fd5b50565b5f8135905061389b81613877565b92915050565b5f80604083850312156138b7576138b66137ee565b5b5f6138c485828601613838565b92505060206138d58582860161388d565b9150509250929050565b5f8115159050919050565b6138f3816138df565b82525050565b5f60208201905061390c5f8301846138ea565b92915050565b5f8060408385031215613928576139276137ee565b5b5f6139358582860161388d565b92505060206139468582860161388d565b9150509250929050565b5f60208284031215613965576139646137ee565b5b5f6139728482850161388d565b91505092915050565b5f805f60608486031215613992576139916137ee565b5b5f61399f86828701613838565b93505060206139b086828701613838565b92505060406139c18682870161388d565b9150509250925092565b6139d481613811565b82525050565b5f6020820190506139ed5f8301846139cb565b92915050565b5f60ff82169050919050565b613a08816139f3565b82525050565b5f602082019050613a215f8301846139ff565b92915050565b613a30816138df565b8114613a3a575f80fd5b50565b5f81359050613a4b81613a27565b92915050565b5f8060408385031215613a6757613a666137ee565b5b5f613a748582860161388d565b9250506020613a8585828601613a3d565b9150509250929050565b5f80fd5b5f60c08284031215613aa857613aa7613a8f565b5b81905092915050565b5f60c08284031215613ac657613ac56137ee565b5b5f613ad384828501613a93565b91505092915050565b5f60208284031215613af157613af06137ee565b5b5f613afe84828501613a3d565b91505092915050565b5f61ffff82169050919050565b613b1d81613b07565b82525050565b5f60c082019050613b365f830189613b14565b613b436020830188613b14565b613b506040830187613b14565b613b5d6060830186613b14565b613b6a6080830185613b14565b613b7760a0830184613b14565b979650505050505050565b5f8060408385031215613b9857613b976137ee565b5b5f613ba585828601613838565b9250506020613bb685828601613a3d565b9150509250929050565b5f602082019050613bd35f830184613b14565b92915050565b5f819050919050565b5f613bfc613bf7613bf2846137f2565b613bd9565b6137f2565b9050919050565b5f613c0d82613be2565b9050919050565b5f613c1e82613c03565b9050919050565b613c2e81613c14565b82525050565b5f602082019050613c475f830184613c25565b92915050565b5f8060408385031215613c6357613c626137ee565b5b5f613c7085828601613838565b9250506020613c8185828601613838565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613ccf57607f821691505b602082108103613ce257613ce1613c8b565b5b50919050565b7f416d6f756e7420746f6f206869676800000000000000000000000000000000005f82015250565b5f613d1c600f83613745565b9150613d2782613ce8565b602082019050919050565b5f6020820190508181035f830152613d4981613d10565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613d878261370a565b9150613d928361370a565b9250828201905080821115613daa57613da9613d50565b5b92915050565b7f4e6f7420656e6f7567682062616c616e636500000000000000000000000000005f82015250565b5f613de4601283613745565b9150613def82613db0565b602082019050919050565b5f6020820190508181035f830152613e1181613dd8565b9050919050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613e528261377d565b810181811067ffffffffffffffff82111715613e7157613e70613e1c565b5b80604052505050565b5f613e836137e5565b9050613e8f8282613e49565b919050565b613e9d81613b07565b8114613ea7575f80fd5b50565b5f81359050613eb881613e94565b92915050565b5f60c08284031215613ed357613ed2613e18565b5b613edd60c0613e7a565b90505f613eec84828501613eaa565b5f830152506020613eff84828501613eaa565b6020830152506040613f1384828501613eaa565b6040830152506060613f2784828501613eaa565b6060830152506080613f3b84828501613eaa565b60808301525060a0613f4f84828501613eaa565b60a08301525092915050565b5f60c08284031215613f7057613f6f6137ee565b5b5f613f7d84828501613ebe565b91505092915050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f613fba600b83613745565b9150613fc582613f86565b602082019050919050565b5f6020820190508181035f830152613fe781613fae565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614048602583613745565b915061405382613fee565b604082019050919050565b5f6020820190508181035f8301526140758161403c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6140d6602683613745565b91506140e18261407c565b604082019050919050565b5f6020820190508181035f830152614103816140ca565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61413e602083613745565b91506141498261410a565b602082019050919050565b5f6020820190508181035f83015261416b81614132565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6141cc602483613745565b91506141d782614172565b604082019050919050565b5f6020820190508181035f8301526141f9816141c0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61425a602283613745565b915061426582614200565b604082019050919050565b5f6020820190508181035f8301526142878161424e565b9050919050565b5f61429882613b07565b91506142a383613b07565b9250828203905061ffff8111156142bd576142bc613d50565b5b92915050565b5f6142cd8261370a565b91506142d88361370a565b92508282026142e68161370a565b915082820484148315176142fd576142fc613d50565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61433b8261370a565b91506143468361370a565b92508261435657614355614304565b5b828204905092915050565b5f61436b8261370a565b91506143768361370a565b925082820390508181111561438e5761438d613d50565b5b92915050565b7f4e6f742066656520636f6c6c6563746f720000000000000000000000000000005f82015250565b5f6143c8601183613745565b91506143d382614394565b602082019050919050565b5f6020820190508181035f8301526143f5816143bc565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614430601d83613745565b915061443b826143fc565b602082019050919050565b5f6020820190508181035f83015261445d81614424565b9050919050565b7f416c72656164792066656520636f6c6c6563746f7200000000000000000000005f82015250565b5f614498601583613745565b91506144a382614464565b602082019050919050565b5f6020820190508181035f8301526144c58161448c565b9050919050565b7f496e76616c6964207368617265000000000000000000000000000000000000005f82015250565b5f614500600d83613745565b915061450b826144cc565b602082019050919050565b5f6020820190508181035f83015261452d816144f4565b9050919050565b7f496e76616c696420726f757465720000000000000000000000000000000000005f82015250565b5f614568600e83613745565b915061457382614534565b602082019050919050565b5f6020820190508181035f8301526145958161455c565b9050919050565b5f815190506145aa81613822565b92915050565b5f602082840312156145c5576145c46137ee565b5b5f6145d28482850161459c565b91505092915050565b7f496e76616c696420666163746f727900000000000000000000000000000000005f82015250565b5f61460f600f83613745565b915061461a826145db565b602082019050919050565b5f6020820190508181035f83015261463c81614603565b9050919050565b5f6040820190506146565f8301856139cb565b61466360208301846139cb565b9392505050565b7f496e76616c6964207061697220616464726573732e00000000000000000000005f82015250565b5f61469e601583613745565b91506146a98261466a565b602082019050919050565b5f6020820190508181035f8301526146cb81614692565b9050919050565b7f496e76616c6964206275792066656500000000000000000000000000000000005f82015250565b5f614706600f83613745565b9150614711826146d2565b602082019050919050565b5f6020820190508181035f830152614733816146fa565b9050919050565b7f496e76616c69642073656c6c20666565000000000000000000000000000000005f82015250565b5f61476e601083613745565b91506147798261473a565b602082019050919050565b5f6020820190508181035f83015261479b81614762565b9050919050565b7f496e76616c6964207472616e73666572206665650000000000000000000000005f82015250565b5f6147d6601483613745565b91506147e1826147a2565b602082019050919050565b5f6020820190508181035f830152614803816147ca565b9050919050565b5f61481482613b07565b915061481f83613b07565b9250828201905061ffff81111561483957614838613d50565b5b92915050565b7f496e76616c6964206665652073686172650000000000000000000000000000005f82015250565b5f614873601183613745565b915061487e8261483f565b602082019050919050565b5f6020820190508181035f8301526148a081614867565b9050919050565b6148b081613b07565b82525050565b60c082015f8201516148ca5f8501826148a7565b5060208201516148dd60208501826148a7565b5060408201516148f060408501826148a7565b50606082015161490360608501826148a7565b50608082015161491660808501826148a7565b5060a082015161492960a08501826148a7565b50505050565b5f60c0820190506149425f8301846148b6565b92915050565b7f416d6f756e7420746f6f206c6f770000000000000000000000000000000000005f82015250565b5f61497c600e83613745565b915061498782614948565b602082019050919050565b5f6020820190508181035f8301526149a981614970565b9050919050565b5f6040820190506149c35f830185613713565b6149d06020830184613713565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614a3681613811565b82525050565b5f614a478383614a2d565b60208301905092915050565b5f602082019050919050565b5f614a6982614a04565b614a738185614a0e565b9350614a7e83614a1e565b805f5b83811015614aae578151614a958882614a3c565b9750614aa083614a53565b925050600181019050614a81565b5085935050505092915050565b5f60a082019050614ace5f830188613713565b614adb6020830187613713565b8181036040830152614aed8186614a5f565b9050614afc60608301856139cb565b614b096080830184613713565b9695505050505050565b5f819050919050565b5f614b36614b31614b2c84614b13565b613bd9565b61370a565b9050919050565b614b4681614b1c565b82525050565b5f60c082019050614b5f5f8301896139cb565b614b6c6020830188613713565b614b796040830187614b3d565b614b866060830186614b3d565b614b9360808301856139cb565b614ba060a0830184613713565b979650505050505050565b5f81519050614bb981613877565b92915050565b5f805f60608486031215614bd657614bd56137ee565b5b5f614be386828701614bab565b9350506020614bf486828701614bab565b9250506040614c0586828701614bab565b9150509250925092565b7f5472616e73666572203c203000000000000000000000000000000000000000005f82015250565b5f614c43600c83613745565b9150614c4e82614c0f565b602082019050919050565b5f6020820190508181035f830152614c7081614c37565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614cfe602583613745565b9150614d0982614ca4565b604082019050919050565b5f6020820190508181035f830152614d2b81614cf2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614d8c602383613745565b9150614d9782614d32565b604082019050919050565b5f6020820190508181035f830152614db981614d80565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614e1a602683613745565b9150614e2582614dc0565b604082019050919050565b5f6020820190508181035f830152614e4781614e0e565b9050919050565b7f57616c6c65742065786365656473206d617800000000000000000000000000005f82015250565b5f614e82601283613745565b9150614e8d82614e4e565b602082019050919050565b5f6020820190508181035f830152614eaf81614e76565b905091905056fea26469706673582212208db7a81eee6d66cc3f351ad388947d135e15735eaa8f96c5bd82c3c8865ddb4864736f6c63430008160033

Deployed Bytecode

0x60806040526004361061028b575f3560e01c806372bc558311610159578063adf18693116100c0578063e55096b011610079578063e55096b014610a01578063e63a391f14610a29578063f2fde38b14610a53578063f4232d2514610a7b578063f725101d14610aa3578063fccc281314610acb57610292565b8063adf18693146108f7578063b3c6e9ee1461091f578063bc063e1a14610949578063bd82394314610973578063c31c9c071461099b578063dd62ed3e146109c557610292565b806394b8a7031161011257806394b8a703146107c057806395d89b41146107fc57806398c47e8c146108265780639b61f1d014610855578063a457c2d71461087f578063a9059cbb146108bb57610292565b806372bc5583146106ca5780637994606d146106f25780637a8baf521461071a5780637f5bbb2c146107445780638da5cb5b1461076c578063905358fe1461079657610292565b8063269f534c116101fd57806341273657116101b657806341273657146105b05780634569c445146105d85780634fbee193146106005780636f741f2a1461063c57806370a0823114610678578063715018a6146106b457610292565b8063269f534c14610480578063313ce567146104bc5780633502628a146104e65780633935ebf91461050e57806339509351146105385780633b90b9bf1461057457610292565b80630f569dad1161024f5780630f569dad1461037657806312363f4a1461039e57806318160ddd146103c85780631fa67b4d146103f257806323b872dd1461041a57806326991cc81461045657610292565b806301a6c43b1461029657806306fdde03146102c0578063093ed8ba146102ea578063095ea7b3146103125780630a4e42ef1461034e57610292565b3661029257005b5f80fd5b3480156102a1575f80fd5b506102aa610af5565b6040516102b79190613722565b60405180910390f35b3480156102cb575f80fd5b506102d4610afb565b6040516102e191906137c5565b60405180910390f35b3480156102f5575f80fd5b50610310600480360381019061030b919061384c565b610b8b565b005b34801561031d575f80fd5b50610338600480360381019061033391906138a1565b610bd6565b60405161034591906138f9565b60405180910390f35b348015610359575f80fd5b50610374600480360381019061036f9190613912565b610bf8565b005b348015610381575f80fd5b5061039c60048036038101906103979190613950565b610c59565b005b3480156103a9575f80fd5b506103b2610c6b565b6040516103bf9190613722565b60405180910390f35b3480156103d3575f80fd5b506103dc610c8f565b6040516103e99190613722565b60405180910390f35b3480156103fd575f80fd5b506104186004803603810190610413919061384c565b610c98565b005b348015610425575f80fd5b50610440600480360381019061043b919061397b565b610cac565b60405161044d91906138f9565b60405180910390f35b348015610461575f80fd5b5061046a610cda565b60405161047791906139da565b60405180910390f35b34801561048b575f80fd5b506104a660048036038101906104a1919061384c565b610cff565b6040516104b391906138f9565b60405180910390f35b3480156104c7575f80fd5b506104d0610d51565b6040516104dd9190613a0e565b60405180910390f35b3480156104f1575f80fd5b5061050c600480360381019061050791906138a1565b610d78565b005b348015610519575f80fd5b50610522610d8e565b60405161052f91906139da565b60405180910390f35b348015610543575f80fd5b5061055e600480360381019061055991906138a1565b610db3565b60405161056b91906138f9565b60405180910390f35b34801561057f575f80fd5b5061059a6004803603810190610595919061384c565b610de9565b6040516105a791906138f9565b60405180910390f35b3480156105bb575f80fd5b506105d660048036038101906105d1919061384c565b610e05565b005b3480156105e3575f80fd5b506105fe60048036038101906105f99190613a51565b610e19565b005b34801561060b575f80fd5b506106266004803603810190610621919061384c565b610eca565b60405161063391906138f9565b60405180910390f35b348015610647575f80fd5b50610662600480360381019061065d919061384c565b610f1c565b60405161066f91906138f9565b60405180910390f35b348015610683575f80fd5b5061069e6004803603810190610699919061384c565b610f6e565b6040516106ab9190613722565b60405180910390f35b3480156106bf575f80fd5b506106c8610fb3565b005b3480156106d5575f80fd5b506106f060048036038101906106eb919061384c565b610fc6565b005b3480156106fd575f80fd5b5061071860048036038101906107139190613ab1565b611011565b005b348015610725575f80fd5b5061072e611035565b60405161073b9190613722565b60405180910390f35b34801561074f575f80fd5b5061076a60048036038101906107659190613adc565b61103b565b005b348015610777575f80fd5b506107806110b5565b60405161078d91906139da565b60405180910390f35b3480156107a1575f80fd5b506107aa6110dd565b6040516107b79190613722565b60405180910390f35b3480156107cb575f80fd5b506107e660048036038101906107e1919061384c565b6110ee565b6040516107f39190613722565b60405180910390f35b348015610807575f80fd5b50610810611134565b60405161081d91906137c5565b60405180910390f35b348015610831575f80fd5b5061083a6111c4565b60405161084c96959493929190613b23565b60405180910390f35b348015610860575f80fd5b5061086961123b565b60405161087691906138f9565b60405180910390f35b34801561088a575f80fd5b506108a560048036038101906108a091906138a1565b61124e565b6040516108b291906138f9565b60405180910390f35b3480156108c6575f80fd5b506108e160048036038101906108dc91906138a1565b6112c3565b6040516108ee91906138f9565b60405180910390f35b348015610902575f80fd5b5061091d60048036038101906109189190613b82565b6112e5565b005b34801561092a575f80fd5b506109336112fb565b6040516109409190613722565b60405180910390f35b348015610954575f80fd5b5061095d611301565b60405161096a9190613bc0565b60405180910390f35b34801561097e575f80fd5b5061099960048036038101906109949190613950565b611307565b005b3480156109a6575f80fd5b506109af61131b565b6040516109bc9190613c34565b60405180910390f35b3480156109d0575f80fd5b506109eb60048036038101906109e69190613c4d565b611340565b6040516109f89190613722565b60405180910390f35b348015610a0c575f80fd5b50610a276004803603810190610a229190613b82565b6113c2565b005b348015610a34575f80fd5b50610a3d6113d8565b604051610a4a9190613bc0565b60405180910390f35b348015610a5e575f80fd5b50610a796004803603810190610a74919061384c565b6113de565b005b348015610a86575f80fd5b50610aa16004803603810190610a9c91906138a1565b611460565b005b348015610aae575f80fd5b50610ac96004803603810190610ac49190613b82565b611476565b005b348015610ad6575f80fd5b50610adf611524565b604051610aec91906139da565b60405180910390f35b600e5481565b606060038054610b0a90613cb8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3690613cb8565b8015610b815780601f10610b5857610100808354040283529160200191610b81565b820191905f5260205f20905b815481529060010190602001808311610b6457829003601f168201915b5050505050905090565b610b9361152a565b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f80610be06115a8565b9050610bed8185856115af565b600191505092915050565b610c0061152a565b610c0930610f6e565b821115610c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4290613d32565b60405180910390fd5b610c558282611772565b5050565b610c6161152a565b80600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b610ca061152a565b610ca9816118ef565b50565b5f80610cb66115a8565b9050610cc3858285611a32565b610cce858585611abd565b60019150509392505050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000012905090565b610d8061152a565b610d8a8282611acd565b5050565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610dbd6115a8565b9050610dde818585610dcf8589611340565b610dd99190613d7d565b6115af565b600191505092915050565b5f610dfe826007611c2490919063ffffffff16565b9050919050565b610e0d61152a565b610e1681611c51565b50565b610e2161152a565b8015610e775781610e3130610f6e565b1015610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990613dfa565b60405180910390fd5b610ebb565b81471015610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190613dfa565b60405180910390fd5b5b610ec58282612187565b505050565b5f60105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60115f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610fbb61152a565b610fc45f612329565b565b610fce61152a565b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61101961152a565b6110328180360381019061102d9190613f5b565b6123ec565b50565b60055481565b61104361152a565b801515600d60159054906101000a900460ff16151503611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90613fd0565b60405180910390fd5b80600d60156101000a81548160ff02191690831515021790555050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6c01431e0fae6d7217caa000000081565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60606004805461114390613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461116f90613cb8565b80156111ba5780601f10611191576101008083540402835291602001916111ba565b820191905f5260205f20905b81548152906001019060200180831161119d57829003601f168201915b5050505050905090565b600f805f015f9054906101000a900461ffff1690805f0160029054906101000a900461ffff1690805f0160049054906101000a900461ffff1690805f0160069054906101000a900461ffff1690805f0160089054906101000a900461ffff1690805f01600a9054906101000a900461ffff16905086565b600d60159054906101000a900460ff1681565b5f806112586115a8565b90505f6112658286611340565b9050838110156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a19061405e565b60405180910390fd5b6112b782868684036115af565b60019250505092915050565b5f806112cd6115a8565b90506112da818585611abd565b600191505092915050565b6112ed61152a565b6112f78282612669565b5050565b600a5481565b6107d081565b61130f61152a565b6113188161279e565b50565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6113ca61152a565b6113d4828261284b565b5050565b61271081565b6113e661152a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b906140ec565b60405180910390fd5b61145d81612329565b50565b61146861152a565b6114728282612980565b5050565b61147e61152a565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f46e542c7dcc512f9d4c5ef6470efcb6729025d935367e1c2c8dc49d8e35eaa888260405161151891906138f9565b60405180910390a25050565b61dead81565b6115326115a8565b73ffffffffffffffffffffffffffffffffffffffff166115506110b5565b73ffffffffffffffffffffffffffffffffffffffff16146115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d90614154565b60405180910390fd5b565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906141e2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290614270565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117659190613722565b60405180910390a3505050565b6001600d60146101000a81548160ff0219169083151502179055505f61179730610f6e565b90508281106118cf575f600f5f0160069054906101000a900461ffff166127106117c1919061428e565b61ffff16600f5f0160089054906101000a900461ffff1661ffff16856117e791906142c3565b6117f19190614331565b90505f6002826118019190614331565b90505f82866118109190614361565b90505f828461181f9190614361565b9050818161182d9190613d7d565b90505f8111156118bf575f611862600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f6e565b036118715750505050506118d1565b5f47905061187f8288612b1d565b5f814761188c9190614361565b90505f83868361189c91906142c3565b6118a69190614331565b90505f8111156118bb576118ba8682612d54565b5b5050505b6118c9475f612187565b50505050505b505b5f600d60146101000a81548160ff0219169083151502179055505050565b611903816007611c2490919063ffffffff16565b611942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611939906143de565b60405180910390fd5b611956816007612e4e90919063ffffffff16565b5060095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600a5f8282546119a59190614361565b9250508190555060095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90558073ffffffffffffffffffffffffffffffffffffffff167f904316769e154356a5e4aad5d41591b55913c7717fab281d818c1fed7d80e81460405160405180910390a250565b5f611a3d8484611340565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ab75781811015611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090614446565b60405180910390fd5b611ab684848484036115af565b5b50505050565b611ac8838383612e7b565b505050565b611ae1826007611c2490919063ffffffff16565b15611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906144ae565b60405180910390fd5b5f8111611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a90614516565b60405180910390fd5b611b778260076131e890919063ffffffff16565b508060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080600a5f828254611bcb9190613d7d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f918584c21fe4a093f5014c0dabaed3e43b642781e27984aef122cae8245fbb2382604051611c189190613722565b60405180910390a25050565b5f611c49835f018373ffffffffffffffffffffffffffffffffffffffff165f1b613215565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb69061457e565b60405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8e91906145b0565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df590614625565b60405180910390fd5b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8d91906145b0565b90508173ffffffffffffffffffffffffffffffffffffffff1663e6a4390530836040518363ffffffff1660e01b8152600401611eca929190614643565b602060405180830381865afa158015611ee5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0991906145b0565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612057578173ffffffffffffffffffffffffffffffffffffffff1663c9c6539630836040518363ffffffff1660e01b8152600401611fd7929190614643565b6020604051808303815f875af1158015611ff3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201791906145b0565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120dd906146b4565b60405180910390fd5b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b60405160405180910390a3505050565b5f808303612197575f9050612323565b5f600a54036121a8575f9050612323565b5f806121b46007613235565b90505f5b8181101561231b575f6121d582600761324890919063ffffffff16565b90505f6001846121e59190614361565b831461224657600a5460095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548961223791906142c3565b6122419190614331565b612253565b84886122529190614361565b5b9050861561226b57612266308383611abd565b6122b0565b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156122ae573d5f803e3d5ffd5b505b8173ffffffffffffffffffffffffffffffffffffffff167f06c5efeff5c320943d265dc4e5f1af95ad523555ce0c1957e367dda5514572df826040516122f69190613722565b60405180910390a2808561230a9190613d7d565b9450505080806001019150506121b8565b506001925050505b92915050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6107d061ffff16815f015161ffff16111561243c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124339061471c565b60405180910390fd5b6107d061ffff16816020015161ffff16111561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614784565b60405180910390fd5b6107d061ffff16816040015161ffff1611156124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d5906147ec565b60405180910390fd5b5f8160a00151826080015183606001516124f8919061480a565b612502919061480a565b90505f8161ffff16148061251f575061271061ffff168161ffff16145b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590614889565b60405180910390fd5b81600f5f820151815f015f6101000a81548161ffff021916908361ffff1602179055506020820151815f0160026101000a81548161ffff021916908361ffff1602179055506040820151815f0160046101000a81548161ffff021916908361ffff1602179055506060820151815f0160066101000a81548161ffff021916908361ffff1602179055506080820151815f0160086101000a81548161ffff021916908361ffff16021790555060a0820151815f01600a6101000a81548161ffff021916908361ffff1602179055509050507fc9632f3cf45264c46361b5340b78f8ef11e561d580a40379a966e3aa8f1f6d7c8260405161265d919061492f565b60405180910390a15050565b80151560105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef90613fd0565b60405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb8260405161279291906138f9565b60405180910390a25050565b5f8114806127cb57506103e860056127b4610c8f565b6127be91906142c3565b6127c89190614331565b81115b61280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190614992565b60405180910390fd5b806005819055507f0271c3ca991d8fa13fc3df55bfd888e9347a178a375ef6e0f63afa9639d144f4816040516128409190613722565b60405180910390a150565b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d190613fd0565b60405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f902b2ea0acdec5a260e398590d055fe29bd61ef5dd41e45db54a4cd98d5569e08260405161297491906138f9565b60405180910390a25050565b612994826007611c2490919063ffffffff16565b6129d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ca906143de565b60405180910390fd5b5f8111612a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0c90614516565b60405180910390fd5b5f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905080600a5f828254612a679190614361565b925050819055508160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555081600a5f828254612ac19190613d7d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167fd350c3685bdab1285c0b97ffb6e96d96ed0ad4578a135c38250e771e7cb831aa8284604051612b109291906149b0565b60405180910390a2505050565b5f600267ffffffffffffffff811115612b3957612b38613e1c565b5b604051908082528060200260200182016040528015612b675781602001602082028036833780820191505090505b50905030815f81518110612b7e57612b7d6149d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4691906145b0565b81600181518110612c5a57612c596149d7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cc030600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856115af565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94784848430426040518663ffffffff1660e01b8152600401612d22959493929190614abb565b5f604051808303815f87803b158015612d39575f80fd5b505af1158015612d4b573d5f803e3d5ffd5b50505050505050565b612d8030600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846115af565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f80600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612e0696959493929190614b4c565b60606040518083038185885af1158015612e22573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612e479190614bbf565b5050505050565b5f612e73835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61325f565b905092915050565b5f811015612ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb590614c59565b60405180910390fd5b5f80600d60149054906101000a900460ff16158015612ee95750600d60159054906101000a900460ff165b9050600d60149054906101000a900460ff1661308c575f612f0986610eca565b90505f612f1586610eca565b90505f612f2188610f1c565b90505f612f2d88610f1c565b9050818015612f3a575080155b8015612f44575082155b8015612f9d5750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b15612fbf57600f5f015f9054906101000a900461ffff1661ffff169550613087565b808015612fca575083155b8015612fd4575082155b15612ff757600f5f0160029054906101000a900461ffff1661ffff169550613086565b81158015613003575080155b801561305c5750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b8015613066575083155b1561308557600f5f0160049054906101000a900461ffff1661ffff1695505b5b5b505050505b80801561309857505f82115b80156130eb575060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15613114575f6130fa30610f6e565b9050600e54811061311257613111600e545f611772565b5b505b5f8211156131d5575f61271061ffff16838561313091906142c3565b61313a9190614331565b90505f81856131499190614361565b90505f61271061ffff16600f5f0160069054906101000a900461ffff1661ffff168461317591906142c3565b61317f9190614331565b90505f8111156131a55780836131959190614361565b92506131a48861dead8361335b565b5b5f8311156131b9576131b888308561335b565b5b5f8211156131cd576131cc88888461335b565b5b5050506131e1565b6131e085858561335b565b5b5050505050565b5f61320d835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6135c7565b905092915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f613241825f0161362e565b9050919050565b5f613255835f018361363d565b5f1c905092915050565b5f80836001015f8481526020019081526020015f205490505f8114613350575f60018261328c9190614361565b90505f6001865f01805490506132a29190614361565b9050808214613308575f865f0182815481106132c1576132c06149d7565b5b905f5260205f200154905080875f0184815481106132e2576132e16149d7565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f0180548061331b5761331a614c77565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050613355565b5f9150505b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c090614d14565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342e90614da2565b60405180910390fd5b613442838383613664565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156134c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134bc90614e30565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516135ae9190613722565b60405180910390a36135c1848484613674565b50505050565b5f6135d28383613215565b61362457825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050613628565b5f90505b92915050565b5f815f01805490509050919050565b5f825f018281548110613653576136526149d7565b5b905f5260205f200154905092915050565b61366f838383613679565b505050565b505050565b8282825f60055414158015613694575061369282610cff565b155b156136f257600554816136a684610f6e565b6136b09190613d7d565b11156136f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e890614e98565b60405180910390fd5b5b6136fd868686613705565b505050505050565b505050565b5f819050919050565b61371c8161370a565b82525050565b5f6020820190506137355f830184613713565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613772578082015181840152602081019050613757565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6137978261373b565b6137a18185613745565b93506137b1818560208601613755565b6137ba8161377d565b840191505092915050565b5f6020820190508181035f8301526137dd818461378d565b905092915050565b5f604051905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61381b826137f2565b9050919050565b61382b81613811565b8114613835575f80fd5b50565b5f8135905061384681613822565b92915050565b5f60208284031215613861576138606137ee565b5b5f61386e84828501613838565b91505092915050565b6138808161370a565b811461388a575f80fd5b50565b5f8135905061389b81613877565b92915050565b5f80604083850312156138b7576138b66137ee565b5b5f6138c485828601613838565b92505060206138d58582860161388d565b9150509250929050565b5f8115159050919050565b6138f3816138df565b82525050565b5f60208201905061390c5f8301846138ea565b92915050565b5f8060408385031215613928576139276137ee565b5b5f6139358582860161388d565b92505060206139468582860161388d565b9150509250929050565b5f60208284031215613965576139646137ee565b5b5f6139728482850161388d565b91505092915050565b5f805f60608486031215613992576139916137ee565b5b5f61399f86828701613838565b93505060206139b086828701613838565b92505060406139c18682870161388d565b9150509250925092565b6139d481613811565b82525050565b5f6020820190506139ed5f8301846139cb565b92915050565b5f60ff82169050919050565b613a08816139f3565b82525050565b5f602082019050613a215f8301846139ff565b92915050565b613a30816138df565b8114613a3a575f80fd5b50565b5f81359050613a4b81613a27565b92915050565b5f8060408385031215613a6757613a666137ee565b5b5f613a748582860161388d565b9250506020613a8585828601613a3d565b9150509250929050565b5f80fd5b5f60c08284031215613aa857613aa7613a8f565b5b81905092915050565b5f60c08284031215613ac657613ac56137ee565b5b5f613ad384828501613a93565b91505092915050565b5f60208284031215613af157613af06137ee565b5b5f613afe84828501613a3d565b91505092915050565b5f61ffff82169050919050565b613b1d81613b07565b82525050565b5f60c082019050613b365f830189613b14565b613b436020830188613b14565b613b506040830187613b14565b613b5d6060830186613b14565b613b6a6080830185613b14565b613b7760a0830184613b14565b979650505050505050565b5f8060408385031215613b9857613b976137ee565b5b5f613ba585828601613838565b9250506020613bb685828601613a3d565b9150509250929050565b5f602082019050613bd35f830184613b14565b92915050565b5f819050919050565b5f613bfc613bf7613bf2846137f2565b613bd9565b6137f2565b9050919050565b5f613c0d82613be2565b9050919050565b5f613c1e82613c03565b9050919050565b613c2e81613c14565b82525050565b5f602082019050613c475f830184613c25565b92915050565b5f8060408385031215613c6357613c626137ee565b5b5f613c7085828601613838565b9250506020613c8185828601613838565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613ccf57607f821691505b602082108103613ce257613ce1613c8b565b5b50919050565b7f416d6f756e7420746f6f206869676800000000000000000000000000000000005f82015250565b5f613d1c600f83613745565b9150613d2782613ce8565b602082019050919050565b5f6020820190508181035f830152613d4981613d10565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613d878261370a565b9150613d928361370a565b9250828201905080821115613daa57613da9613d50565b5b92915050565b7f4e6f7420656e6f7567682062616c616e636500000000000000000000000000005f82015250565b5f613de4601283613745565b9150613def82613db0565b602082019050919050565b5f6020820190508181035f830152613e1181613dd8565b9050919050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613e528261377d565b810181811067ffffffffffffffff82111715613e7157613e70613e1c565b5b80604052505050565b5f613e836137e5565b9050613e8f8282613e49565b919050565b613e9d81613b07565b8114613ea7575f80fd5b50565b5f81359050613eb881613e94565b92915050565b5f60c08284031215613ed357613ed2613e18565b5b613edd60c0613e7a565b90505f613eec84828501613eaa565b5f830152506020613eff84828501613eaa565b6020830152506040613f1384828501613eaa565b6040830152506060613f2784828501613eaa565b6060830152506080613f3b84828501613eaa565b60808301525060a0613f4f84828501613eaa565b60a08301525092915050565b5f60c08284031215613f7057613f6f6137ee565b5b5f613f7d84828501613ebe565b91505092915050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f613fba600b83613745565b9150613fc582613f86565b602082019050919050565b5f6020820190508181035f830152613fe781613fae565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614048602583613745565b915061405382613fee565b604082019050919050565b5f6020820190508181035f8301526140758161403c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6140d6602683613745565b91506140e18261407c565b604082019050919050565b5f6020820190508181035f830152614103816140ca565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61413e602083613745565b91506141498261410a565b602082019050919050565b5f6020820190508181035f83015261416b81614132565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6141cc602483613745565b91506141d782614172565b604082019050919050565b5f6020820190508181035f8301526141f9816141c0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61425a602283613745565b915061426582614200565b604082019050919050565b5f6020820190508181035f8301526142878161424e565b9050919050565b5f61429882613b07565b91506142a383613b07565b9250828203905061ffff8111156142bd576142bc613d50565b5b92915050565b5f6142cd8261370a565b91506142d88361370a565b92508282026142e68161370a565b915082820484148315176142fd576142fc613d50565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61433b8261370a565b91506143468361370a565b92508261435657614355614304565b5b828204905092915050565b5f61436b8261370a565b91506143768361370a565b925082820390508181111561438e5761438d613d50565b5b92915050565b7f4e6f742066656520636f6c6c6563746f720000000000000000000000000000005f82015250565b5f6143c8601183613745565b91506143d382614394565b602082019050919050565b5f6020820190508181035f8301526143f5816143bc565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614430601d83613745565b915061443b826143fc565b602082019050919050565b5f6020820190508181035f83015261445d81614424565b9050919050565b7f416c72656164792066656520636f6c6c6563746f7200000000000000000000005f82015250565b5f614498601583613745565b91506144a382614464565b602082019050919050565b5f6020820190508181035f8301526144c58161448c565b9050919050565b7f496e76616c6964207368617265000000000000000000000000000000000000005f82015250565b5f614500600d83613745565b915061450b826144cc565b602082019050919050565b5f6020820190508181035f83015261452d816144f4565b9050919050565b7f496e76616c696420726f757465720000000000000000000000000000000000005f82015250565b5f614568600e83613745565b915061457382614534565b602082019050919050565b5f6020820190508181035f8301526145958161455c565b9050919050565b5f815190506145aa81613822565b92915050565b5f602082840312156145c5576145c46137ee565b5b5f6145d28482850161459c565b91505092915050565b7f496e76616c696420666163746f727900000000000000000000000000000000005f82015250565b5f61460f600f83613745565b915061461a826145db565b602082019050919050565b5f6020820190508181035f83015261463c81614603565b9050919050565b5f6040820190506146565f8301856139cb565b61466360208301846139cb565b9392505050565b7f496e76616c6964207061697220616464726573732e00000000000000000000005f82015250565b5f61469e601583613745565b91506146a98261466a565b602082019050919050565b5f6020820190508181035f8301526146cb81614692565b9050919050565b7f496e76616c6964206275792066656500000000000000000000000000000000005f82015250565b5f614706600f83613745565b9150614711826146d2565b602082019050919050565b5f6020820190508181035f830152614733816146fa565b9050919050565b7f496e76616c69642073656c6c20666565000000000000000000000000000000005f82015250565b5f61476e601083613745565b91506147798261473a565b602082019050919050565b5f6020820190508181035f83015261479b81614762565b9050919050565b7f496e76616c6964207472616e73666572206665650000000000000000000000005f82015250565b5f6147d6601483613745565b91506147e1826147a2565b602082019050919050565b5f6020820190508181035f830152614803816147ca565b9050919050565b5f61481482613b07565b915061481f83613b07565b9250828201905061ffff81111561483957614838613d50565b5b92915050565b7f496e76616c6964206665652073686172650000000000000000000000000000005f82015250565b5f614873601183613745565b915061487e8261483f565b602082019050919050565b5f6020820190508181035f8301526148a081614867565b9050919050565b6148b081613b07565b82525050565b60c082015f8201516148ca5f8501826148a7565b5060208201516148dd60208501826148a7565b5060408201516148f060408501826148a7565b50606082015161490360608501826148a7565b50608082015161491660808501826148a7565b5060a082015161492960a08501826148a7565b50505050565b5f60c0820190506149425f8301846148b6565b92915050565b7f416d6f756e7420746f6f206c6f770000000000000000000000000000000000005f82015250565b5f61497c600e83613745565b915061498782614948565b602082019050919050565b5f6020820190508181035f8301526149a981614970565b9050919050565b5f6040820190506149c35f830185613713565b6149d06020830184613713565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614a3681613811565b82525050565b5f614a478383614a2d565b60208301905092915050565b5f602082019050919050565b5f614a6982614a04565b614a738185614a0e565b9350614a7e83614a1e565b805f5b83811015614aae578151614a958882614a3c565b9750614aa083614a53565b925050600181019050614a81565b5085935050505092915050565b5f60a082019050614ace5f830188613713565b614adb6020830187613713565b8181036040830152614aed8186614a5f565b9050614afc60608301856139cb565b614b096080830184613713565b9695505050505050565b5f819050919050565b5f614b36614b31614b2c84614b13565b613bd9565b61370a565b9050919050565b614b4681614b1c565b82525050565b5f60c082019050614b5f5f8301896139cb565b614b6c6020830188613713565b614b796040830187614b3d565b614b866060830186614b3d565b614b9360808301856139cb565b614ba060a0830184613713565b979650505050505050565b5f81519050614bb981613877565b92915050565b5f805f60608486031215614bd657614bd56137ee565b5b5f614be386828701614bab565b9350506020614bf486828701614bab565b9250506040614c0586828701614bab565b9150509250925092565b7f5472616e73666572203c203000000000000000000000000000000000000000005f82015250565b5f614c43600c83613745565b9150614c4e82614c0f565b602082019050919050565b5f6020820190508181035f830152614c7081614c37565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614cfe602583613745565b9150614d0982614ca4565b604082019050919050565b5f6020820190508181035f830152614d2b81614cf2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614d8c602383613745565b9150614d9782614d32565b604082019050919050565b5f6020820190508181035f830152614db981614d80565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614e1a602683613745565b9150614e2582614dc0565b604082019050919050565b5f6020820190508181035f830152614e4781614e0e565b9050919050565b7f57616c6c65742065786365656473206d617800000000000000000000000000005f82015250565b5f614e82601283613745565b9150614e8d82614e4e565b602082019050919050565b5f6020820190508181035f830152614eaf81614e76565b905091905056fea26469706673582212208db7a81eee6d66cc3f351ad388947d135e15735eaa8f96c5bd82c3c8865ddb4864736f6c63430008160033

Deployed Bytecode Sourcemap

55316:5812:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45427:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6381:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56927:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8732:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59376:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60128:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17659:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7501:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59686:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9513:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45277:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57109:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17888:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58203:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45307:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10217:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41691:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60851:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58946:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46954:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47573:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7672:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21189:103;;;;;;;;;;;;;:::i;:::-;;59904:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60602:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18107:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57922:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20541:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55412:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41822:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6600:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45547:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;45393:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10958:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8005:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58682:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41058:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45101:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56717:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45234:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8261:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58429:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45161:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21447:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60346:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57369:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45004:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45427:30;;;;:::o;6381:100::-;6435:13;6468:5;6461:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6381:100;:::o;56927:91::-;20427:13;:11;:13::i;:::-;57005:5:::1;56994:8;;:16;;;;;;;;;;;;;;;;;;56927:91:::0;:::o;8732:201::-;8815:4;8832:13;8848:12;:10;:12::i;:::-;8832:28;;8871:32;8880:5;8887:7;8896:6;8871:8;:32::i;:::-;8921:4;8914:11;;;8732:201;;;;:::o;59376:213::-;20427:13;:11;:13::i;:::-;59492:24:::1;59510:4;59492:9;:24::i;:::-;59482:6;:34;;59474:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59547:34;59560:6;59568:12;59547;:34::i;:::-;59376:213:::0;;:::o;60128:115::-;20427:13;:11;:13::i;:::-;60229:6:::1;60211:15;:24;;;;60128:115:::0;:::o;17659:35::-;;;:::o;7501:108::-;7562:7;7589:12;;7582:19;;7501:108;:::o;59686:120::-;20427:13;:11;:13::i;:::-;59770:28:::1;59790:7;59770:19;:28::i;:::-;59686:120:::0;:::o;9513:295::-;9644:4;9661:15;9679:12;:10;:12::i;:::-;9661:30;;9702:38;9718:4;9724:7;9733:6;9702:15;:38::i;:::-;9751:27;9761:4;9767:2;9771:6;9751:9;:27::i;:::-;9796:4;9789:11;;;9513:295;;;;;:::o;45277:23::-;;;;;;;;;;;;;:::o;57109:143::-;57189:4;57213:22;:31;57236:7;57213:31;;;;;;;;;;;;;;;;;;;;;;;;;57206:38;;57109:143;;;:::o;17888:92::-;17938:5;17963:9;17956:16;;17888:92;:::o;58203:136::-;20427:13;:11;:13::i;:::-;58299:32:::1;58316:7;58325:5;58299:16;:32::i;:::-;58203:136:::0;;:::o;45307:29::-;;;;;;;;;;;;;:::o;10217:238::-;10305:4;10322:13;10338:12;:10;:12::i;:::-;10322:28;;10361:64;10370:5;10377:7;10414:10;10386:25;10396:5;10403:7;10386:9;:25::i;:::-;:38;;;;:::i;:::-;10361:8;:64::i;:::-;10443:4;10436:11;;;10217:238;;;;:::o;41691:123::-;41753:4;41777:29;41798:7;41777:11;:20;;:29;;;;:::i;:::-;41770:36;;41691:123;;;:::o;60851:114::-;20427:13;:11;:13::i;:::-;60932:25:::1;60947:9;60932:14;:25::i;:::-;60851:114:::0;:::o;58946:343::-;20427:13;:11;:13::i;:::-;59043:7:::1;59039:200;;;59103:6;59075:24;59093:4;59075:9;:24::i;:::-;:34;;59067:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59039:200;;;59198:6;59173:21;:31;;59165:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59039:200;59249:32;59265:6;59273:7;59249:15;:32::i;:::-;;58946:343:::0;;:::o;46954:124::-;47020:4;47044:17;:26;47062:7;47044:26;;;;;;;;;;;;;;;;;;;;;;;;;47037:33;;46954:124;;;:::o;47573:113::-;47633:4;47657:8;:21;47666:11;47657:21;;;;;;;;;;;;;;;;;;;;;;;;;47650:28;;47573:113;;;:::o;7672:127::-;7746:7;7773:9;:18;7783:7;7773:18;;;;;;;;;;;;;;;;7766:25;;7672:127;;;:::o;21189:103::-;20427:13;:11;:13::i;:::-;21254:30:::1;21281:1;21254:18;:30::i;:::-;21189:103::o:0;59904:117::-;20427:13;:11;:13::i;:::-;60005:8:::1;59988:14;;:25;;;;;;;;;;;;;;;;;;59904:117:::0;:::o;60602:152::-;20427:13;:11;:13::i;:::-;60711:35:::1;60732:13;60711:35;;;;;;;;;;:::i;:::-;:20;:35::i;:::-;60602:152:::0;:::o;18107:32::-;;;;:::o;57922:187::-;20427:13;:11;:13::i;:::-;58034:11:::1;58015:30;;:15;;;;;;;;;;;:30;;::::0;58007:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;58090:11;58072:15;;:29;;;;;;;;;;;;;;;;;;57922:187:::0;:::o;20541:87::-;20587:7;20614:6;;;;;;;;;;;20607:13;;20541:87;:::o;55412:66::-;55453:25;55412:66;:::o;41822:116::-;41887:7;41914;:16;41922:7;41914:16;;;;;;;;;;;;;;;;41907:23;;41822:116;;;:::o;6600:104::-;6656:13;6689:7;6682:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6600:104;:::o;45547:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45393:27::-;;;;;;;;;;;;;:::o;10958:436::-;11051:4;11068:13;11084:12;:10;:12::i;:::-;11068:28;;11107:24;11134:25;11144:5;11151:7;11134:9;:25::i;:::-;11107:52;;11198:15;11178:16;:35;;11170:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11291:60;11300:5;11307:7;11335:15;11316:16;:34;11291:8;:60::i;:::-;11382:4;11375:11;;;;10958:436;;;;:::o;8005:193::-;8084:4;8101:13;8117:12;:10;:12::i;:::-;8101:28;;8140;8150:5;8157:2;8161:6;8140:9;:28::i;:::-;8186:4;8179:11;;;8005:193;;;;:::o;58682:151::-;20427:13;:11;:13::i;:::-;58784:41:::1;58807:7;58816:8;58784:22;:41::i;:::-;58682:151:::0;;:::o;41058:39::-;;;;:::o;45101:37::-;45134:4;45101:37;:::o;56717:113::-;20427:13;:11;:13::i;:::-;56793:29:::1;56815:6;56793:21;:29::i;:::-;56717:113:::0;:::o;45234:36::-;;;;;;;;;;;;;:::o;8261:151::-;8350:7;8377:11;:18;8389:5;8377:18;;;;;;;;;;;;;;;:27;8396:7;8377:27;;;;;;;;;;;;;;;;8370:34;;8261:151;;;;:::o;58429:131::-;20427:13;:11;:13::i;:::-;58521:31:::1;58534:11;58547:4;58521:12;:31::i;:::-;58429:131:::0;;:::o;45161:44::-;45200:5;45161:44;:::o;21447:201::-;20427:13;:11;:13::i;:::-;21556:1:::1;21536:22;;:8;:22;;::::0;21528:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21612:28;21631:8;21612:18;:28::i;:::-;21447:201:::0;:::o;60346:152::-;20427:13;:11;:13::i;:::-;60450:40:::1;60475:7;60484:5;60450:24;:40::i;:::-;60346:152:::0;;:::o;57369:204::-;20427:13;:11;:13::i;:::-;57501:8:::1;57467:22;:31;57490:7;57467:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;57547:7;57525:40;;;57556:8;57525:40;;;;;;:::i;:::-;;;;;;;;57369:204:::0;;:::o;45004:90::-;45051:42;45004:90;:::o;20706:132::-;20781:12;:10;:12::i;:::-;20770:23;;:7;:5;:7::i;:::-;:23;;;20762:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20706:132::o;676:98::-;729:7;756:10;749:17;;676:98;:::o;14985:380::-;15138:1;15121:19;;:5;:19;;;15113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15219:1;15200:21;;:7;:21;;;15192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15303:6;15273:11;:18;15285:5;15273:18;;;;;;;;;;;;;;;:27;15292:7;15273:27;;;;;;;;;;;;;;;:36;;;;15341:7;15325:32;;15334:5;15325:32;;;15350:6;15325:32;;;;;;:::i;:::-;;;;;;;;14985:380;;;:::o;49038:1568::-;46032:4;46014:15;;:22;;;;;;;;;;;;;;;;;;49135:28:::1;49166:24;49184:4;49166:9;:24::i;:::-;49135:55;;49229:11;49205:20;:35;49201:1398;;49257:23;49370:16;:29;;;;;;;;;;;;45200:5;49354:45;;;;:::i;:::-;49283:117;;49298:16;:34;;;;;;;;;;;;49284:48;;:11;:48;;;;:::i;:::-;49283:117;;;;:::i;:::-;49257:143;;49415:23;49459:1;49441:15;:19;;;;:::i;:::-;49415:45;;49477:24;49518:15;49504:11;:29;;;;:::i;:::-;49477:56;;49548:21;49590:15;49572;:33;;;;:::i;:::-;49548:57;;49664:16;49647:33;;;;;:::i;:::-;;;49747:1;49731:13;:17;49727:781;;;49796:1;49773:19;49783:8;;;;;;;;;;;49773:9;:19::i;:::-;:24:::0;49769:145:::1;;49888:7;;;;;;;49769:145;49994:22;50019:21;49994:46;;50061;50079:13;50094:12;50061:17;:46::i;:::-;50180:19;50226:14;50202:21;:38;;;;:::i;:::-;50180:60;;50295:20;50352:13;50333:15;50319:11;:29;;;;:::i;:::-;50318:47;;;;:::i;:::-;50295:70;;50403:1;50388:12;:16;50384:109;;;50429:44;50443:15;50460:12;50429:13;:44::i;:::-;50384:109;49750:758;;;49727:781;50538:45;50554:21;50577:5;50538:15;:45::i;:::-;;49242:1357;;;;49201:1398;49124:1482;46047:1;46077:5:::0;46059:15;;:23;;;;;;;;;;;;;;;;;;49038:1568;;:::o;42317:306::-;42391:29;42412:7;42391:11;:20;;:29;;;;:::i;:::-;42383:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;42453:27;42472:7;42453:11;:18;;:27;;;;:::i;:::-;;42519:7;:16;42527:7;42519:16;;;;;;;;;;;;;;;;42491:24;;:44;;;;;;;:::i;:::-;;;;;;;;42553:7;:16;42561:7;42553:16;;;;;;;;;;;;;;;42546:23;;;42607:7;42587:28;;;;;;;;;;;;42317:306;:::o;15656:453::-;15791:24;15818:25;15828:5;15835:7;15818:9;:25::i;:::-;15791:52;;15878:17;15858:16;:37;15854:248;;15940:6;15920:16;:26;;15912:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16024:51;16033:5;16040:7;16068:6;16049:16;:25;16024:8;:51::i;:::-;15854:248;15780:329;15656:453;;;:::o;60973:152::-;61084:33;61100:4;61106:2;61110:6;61084:15;:33::i;:::-;60973:152;;;:::o;41946:363::-;42033:29;42054:7;42033:11;:20;;:29;;;;:::i;:::-;42032:30;42024:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42115:1;42107:5;:9;42099:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;42147:24;42163:7;42147:11;:15;;:24;;;;:::i;:::-;;42201:5;42182:7;:16;42190:7;42182:16;;;;;;;;;;;;;;;:24;;;;42245:5;42217:24;;:33;;;;;;;:::i;:::-;;;;;;;;42286:7;42268:33;;;42295:5;42268:33;;;;;;:::i;:::-;;;;;;;;41946:363;;:::o;36616:167::-;36696:4;36720:55;36730:3;:10;;36766:5;36750:23;;36742:32;;36720:9;:55::i;:::-;36713:62;;36616:167;;;;:::o;47694:677::-;47788:1;47766:24;;:10;:24;;;47758:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;47854:10;47822;;:43;;;;;;;;;;;;;;;;;;47876:25;47922:10;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47876:67;;47990:1;47962:30;;47970:7;47962:30;;;47954:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48025:12;48040:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48025:32;;48079:7;:15;;;48103:4;48110;48079:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48068:8;;:47;;;;;;;;;;;;;;;;;;48150:1;48130:22;;:8;;;;;;;;;;;:22;;;48126:105;;48180:7;:18;;;48207:4;48214;48180:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48169:8;;:50;;;;;;;;;;;;;;;;;;48126:105;48271:1;48251:22;;:8;;;;;;;;;;;:22;;;48243:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48354:8;;;;;;;;;;;48315:48;;48341:10;;;;;;;;;;;48315:48;;;;;;;;;;;;47747:624;;47694:677;:::o;43077:825::-;43150:4;43181:1;43171:6;:11;43167:29;;43191:5;43184:12;;;;43167:29;43239:1;43211:24;;:29;43207:47;;43249:5;43242:12;;;;43207:47;43267:19;43301:11;43315:20;:11;:18;:20::i;:::-;43301:34;;43351:9;43346:525;43370:3;43366:1;:7;43346:525;;;43395:17;43415;43430:1;43415:11;:14;;:17;;;;:::i;:::-;43395:37;;43447:13;43474:1;43468:3;:7;;;;:::i;:::-;43463:1;:12;:128;;43567:24;;43545:7;:18;43553:9;43545:18;;;;;;;;;;;;;;;;43536:6;:27;;;;:::i;:::-;43535:56;;;;:::i;:::-;43463:128;;;43504:11;43495:6;:20;;;;:::i;:::-;43463:128;43447:144;;43612:7;43608:165;;;43640:42;43658:4;43665:9;43676:5;43640:9;:42::i;:::-;43608:165;;;43731:9;43723:27;;:34;43751:5;43723:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43608:165;43805:9;43792:30;;;43816:5;43792:30;;;;;;:::i;:::-;;;;;;;;43854:5;43839:20;;;;;:::i;:::-;;;43380:491;;43375:3;;;;;;;43346:525;;;;43890:4;43883:11;;;;43077:825;;;;;:::o;21808:191::-;21882:16;21901:6;;;;;;;;;;;21882:25;;21927:8;21918:6;;:17;;;;;;;;;;;;;;;;;;21982:8;21951:40;;21972:8;21951:40;;;;;;;;;;;;21871:128;21808:191;:::o;48379:651::-;45134:4;48476:32;;:13;:21;;;:32;;;;48468:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45134:4;48547:33;;:13;:22;;;:33;;;;48539:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45134:4;48620:37;;:13;:26;;;:37;;;;48612:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48695:17;48804:13;:32;;;48757:13;:31;;;48715:13;:26;;;:73;;;;:::i;:::-;:121;;;;:::i;:::-;48695:141;;48869:1;48855:10;:15;;;:46;;;;45200:5;48874:27;;:10;:27;;;48855:46;48847:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48955:13;48936:16;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48984:38;49008:13;48984:38;;;;;;:::i;:::-;;;;;;;;48457:573;48379:651;:::o;47086:253::-;47208:8;47178:38;;:17;:26;47196:7;47178:26;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;47170:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47272:8;47243:17;:26;47261:7;47243:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;47313:7;47296:35;;;47322:8;47296:35;;;;;;:::i;:::-;;;;;;;;47086:253;;:::o;18871:261::-;18956:1;18946:6;:11;:50;;;;18992:4;18987:1;18971:13;:11;:13::i;:::-;:17;;;;:::i;:::-;18970:26;;;;:::i;:::-;18961:6;:35;18946:50;18938:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;19070:6;19050:17;:26;;;;19092:32;19117:6;19092:32;;;;;;:::i;:::-;;;;;;;;18871:261;:::o;47347:218::-;47454:4;47429:29;;:8;:21;47438:11;47429:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;47421:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47509:4;47485:8;:21;47494:11;47485:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;47539:11;47529:28;;;47552:4;47529:28;;;;;;:::i;:::-;;;;;;;;47347:218;;:::o;42631:438::-;42725:29;42746:7;42725:11;:20;;:29;;;;:::i;:::-;42717:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;42803:1;42795:5;:9;42787:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;42835:16;42854:7;:16;42862:7;42854:16;;;;;;;;;;;;;;;;42835:35;;42909:8;42881:24;;:36;;;;;;;:::i;:::-;;;;;;;;42949:5;42930:7;:16;42938:7;42930:16;;;;;;;;;;;;;;;:24;;;;42993:5;42965:24;;:33;;;;;;;:::i;:::-;;;;;;;;43036:7;43016:45;;;43045:8;43055:5;43016:45;;;;;;;:::i;:::-;;;;;;;;42706:363;42631:438;;:::o;50648:577::-;50794:21;50832:1;50818:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50794:40;;50863:4;50845;50850:1;50845:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;50889:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50879:4;50884:1;50879:7;;;;;;;;:::i;:::-;;;;;;;:27;;;;;;;;;;;50919:57;50936:4;50951:10;;;;;;;;;;;50964:11;50919:8;:57::i;:::-;51015:10;;;;;;;;;;;:61;;;51091:11;51117:12;51144:4;51171;51191:15;51015:202;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50726:499;50648:577;;:::o;51261:511::-;51410:57;51427:4;51442:10;;;;;;;;;;;51455:11;51410:8;:57::i;:::-;51510:10;;;;;;;;;;;:26;;;51544:9;51577:4;51597:11;51623:1;51666;51709:14;;;;;;;;;;;51738:15;51510:254;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;51261:511;;:::o;36372:158::-;36445:4;36469:53;36477:3;:10;;36513:5;36497:23;;36489:32;;36469:7;:53::i;:::-;36462:60;;36372:158;;;;:::o;52591:1988::-;52707:1;52697:6;:11;;52689:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52738:14;52767:15;52786;;;;;;;;;;;52785:16;:35;;;;;52805:15;;;;;;;;;;;52785:35;52767:53;;52838:15;;;;;;;;;;;52833:737;;52870:17;52890:24;52909:4;52890:18;:24::i;:::-;52870:44;;52929:15;52947:22;52966:2;52947:18;:22::i;:::-;52929:40;;52986:11;53000:14;53009:4;53000:8;:14::i;:::-;52986:28;;53029:9;53041:12;53050:2;53041:8;:12::i;:::-;53029:24;;53074:6;:15;;;;;53085:4;53084:5;53074:15;:30;;;;;53094:10;53093:11;53074:30;:59;;;;;53122:10;;;;;;;;;;;53108:25;;:2;:25;;;;53074:59;53070:489;;;53191:16;:24;;;;;;;;;;;;53182:33;;;;53070:489;;;53241:4;:21;;;;;53250:12;53249:13;53241:21;:36;;;;;53267:10;53266:11;53241:36;53237:322;;;53336:16;:25;;;;;;;;;;;;53327:34;;;;53237:322;;;53388:6;53387:7;:16;;;;;53399:4;53398:5;53387:16;:47;;;;;53423:10;;;;;;;;;;;53407:27;;:4;:27;;;;53387:47;:64;;;;;53439:12;53438:13;53387:64;53383:176;;;53514:16;:29;;;;;;;;;;;;53505:38;;;;53383:176;53237:322;53070:489;52855:715;;;;52833:737;53611:10;:24;;;;;53634:1;53625:6;:10;53611:24;:43;;;;;53640:8;:14;53649:4;53640:14;;;;;;;;;;;;;;;;;;;;;;;;;53639:15;53611:43;53607:257;;;53671:28;53702:24;53720:4;53702:9;:24::i;:::-;53671:55;;53769:15;;53745:20;:39;53741:112;;53805:32;53818:15;;53835:1;53805:12;:32::i;:::-;53741:112;53656:208;53607:257;53889:1;53880:6;:10;53876:696;;;53907:17;45200:5;53927:33;;53937:6;53928;:15;;;;:::i;:::-;53927:33;;;;:::i;:::-;53907:53;;53975:18;54005:9;53996:6;:18;;;;:::i;:::-;53975:39;;54029:18;45200:5;54050:59;;54063:16;:29;;;;;;;;;;;;54051:41;;:9;:41;;;;:::i;:::-;54050:59;;;;:::i;:::-;54029:80;;54143:1;54130:10;:14;54126:144;;;54178:10;54165:23;;;;;:::i;:::-;;;54207:47;54223:4;45051:42;54243:10;54207:15;:47::i;:::-;54126:144;54302:1;54290:9;:13;54286:101;;;54324:47;54340:4;54354;54361:9;54324:15;:47::i;:::-;54286:101;54420:1;54407:10;:14;54403:92;;;54442:37;54458:4;54464:2;54468:10;54442:15;:37::i;:::-;54403:92;53892:614;;;53876:696;;;54527:33;54543:4;54549:2;54553:6;54527:15;:33::i;:::-;53876:696;52678:1901;;52591:1988;;;:::o;36044:152::-;36114:4;36138:50;36143:3;:10;;36179:5;36163:23;;36155:32;;36138:4;:50::i;:::-;36131:57;;36044:152;;;;:::o;31869:131::-;31942:4;31991:1;31966:3;:14;;:21;31981:5;31966:21;;;;;;;;;;;;:26;;31959:33;;31869:131;;;;:::o;36869:117::-;36932:7;36959:19;36967:3;:10;;36959:7;:19::i;:::-;36952:26;;36869:117;;;:::o;37340:158::-;37414:7;37465:22;37469:3;:10;;37481:5;37465:3;:22::i;:::-;37457:31;;37434:56;;37340:158;;;;:::o;30383:1400::-;30449:4;30561:16;30580:3;:14;;:21;30595:5;30580:21;;;;;;;;;;;;30561:40;;30630:1;30618:8;:13;30614:1162;;30991:18;31023:1;31012:8;:12;;;;:::i;:::-;30991:33;;31039:17;31080:1;31059:3;:11;;:18;;;;:22;;;;:::i;:::-;31039:42;;31116:9;31102:10;:23;31098:385;;31146:17;31166:3;:11;;31178:9;31166:22;;;;;;;;:::i;:::-;;;;;;;;;;31146:42;;31316:9;31290:3;:11;;31302:10;31290:23;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;31459:8;31431:3;:14;;:25;31446:9;31431:25;;;;;;;;;;;:36;;;;31127:356;31098:385;31564:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31670:3;:14;;:21;31685:5;31670:21;;;;;;;;;;;31663:28;;;31715:4;31708:11;;;;;;;30614:1162;31759:5;31752:12;;;30383:1400;;;;;:::o;11864:840::-;12011:1;11995:18;;:4;:18;;;11987:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12088:1;12074:16;;:2;:16;;;12066:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12143:38;12164:4;12170:2;12174:6;12143:20;:38::i;:::-;12194:19;12216:9;:15;12226:4;12216:15;;;;;;;;;;;;;;;;12194:37;;12265:6;12250:11;:21;;12242:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12382:6;12368:11;:20;12350:9;:15;12360:4;12350:15;;;;;;;;;;;;;;;:38;;;;12585:6;12568:9;:13;12578:2;12568:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12635:2;12620:26;;12629:4;12620:26;;;12639:6;12620:26;;;;;;:::i;:::-;;;;;;;;12659:37;12679:4;12685:2;12689:6;12659:19;:37::i;:::-;11976:728;11864:840;;;:::o;29791:416::-;29854:4;29876:21;29886:3;29891:5;29876:9;:21::i;:::-;29871:329;;29914:3;:11;;29931:5;29914:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30099:3;:11;;:18;;;;30075:3;:14;;:21;30090:5;30075:21;;;;;;;;;;;:42;;;;30139:4;30132:11;;;;29871:329;30183:5;30176:12;;29791:416;;;;;:::o;32086:109::-;32142:7;32169:3;:11;;:18;;;;32162:25;;32086:109;;;:::o;32549:120::-;32616:7;32643:3;:11;;32655:5;32643:18;;;;;;;;:::i;:::-;;;;;;;;;;32636:25;;32549:120;;;;:::o;57587:218::-;57753:44;57780:4;57786:2;57790:6;57753:26;:44::i;:::-;57587:218;;;:::o;17438:124::-;;;;:::o;19140:223::-;19282:4;19288:2;19292:6;18405:1;18384:17;;:22;;:61;;;;;18411:34;18435:9;18411:23;:34::i;:::-;18410:35;18384:61;18380:175;;;18503:17;;18493:6;18470:20;18480:9;18470;:20::i;:::-;:29;;;;:::i;:::-;:50;;18462:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;18380:175;19311:44:::1;19338:4;19344:2;19348:6;19311:26;:44::i;:::-;19140:223:::0;;;;;;:::o;16709:125::-;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1784:75::-;1817:6;1850:2;1844:9;1834:19;;1784:75;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:329::-;2677:6;2726:2;2714:9;2705:7;2701:23;2697:32;2694:119;;;2732:79;;:::i;:::-;2694:119;2852:1;2877:53;2922:7;2913:6;2902:9;2898:22;2877:53;:::i;:::-;2867:63;;2823:117;2618:329;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:474::-;4201:6;4209;4258:2;4246:9;4237:7;4233:23;4229:32;4226:119;;;4264:79;;:::i;:::-;4226:119;4384:1;4409:53;4454:7;4445:6;4434:9;4430:22;4409:53;:::i;:::-;4399:63;;4355:117;4511:2;4537:53;4582:7;4573:6;4562:9;4558:22;4537:53;:::i;:::-;4527:63;;4482:118;4133:474;;;;;:::o;4613:329::-;4672:6;4721:2;4709:9;4700:7;4696:23;4692:32;4689:119;;;4727:79;;:::i;:::-;4689:119;4847:1;4872:53;4917:7;4908:6;4897:9;4893:22;4872:53;:::i;:::-;4862:63;;4818:117;4613:329;;;;:::o;4948:619::-;5025:6;5033;5041;5090:2;5078:9;5069:7;5065:23;5061:32;5058:119;;;5096:79;;:::i;:::-;5058:119;5216:1;5241:53;5286:7;5277:6;5266:9;5262:22;5241:53;:::i;:::-;5231:63;;5187:117;5343:2;5369:53;5414:7;5405:6;5394:9;5390:22;5369:53;:::i;:::-;5359:63;;5314:118;5471:2;5497:53;5542:7;5533:6;5522:9;5518:22;5497:53;:::i;:::-;5487:63;;5442:118;4948:619;;;;;:::o;5573:118::-;5660:24;5678:5;5660:24;:::i;:::-;5655:3;5648:37;5573:118;;:::o;5697:222::-;5790:4;5828:2;5817:9;5813:18;5805:26;;5841:71;5909:1;5898:9;5894:17;5885:6;5841:71;:::i;:::-;5697:222;;;;:::o;5925:86::-;5960:7;6000:4;5993:5;5989:16;5978:27;;5925:86;;;:::o;6017:112::-;6100:22;6116:5;6100:22;:::i;:::-;6095:3;6088:35;6017:112;;:::o;6135:214::-;6224:4;6262:2;6251:9;6247:18;6239:26;;6275:67;6339:1;6328:9;6324:17;6315:6;6275:67;:::i;:::-;6135:214;;;;:::o;6355:116::-;6425:21;6440:5;6425:21;:::i;:::-;6418:5;6415:32;6405:60;;6461:1;6458;6451:12;6405:60;6355:116;:::o;6477:133::-;6520:5;6558:6;6545:20;6536:29;;6574:30;6598:5;6574:30;:::i;:::-;6477:133;;;;:::o;6616:468::-;6681:6;6689;6738:2;6726:9;6717:7;6713:23;6709:32;6706:119;;;6744:79;;:::i;:::-;6706:119;6864:1;6889:53;6934:7;6925:6;6914:9;6910:22;6889:53;:::i;:::-;6879:63;;6835:117;6991:2;7017:50;7059:7;7050:6;7039:9;7035:22;7017:50;:::i;:::-;7007:60;;6962:115;6616:468;;;;;:::o;7090:117::-;7199:1;7196;7189:12;7257:241;7339:5;7380:3;7371:6;7366:3;7362:16;7358:26;7355:113;;;7387:79;;:::i;:::-;7355:113;7486:6;7477:15;;7257:241;;;;:::o;7504:402::-;7599:6;7648:3;7636:9;7627:7;7623:23;7619:33;7616:120;;;7655:79;;:::i;:::-;7616:120;7775:1;7800:89;7881:7;7872:6;7861:9;7857:22;7800:89;:::i;:::-;7790:99;;7746:153;7504:402;;;;:::o;7912:323::-;7968:6;8017:2;8005:9;7996:7;7992:23;7988:32;7985:119;;;8023:79;;:::i;:::-;7985:119;8143:1;8168:50;8210:7;8201:6;8190:9;8186:22;8168:50;:::i;:::-;8158:60;;8114:114;7912:323;;;;:::o;8241:89::-;8277:7;8317:6;8310:5;8306:18;8295:29;;8241:89;;;:::o;8336:115::-;8421:23;8438:5;8421:23;:::i;:::-;8416:3;8409:36;8336:115;;:::o;8457:751::-;8678:4;8716:3;8705:9;8701:19;8693:27;;8730:69;8796:1;8785:9;8781:17;8772:6;8730:69;:::i;:::-;8809:70;8875:2;8864:9;8860:18;8851:6;8809:70;:::i;:::-;8889;8955:2;8944:9;8940:18;8931:6;8889:70;:::i;:::-;8969;9035:2;9024:9;9020:18;9011:6;8969:70;:::i;:::-;9049:71;9115:3;9104:9;9100:19;9091:6;9049:71;:::i;:::-;9130;9196:3;9185:9;9181:19;9172:6;9130:71;:::i;:::-;8457:751;;;;;;;;;:::o;9214:468::-;9279:6;9287;9336:2;9324:9;9315:7;9311:23;9307:32;9304:119;;;9342:79;;:::i;:::-;9304:119;9462:1;9487:53;9532:7;9523:6;9512:9;9508:22;9487:53;:::i;:::-;9477:63;;9433:117;9589:2;9615:50;9657:7;9648:6;9637:9;9633:22;9615:50;:::i;:::-;9605:60;;9560:115;9214:468;;;;;:::o;9688:218::-;9779:4;9817:2;9806:9;9802:18;9794:26;;9830:69;9896:1;9885:9;9881:17;9872:6;9830:69;:::i;:::-;9688:218;;;;:::o;9912:60::-;9940:3;9961:5;9954:12;;9912:60;;;:::o;9978:142::-;10028:9;10061:53;10079:34;10088:24;10106:5;10088:24;:::i;:::-;10079:34;:::i;:::-;10061:53;:::i;:::-;10048:66;;9978:142;;;:::o;10126:126::-;10176:9;10209:37;10240:5;10209:37;:::i;:::-;10196:50;;10126:126;;;:::o;10258:153::-;10335:9;10368:37;10399:5;10368:37;:::i;:::-;10355:50;;10258:153;;;:::o;10417:185::-;10531:64;10589:5;10531:64;:::i;:::-;10526:3;10519:77;10417:185;;:::o;10608:276::-;10728:4;10766:2;10755:9;10751:18;10743:26;;10779:98;10874:1;10863:9;10859:17;10850:6;10779:98;:::i;:::-;10608:276;;;;:::o;10890:474::-;10958:6;10966;11015:2;11003:9;10994:7;10990:23;10986:32;10983:119;;;11021:79;;:::i;:::-;10983:119;11141:1;11166:53;11211:7;11202:6;11191:9;11187:22;11166:53;:::i;:::-;11156:63;;11112:117;11268:2;11294:53;11339:7;11330:6;11319:9;11315:22;11294:53;:::i;:::-;11284:63;;11239:118;10890:474;;;;;:::o;11370:180::-;11418:77;11415:1;11408:88;11515:4;11512:1;11505:15;11539:4;11536:1;11529:15;11556:320;11600:6;11637:1;11631:4;11627:12;11617:22;;11684:1;11678:4;11674:12;11705:18;11695:81;;11761:4;11753:6;11749:17;11739:27;;11695:81;11823:2;11815:6;11812:14;11792:18;11789:38;11786:84;;11842:18;;:::i;:::-;11786:84;11607:269;11556:320;;;:::o;11882:165::-;12022:17;12018:1;12010:6;12006:14;11999:41;11882:165;:::o;12053:366::-;12195:3;12216:67;12280:2;12275:3;12216:67;:::i;:::-;12209:74;;12292:93;12381:3;12292:93;:::i;:::-;12410:2;12405:3;12401:12;12394:19;;12053:366;;;:::o;12425:419::-;12591:4;12629:2;12618:9;12614:18;12606:26;;12678:9;12672:4;12668:20;12664:1;12653:9;12649:17;12642:47;12706:131;12832:4;12706:131;:::i;:::-;12698:139;;12425:419;;;:::o;12850:180::-;12898:77;12895:1;12888:88;12995:4;12992:1;12985:15;13019:4;13016:1;13009:15;13036:191;13076:3;13095:20;13113:1;13095:20;:::i;:::-;13090:25;;13129:20;13147:1;13129:20;:::i;:::-;13124:25;;13172:1;13169;13165:9;13158:16;;13193:3;13190:1;13187:10;13184:36;;;13200:18;;:::i;:::-;13184:36;13036:191;;;;:::o;13233:168::-;13373:20;13369:1;13361:6;13357:14;13350:44;13233:168;:::o;13407:366::-;13549:3;13570:67;13634:2;13629:3;13570:67;:::i;:::-;13563:74;;13646:93;13735:3;13646:93;:::i;:::-;13764:2;13759:3;13755:12;13748:19;;13407:366;;;:::o;13779:419::-;13945:4;13983:2;13972:9;13968:18;13960:26;;14032:9;14026:4;14022:20;14018:1;14007:9;14003:17;13996:47;14060:131;14186:4;14060:131;:::i;:::-;14052:139;;13779:419;;;:::o;14204:117::-;14313:1;14310;14303:12;14327:180;14375:77;14372:1;14365:88;14472:4;14469:1;14462:15;14496:4;14493:1;14486:15;14513:281;14596:27;14618:4;14596:27;:::i;:::-;14588:6;14584:40;14726:6;14714:10;14711:22;14690:18;14678:10;14675:34;14672:62;14669:88;;;14737:18;;:::i;:::-;14669:88;14777:10;14773:2;14766:22;14556:238;14513:281;;:::o;14800:129::-;14834:6;14861:20;;:::i;:::-;14851:30;;14890:33;14918:4;14910:6;14890:33;:::i;:::-;14800:129;;;:::o;15058:120::-;15130:23;15147:5;15130:23;:::i;:::-;15123:5;15120:34;15110:62;;15168:1;15165;15158:12;15110:62;15058:120;:::o;15184:137::-;15229:5;15267:6;15254:20;15245:29;;15283:32;15309:5;15283:32;:::i;:::-;15184:137;;;;:::o;15371:1273::-;15454:5;15498:4;15486:9;15481:3;15477:19;15473:30;15470:117;;;15506:79;;:::i;:::-;15470:117;15605:21;15621:4;15605:21;:::i;:::-;15596:30;;15688:1;15728:48;15772:3;15763:6;15752:9;15748:22;15728:48;:::i;:::-;15721:4;15714:5;15710:16;15703:74;15636:152;15851:2;15892:48;15936:3;15927:6;15916:9;15912:22;15892:48;:::i;:::-;15885:4;15878:5;15874:16;15867:74;15798:154;16019:2;16060:48;16104:3;16095:6;16084:9;16080:22;16060:48;:::i;:::-;16053:4;16046:5;16042:16;16035:74;15962:158;16187:2;16228:48;16272:3;16263:6;16252:9;16248:22;16228:48;:::i;:::-;16221:4;16214:5;16210:16;16203:74;16130:158;16360:3;16402:48;16446:3;16437:6;16426:9;16422:22;16402:48;:::i;:::-;16395:4;16388:5;16384:16;16377:74;16298:164;16535:3;16577:48;16621:3;16612:6;16601:9;16597:22;16577:48;:::i;:::-;16570:4;16563:5;16559:16;16552:74;16472:165;15371:1273;;;;:::o;16650:398::-;16743:6;16792:3;16780:9;16771:7;16767:23;16763:33;16760:120;;;16799:79;;:::i;:::-;16760:120;16919:1;16944:87;17023:7;17014:6;17003:9;16999:22;16944:87;:::i;:::-;16934:97;;16890:151;16650:398;;;;:::o;17054:161::-;17194:13;17190:1;17182:6;17178:14;17171:37;17054:161;:::o;17221:366::-;17363:3;17384:67;17448:2;17443:3;17384:67;:::i;:::-;17377:74;;17460:93;17549:3;17460:93;:::i;:::-;17578:2;17573:3;17569:12;17562:19;;17221:366;;;:::o;17593:419::-;17759:4;17797:2;17786:9;17782:18;17774:26;;17846:9;17840:4;17836:20;17832:1;17821:9;17817:17;17810:47;17874:131;18000:4;17874:131;:::i;:::-;17866:139;;17593:419;;;:::o;18018:224::-;18158:34;18154:1;18146:6;18142:14;18135:58;18227:7;18222:2;18214:6;18210:15;18203:32;18018:224;:::o;18248:366::-;18390:3;18411:67;18475:2;18470:3;18411:67;:::i;:::-;18404:74;;18487:93;18576:3;18487:93;:::i;:::-;18605:2;18600:3;18596:12;18589:19;;18248:366;;;:::o;18620:419::-;18786:4;18824:2;18813:9;18809:18;18801:26;;18873:9;18867:4;18863:20;18859:1;18848:9;18844:17;18837:47;18901:131;19027:4;18901:131;:::i;:::-;18893:139;;18620:419;;;:::o;19045:225::-;19185:34;19181:1;19173:6;19169:14;19162:58;19254:8;19249:2;19241:6;19237:15;19230:33;19045:225;:::o;19276:366::-;19418:3;19439:67;19503:2;19498:3;19439:67;:::i;:::-;19432:74;;19515:93;19604:3;19515:93;:::i;:::-;19633:2;19628:3;19624:12;19617:19;;19276:366;;;:::o;19648:419::-;19814:4;19852:2;19841:9;19837:18;19829:26;;19901:9;19895:4;19891:20;19887:1;19876:9;19872:17;19865:47;19929:131;20055:4;19929:131;:::i;:::-;19921:139;;19648:419;;;:::o;20073:182::-;20213:34;20209:1;20201:6;20197:14;20190:58;20073:182;:::o;20261:366::-;20403:3;20424:67;20488:2;20483:3;20424:67;:::i;:::-;20417:74;;20500:93;20589:3;20500:93;:::i;:::-;20618:2;20613:3;20609:12;20602:19;;20261:366;;;:::o;20633:419::-;20799:4;20837:2;20826:9;20822:18;20814:26;;20886:9;20880:4;20876:20;20872:1;20861:9;20857:17;20850:47;20914:131;21040:4;20914:131;:::i;:::-;20906:139;;20633:419;;;:::o;21058:223::-;21198:34;21194:1;21186:6;21182:14;21175:58;21267:6;21262:2;21254:6;21250:15;21243:31;21058:223;:::o;21287:366::-;21429:3;21450:67;21514:2;21509:3;21450:67;:::i;:::-;21443:74;;21526:93;21615:3;21526:93;:::i;:::-;21644:2;21639:3;21635:12;21628:19;;21287:366;;;:::o;21659:419::-;21825:4;21863:2;21852:9;21848:18;21840:26;;21912:9;21906:4;21902:20;21898:1;21887:9;21883:17;21876:47;21940:131;22066:4;21940:131;:::i;:::-;21932:139;;21659:419;;;:::o;22084:221::-;22224:34;22220:1;22212:6;22208:14;22201:58;22293:4;22288:2;22280:6;22276:15;22269:29;22084:221;:::o;22311:366::-;22453:3;22474:67;22538:2;22533:3;22474:67;:::i;:::-;22467:74;;22550:93;22639:3;22550:93;:::i;:::-;22668:2;22663:3;22659:12;22652:19;;22311:366;;;:::o;22683:419::-;22849:4;22887:2;22876:9;22872:18;22864:26;;22936:9;22930:4;22926:20;22922:1;22911:9;22907:17;22900:47;22964:131;23090:4;22964:131;:::i;:::-;22956:139;;22683:419;;;:::o;23108:196::-;23147:4;23167:19;23184:1;23167:19;:::i;:::-;23162:24;;23200:19;23217:1;23200:19;:::i;:::-;23195:24;;23243:1;23240;23236:9;23228:17;;23267:6;23261:4;23258:16;23255:42;;;23277:18;;:::i;:::-;23255:42;23108:196;;;;:::o;23310:410::-;23350:7;23373:20;23391:1;23373:20;:::i;:::-;23368:25;;23407:20;23425:1;23407:20;:::i;:::-;23402:25;;23462:1;23459;23455:9;23484:30;23502:11;23484:30;:::i;:::-;23473:41;;23663:1;23654:7;23650:15;23647:1;23644:22;23624:1;23617:9;23597:83;23574:139;;23693:18;;:::i;:::-;23574:139;23358:362;23310:410;;;;:::o;23726:180::-;23774:77;23771:1;23764:88;23871:4;23868:1;23861:15;23895:4;23892:1;23885:15;23912:185;23952:1;23969:20;23987:1;23969:20;:::i;:::-;23964:25;;24003:20;24021:1;24003:20;:::i;:::-;23998:25;;24042:1;24032:35;;24047:18;;:::i;:::-;24032:35;24089:1;24086;24082:9;24077:14;;23912:185;;;;:::o;24103:194::-;24143:4;24163:20;24181:1;24163:20;:::i;:::-;24158:25;;24197:20;24215:1;24197:20;:::i;:::-;24192:25;;24241:1;24238;24234:9;24226:17;;24265:1;24259:4;24256:11;24253:37;;;24270:18;;:::i;:::-;24253:37;24103:194;;;;:::o;24303:167::-;24443:19;24439:1;24431:6;24427:14;24420:43;24303:167;:::o;24476:366::-;24618:3;24639:67;24703:2;24698:3;24639:67;:::i;:::-;24632:74;;24715:93;24804:3;24715:93;:::i;:::-;24833:2;24828:3;24824:12;24817:19;;24476:366;;;:::o;24848:419::-;25014:4;25052:2;25041:9;25037:18;25029:26;;25101:9;25095:4;25091:20;25087:1;25076:9;25072:17;25065:47;25129:131;25255:4;25129:131;:::i;:::-;25121:139;;24848:419;;;:::o;25273:179::-;25413:31;25409:1;25401:6;25397:14;25390:55;25273:179;:::o;25458:366::-;25600:3;25621:67;25685:2;25680:3;25621:67;:::i;:::-;25614:74;;25697:93;25786:3;25697:93;:::i;:::-;25815:2;25810:3;25806:12;25799:19;;25458:366;;;:::o;25830:419::-;25996:4;26034:2;26023:9;26019:18;26011:26;;26083:9;26077:4;26073:20;26069:1;26058:9;26054:17;26047:47;26111:131;26237:4;26111:131;:::i;:::-;26103:139;;25830:419;;;:::o;26255:171::-;26395:23;26391:1;26383:6;26379:14;26372:47;26255:171;:::o;26432:366::-;26574:3;26595:67;26659:2;26654:3;26595:67;:::i;:::-;26588:74;;26671:93;26760:3;26671:93;:::i;:::-;26789:2;26784:3;26780:12;26773:19;;26432:366;;;:::o;26804:419::-;26970:4;27008:2;26997:9;26993:18;26985:26;;27057:9;27051:4;27047:20;27043:1;27032:9;27028:17;27021:47;27085:131;27211:4;27085:131;:::i;:::-;27077:139;;26804:419;;;:::o;27229:163::-;27369:15;27365:1;27357:6;27353:14;27346:39;27229:163;:::o;27398:366::-;27540:3;27561:67;27625:2;27620:3;27561:67;:::i;:::-;27554:74;;27637:93;27726:3;27637:93;:::i;:::-;27755:2;27750:3;27746:12;27739:19;;27398:366;;;:::o;27770:419::-;27936:4;27974:2;27963:9;27959:18;27951:26;;28023:9;28017:4;28013:20;28009:1;27998:9;27994:17;27987:47;28051:131;28177:4;28051:131;:::i;:::-;28043:139;;27770:419;;;:::o;28195:164::-;28335:16;28331:1;28323:6;28319:14;28312:40;28195:164;:::o;28365:366::-;28507:3;28528:67;28592:2;28587:3;28528:67;:::i;:::-;28521:74;;28604:93;28693:3;28604:93;:::i;:::-;28722:2;28717:3;28713:12;28706:19;;28365:366;;;:::o;28737:419::-;28903:4;28941:2;28930:9;28926:18;28918:26;;28990:9;28984:4;28980:20;28976:1;28965:9;28961:17;28954:47;29018:131;29144:4;29018:131;:::i;:::-;29010:139;;28737:419;;;:::o;29162:143::-;29219:5;29250:6;29244:13;29235:22;;29266:33;29293:5;29266:33;:::i;:::-;29162:143;;;;:::o;29311:351::-;29381:6;29430:2;29418:9;29409:7;29405:23;29401:32;29398:119;;;29436:79;;:::i;:::-;29398:119;29556:1;29581:64;29637:7;29628:6;29617:9;29613:22;29581:64;:::i;:::-;29571:74;;29527:128;29311:351;;;;:::o;29668:165::-;29808:17;29804:1;29796:6;29792:14;29785:41;29668:165;:::o;29839:366::-;29981:3;30002:67;30066:2;30061:3;30002:67;:::i;:::-;29995:74;;30078:93;30167:3;30078:93;:::i;:::-;30196:2;30191:3;30187:12;30180:19;;29839:366;;;:::o;30211:419::-;30377:4;30415:2;30404:9;30400:18;30392:26;;30464:9;30458:4;30454:20;30450:1;30439:9;30435:17;30428:47;30492:131;30618:4;30492:131;:::i;:::-;30484:139;;30211:419;;;:::o;30636:332::-;30757:4;30795:2;30784:9;30780:18;30772:26;;30808:71;30876:1;30865:9;30861:17;30852:6;30808:71;:::i;:::-;30889:72;30957:2;30946:9;30942:18;30933:6;30889:72;:::i;:::-;30636:332;;;;;:::o;30974:171::-;31114:23;31110:1;31102:6;31098:14;31091:47;30974:171;:::o;31151:366::-;31293:3;31314:67;31378:2;31373:3;31314:67;:::i;:::-;31307:74;;31390:93;31479:3;31390:93;:::i;:::-;31508:2;31503:3;31499:12;31492:19;;31151:366;;;:::o;31523:419::-;31689:4;31727:2;31716:9;31712:18;31704:26;;31776:9;31770:4;31766:20;31762:1;31751:9;31747:17;31740:47;31804:131;31930:4;31804:131;:::i;:::-;31796:139;;31523:419;;;:::o;31948:165::-;32088:17;32084:1;32076:6;32072:14;32065:41;31948:165;:::o;32119:366::-;32261:3;32282:67;32346:2;32341:3;32282:67;:::i;:::-;32275:74;;32358:93;32447:3;32358:93;:::i;:::-;32476:2;32471:3;32467:12;32460:19;;32119:366;;;:::o;32491:419::-;32657:4;32695:2;32684:9;32680:18;32672:26;;32744:9;32738:4;32734:20;32730:1;32719:9;32715:17;32708:47;32772:131;32898:4;32772:131;:::i;:::-;32764:139;;32491:419;;;:::o;32916:166::-;33056:18;33052:1;33044:6;33040:14;33033:42;32916:166;:::o;33088:366::-;33230:3;33251:67;33315:2;33310:3;33251:67;:::i;:::-;33244:74;;33327:93;33416:3;33327:93;:::i;:::-;33445:2;33440:3;33436:12;33429:19;;33088:366;;;:::o;33460:419::-;33626:4;33664:2;33653:9;33649:18;33641:26;;33713:9;33707:4;33703:20;33699:1;33688:9;33684:17;33677:47;33741:131;33867:4;33741:131;:::i;:::-;33733:139;;33460:419;;;:::o;33885:170::-;34025:22;34021:1;34013:6;34009:14;34002:46;33885:170;:::o;34061:366::-;34203:3;34224:67;34288:2;34283:3;34224:67;:::i;:::-;34217:74;;34300:93;34389:3;34300:93;:::i;:::-;34418:2;34413:3;34409:12;34402:19;;34061:366;;;:::o;34433:419::-;34599:4;34637:2;34626:9;34622:18;34614:26;;34686:9;34680:4;34676:20;34672:1;34661:9;34657:17;34650:47;34714:131;34840:4;34714:131;:::i;:::-;34706:139;;34433:419;;;:::o;34858:193::-;34897:3;34916:19;34933:1;34916:19;:::i;:::-;34911:24;;34949:19;34966:1;34949:19;:::i;:::-;34944:24;;34991:1;34988;34984:9;34977:16;;35014:6;35009:3;35006:15;35003:41;;;35024:18;;:::i;:::-;35003:41;34858:193;;;;:::o;35057:167::-;35197:19;35193:1;35185:6;35181:14;35174:43;35057:167;:::o;35230:366::-;35372:3;35393:67;35457:2;35452:3;35393:67;:::i;:::-;35386:74;;35469:93;35558:3;35469:93;:::i;:::-;35587:2;35582:3;35578:12;35571:19;;35230:366;;;:::o;35602:419::-;35768:4;35806:2;35795:9;35791:18;35783:26;;35855:9;35849:4;35845:20;35841:1;35830:9;35826:17;35819:47;35883:131;36009:4;35883:131;:::i;:::-;35875:139;;35602:419;;;:::o;36027:105::-;36102:23;36119:5;36102:23;:::i;:::-;36097:3;36090:36;36027:105;;:::o;36222:1259::-;36387:4;36382:3;36378:14;36477:4;36470:5;36466:16;36460:23;36496:61;36551:4;36546:3;36542:14;36528:12;36496:61;:::i;:::-;36402:165;36653:4;36646:5;36642:16;36636:23;36672:61;36727:4;36722:3;36718:14;36704:12;36672:61;:::i;:::-;36577:166;36833:4;36826:5;36822:16;36816:23;36852:61;36907:4;36902:3;36898:14;36884:12;36852:61;:::i;:::-;36753:170;37013:4;37006:5;37002:16;36996:23;37032:61;37087:4;37082:3;37078:14;37064:12;37032:61;:::i;:::-;36933:170;37198:4;37191:5;37187:16;37181:23;37217:61;37272:4;37267:3;37263:14;37249:12;37217:61;:::i;:::-;37113:175;37384:4;37377:5;37373:16;37367:23;37403:61;37458:4;37453:3;37449:14;37435:12;37403:61;:::i;:::-;37298:176;36356:1125;36222:1259;;:::o;37487:359::-;37648:4;37686:3;37675:9;37671:19;37663:27;;37700:139;37836:1;37825:9;37821:17;37812:6;37700:139;:::i;:::-;37487:359;;;;:::o;37852:164::-;37992:16;37988:1;37980:6;37976:14;37969:40;37852:164;:::o;38022:366::-;38164:3;38185:67;38249:2;38244:3;38185:67;:::i;:::-;38178:74;;38261:93;38350:3;38261:93;:::i;:::-;38379:2;38374:3;38370:12;38363:19;;38022:366;;;:::o;38394:419::-;38560:4;38598:2;38587:9;38583:18;38575:26;;38647:9;38641:4;38637:20;38633:1;38622:9;38618:17;38611:47;38675:131;38801:4;38675:131;:::i;:::-;38667:139;;38394:419;;;:::o;38819:332::-;38940:4;38978:2;38967:9;38963:18;38955:26;;38991:71;39059:1;39048:9;39044:17;39035:6;38991:71;:::i;:::-;39072:72;39140:2;39129:9;39125:18;39116:6;39072:72;:::i;:::-;38819:332;;;;;:::o;39157:180::-;39205:77;39202:1;39195:88;39302:4;39299:1;39292:15;39326:4;39323:1;39316:15;39343:114;39410:6;39444:5;39438:12;39428:22;;39343:114;;;:::o;39463:184::-;39562:11;39596:6;39591:3;39584:19;39636:4;39631:3;39627:14;39612:29;;39463:184;;;;:::o;39653:132::-;39720:4;39743:3;39735:11;;39773:4;39768:3;39764:14;39756:22;;39653:132;;;:::o;39791:108::-;39868:24;39886:5;39868:24;:::i;:::-;39863:3;39856:37;39791:108;;:::o;39905:179::-;39974:10;39995:46;40037:3;40029:6;39995:46;:::i;:::-;40073:4;40068:3;40064:14;40050:28;;39905:179;;;;:::o;40090:113::-;40160:4;40192;40187:3;40183:14;40175:22;;40090:113;;;:::o;40239:732::-;40358:3;40387:54;40435:5;40387:54;:::i;:::-;40457:86;40536:6;40531:3;40457:86;:::i;:::-;40450:93;;40567:56;40617:5;40567:56;:::i;:::-;40646:7;40677:1;40662:284;40687:6;40684:1;40681:13;40662:284;;;40763:6;40757:13;40790:63;40849:3;40834:13;40790:63;:::i;:::-;40783:70;;40876:60;40929:6;40876:60;:::i;:::-;40866:70;;40722:224;40709:1;40706;40702:9;40697:14;;40662:284;;;40666:14;40962:3;40955:10;;40363:608;;;40239:732;;;;:::o;40977:815::-;41232:4;41270:3;41259:9;41255:19;41247:27;;41284:71;41352:1;41341:9;41337:17;41328:6;41284:71;:::i;:::-;41365:72;41433:2;41422:9;41418:18;41409:6;41365:72;:::i;:::-;41484:9;41478:4;41474:20;41469:2;41458:9;41454:18;41447:48;41512:108;41615:4;41606:6;41512:108;:::i;:::-;41504:116;;41630:72;41698:2;41687:9;41683:18;41674:6;41630:72;:::i;:::-;41712:73;41780:3;41769:9;41765:19;41756:6;41712:73;:::i;:::-;40977:815;;;;;;;;:::o;41798:85::-;41843:7;41872:5;41861:16;;41798:85;;;:::o;41889:158::-;41947:9;41980:61;41998:42;42007:32;42033:5;42007:32;:::i;:::-;41998:42;:::i;:::-;41980:61;:::i;:::-;41967:74;;41889:158;;;:::o;42053:147::-;42148:45;42187:5;42148:45;:::i;:::-;42143:3;42136:58;42053:147;;:::o;42206:807::-;42455:4;42493:3;42482:9;42478:19;42470:27;;42507:71;42575:1;42564:9;42560:17;42551:6;42507:71;:::i;:::-;42588:72;42656:2;42645:9;42641:18;42632:6;42588:72;:::i;:::-;42670:80;42746:2;42735:9;42731:18;42722:6;42670:80;:::i;:::-;42760;42836:2;42825:9;42821:18;42812:6;42760:80;:::i;:::-;42850:73;42918:3;42907:9;42903:19;42894:6;42850:73;:::i;:::-;42933;43001:3;42990:9;42986:19;42977:6;42933:73;:::i;:::-;42206:807;;;;;;;;;:::o;43019:143::-;43076:5;43107:6;43101:13;43092:22;;43123:33;43150:5;43123:33;:::i;:::-;43019:143;;;;:::o;43168:663::-;43256:6;43264;43272;43321:2;43309:9;43300:7;43296:23;43292:32;43289:119;;;43327:79;;:::i;:::-;43289:119;43447:1;43472:64;43528:7;43519:6;43508:9;43504:22;43472:64;:::i;:::-;43462:74;;43418:128;43585:2;43611:64;43667:7;43658:6;43647:9;43643:22;43611:64;:::i;:::-;43601:74;;43556:129;43724:2;43750:64;43806:7;43797:6;43786:9;43782:22;43750:64;:::i;:::-;43740:74;;43695:129;43168:663;;;;;:::o;43837:162::-;43977:14;43973:1;43965:6;43961:14;43954:38;43837:162;:::o;44005:366::-;44147:3;44168:67;44232:2;44227:3;44168:67;:::i;:::-;44161:74;;44244:93;44333:3;44244:93;:::i;:::-;44362:2;44357:3;44353:12;44346:19;;44005:366;;;:::o;44377:419::-;44543:4;44581:2;44570:9;44566:18;44558:26;;44630:9;44624:4;44620:20;44616:1;44605:9;44601:17;44594:47;44658:131;44784:4;44658:131;:::i;:::-;44650:139;;44377:419;;;:::o;44802:180::-;44850:77;44847:1;44840:88;44947:4;44944:1;44937:15;44971:4;44968:1;44961:15;44988:224;45128:34;45124:1;45116:6;45112:14;45105:58;45197:7;45192:2;45184:6;45180:15;45173:32;44988:224;:::o;45218:366::-;45360:3;45381:67;45445:2;45440:3;45381:67;:::i;:::-;45374:74;;45457:93;45546:3;45457:93;:::i;:::-;45575:2;45570:3;45566:12;45559:19;;45218:366;;;:::o;45590:419::-;45756:4;45794:2;45783:9;45779:18;45771:26;;45843:9;45837:4;45833:20;45829:1;45818:9;45814:17;45807:47;45871:131;45997:4;45871:131;:::i;:::-;45863:139;;45590:419;;;:::o;46015:222::-;46155:34;46151:1;46143:6;46139:14;46132:58;46224:5;46219:2;46211:6;46207:15;46200:30;46015:222;:::o;46243:366::-;46385:3;46406:67;46470:2;46465:3;46406:67;:::i;:::-;46399:74;;46482:93;46571:3;46482:93;:::i;:::-;46600:2;46595:3;46591:12;46584:19;;46243:366;;;:::o;46615:419::-;46781:4;46819:2;46808:9;46804:18;46796:26;;46868:9;46862:4;46858:20;46854:1;46843:9;46839:17;46832:47;46896:131;47022:4;46896:131;:::i;:::-;46888:139;;46615:419;;;:::o;47040:225::-;47180:34;47176:1;47168:6;47164:14;47157:58;47249:8;47244:2;47236:6;47232:15;47225:33;47040:225;:::o;47271:366::-;47413:3;47434:67;47498:2;47493:3;47434:67;:::i;:::-;47427:74;;47510:93;47599:3;47510:93;:::i;:::-;47628:2;47623:3;47619:12;47612:19;;47271:366;;;:::o;47643:419::-;47809:4;47847:2;47836:9;47832:18;47824:26;;47896:9;47890:4;47886:20;47882:1;47871:9;47867:17;47860:47;47924:131;48050:4;47924:131;:::i;:::-;47916:139;;47643:419;;;:::o;48068:168::-;48208:20;48204:1;48196:6;48192:14;48185:44;48068:168;:::o;48242:366::-;48384:3;48405:67;48469:2;48464:3;48405:67;:::i;:::-;48398:74;;48481:93;48570:3;48481:93;:::i;:::-;48599:2;48594:3;48590:12;48583:19;;48242:366;;;:::o;48614:419::-;48780:4;48818:2;48807:9;48803:18;48795:26;;48867:9;48861:4;48857:20;48853:1;48842:9;48838:17;48831:47;48895:131;49021:4;48895:131;:::i;:::-;48887:139;;48614:419;;;:::o

Swarm Source

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