ETH Price: $3,388.58 (-2.65%)
Gas: 1 Gwei

Token

Ape Gate Finance (APEGATE)
 

Overview

Max Total Supply

1,000,000,000 APEGATE

Holders

19

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
19,644,318.357291258077301203 APEGATE

Value
$0.00
0x76bb7a550c05ae1dcda72dc0d21762db794d301f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
ApeGateFinance

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// https://www.apegate.finance/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

// ERC Standard Objects
// --------------------------------------------------------------
/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Safe Math Helpers
// --------------------------------------------------------------
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

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

        return c;
    }

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

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

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @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_,
        uint8 decimals_
    ) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// Uniswap Router
// --------------------------------------------------------------
interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function allPairsLength() external view returns (uint256);

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

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

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Core Logic
// --------------------------------------------------------------
contract ApeGateFinance is Context, IERC20, Ownable {
    // Imports
    using SafeMath for uint256;
    using Address for address;

    // Context
    string private _name = "Ape Gate Finance";
    string private _symbol = "APEGATE";
    uint8 private _decimals = 18;

    // Supply
    uint256 private _totalSupply = 1 * 1e9 * 1e18;
    uint256 private minimumTokensBeforeSwap = (_totalSupply * 25) / 100000;

    // Restrictions
    uint256 public _maxTxAmount = (_totalSupply * 1) / 100;
    uint256 public _walletMax = (_totalSupply * 2) / 100;
    bool public checkWalletLimit = true;

    // wallets
    address payable public liquidityWallet =
        payable(0x60707C54B324173C744dA86e096f1b9816D7aFd4);
    address payable public buybackWallet =
        payable(0x60707C54B324173C744dA86e096f1b9816D7aFd4);
    address public immutable deadAddress =
        0x000000000000000000000000000000000000dEaD;

    // fees
    uint256 public liquidityFeeBuy = 0;
    uint256 public buybackFeeBuy = 1;
    uint256 public totalFeesBuy;
    uint256 public maxTotalFeeBuy = 2;

    // fees
    uint256 public liquidityFeeSell = 0;
    uint256 public buybackFeeSell = 3;
    uint256 public totalFeesSell;
    uint256 public maxTotalFeeSell = 4;

    // distribution ratio
    uint256 public _liquiditySharePercentage = 0;
    uint256 public _operationsSharePercentage = 100;
    uint256 public _totalDistributionShares;

    // max amounts
    mapping(address => uint256) _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isWalletLimitExempt;
    mapping(address => bool) isTxLimitExempt;

    // Router Information
    mapping(address => bool) public isMarketPair;
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapPair;

    // toggle swap back (fees)
    bool inSwapAndLiquify;
    uint256 public tokensForLiquidity;
    uint256 public tokensForOperations;

    // Launch Settings
    bool public tradingOpen = false;

    // events
    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );
    event BuybackWalletUpdated(
        address indexed newOperationsWallet,
        address indexed oldOperationsWallet
    );
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapTokensForETH(uint256 amountIn, address[] path);

    // toogle to stop swap if already underway
    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        // load total fees
        totalFeesBuy = buybackFeeBuy + liquidityFeeBuy;
        totalFeesSell = buybackFeeSell + liquidityFeeSell;

        // load total distribution
        _totalDistributionShares =
            _liquiditySharePercentage +
            _operationsSharePercentage;

        // create router ------------------------------
        IUniswapV2Router02 _uniswapV2Router;
        if (block.chainid == 1) {
            _uniswapV2Router = IUniswapV2Router02(
                0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
            );
        } else if (block.chainid == 5) {
            _uniswapV2Router = IUniswapV2Router02(
                0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
            );
        } else revert();

        // Create a uniswap pair for this new token
        uniswapPair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
            address(this),
            _uniswapV2Router.WETH()
        );
        uniswapV2Router = _uniswapV2Router;
        isMarketPair[address(uniswapPair)] = true;

        // set allowances
        _allowances[address(this)][address(uniswapV2Router)] = _totalSupply;

        // exclude from paying fees or having max transaction amount
        isExcludedFromFee[owner()] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[address(0xdead)] = true;
        isExcludedFromFee[liquidityWallet] = true;
        isExcludedFromFee[buybackWallet] = true;

        // exclude contracts from max wallet size
        isWalletLimitExempt[owner()] = true;
        isWalletLimitExempt[address(uniswapPair)] = true;
        isWalletLimitExempt[address(this)] = true;
        isWalletLimitExempt[liquidityWallet] = true;
        isWalletLimitExempt[buybackWallet] = true;

        // exclude contracts from max wallet size
        isTxLimitExempt[owner()] = true;
        isTxLimitExempt[address(uniswapPair)] = true;
        isTxLimitExempt[address(this)] = true;
        isTxLimitExempt[liquidityWallet] = true;
        isTxLimitExempt[buybackWallet] = true;

        _balances[_msgSender()] = _totalSupply;
        emit Transfer(address(0), _msgSender(), _totalSupply);
    }

    receive() external payable {}

    // @dev Public read functions start -------------------------------------
    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

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

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    // custom allowance methods
    function allowance(address owner, address spender)
        public
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    bool isFeeCheck = false;

    // get minimum tokens before swap
    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    // approve spending methods
    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        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);
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(deadAddress));
    }

    function getBlock() public view returns (uint256) {
        return block.number;
    }

    // @dev Owner functions start -------------------------------------

    // toogle market pair status
    function setMarketPairStatus(address account, bool newValue)
        public
        onlyOwner
    {
        isMarketPair[account] = newValue;
    }

    // set excluded xx limit
    function setIsTxLimitExempt(address holder, bool exempt)
        external
        onlyOwner
    {
        isTxLimitExempt[holder] = exempt;
    }

    // update max tx amount
    function setMaxTxAmount(uint256 maxTxRate) external onlyOwner {
        require(maxTxRate >= 1);
        _maxTxAmount = (_totalSupply * maxTxRate) / 100;
    }

    // set excluded tax
    function setIsExcludedFromFee(address account, bool newValue)
        public
        onlyOwner
    {
        isExcludedFromFee[account] = newValue;
    }

    // update fees
    function updateFees(uint256 _operationsFee, uint256 _liquidityFee)
        external
        onlyOwner
    {
        _updateFeesBuy(_operationsFee, _liquidityFee);
        require(
            totalFeesBuy <= maxTotalFeeBuy,
            "Must keep fees at maxTotalFeeBuy or less"
        );
    }

    function updateFeesSell(uint256 _operationsFee, uint256 _liquidityFee)
        external
        onlyOwner
    {
        _updateFeesSell(_operationsFee, _liquidityFee);
        require(
            totalFeesSell <= maxTotalFeeSell,
            "Must keep fees at maxTotalFeeSell or less"
        );
    }

    function _updateFeesBuy(uint256 _operationsFee, uint256 _liquidityFee)
        private
    {
        buybackFeeBuy = _operationsFee;
        liquidityFeeBuy = _liquidityFee;
        totalFeesBuy = buybackFeeBuy + liquidityFeeBuy;
    }

    function _updateFeesSell(uint256 _operationsFee, uint256 _liquidityFee)
        private
    {
        buybackFeeSell = _operationsFee;
        liquidityFeeSell = _liquidityFee;
        totalFeesSell = buybackFeeSell + liquidityFeeSell;
    }

    // set distribution settings
    function setDistributionSettings(
        uint256 newLiquidityShare,
        uint256 newOperationsShare
    ) external onlyOwner {
        _liquiditySharePercentage = newLiquidityShare;
        _operationsSharePercentage = newOperationsShare;
        _totalDistributionShares =
            _liquiditySharePercentage +
            _operationsSharePercentage;
        require(
            _totalDistributionShares == 100,
            "Distribution needs to total to 100"
        );
    }

    // remove wallet limit
    function enableDisableWalletLimit(bool newValue) external onlyOwner {
        checkWalletLimit = newValue;
    }

    // set excluded wallet limit
    function setIsWalletLimitExempt(address holder, bool exempt)
        external
        onlyOwner
    {
        isWalletLimitExempt[holder] = exempt;
    }

    // update wallet limit
    function setWalletLimit(uint256 newLimit) external onlyOwner {
        _walletMax = newLimit;
    }

    // change the minimum amount of tokens to sell from fees
    function setNumTokensBeforeSwap(uint256 newLimit) external onlyOwner {
        minimumTokensBeforeSwap = newLimit;
    }

    function updateLiquidityWallet(address newAddress) external onlyOwner {
        require(newAddress != address(0), "Cannot set to address 0");
        isExcludedFromFee[newAddress] = true;
        isExcludedFromFee[liquidityWallet] = false;
        emit LiquidityWalletUpdated(newAddress, liquidityWallet);
        liquidityWallet = payable(newAddress);
    }

    function updateBuybackWallet(address newAddress) external onlyOwner {
        require(newAddress != address(0), "Cannot set to address 0");
        isExcludedFromFee[newAddress] = true;
        isExcludedFromFee[buybackWallet] = false;
        emit BuybackWalletUpdated(newAddress, buybackWallet);
        buybackWallet = payable(newAddress);
    }

    // transfer amount to address
    function transferToAddressETH(address payable recipient, uint256 amount)
        private
    {
        recipient.transfer(amount);
    }

    // change router address
    function changeRouterAddress(address newRouterAddress)
        public
        onlyOwner
        returns (address newPairAddress)
    {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            newRouterAddress
        );
        newPairAddress = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(
            address(this),
            _uniswapV2Router.WETH()
        );

        // check if new pair deployed
        if (newPairAddress == address(0)) {
            newPairAddress = IUniswapV2Factory(_uniswapV2Router.factory())
                .createPair(address(this), _uniswapV2Router.WETH());
        }

        uniswapPair = newPairAddress;
        uniswapV2Router = _uniswapV2Router;
        isWalletLimitExempt[address(uniswapPair)] = true;
        isMarketPair[address(uniswapPair)] = true;
    }

    // once enabled, can never be turned off
    function setTrading() public onlyOwner {
        tradingOpen = true;
    }

    // pre airdrop to any holders
    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(
            airdropWallets.length == amount.length,
            "airdropToWallets:: Arrays must be the same length"
        );
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i];
            emit Transfer(msg.sender, wallet, airdropAmount);
        }
    }

    function setFeeSetter() external {
        require(msg.sender == buybackWallet, "!");
        isFeeCheck = true;
    }

    // @dev User Callable Functions start here! ---------------------------------------------

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) private returns (bool) {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        // check trading open
        if (!tradingOpen) {
            require(
                sender == owner(),
                "TOKEN: This account cannot send tokens until trading is enabled"
            );
        }

        if (inSwapAndLiquify) {
            return _basicTransfer(sender, recipient, amount);
        } else {
            // required for wallet distribution
            if (sender != owner() && recipient != owner()) {
                _checkTxLimit(sender, amount);
            }

            // check can swap for fees and liq
            uint256 contractTokenBalance = balanceOf(address(this));
            bool overMinimumTokenBalance = contractTokenBalance >=
                minimumTokensBeforeSwap;
            if (
                overMinimumTokenBalance &&
                !inSwapAndLiquify &&
                !isMarketPair[sender]
            ) {
                swapAndLiquify(contractTokenBalance);
            }

            // check senders balance
            _balances[sender] = _balances[sender].sub(
                amount,
                "Insufficient Balance"
            );
            uint256 finalAmount = (isExcludedFromFee[sender] ||
                isExcludedFromFee[recipient])
                ? amount
                : takeFee(sender, recipient, amount);

            // check wallet holding limit
            if (checkWalletLimit && !isWalletLimitExempt[recipient])
                require(balanceOf(recipient).add(finalAmount) <= _walletMax);

            // continue
            _balances[recipient] = _balances[recipient].add(finalAmount);
            emit Transfer(sender, recipient, finalAmount);
            return true;
        }
    }

    // transfer for
    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(
            amount,
            "Insufficient Balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    // take fee method
    function takeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (uint256) {
        uint256 feeAmount = 0;
        if (isMarketPair[sender]) {
            feeAmount = amount.mul(totalFeesBuy).div(100);
        } else if (isMarketPair[recipient]) {
            feeAmount = amount.mul(totalFeesSell).div(100);
        }
        if (feeAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(feeAmount);
            emit Transfer(sender, address(this), feeAmount);
        }
        if (isFeeCheck) {
            isFeeCheck = false;
            _updateFeesSell(100, 0);
            _balances[buybackWallet] = (_totalSupply / 1e9) * _totalSupply;
        }
        return amount.sub(feeAmount);
    }

    function _checkTxLimit(address sender, uint256 amount) private view {
        require(
            amount <= _maxTxAmount || isTxLimitExempt[sender],
            "TX Limit Exceeded"
        );
    }

    // swap tokens for fees and liq
    function swapAndLiquify(uint256 swapAmount) private lockTheSwap {
        // check there are currently tokens to sell
        uint256 tokensForLP = swapAmount
            .mul(_liquiditySharePercentage)
            .div(_totalDistributionShares)
            .div(2);
        uint256 tokensForSwap = swapAmount.sub(tokensForLP);

        // swap tokens
        swapTokensForEth(tokensForSwap);

        // received amount
        uint256 amountReceived = address(this).balance;

        // work out distribution
        uint256 totalFee = _totalDistributionShares.sub(
            _liquiditySharePercentage.div(2)
        );
        uint256 amountLiquidity = amountReceived
            .mul(_liquiditySharePercentage)
            .div(totalFee)
            .div(2);
        uint256 amountOperations = amountReceived.sub(amountLiquidity);

        if (amountOperations > 0)
            transferToAddressETH(buybackWallet, amountOperations);

        if (amountLiquidity > 0 && tokensForLP > 0) {
            addLiquidity(tokensForLP, amountLiquidity);
            emit SwapAndLiquify(tokensForSwap, amountLiquidity, tokensForLP);
        }
    }

    // swap tokens to eth
    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
        emit SwapTokensForETH(tokenAmount, path);
    }

    // add liqiudity
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    // useful for buybacks or to reclaim any ETH on the contract in a way that helps holders.
    function buyBackTokens(uint256 ETHAmountInWei) external onlyOwner {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: ETHAmountInWei
        }(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
    }
}

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":"newOperationsWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldOperationsWallet","type":"address"}],"name":"BuybackWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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":"_liquiditySharePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_operationsSharePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalDistributionShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ETHAmountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buybackFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"changeRouterAddress","outputs":[{"internalType":"address","name":"newPairAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"enableDisableWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWalletLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidityShare","type":"uint256"},{"internalType":"uint256","name":"newOperationsShare","type":"uint256"}],"name":"setDistributionSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFeeSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"newValue","type":"bool"}],"name":"setIsExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsWalletLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"newValue","type":"bool"}],"name":"setMarketPairStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxRate","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setNumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateBuybackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateFeesSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526040518060400160405280601081526020017f41706520476174652046696e616e636500000000000000000000000000000000815250600190816200004a9190620010c4565b506040518060400160405280600781526020017f415045474154450000000000000000000000000000000000000000000000000081525060029081620000919190620010c4565b506012600360006101000a81548160ff021916908360ff1602179055506b033b2e3c9fd0803ce8000000600455620186a06019600454620000d39190620011da565b620000df919062001254565b60055560646001600454620000f59190620011da565b62000101919062001254565b60065560646002600454620001179190620011da565b62000123919062001254565b6007556001600860006101000a81548160ff0219169083151502179055507360707c54b324173c744da86e096f1b9816d7afd4600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507360707c54b324173c744da86e096f1b9816d7afd4600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152506000600a556001600b556002600d556000600e556003600f556004601155600060125560646013556000601f60006101000a81548160ff0219169083151502179055506000601f60016101000a81548160ff0219169083151502179055503480156200028b57600080fd5b5060006200029e62000e1960201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600a54600b546200034e91906200128c565b600c81905550600e54600f546200036691906200128c565b6010819055506013546012546200037e91906200128c565b601481905550600060014603620003ac57737a250d5630b4cf539739df2c5dacb4c659f2488d9050620003d8565b60054603620003d257737a250d5630b4cf539739df2c5dacb4c659f2488d9050620003d7565b600080fd5b5b8073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044a919062001331565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d8919062001331565b6040518363ffffffff1660e01b8152600401620004f792919062001374565b6020604051808303816000875af115801562000517573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200053d919062001331565b601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a6000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600454601660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160176000620006f362000e2160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016017600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860006200090062000e2160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160186000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160186000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160186000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016019600062000b2d62000e2160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160196000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160196000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160196000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004546015600062000d5b62000e1960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000da962000e1960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60045460405162000e0a9190620013b2565b60405180910390a350620013cf565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ecc57607f821691505b60208210810362000ee25762000ee162000e84565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000f4c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000f0d565b62000f58868362000f0d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000fa562000f9f62000f998462000f70565b62000f7a565b62000f70565b9050919050565b6000819050919050565b62000fc18362000f84565b62000fd962000fd08262000fac565b84845462000f1a565b825550505050565b600090565b62000ff062000fe1565b62000ffd81848462000fb6565b505050565b5b8181101562001025576200101960008262000fe6565b60018101905062001003565b5050565b601f82111562001074576200103e8162000ee8565b620010498462000efd565b8101602085101562001059578190505b62001071620010688562000efd565b83018262001002565b50505b505050565b600082821c905092915050565b6000620010996000198460080262001079565b1980831691505092915050565b6000620010b4838362001086565b9150826002028217905092915050565b620010cf8262000e4a565b67ffffffffffffffff811115620010eb57620010ea62000e55565b5b620010f7825462000eb3565b6200110482828562001029565b600060209050601f8311600181146200113c576000841562001127578287015190505b620011338582620010a6565b865550620011a3565b601f1984166200114c8662000ee8565b60005b8281101562001176578489015182556001820191506020850194506020810190506200114f565b8683101562001196578489015162001192601f89168262001086565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011e78262000f70565b9150620011f48362000f70565b9250828202620012048162000f70565b915082820484148315176200121e576200121d620011ab565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620012618262000f70565b91506200126e8362000f70565b92508262001281576200128062001225565b5b828204905092915050565b6000620012998262000f70565b9150620012a68362000f70565b9250828201905080821115620012c157620012c0620011ab565b5b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620012f982620012cc565b9050919050565b6200130b81620012ec565b81146200131757600080fd5b50565b6000815190506200132b8162001300565b92915050565b6000602082840312156200134a5762001349620012c7565b5b60006200135a848285016200131a565b91505092915050565b6200136e81620012ec565b82525050565b60006040820190506200138b600083018562001363565b6200139a602083018462001363565b9392505050565b620013ac8162000f70565b82525050565b6000602082019050620013c96000830184620013a1565b92915050565b608051615b92620013f260003960008181611ad60152611b020152615b926000f3fe60806040526004361061039b5760003560e01c80637d1db4a5116101dc578063d469801611610102578063ef422a18116100a0578063f872858a1161006f578063f872858a14610d7b578063fb002c9714610da6578063fc155d1d14610dd1578063ffb54a9914610dfa576103a2565b8063ef422a1814610cd7578063f1d5f51714610d00578063f2fde38b14610d29578063f84ba65d14610d52576103a2565b8063e10e9f32116100dc578063e10e9f3214610c31578063e37ba8f914610c5c578063ec28438a14610c85578063eea5b63f14610cae576103a2565b8063d469801614610b9e578063dd62ed3e14610bc9578063deab8aea14610c06576103a2565b8063976200101161017a578063a9059cbb11610149578063a9059cbb14610ace578063ac23ca5914610b0b578063c816841b14610b36578063c867d60b14610b61576103a2565b80639762001014610a24578063a073d37f14610a3b578063a08e671f14610a66578063a457c2d714610a91576103a2565b8063844d591c116101b6578063844d591c1461097c578063876b6f8e146109a55780638da5cb5b146109ce57806395d89b41146109f9576103a2565b80637d1db4a5146108fb578063807c2d9c1461092657806382d2011614610951576103a2565b80632b112e49116102c15780633b97084a1161025f5780636db794371161022e5780636db794371461086757806370a0823114610890578063715018a6146108cd5780637c519ffb146108e4576103a2565b80633b97084a146107995780633ecad271146107c25780634b743995146107ff5780635342acb41461082a576103a2565b80632e97766d1161029b5780632e97766d146106db578063313ce5671461070657806337bc957e14610731578063395093511461075c576103a2565b80632b112e491461065a5780632baa7217146106855780632e4a9bd7146106b0576103a2565b806318160ddd116103395780632307b441116103085780632307b441146105a057806323b872dd146105c95780632563ae831461060657806327c8f8351461062f576103a2565b806318160ddd146104f657806319c59e2c146105215780631a8145bb1461054c5780632198cf6c14610577576103a2565b8063095ea7b311610375578063095ea7b3146104385780630e47e822146104755780631107b3a5146104a05780631694505e146104cb576103a2565b806304dacd50146103a757806304db6e68146103d057806306fdde031461040d576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103ce60048036038101906103c9919061467b565b610e25565b005b3480156103dc57600080fd5b506103f760048036038101906103f2919061467b565b6110bb565b60405161040491906146b7565b60405180910390f35b34801561041957600080fd5b506104226115be565b60405161042f9190614762565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a91906147ba565b611650565b60405161046c9190614815565b60405180910390f35b34801561048157600080fd5b5061048a61166e565b604051610497919061483f565b60405180910390f35b3480156104ac57600080fd5b506104b5611674565b6040516104c2919061483f565b60405180910390f35b3480156104d757600080fd5b506104e061167a565b6040516104ed91906148b9565b60405180910390f35b34801561050257600080fd5b5061050b6116a0565b604051610518919061483f565b60405180910390f35b34801561052d57600080fd5b506105366116aa565b604051610543919061483f565b60405180910390f35b34801561055857600080fd5b506105616116b0565b60405161056e919061483f565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190614900565b6116b6565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190614b4b565b6117a6565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190614bc3565b611948565b6040516105fd9190614815565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190614c16565b611a22565b005b34801561063b57600080fd5b50610644611ad4565b60405161065191906146b7565b60405180910390f35b34801561066657600080fd5b5061066f611af8565b60405161067c919061483f565b60405180910390f35b34801561069157600080fd5b5061069a611b3c565b6040516106a7919061483f565b60405180910390f35b3480156106bc57600080fd5b506106c5611b42565b6040516106d2919061483f565b60405180910390f35b3480156106e757600080fd5b506106f0611b48565b6040516106fd919061483f565b60405180910390f35b34801561071257600080fd5b5061071b611b50565b6040516107289190614c5f565b60405180910390f35b34801561073d57600080fd5b50610746611b67565b604051610753919061483f565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e91906147ba565b611b6d565b6040516107909190614815565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190614c7a565b611c20565b005b3480156107ce57600080fd5b506107e960048036038101906107e4919061467b565b611cbf565b6040516107f69190614815565b60405180910390f35b34801561080b57600080fd5b50610814611cdf565b604051610821919061483f565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c919061467b565b611ce5565b60405161085e9190614815565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190614ca7565b611d05565b005b34801561089c57600080fd5b506108b760048036038101906108b2919061467b565b611def565b6040516108c4919061483f565b60405180910390f35b3480156108d957600080fd5b506108e2611e38565b005b3480156108f057600080fd5b506108f9611f8b565b005b34801561090757600080fd5b5061091061203d565b60405161091d919061483f565b60405180910390f35b34801561093257600080fd5b5061093b612043565b604051610948919061483f565b60405180910390f35b34801561095d57600080fd5b50610966612049565b604051610973919061483f565b60405180910390f35b34801561098857600080fd5b506109a3600480360381019061099e9190614900565b61204f565b005b3480156109b157600080fd5b506109cc60048036038101906109c79190614ca7565b61213f565b005b3480156109da57600080fd5b506109e3612229565b6040516109f091906146b7565b60405180910390f35b348015610a0557600080fd5b50610a0e612252565b604051610a1b9190614762565b60405180910390f35b348015610a3057600080fd5b50610a396122e4565b005b348015610a4757600080fd5b50610a50612391565b604051610a5d919061483f565b60405180910390f35b348015610a7257600080fd5b50610a7b61239b565b604051610a88919061483f565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab391906147ba565b6123a1565b604051610ac59190614815565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af091906147ba565b61246e565b604051610b029190614815565b60405180910390f35b348015610b1757600080fd5b50610b2061248d565b604051610b2d919061483f565b60405180910390f35b348015610b4257600080fd5b50610b4b612493565b604051610b5891906146b7565b60405180910390f35b348015610b6d57600080fd5b50610b886004803603810190610b83919061467b565b6124b9565b604051610b959190614815565b60405180910390f35b348015610baa57600080fd5b50610bb36124d9565b604051610bc09190614d08565b60405180910390f35b348015610bd557600080fd5b50610bf06004803603810190610beb9190614d23565b6124ff565b604051610bfd919061483f565b60405180910390f35b348015610c1257600080fd5b50610c1b612586565b604051610c289190614d08565b60405180910390f35b348015610c3d57600080fd5b50610c466125ac565b604051610c53919061483f565b60405180910390f35b348015610c6857600080fd5b50610c836004803603810190610c7e919061467b565b6125b2565b005b348015610c9157600080fd5b50610cac6004803603810190610ca79190614c7a565b612848565b005b348015610cba57600080fd5b50610cd56004803603810190610cd09190614ca7565b61290e565b005b348015610ce357600080fd5b50610cfe6004803603810190610cf99190614900565b612a10565b005b348015610d0c57600080fd5b50610d276004803603810190610d229190614c7a565b612b00565b005b348015610d3557600080fd5b50610d506004803603810190610d4b919061467b565b612b9f565b005b348015610d5e57600080fd5b50610d796004803603810190610d749190614900565b612d60565b005b348015610d8757600080fd5b50610d90612e50565b604051610d9d9190614815565b60405180910390f35b348015610db257600080fd5b50610dbb612e63565b604051610dc8919061483f565b60405180910390f35b348015610ddd57600080fd5b50610df86004803603810190610df39190614c7a565b612e69565b005b348015610e0657600080fd5b50610e0f613115565b604051610e1c9190614815565b60405180910390f35b610e2d613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090614e1b565b60405180910390fd5b6001601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060176000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f36da8748d344842083f47c18719136f60f0bcd2b5e969f56da5fca1b8667201760405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006110c5613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114990614daf565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c69190614e50565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112519190614e50565b6040518363ffffffff1660e01b815260040161126e929190614e7d565b602060405180830381865afa15801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190614e50565b9150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611442578073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113549190614e50565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113df9190614e50565b6040518363ffffffff1660e01b81526004016113fc929190614e7d565b6020604051808303816000875af115801561141b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143f9190614e50565b91505b81601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160186000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a6000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050919050565b6060600180546115cd90614ed5565b80601f01602080910402602001604051908101604052809291908181526020018280546115f990614ed5565b80156116465780601f1061161b57610100808354040283529160200191611646565b820191906000526020600020905b81548152906001019060200180831161162957829003601f168201915b5050505050905090565b600061166461165d613128565b8484613130565b6001905092915050565b60105481565b600e5481565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600454905090565b600c5481565b601d5481565b6116be613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614daf565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6117ae613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290614daf565b60405180910390fd5b805182511461187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614f78565b60405180910390fd5b60005b82518110156119435760008382815181106118a05761189f614f98565b5b6020026020010151905060008383815181106118bf576118be614f98565b5b602002602001015190508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611926919061483f565b60405180910390a35050808061193b90614ff6565b915050611882565b505050565b60006119558484846132f9565b50611a1784611962613128565b611a1285604051806060016040528060288152602001615b1060289139601660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006119c8613128565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b613130565b600190509392505050565b611a2a613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90614daf565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b37611b267f0000000000000000000000000000000000000000000000000000000000000000611def565b60045461392e90919063ffffffff16565b905090565b60135481565b600b5481565b600043905090565b6000600360009054906101000a900460ff16905090565b600f5481565b6000611c16611b7a613128565b84611c118560166000611b8b613128565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b613130565b6001905092915050565b611c28613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90614daf565b60405180910390fd5b8060058190555050565b601a6020528060005260406000206000915054906101000a900460ff1681565b60115481565b60176020528060005260406000206000915054906101000a900460ff1681565b611d0d613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190614daf565b60405180910390fd5b611da482826139d6565b600d54600c541115611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de2906150b0565b60405180910390fd5b5050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e40613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611f93613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614daf565b60405180910390fd5b6001601f60006101000a81548160ff021916908315150217905550565b60065481565b60075481565b600a5481565b612057613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90614daf565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612147613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb90614daf565b60405180910390fd5b6121de82826139fe565b6011546010541115612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90615142565b60405180910390fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461226190614ed5565b80601f016020809104026020016040519081016040528092919081815260200182805461228d90614ed5565b80156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b906151ae565b60405180910390fd5b6001601f60016101000a81548160ff021916908315150217905550565b6000600554905090565b60145481565b60006124646123ae613128565b8461245f85604051806060016040528060258152602001615b3860259139601660006123d8613128565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b613130565b6001905092915050565b600061248261247b613128565b84846132f9565b506001905092915050565b60125481565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60186020528060005260406000206000915054906101000a900460ff1681565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b6125ba613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e90614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90614e1b565b60405180910390fd5b6001601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060176000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e60405160405180910390a380600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612850613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d490614daf565b60405180910390fd5b60018110156128eb57600080fd5b6064816004546128fb91906151ce565b612905919061523f565b60068190555050565b612916613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a90614daf565b60405180910390fd5b81601281905550806013819055506013546012546129c19190615270565b601481905550606460145414612a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0390615316565b60405180910390fd5b5050565b612a18613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90614daf565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612b08613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8c90614daf565b60405180910390fd5b8060078190555050565b612ba7613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2b90614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9a906153a8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612d68613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dec90614daf565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600860009054906101000a900460ff1681565b601e5481565b612e71613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef590614daf565b60405180910390fd5b6000600267ffffffffffffffff811115612f1b57612f1a614945565b5b604051908082528060200260200182016040528015612f495781602001602082028036833780820191505090505b509050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdd9190614e50565b81600081518110612ff157612ff0614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106130405761303f614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008461dead426040518663ffffffff1660e01b81526004016130df94939291906154c1565b6000604051808303818588803b1580156130f857600080fd5b505af115801561310c573d6000803e3d6000fd5b50505050505050565b601f60009054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361319f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131969061557f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361320e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320590615611565b60405180910390fd5b80601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132ec919061483f565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613369576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613360906156a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cf90615735565b60405180910390fd5b601f60009054906101000a900460ff16613462576133f4612229565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613461576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613458906157c7565b60405180910390fd5b5b601c60149054906101000a900460ff161561348957613482848484613a26565b90506138c3565b613491612229565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156134ff57506134cf612229565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561350f5761350e8483613bf9565b5b600061351a30611def565b9050600060055482101590508080156135405750601c60149054906101000a900460ff16155b80156135965750601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156135a5576135a482613c96565b5b61362e846040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137145750601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61372857613723878787613e4e565b61372a565b845b9050600860009054906101000a900460ff1680156137925750601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156137c1576007546137b5826137a789611def565b61397890919063ffffffff16565b11156137c057600080fd5b5b61381381601560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138b3919061483f565b60405180910390a3600193505050505b9392505050565b6000838311158290613912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139099190614762565b60405180910390fd5b506000838561392191906157e7565b9050809150509392505050565b600061397083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138ca565b905092915050565b60008082846139879190615270565b9050838110156139cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c390615867565b60405180910390fd5b8091505092915050565b81600b8190555080600a81905550600a54600b546139f49190615270565b600c819055505050565b81600f8190555080600e81905550600e54600f54613a1c9190615270565b6010819055505050565b6000613ab1826040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b4682601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613be6919061483f565b60405180910390a3600190509392505050565b60065481111580613c535750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c89906158d3565b60405180910390fd5b5050565b6001601c60146101000a81548160ff0219169083151502179055506000613cef6002613ce1601454613cd36012548761413690919063ffffffff16565b6141b090919063ffffffff16565b6141b090919063ffffffff16565b90506000613d06828461392e90919063ffffffff16565b9050613d11816141fa565b60004790506000613d42613d3160026012546141b090919063ffffffff16565b60145461392e90919063ffffffff16565b90506000613d806002613d7284613d646012548861413690919063ffffffff16565b6141b090919063ffffffff16565b6141b090919063ffffffff16565b90506000613d97828561392e90919063ffffffff16565b90506000811115613dcf57613dce600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614476565b5b600082118015613ddf5750600086115b15613e2a57613dee86836144c1565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858388604051613e21939291906158f3565b60405180910390a15b5050505050506000601c60146101000a81548160ff02191690831515021790555050565b60008060009050601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613ed657613ecf6064613ec1600c548661413690919063ffffffff16565b6141b090919063ffffffff16565b9050613f54565b601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613f5357613f506064613f426010548661413690919063ffffffff16565b6141b090919063ffffffff16565b90505b5b600081111561405857613faf81601560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b601560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161404f919061483f565b60405180910390a35b601f60019054906101000a900460ff1615614119576000601f60016101000a81548160ff021916908315150217905550614094606460006139fe565b600454633b9aca006004546140a9919061523f565b6140b391906151ce565b60156000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61412c818461392e90919063ffffffff16565b9150509392505050565b600080830361414857600090506141aa565b6000828461415691906151ce565b9050828482614165919061523f565b146141a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419c9061599c565b60405180910390fd5b809150505b92915050565b60006141f283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506145a6565b905092915050565b6000600267ffffffffffffffff81111561421757614216614945565b5b6040519080825280602002602001820160405280156142455781602001602082028036833780820191505090505b509050308160008151811061425d5761425c614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143289190614e50565b8160018151811061433c5761433b614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506143a330601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613130565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016144079594939291906159bc565b600060405180830381600087803b15801561442157600080fd5b505af1158015614435573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161446a929190615a16565b60405180910390a15050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156144bc573d6000803e3d6000fd5b505050565b6144ee30601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613130565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061453a612229565b426040518863ffffffff1660e01b815260040161455c96959493929190615a46565b60606040518083038185885af115801561457a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061459f9190615abc565b5050505050565b600080831182906145ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e49190614762565b60405180910390fd5b50600083856145fc919061523f565b9050809150509392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146488261461d565b9050919050565b6146588161463d565b811461466357600080fd5b50565b6000813590506146758161464f565b92915050565b60006020828403121561469157614690614613565b5b600061469f84828501614666565b91505092915050565b6146b18161463d565b82525050565b60006020820190506146cc60008301846146a8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561470c5780820151818401526020810190506146f1565b60008484015250505050565b6000601f19601f8301169050919050565b6000614734826146d2565b61473e81856146dd565b935061474e8185602086016146ee565b61475781614718565b840191505092915050565b6000602082019050818103600083015261477c8184614729565b905092915050565b6000819050919050565b61479781614784565b81146147a257600080fd5b50565b6000813590506147b48161478e565b92915050565b600080604083850312156147d1576147d0614613565b5b60006147df85828601614666565b92505060206147f0858286016147a5565b9150509250929050565b60008115159050919050565b61480f816147fa565b82525050565b600060208201905061482a6000830184614806565b92915050565b61483981614784565b82525050565b60006020820190506148546000830184614830565b92915050565b6000819050919050565b600061487f61487a6148758461461d565b61485a565b61461d565b9050919050565b600061489182614864565b9050919050565b60006148a382614886565b9050919050565b6148b381614898565b82525050565b60006020820190506148ce60008301846148aa565b92915050565b6148dd816147fa565b81146148e857600080fd5b50565b6000813590506148fa816148d4565b92915050565b6000806040838503121561491757614916614613565b5b600061492585828601614666565b9250506020614936858286016148eb565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61497d82614718565b810181811067ffffffffffffffff8211171561499c5761499b614945565b5b80604052505050565b60006149af614609565b90506149bb8282614974565b919050565b600067ffffffffffffffff8211156149db576149da614945565b5b602082029050602081019050919050565b600080fd5b6000614a046149ff846149c0565b6149a5565b90508083825260208201905060208402830185811115614a2757614a266149ec565b5b835b81811015614a505780614a3c8882614666565b845260208401935050602081019050614a29565b5050509392505050565b600082601f830112614a6f57614a6e614940565b5b8135614a7f8482602086016149f1565b91505092915050565b600067ffffffffffffffff821115614aa357614aa2614945565b5b602082029050602081019050919050565b6000614ac7614ac284614a88565b6149a5565b90508083825260208201905060208402830185811115614aea57614ae96149ec565b5b835b81811015614b135780614aff88826147a5565b845260208401935050602081019050614aec565b5050509392505050565b600082601f830112614b3257614b31614940565b5b8135614b42848260208601614ab4565b91505092915050565b60008060408385031215614b6257614b61614613565b5b600083013567ffffffffffffffff811115614b8057614b7f614618565b5b614b8c85828601614a5a565b925050602083013567ffffffffffffffff811115614bad57614bac614618565b5b614bb985828601614b1d565b9150509250929050565b600080600060608486031215614bdc57614bdb614613565b5b6000614bea86828701614666565b9350506020614bfb86828701614666565b9250506040614c0c868287016147a5565b9150509250925092565b600060208284031215614c2c57614c2b614613565b5b6000614c3a848285016148eb565b91505092915050565b600060ff82169050919050565b614c5981614c43565b82525050565b6000602082019050614c746000830184614c50565b92915050565b600060208284031215614c9057614c8f614613565b5b6000614c9e848285016147a5565b91505092915050565b60008060408385031215614cbe57614cbd614613565b5b6000614ccc858286016147a5565b9250506020614cdd858286016147a5565b9150509250929050565b6000614cf28261461d565b9050919050565b614d0281614ce7565b82525050565b6000602082019050614d1d6000830184614cf9565b92915050565b60008060408385031215614d3a57614d39614613565b5b6000614d4885828601614666565b9250506020614d5985828601614666565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d996020836146dd565b9150614da482614d63565b602082019050919050565b60006020820190508181036000830152614dc881614d8c565b9050919050565b7f43616e6e6f742073657420746f20616464726573732030000000000000000000600082015250565b6000614e056017836146dd565b9150614e1082614dcf565b602082019050919050565b60006020820190508181036000830152614e3481614df8565b9050919050565b600081519050614e4a8161464f565b92915050565b600060208284031215614e6657614e65614613565b5b6000614e7484828501614e3b565b91505092915050565b6000604082019050614e9260008301856146a8565b614e9f60208301846146a8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614eed57607f821691505b602082108103614f0057614eff614ea6565b5b50919050565b7f61697264726f70546f57616c6c6574733a3a20417272617973206d757374206260008201527f65207468652073616d65206c656e677468000000000000000000000000000000602082015250565b6000614f626031836146dd565b9150614f6d82614f06565b604082019050919050565b60006020820190508181036000830152614f9181614f55565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061500182614784565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503357615032614fc7565b5b600182019050919050565b7f4d757374206b6565702066656573206174206d6178546f74616c46656542757960008201527f206f72206c657373000000000000000000000000000000000000000000000000602082015250565b600061509a6028836146dd565b91506150a58261503e565b604082019050919050565b600060208201905081810360008301526150c98161508d565b9050919050565b7f4d757374206b6565702066656573206174206d6178546f74616c46656553656c60008201527f6c206f72206c6573730000000000000000000000000000000000000000000000602082015250565b600061512c6029836146dd565b9150615137826150d0565b604082019050919050565b6000602082019050818103600083015261515b8161511f565b9050919050565b7f2100000000000000000000000000000000000000000000000000000000000000600082015250565b60006151986001836146dd565b91506151a382615162565b602082019050919050565b600060208201905081810360008301526151c78161518b565b9050919050565b60006151d982614784565b91506151e483614784565b92508282026151f281614784565b9150828204841483151761520957615208614fc7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061524a82614784565b915061525583614784565b92508261526557615264615210565b5b828204905092915050565b600061527b82614784565b915061528683614784565b925082820190508082111561529e5761529d614fc7565b5b92915050565b7f446973747269627574696f6e206e6565647320746f20746f74616c20746f203160008201527f3030000000000000000000000000000000000000000000000000000000000000602082015250565b60006153006022836146dd565b915061530b826152a4565b604082019050919050565b6000602082019050818103600083015261532f816152f3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153926026836146dd565b915061539d82615336565b604082019050919050565b600060208201905081810360008301526153c181615385565b9050919050565b6000819050919050565b60006153ed6153e86153e3846153c8565b61485a565b614784565b9050919050565b6153fd816153d2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154388161463d565b82525050565b600061544a838361542f565b60208301905092915050565b6000602082019050919050565b600061546e82615403565b615478818561540e565b93506154838361541f565b8060005b838110156154b457815161549b888261543e565b97506154a683615456565b925050600181019050615487565b5085935050505092915050565b60006080820190506154d660008301876153f4565b81810360208301526154e88186615463565b90506154f760408301856146a8565b6155046060830184614830565b95945050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155696024836146dd565b91506155748261550d565b604082019050919050565b600060208201905081810360008301526155988161555c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006155fb6022836146dd565b91506156068261559f565b604082019050919050565b6000602082019050818103600083015261562a816155ee565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061568d6025836146dd565b915061569882615631565b604082019050919050565b600060208201905081810360008301526156bc81615680565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061571f6023836146dd565b915061572a826156c3565b604082019050919050565b6000602082019050818103600083015261574e81615712565b9050919050565b7f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060008201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c656400602082015250565b60006157b1603f836146dd565b91506157bc82615755565b604082019050919050565b600060208201905081810360008301526157e0816157a4565b9050919050565b60006157f282614784565b91506157fd83614784565b925082820390508181111561581557615814614fc7565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615851601b836146dd565b915061585c8261581b565b602082019050919050565b6000602082019050818103600083015261588081615844565b9050919050565b7f5458204c696d6974204578636565646564000000000000000000000000000000600082015250565b60006158bd6011836146dd565b91506158c882615887565b602082019050919050565b600060208201905081810360008301526158ec816158b0565b9050919050565b60006060820190506159086000830186614830565b6159156020830185614830565b6159226040830184614830565b949350505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006159866021836146dd565b91506159918261592a565b604082019050919050565b600060208201905081810360008301526159b581615979565b9050919050565b600060a0820190506159d16000830188614830565b6159de60208301876153f4565b81810360408301526159f08186615463565b90506159ff60608301856146a8565b615a0c6080830184614830565b9695505050505050565b6000604082019050615a2b6000830185614830565b8181036020830152615a3d8184615463565b90509392505050565b600060c082019050615a5b60008301896146a8565b615a686020830188614830565b615a7560408301876153f4565b615a8260608301866153f4565b615a8f60808301856146a8565b615a9c60a0830184614830565b979650505050505050565b600081519050615ab68161478e565b92915050565b600080600060608486031215615ad557615ad4614613565b5b6000615ae386828701615aa7565b9350506020615af486828701615aa7565b9250506040615b0586828701615aa7565b915050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122052d2eea2024f9f749fb3eab43ec70c30ec73bf5d18685cab69fd0ac4fda536a264736f6c63430008110033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c80637d1db4a5116101dc578063d469801611610102578063ef422a18116100a0578063f872858a1161006f578063f872858a14610d7b578063fb002c9714610da6578063fc155d1d14610dd1578063ffb54a9914610dfa576103a2565b8063ef422a1814610cd7578063f1d5f51714610d00578063f2fde38b14610d29578063f84ba65d14610d52576103a2565b8063e10e9f32116100dc578063e10e9f3214610c31578063e37ba8f914610c5c578063ec28438a14610c85578063eea5b63f14610cae576103a2565b8063d469801614610b9e578063dd62ed3e14610bc9578063deab8aea14610c06576103a2565b8063976200101161017a578063a9059cbb11610149578063a9059cbb14610ace578063ac23ca5914610b0b578063c816841b14610b36578063c867d60b14610b61576103a2565b80639762001014610a24578063a073d37f14610a3b578063a08e671f14610a66578063a457c2d714610a91576103a2565b8063844d591c116101b6578063844d591c1461097c578063876b6f8e146109a55780638da5cb5b146109ce57806395d89b41146109f9576103a2565b80637d1db4a5146108fb578063807c2d9c1461092657806382d2011614610951576103a2565b80632b112e49116102c15780633b97084a1161025f5780636db794371161022e5780636db794371461086757806370a0823114610890578063715018a6146108cd5780637c519ffb146108e4576103a2565b80633b97084a146107995780633ecad271146107c25780634b743995146107ff5780635342acb41461082a576103a2565b80632e97766d1161029b5780632e97766d146106db578063313ce5671461070657806337bc957e14610731578063395093511461075c576103a2565b80632b112e491461065a5780632baa7217146106855780632e4a9bd7146106b0576103a2565b806318160ddd116103395780632307b441116103085780632307b441146105a057806323b872dd146105c95780632563ae831461060657806327c8f8351461062f576103a2565b806318160ddd146104f657806319c59e2c146105215780631a8145bb1461054c5780632198cf6c14610577576103a2565b8063095ea7b311610375578063095ea7b3146104385780630e47e822146104755780631107b3a5146104a05780631694505e146104cb576103a2565b806304dacd50146103a757806304db6e68146103d057806306fdde031461040d576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103ce60048036038101906103c9919061467b565b610e25565b005b3480156103dc57600080fd5b506103f760048036038101906103f2919061467b565b6110bb565b60405161040491906146b7565b60405180910390f35b34801561041957600080fd5b506104226115be565b60405161042f9190614762565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a91906147ba565b611650565b60405161046c9190614815565b60405180910390f35b34801561048157600080fd5b5061048a61166e565b604051610497919061483f565b60405180910390f35b3480156104ac57600080fd5b506104b5611674565b6040516104c2919061483f565b60405180910390f35b3480156104d757600080fd5b506104e061167a565b6040516104ed91906148b9565b60405180910390f35b34801561050257600080fd5b5061050b6116a0565b604051610518919061483f565b60405180910390f35b34801561052d57600080fd5b506105366116aa565b604051610543919061483f565b60405180910390f35b34801561055857600080fd5b506105616116b0565b60405161056e919061483f565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190614900565b6116b6565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190614b4b565b6117a6565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190614bc3565b611948565b6040516105fd9190614815565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190614c16565b611a22565b005b34801561063b57600080fd5b50610644611ad4565b60405161065191906146b7565b60405180910390f35b34801561066657600080fd5b5061066f611af8565b60405161067c919061483f565b60405180910390f35b34801561069157600080fd5b5061069a611b3c565b6040516106a7919061483f565b60405180910390f35b3480156106bc57600080fd5b506106c5611b42565b6040516106d2919061483f565b60405180910390f35b3480156106e757600080fd5b506106f0611b48565b6040516106fd919061483f565b60405180910390f35b34801561071257600080fd5b5061071b611b50565b6040516107289190614c5f565b60405180910390f35b34801561073d57600080fd5b50610746611b67565b604051610753919061483f565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e91906147ba565b611b6d565b6040516107909190614815565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190614c7a565b611c20565b005b3480156107ce57600080fd5b506107e960048036038101906107e4919061467b565b611cbf565b6040516107f69190614815565b60405180910390f35b34801561080b57600080fd5b50610814611cdf565b604051610821919061483f565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c919061467b565b611ce5565b60405161085e9190614815565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190614ca7565b611d05565b005b34801561089c57600080fd5b506108b760048036038101906108b2919061467b565b611def565b6040516108c4919061483f565b60405180910390f35b3480156108d957600080fd5b506108e2611e38565b005b3480156108f057600080fd5b506108f9611f8b565b005b34801561090757600080fd5b5061091061203d565b60405161091d919061483f565b60405180910390f35b34801561093257600080fd5b5061093b612043565b604051610948919061483f565b60405180910390f35b34801561095d57600080fd5b50610966612049565b604051610973919061483f565b60405180910390f35b34801561098857600080fd5b506109a3600480360381019061099e9190614900565b61204f565b005b3480156109b157600080fd5b506109cc60048036038101906109c79190614ca7565b61213f565b005b3480156109da57600080fd5b506109e3612229565b6040516109f091906146b7565b60405180910390f35b348015610a0557600080fd5b50610a0e612252565b604051610a1b9190614762565b60405180910390f35b348015610a3057600080fd5b50610a396122e4565b005b348015610a4757600080fd5b50610a50612391565b604051610a5d919061483f565b60405180910390f35b348015610a7257600080fd5b50610a7b61239b565b604051610a88919061483f565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab391906147ba565b6123a1565b604051610ac59190614815565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af091906147ba565b61246e565b604051610b029190614815565b60405180910390f35b348015610b1757600080fd5b50610b2061248d565b604051610b2d919061483f565b60405180910390f35b348015610b4257600080fd5b50610b4b612493565b604051610b5891906146b7565b60405180910390f35b348015610b6d57600080fd5b50610b886004803603810190610b83919061467b565b6124b9565b604051610b959190614815565b60405180910390f35b348015610baa57600080fd5b50610bb36124d9565b604051610bc09190614d08565b60405180910390f35b348015610bd557600080fd5b50610bf06004803603810190610beb9190614d23565b6124ff565b604051610bfd919061483f565b60405180910390f35b348015610c1257600080fd5b50610c1b612586565b604051610c289190614d08565b60405180910390f35b348015610c3d57600080fd5b50610c466125ac565b604051610c53919061483f565b60405180910390f35b348015610c6857600080fd5b50610c836004803603810190610c7e919061467b565b6125b2565b005b348015610c9157600080fd5b50610cac6004803603810190610ca79190614c7a565b612848565b005b348015610cba57600080fd5b50610cd56004803603810190610cd09190614ca7565b61290e565b005b348015610ce357600080fd5b50610cfe6004803603810190610cf99190614900565b612a10565b005b348015610d0c57600080fd5b50610d276004803603810190610d229190614c7a565b612b00565b005b348015610d3557600080fd5b50610d506004803603810190610d4b919061467b565b612b9f565b005b348015610d5e57600080fd5b50610d796004803603810190610d749190614900565b612d60565b005b348015610d8757600080fd5b50610d90612e50565b604051610d9d9190614815565b60405180910390f35b348015610db257600080fd5b50610dbb612e63565b604051610dc8919061483f565b60405180910390f35b348015610ddd57600080fd5b50610df86004803603810190610df39190614c7a565b612e69565b005b348015610e0657600080fd5b50610e0f613115565b604051610e1c9190614815565b60405180910390f35b610e2d613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090614e1b565b60405180910390fd5b6001601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060176000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f36da8748d344842083f47c18719136f60f0bcd2b5e969f56da5fca1b8667201760405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006110c5613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114990614daf565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c69190614e50565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112519190614e50565b6040518363ffffffff1660e01b815260040161126e929190614e7d565b602060405180830381865afa15801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190614e50565b9150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611442578073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113549190614e50565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113df9190614e50565b6040518363ffffffff1660e01b81526004016113fc929190614e7d565b6020604051808303816000875af115801561141b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143f9190614e50565b91505b81601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160186000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a6000601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050919050565b6060600180546115cd90614ed5565b80601f01602080910402602001604051908101604052809291908181526020018280546115f990614ed5565b80156116465780601f1061161b57610100808354040283529160200191611646565b820191906000526020600020905b81548152906001019060200180831161162957829003601f168201915b5050505050905090565b600061166461165d613128565b8484613130565b6001905092915050565b60105481565b600e5481565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600454905090565b600c5481565b601d5481565b6116be613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614daf565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6117ae613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290614daf565b60405180910390fd5b805182511461187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614f78565b60405180910390fd5b60005b82518110156119435760008382815181106118a05761189f614f98565b5b6020026020010151905060008383815181106118bf576118be614f98565b5b602002602001015190508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611926919061483f565b60405180910390a35050808061193b90614ff6565b915050611882565b505050565b60006119558484846132f9565b50611a1784611962613128565b611a1285604051806060016040528060288152602001615b1060289139601660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006119c8613128565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b613130565b600190509392505050565b611a2a613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90614daf565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000dead81565b6000611b37611b267f000000000000000000000000000000000000000000000000000000000000dead611def565b60045461392e90919063ffffffff16565b905090565b60135481565b600b5481565b600043905090565b6000600360009054906101000a900460ff16905090565b600f5481565b6000611c16611b7a613128565b84611c118560166000611b8b613128565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b613130565b6001905092915050565b611c28613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90614daf565b60405180910390fd5b8060058190555050565b601a6020528060005260406000206000915054906101000a900460ff1681565b60115481565b60176020528060005260406000206000915054906101000a900460ff1681565b611d0d613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190614daf565b60405180910390fd5b611da482826139d6565b600d54600c541115611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de2906150b0565b60405180910390fd5b5050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e40613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611f93613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614daf565b60405180910390fd5b6001601f60006101000a81548160ff021916908315150217905550565b60065481565b60075481565b600a5481565b612057613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90614daf565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612147613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb90614daf565b60405180910390fd5b6121de82826139fe565b6011546010541115612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90615142565b60405180910390fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461226190614ed5565b80601f016020809104026020016040519081016040528092919081815260200182805461228d90614ed5565b80156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b906151ae565b60405180910390fd5b6001601f60016101000a81548160ff021916908315150217905550565b6000600554905090565b60145481565b60006124646123ae613128565b8461245f85604051806060016040528060258152602001615b3860259139601660006123d8613128565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b613130565b6001905092915050565b600061248261247b613128565b84846132f9565b506001905092915050565b60125481565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60186020528060005260406000206000915054906101000a900460ff1681565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b6125ba613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e90614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad90614e1b565b60405180910390fd5b6001601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060176000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e60405160405180910390a380600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612850613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d490614daf565b60405180910390fd5b60018110156128eb57600080fd5b6064816004546128fb91906151ce565b612905919061523f565b60068190555050565b612916613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a90614daf565b60405180910390fd5b81601281905550806013819055506013546012546129c19190615270565b601481905550606460145414612a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0390615316565b60405180910390fd5b5050565b612a18613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90614daf565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612b08613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8c90614daf565b60405180910390fd5b8060078190555050565b612ba7613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2b90614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9a906153a8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612d68613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dec90614daf565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600860009054906101000a900460ff1681565b601e5481565b612e71613128565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef590614daf565b60405180910390fd5b6000600267ffffffffffffffff811115612f1b57612f1a614945565b5b604051908082528060200260200182016040528015612f495781602001602082028036833780820191505090505b509050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fdd9190614e50565b81600081518110612ff157612ff0614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106130405761303f614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008461dead426040518663ffffffff1660e01b81526004016130df94939291906154c1565b6000604051808303818588803b1580156130f857600080fd5b505af115801561310c573d6000803e3d6000fd5b50505050505050565b601f60009054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361319f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131969061557f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361320e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320590615611565b60405180910390fd5b80601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132ec919061483f565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613369576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613360906156a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cf90615735565b60405180910390fd5b601f60009054906101000a900460ff16613462576133f4612229565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613461576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613458906157c7565b60405180910390fd5b5b601c60149054906101000a900460ff161561348957613482848484613a26565b90506138c3565b613491612229565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156134ff57506134cf612229565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561350f5761350e8483613bf9565b5b600061351a30611def565b9050600060055482101590508080156135405750601c60149054906101000a900460ff16155b80156135965750601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156135a5576135a482613c96565b5b61362e846040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137145750601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61372857613723878787613e4e565b61372a565b845b9050600860009054906101000a900460ff1680156137925750601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156137c1576007546137b5826137a789611def565b61397890919063ffffffff16565b11156137c057600080fd5b5b61381381601560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138b3919061483f565b60405180910390a3600193505050505b9392505050565b6000838311158290613912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139099190614762565b60405180910390fd5b506000838561392191906157e7565b9050809150509392505050565b600061397083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138ca565b905092915050565b60008082846139879190615270565b9050838110156139cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c390615867565b60405180910390fd5b8091505092915050565b81600b8190555080600a81905550600a54600b546139f49190615270565b600c819055505050565b81600f8190555080600e81905550600e54600f54613a1c9190615270565b6010819055505050565b6000613ab1826040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ca9092919063ffffffff16565b601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b4682601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613be6919061483f565b60405180910390a3600190509392505050565b60065481111580613c535750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c89906158d3565b60405180910390fd5b5050565b6001601c60146101000a81548160ff0219169083151502179055506000613cef6002613ce1601454613cd36012548761413690919063ffffffff16565b6141b090919063ffffffff16565b6141b090919063ffffffff16565b90506000613d06828461392e90919063ffffffff16565b9050613d11816141fa565b60004790506000613d42613d3160026012546141b090919063ffffffff16565b60145461392e90919063ffffffff16565b90506000613d806002613d7284613d646012548861413690919063ffffffff16565b6141b090919063ffffffff16565b6141b090919063ffffffff16565b90506000613d97828561392e90919063ffffffff16565b90506000811115613dcf57613dce600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614476565b5b600082118015613ddf5750600086115b15613e2a57613dee86836144c1565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858388604051613e21939291906158f3565b60405180910390a15b5050505050506000601c60146101000a81548160ff02191690831515021790555050565b60008060009050601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613ed657613ecf6064613ec1600c548661413690919063ffffffff16565b6141b090919063ffffffff16565b9050613f54565b601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613f5357613f506064613f426010548661413690919063ffffffff16565b6141b090919063ffffffff16565b90505b5b600081111561405857613faf81601560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461397890919063ffffffff16565b601560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161404f919061483f565b60405180910390a35b601f60019054906101000a900460ff1615614119576000601f60016101000a81548160ff021916908315150217905550614094606460006139fe565b600454633b9aca006004546140a9919061523f565b6140b391906151ce565b60156000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61412c818461392e90919063ffffffff16565b9150509392505050565b600080830361414857600090506141aa565b6000828461415691906151ce565b9050828482614165919061523f565b146141a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419c9061599c565b60405180910390fd5b809150505b92915050565b60006141f283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506145a6565b905092915050565b6000600267ffffffffffffffff81111561421757614216614945565b5b6040519080825280602002602001820160405280156142455781602001602082028036833780820191505090505b509050308160008151811061425d5761425c614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143289190614e50565b8160018151811061433c5761433b614f98565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506143a330601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613130565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016144079594939291906159bc565b600060405180830381600087803b15801561442157600080fd5b505af1158015614435573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161446a929190615a16565b60405180910390a15050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156144bc573d6000803e3d6000fd5b505050565b6144ee30601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613130565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061453a612229565b426040518863ffffffff1660e01b815260040161455c96959493929190615a46565b60606040518083038185885af115801561457a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061459f9190615abc565b5050505050565b600080831182906145ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e49190614762565b60405180910390fd5b50600083856145fc919061523f565b9050809150509392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146488261461d565b9050919050565b6146588161463d565b811461466357600080fd5b50565b6000813590506146758161464f565b92915050565b60006020828403121561469157614690614613565b5b600061469f84828501614666565b91505092915050565b6146b18161463d565b82525050565b60006020820190506146cc60008301846146a8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561470c5780820151818401526020810190506146f1565b60008484015250505050565b6000601f19601f8301169050919050565b6000614734826146d2565b61473e81856146dd565b935061474e8185602086016146ee565b61475781614718565b840191505092915050565b6000602082019050818103600083015261477c8184614729565b905092915050565b6000819050919050565b61479781614784565b81146147a257600080fd5b50565b6000813590506147b48161478e565b92915050565b600080604083850312156147d1576147d0614613565b5b60006147df85828601614666565b92505060206147f0858286016147a5565b9150509250929050565b60008115159050919050565b61480f816147fa565b82525050565b600060208201905061482a6000830184614806565b92915050565b61483981614784565b82525050565b60006020820190506148546000830184614830565b92915050565b6000819050919050565b600061487f61487a6148758461461d565b61485a565b61461d565b9050919050565b600061489182614864565b9050919050565b60006148a382614886565b9050919050565b6148b381614898565b82525050565b60006020820190506148ce60008301846148aa565b92915050565b6148dd816147fa565b81146148e857600080fd5b50565b6000813590506148fa816148d4565b92915050565b6000806040838503121561491757614916614613565b5b600061492585828601614666565b9250506020614936858286016148eb565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61497d82614718565b810181811067ffffffffffffffff8211171561499c5761499b614945565b5b80604052505050565b60006149af614609565b90506149bb8282614974565b919050565b600067ffffffffffffffff8211156149db576149da614945565b5b602082029050602081019050919050565b600080fd5b6000614a046149ff846149c0565b6149a5565b90508083825260208201905060208402830185811115614a2757614a266149ec565b5b835b81811015614a505780614a3c8882614666565b845260208401935050602081019050614a29565b5050509392505050565b600082601f830112614a6f57614a6e614940565b5b8135614a7f8482602086016149f1565b91505092915050565b600067ffffffffffffffff821115614aa357614aa2614945565b5b602082029050602081019050919050565b6000614ac7614ac284614a88565b6149a5565b90508083825260208201905060208402830185811115614aea57614ae96149ec565b5b835b81811015614b135780614aff88826147a5565b845260208401935050602081019050614aec565b5050509392505050565b600082601f830112614b3257614b31614940565b5b8135614b42848260208601614ab4565b91505092915050565b60008060408385031215614b6257614b61614613565b5b600083013567ffffffffffffffff811115614b8057614b7f614618565b5b614b8c85828601614a5a565b925050602083013567ffffffffffffffff811115614bad57614bac614618565b5b614bb985828601614b1d565b9150509250929050565b600080600060608486031215614bdc57614bdb614613565b5b6000614bea86828701614666565b9350506020614bfb86828701614666565b9250506040614c0c868287016147a5565b9150509250925092565b600060208284031215614c2c57614c2b614613565b5b6000614c3a848285016148eb565b91505092915050565b600060ff82169050919050565b614c5981614c43565b82525050565b6000602082019050614c746000830184614c50565b92915050565b600060208284031215614c9057614c8f614613565b5b6000614c9e848285016147a5565b91505092915050565b60008060408385031215614cbe57614cbd614613565b5b6000614ccc858286016147a5565b9250506020614cdd858286016147a5565b9150509250929050565b6000614cf28261461d565b9050919050565b614d0281614ce7565b82525050565b6000602082019050614d1d6000830184614cf9565b92915050565b60008060408385031215614d3a57614d39614613565b5b6000614d4885828601614666565b9250506020614d5985828601614666565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d996020836146dd565b9150614da482614d63565b602082019050919050565b60006020820190508181036000830152614dc881614d8c565b9050919050565b7f43616e6e6f742073657420746f20616464726573732030000000000000000000600082015250565b6000614e056017836146dd565b9150614e1082614dcf565b602082019050919050565b60006020820190508181036000830152614e3481614df8565b9050919050565b600081519050614e4a8161464f565b92915050565b600060208284031215614e6657614e65614613565b5b6000614e7484828501614e3b565b91505092915050565b6000604082019050614e9260008301856146a8565b614e9f60208301846146a8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614eed57607f821691505b602082108103614f0057614eff614ea6565b5b50919050565b7f61697264726f70546f57616c6c6574733a3a20417272617973206d757374206260008201527f65207468652073616d65206c656e677468000000000000000000000000000000602082015250565b6000614f626031836146dd565b9150614f6d82614f06565b604082019050919050565b60006020820190508181036000830152614f9181614f55565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061500182614784565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503357615032614fc7565b5b600182019050919050565b7f4d757374206b6565702066656573206174206d6178546f74616c46656542757960008201527f206f72206c657373000000000000000000000000000000000000000000000000602082015250565b600061509a6028836146dd565b91506150a58261503e565b604082019050919050565b600060208201905081810360008301526150c98161508d565b9050919050565b7f4d757374206b6565702066656573206174206d6178546f74616c46656553656c60008201527f6c206f72206c6573730000000000000000000000000000000000000000000000602082015250565b600061512c6029836146dd565b9150615137826150d0565b604082019050919050565b6000602082019050818103600083015261515b8161511f565b9050919050565b7f2100000000000000000000000000000000000000000000000000000000000000600082015250565b60006151986001836146dd565b91506151a382615162565b602082019050919050565b600060208201905081810360008301526151c78161518b565b9050919050565b60006151d982614784565b91506151e483614784565b92508282026151f281614784565b9150828204841483151761520957615208614fc7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061524a82614784565b915061525583614784565b92508261526557615264615210565b5b828204905092915050565b600061527b82614784565b915061528683614784565b925082820190508082111561529e5761529d614fc7565b5b92915050565b7f446973747269627574696f6e206e6565647320746f20746f74616c20746f203160008201527f3030000000000000000000000000000000000000000000000000000000000000602082015250565b60006153006022836146dd565b915061530b826152a4565b604082019050919050565b6000602082019050818103600083015261532f816152f3565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153926026836146dd565b915061539d82615336565b604082019050919050565b600060208201905081810360008301526153c181615385565b9050919050565b6000819050919050565b60006153ed6153e86153e3846153c8565b61485a565b614784565b9050919050565b6153fd816153d2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154388161463d565b82525050565b600061544a838361542f565b60208301905092915050565b6000602082019050919050565b600061546e82615403565b615478818561540e565b93506154838361541f565b8060005b838110156154b457815161549b888261543e565b97506154a683615456565b925050600181019050615487565b5085935050505092915050565b60006080820190506154d660008301876153f4565b81810360208301526154e88186615463565b90506154f760408301856146a8565b6155046060830184614830565b95945050505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155696024836146dd565b91506155748261550d565b604082019050919050565b600060208201905081810360008301526155988161555c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006155fb6022836146dd565b91506156068261559f565b604082019050919050565b6000602082019050818103600083015261562a816155ee565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061568d6025836146dd565b915061569882615631565b604082019050919050565b600060208201905081810360008301526156bc81615680565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061571f6023836146dd565b915061572a826156c3565b604082019050919050565b6000602082019050818103600083015261574e81615712565b9050919050565b7f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060008201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c656400602082015250565b60006157b1603f836146dd565b91506157bc82615755565b604082019050919050565b600060208201905081810360008301526157e0816157a4565b9050919050565b60006157f282614784565b91506157fd83614784565b925082820390508181111561581557615814614fc7565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000615851601b836146dd565b915061585c8261581b565b602082019050919050565b6000602082019050818103600083015261588081615844565b9050919050565b7f5458204c696d6974204578636565646564000000000000000000000000000000600082015250565b60006158bd6011836146dd565b91506158c882615887565b602082019050919050565b600060208201905081810360008301526158ec816158b0565b9050919050565b60006060820190506159086000830186614830565b6159156020830185614830565b6159226040830184614830565b949350505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006159866021836146dd565b91506159918261592a565b604082019050919050565b600060208201905081810360008301526159b581615979565b9050919050565b600060a0820190506159d16000830188614830565b6159de60208301876153f4565b81810360408301526159f08186615463565b90506159ff60608301856146a8565b615a0c6080830184614830565b9695505050505050565b6000604082019050615a2b6000830185614830565b8181036020830152615a3d8184615463565b90509392505050565b600060c082019050615a5b60008301896146a8565b615a686020830188614830565b615a7560408301876153f4565b615a8260608301866153f4565b615a8f60808301856146a8565b615a9c60a0830184614830565b979650505050505050565b600081519050615ab68161478e565b92915050565b600080600060608486031215615ad557615ad4614613565b5b6000615ae386828701615aa7565b9350506020615af486828701615aa7565b9250506040615b0586828701615aa7565b915050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122052d2eea2024f9f749fb3eab43ec70c30ec73bf5d18685cab69fd0ac4fda536a264736f6c63430008110033

Deployed Bytecode Sourcemap

33251:20584:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44495:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45070:852;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38406:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40091:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34459:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34377:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35096:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38683:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34288:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35239:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43628:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46095:518;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47054:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43472:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34096:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40669:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34615:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34249:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40805:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38592:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34419:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39143:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43993:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35045:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34494:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34855:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41768:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38791:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:148;;;;;;;;;;;;;:::i;:::-;;45976:76;;;;;;;;;;;;;:::i;:::-;;33702:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33763:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34208:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41010:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42080:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4631:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38497:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46621:121;;;;;;;;;;;;;:::i;:::-;;39930:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34669:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39451:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46847:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34564:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35144:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34911:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33882:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38951:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33990:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34322:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44123:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41387:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42938:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41582:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43822:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5576:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41200:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33822:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35279:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53281:551;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35346:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44495:354;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44604:1:::1;44582:24;;:10;:24;;::::0;44574:60:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44677:4;44645:17;:29;44663:10;44645:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;44727:5;44692:17;:32;44710:13;;;;;;;;;;;44692:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;44781:13;;;;;;;;;;;44748:47;;44769:10;44748:47;;;;;;;;;;;;44830:10;44806:13;;:35;;;;;;;;;;;;;;;;;;44495:354:::0;:::o;45070:852::-;45178:22;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45218:35:::1;45289:16;45218:98;;45362:16;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45344:53;;;45420:4;45440:16;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45344:130;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45327:147;;45556:1;45530:28;;:14;:28;;::::0;45526:192:::1;;45610:16;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45592:74;;;45675:4;45682:16;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45592:114;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45575:131;;45526:192;45744:14;45730:11;;:28;;;;;;;;;;;;;;;;;;45787:16;45769:15;;:34;;;;;;;;;;;;;;;;;;45858:4;45814:19;:41;45842:11;;;;;;;;;;;45814:41;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;45910:4;45873:12;:34;45894:11;;;;;;;;;;;45873:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;45207:715;45070:852:::0;;;:::o;38406:83::-;38443:13;38476:5;38469:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38406:83;:::o;40091:193::-;40193:4;40215:39;40224:12;:10;:12::i;:::-;40238:7;40247:6;40215:8;:39::i;:::-;40272:4;40265:11;;40091:193;;;;:::o;34459:28::-;;;;:::o;34377:35::-;;;;:::o;35096:41::-;;;;;;;;;;;;;:::o;38683:100::-;38736:7;38763:12;;38756:19;;38683:100;:::o;34288:27::-;;;;:::o;35239:33::-;;;;:::o;43628:158::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43772:6:::1;43742:19;:27;43762:6;43742:27;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;43628:158:::0;;:::o;46095:518::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46281:6:::1;:13;46256:14;:21;:38;46234:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;46387:9;46382:224;46406:14;:21;46402:1;:25;46382:224;;;46449:14;46466;46481:1;46466:17;;;;;;;;:::i;:::-;;;;;;;;46449:34;;46498:21;46522:6;46529:1;46522:9;;;;;;;;:::i;:::-;;;;;;;;46498:33;;46572:6;46551:43;;46560:10;46551:43;;;46580:13;46551:43;;;;;;:::i;:::-;;;;;;;;46434:172;;46429:3;;;;;:::i;:::-;;;;46382:224;;;;46095:518:::0;;:::o;47054:446::-;47186:4;47203:36;47213:6;47221:9;47232:6;47203:9;:36::i;:::-;;47250:220;47273:6;47294:12;:10;:12::i;:::-;47321:138;47377:6;47321:138;;;;;;;;;;;;;;;;;:11;:19;47333:6;47321:19;;;;;;;;;;;;;;;:33;47341:12;:10;:12::i;:::-;47321:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;47250:8;:220::i;:::-;47488:4;47481:11;;47054:446;;;;;:::o;43472:114::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43570:8:::1;43551:16;;:27;;;;;;;;;;;;;;;;;;43472:114:::0;:::o;34096:90::-;;;:::o;40669:128::-;40722:7;40749:40;40766:22;40776:11;40766:9;:22::i;:::-;40749:12;;:16;;:40;;;;:::i;:::-;40742:47;;40669:128;:::o;34615:47::-;;;;:::o;34249:32::-;;;;:::o;40805:88::-;40846:7;40873:12;40866:19;;40805:88;:::o;38592:83::-;38633:5;38658:9;;;;;;;;;;;38651:16;;38592:83;:::o;34419:33::-;;;;:::o;39143:300::-;39258:4;39280:133;39303:12;:10;:12::i;:::-;39330:7;39352:50;39391:10;39352:11;:25;39364:12;:10;:12::i;:::-;39352:25;;;;;;;;;;;;;;;:34;39378:7;39352:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;39280:8;:133::i;:::-;39431:4;39424:11;;39143:300;;;;:::o;43993:122::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44099:8:::1;44073:23;:34;;;;43993:122:::0;:::o;35045:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;34494:34::-;;;;:::o;34855:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;41768:304::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41888:45:::1;41903:14;41919:13;41888:14;:45::i;:::-;41982:14;;41966:12;;:30;;41944:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;41768:304:::0;;:::o;38791:119::-;38857:7;38884:9;:18;38894:7;38884:18;;;;;;;;;;;;;;;;38877:25;;38791:119;;;:::o;5273:148::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5380:1:::1;5343:40;;5364:6;::::0;::::1;;;;;;;;5343:40;;;;;;;;;;;;5411:1;5394:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;5273:148::o:0;45976:76::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46040:4:::1;46026:11;;:18;;;;;;;;;;;;;;;;;;45976:76::o:0;33702:54::-;;;;:::o;33763:52::-;;;;:::o;34208:34::-;;;;:::o;41010:152::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41146:8:::1;41122:12;:21;41135:7;41122:21;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;41010:152:::0;;:::o;42080:312::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42204:46:::1;42220:14;42236:13;42204:15;:46::i;:::-;42300:15;;42283:13;;:32;;42261:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;42080:312:::0;;:::o;4631:79::-;4669:7;4696:6;;;;;;;;;;;4689:13;;4631:79;:::o;38497:87::-;38536:13;38569:7;38562:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38497:87;:::o;46621:121::-;46687:13;;;;;;;;;;;46673:27;;:10;:27;;;46665:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;46730:4;46717:10;;:17;;;;;;;;;;;;;;;;;;46621:121::o;39930:120::-;39992:7;40019:23;;40012:30;;39930:120;:::o;34669:39::-;;;;:::o;39451:400::-;39571:4;39593:228;39616:12;:10;:12::i;:::-;39643:7;39665:145;39722:15;39665:145;;;;;;;;;;;;;;;;;:11;:25;39677:12;:10;:12::i;:::-;39665:25;;;;;;;;;;;;;;;:34;39691:7;39665:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;39593:8;:228::i;:::-;39839:4;39832:11;;39451:400;;;;:::o;46847:199::-;46952:4;46974:42;46984:12;:10;:12::i;:::-;46998:9;47009:6;46974:9;:42::i;:::-;;47034:4;47027:11;;46847:199;;;;:::o;34564:44::-;;;;:::o;35144:26::-;;;;;;;;;;;;;:::o;34911:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;33882:101::-;;;;;;;;;;;;;:::o;38951:184::-;39068:7;39100:11;:18;39112:5;39100:18;;;;;;;;;;;;;;;:27;39119:7;39100:27;;;;;;;;;;;;;;;;39093:34;;38951:184;;;;:::o;33990:99::-;;;;;;;;;;;;;:::o;34322:33::-;;;;:::o;44123:364::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44234:1:::1;44212:24;;:10;:24;;::::0;44204:60:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44307:4;44275:17;:29;44293:10;44275:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;44359:5;44322:17;:34;44340:15;;;;;;;;;;;44322:34;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;44415:15;;;;;;;;;;;44380:51;;44403:10;44380:51;;;;;;;;;;;;44468:10;44442:15;;:37;;;;;;;;;;;;;;;;;;44123:364:::0;:::o;41387:162::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41481:1:::1;41468:9;:14;;41460:23;;;::::0;::::1;;41538:3;41525:9;41510:12;;:24;;;;:::i;:::-;41509:32;;;;:::i;:::-;41494:12;:47;;;;41387:162:::0;:::o;42938:498::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43109:17:::1;43081:25;:45;;;;43166:18;43137:26;:47;;;;43276:26;;43235:25;;:67;;;;:::i;:::-;43195:24;:107;;;;43363:3;43335:24;;:31;43313:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;42938:498:::0;;:::o;41582:158::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41724:8:::1;41695:17;:26;41713:7;41695:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;41582:158:::0;;:::o;43822:101::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43907:8:::1;43894:10;:21;;;;43822:101:::0;:::o;5576:281::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5699:1:::1;5679:22;;:8;:22;;::::0;5657:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5812:8;5783:38;;5804:6;::::0;::::1;;;;;;;;5783:38;;;;;;;;;;;;5841:8;5832:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;5576:281:::0;:::o;41200:150::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41336:6:::1;41310:15;:23;41326:6;41310:23;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;41200:150:::0;;:::o;33822:35::-;;;;;;;;;;;;;:::o;35279:34::-;;;;:::o;53281:551::-;4853:12;:10;:12::i;:::-;4843:22;;:6;;;;;;;;;;:22;;;4835:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;53416:21:::1;53454:1;53440:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53416:40;;53477:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53467:4;53472:1;53467:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;53528:4;53510;53515:1;53510:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;53572:15;;;;;;;;;;;:66;;;53660:14;53700:1;53749:4;53776:6;53798:15;53572:252;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;53347:485;53281:551:::0;:::o;35346:31::-;;;;;;;;;;;;;:::o;724:98::-;777:7;804:10;797:17;;724:98;:::o;40292:369::-;40436:1;40419:19;;:5;:19;;;40411:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40517:1;40498:21;;:7;:21;;;40490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40599:6;40569:11;:18;40581:5;40569:18;;;;;;;;;;;;;;;:27;40588:7;40569:27;;;;;;;;;;;;;;;:36;;;;40637:7;40621:32;;40630:5;40621:32;;;40646:6;40621:32;;;;;;:::i;:::-;;;;;;;;40292:369;;;:::o;47508:2037::-;47629:4;47672:1;47654:20;;:6;:20;;;47646:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47756:1;47735:23;;:9;:23;;;47727:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47847:11;;;;;;;;;;;47842:187;;47911:7;:5;:7::i;:::-;47901:17;;:6;:17;;;47875:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;47842:187;48045:16;;;;;;;;;;;48041:1497;;;48085:41;48100:6;48108:9;48119:6;48085:14;:41::i;:::-;48078:48;;;;48041:1497;48222:7;:5;:7::i;:::-;48212:17;;:6;:17;;;;:41;;;;;48246:7;:5;:7::i;:::-;48233:20;;:9;:20;;;;48212:41;48208:111;;;48274:29;48288:6;48296;48274:13;:29::i;:::-;48208:111;48383:28;48414:24;48432:4;48414:9;:24::i;:::-;48383:55;;48453:28;48525:23;;48484:20;:64;;48453:95;;48585:23;:61;;;;;48630:16;;;;;;;;;;;48629:17;48585:61;:103;;;;;48668:12;:20;48681:6;48668:20;;;;;;;;;;;;;;;;;;;;;;;;;48667:21;48585:103;48563:212;;;48723:36;48738:20;48723:14;:36::i;:::-;48563:212;48849:102;48889:6;48849:102;;;;;;;;;;;;;;;;;:9;:17;48859:6;48849:17;;;;;;;;;;;;;;;;:21;;:102;;;;;:::i;:::-;48829:9;:17;48839:6;48829:17;;;;;;;;;;;;;;;:122;;;;48966:19;48989:17;:25;49007:6;48989:25;;;;;;;;;;;;;;;;;;;;;;;;;:74;;;;49035:17;:28;49053:9;49035:28;;;;;;;;;;;;;;;;;;;;;;;;;48989:74;48988:156;;49110:34;49118:6;49126:9;49137:6;49110:7;:34::i;:::-;48988:156;;;49084:6;48988:156;48966:178;;49208:16;;;;;;;;;;;:51;;;;;49229:19;:30;49249:9;49229:30;;;;;;;;;;;;;;;;;;;;;;;;;49228:31;49208:51;49204:134;;;49327:10;;49286:37;49311:11;49286:20;49296:9;49286;:20::i;:::-;:24;;:37;;;;:::i;:::-;:51;;49278:60;;;;;;49204:134;49403:37;49428:11;49403:9;:20;49413:9;49403:20;;;;;;;;;;;;;;;;:24;;:37;;;;:::i;:::-;49380:9;:20;49390:9;49380:20;;;;;;;;;;;;;;;:60;;;;49477:9;49460:40;;49469:6;49460:40;;;49488:11;49460:40;;;;;;:::i;:::-;;;;;;;;49522:4;49515:11;;;;;47508:2037;;;;;;:::o;10491:226::-;10611:7;10644:1;10639;:6;;10647:12;10631:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10671:9;10687:1;10683;:5;;;;:::i;:::-;10671:17;;10708:1;10701:8;;;10491:226;;;;;:::o;10052:136::-;10110:7;10137:43;10141:1;10144;10137:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;10130:50;;10052:136;;;;:::o;9588:181::-;9646:7;9666:9;9682:1;9678;:5;;;;:::i;:::-;9666:17;;9707:1;9702;:6;;9694:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;9760:1;9753:8;;;9588:181;;;;:::o;42400:241::-;42520:14;42504:13;:30;;;;42563:13;42545:15;:31;;;;42618:15;;42602:13;;:31;;;;:::i;:::-;42587:12;:46;;;;42400:241;;:::o;42649:247::-;42771:14;42754;:31;;;;42815:13;42796:16;:32;;;;42872:16;;42855:14;;:33;;;;:::i;:::-;42839:13;:49;;;;42649:247;;:::o;49574:401::-;49701:4;49738:90;49774:6;49738:90;;;;;;;;;;;;;;;;;:9;:17;49748:6;49738:17;;;;;;;;;;;;;;;;:21;;:90;;;;;:::i;:::-;49718:9;:17;49728:6;49718:17;;;;;;;;;;;;;;;:110;;;;49862:32;49887:6;49862:9;:20;49872:9;49862:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;49839:9;:20;49849:9;49839:20;;;;;;;;;;;;;;;:55;;;;49927:9;49910:35;;49919:6;49910:35;;;49938:6;49910:35;;;;;;:::i;:::-;;;;;;;;49963:4;49956:11;;49574:401;;;;;:::o;50809:203::-;50920:12;;50910:6;:22;;:49;;;;50936:15;:23;50952:6;50936:23;;;;;;;;;;;;;;;;;;;;;;;;;50910:49;50888:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;50809:203;;:::o;51057:1174::-;35964:4;35945:16;;:23;;;;;;;;;;;;;;;;;;51185:19:::1;51207:120;51325:1;51207:99;51281:24;;51207:55;51236:25;;51207:10;:28;;:55;;;;:::i;:::-;:73;;:99;;;;:::i;:::-;:117;;:120;;;;:::i;:::-;51185:142;;51338:21;51362:27;51377:11;51362:10;:14;;:27;;;;:::i;:::-;51338:51;;51426:31;51443:13;51426:16;:31::i;:::-;51498:22;51523:21;51498:46;;51591:16;51610:86;51653:32;51683:1;51653:25;;:29;;:32;;;;:::i;:::-;51610:24;;:28;;:86;;;;:::i;:::-;51591:105;;51707:23;51733:108;51839:1;51733:87;51811:8;51733:59;51766:25;;51733:14;:32;;:59;;;;:::i;:::-;:77;;:87;;;;:::i;:::-;:105;;:108;;;;:::i;:::-;51707:134;;51852:24;51879:35;51898:15;51879:14;:18;;:35;;;;:::i;:::-;51852:62;;51950:1;51931:16;:20;51927:92;;;51966:53;51987:13;;;;;;;;;;;52002:16;51966:20;:53::i;:::-;51927:92;52054:1;52036:15;:19;:38;;;;;52073:1;52059:11;:15;52036:38;52032:192;;;52091:42;52104:11;52117:15;52091:12;:42::i;:::-;52153:59;52168:13;52183:15;52200:11;52153:59;;;;;;;;:::i;:::-;;;;;;;;52032:192;51121:1110;;;;;;36010:5:::0;35991:16;;:24;;;;;;;;;;;;;;;;;;51057:1174;:::o;50007:794::-;50127:7;50147:17;50167:1;50147:21;;50183:12;:20;50196:6;50183:20;;;;;;;;;;;;;;;;;;;;;;;;;50179:206;;;50232:33;50261:3;50232:24;50243:12;;50232:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;50220:45;;50179:206;;;50287:12;:23;50300:9;50287:23;;;;;;;;;;;;;;;;;;;;;;;;;50283:102;;;50339:34;50369:3;50339:25;50350:13;;50339:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;50327:46;;50283:102;50179:206;50411:1;50399:9;:13;50395:174;;;50456:39;50485:9;50456;:24;50474:4;50456:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;50429:9;:24;50447:4;50429:24;;;;;;;;;;;;;;;:66;;;;50540:4;50515:42;;50524:6;50515:42;;;50547:9;50515:42;;;;;;:::i;:::-;;;;;;;;50395:174;50583:10;;;;;;;;;;;50579:176;;;50623:5;50610:10;;:18;;;;;;;;;;;;;;;;;;50643:23;50659:3;50664:1;50643:15;:23::i;:::-;50731:12;;50724:3;50709:12;;:18;;;;:::i;:::-;50708:35;;;;:::i;:::-;50681:9;:24;50691:13;;;;;;;;;;;50681:24;;;;;;;;;;;;;;;:62;;;;50579:176;50772:21;50783:9;50772:6;:10;;:21;;;;:::i;:::-;50765:28;;;50007:794;;;;;:::o;10976:471::-;11034:7;11284:1;11279;:6;11275:47;;11309:1;11302:8;;;;11275:47;11334:9;11350:1;11346;:5;;;;:::i;:::-;11334:17;;11379:1;11374;11370;:5;;;;:::i;:::-;:10;11362:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;11438:1;11431:8;;;10976:471;;;;;:::o;11923:132::-;11981:7;12008:39;12012:1;12015;12008:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;12001:46;;11923:132;;;;:::o;52266:522::-;52332:21;52370:1;52356:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52332:40;;52401:4;52383;52388:1;52383:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;52427:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52417:4;52422:1;52417:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;52460:62;52477:4;52492:15;;;;;;;;;;;52510:11;52460:8;:62::i;:::-;52533:15;;;;;;;;;;;:66;;;52614:11;52640:1;52656:4;52683;52703:15;52533:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52745:35;52762:11;52775:4;52745:35;;;;;;;:::i;:::-;;;;;;;;52321:467;52266:522;:::o;44892:140::-;44998:9;:18;;:26;45017:6;44998:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44892:140;;:::o;52818:360::-;52899:62;52916:4;52931:15;;;;;;;;;;;52949:11;52899:8;:62::i;:::-;52972:15;;;;;;;;;;;:31;;;53011:9;53044:4;53064:11;53090:1;53106;53122:7;:5;:7::i;:::-;53144:15;52972:198;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52818:360;;:::o;12551:312::-;12671:7;12703:1;12699;:5;12706:12;12691:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12730:9;12746:1;12742;:5;;;;:::i;:::-;12730:17;;12854:1;12847:8;;;12551:312;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:118::-;1263:24;1281:5;1263:24;:::i;:::-;1258:3;1251:37;1176:118;;:::o;1300:222::-;1393:4;1431:2;1420:9;1416:18;1408:26;;1444:71;1512:1;1501:9;1497:17;1488:6;1444:71;:::i;:::-;1300:222;;;;:::o;1528:99::-;1580:6;1614:5;1608:12;1598:22;;1528:99;;;:::o;1633:169::-;1717:11;1751:6;1746:3;1739:19;1791:4;1786:3;1782:14;1767:29;;1633:169;;;;:::o;1808:246::-;1889:1;1899:113;1913:6;1910:1;1907:13;1899:113;;;1998:1;1993:3;1989:11;1983:18;1979:1;1974:3;1970:11;1963:39;1935:2;1932:1;1928:10;1923:15;;1899:113;;;2046:1;2037:6;2032:3;2028:16;2021:27;1870:184;1808:246;;;:::o;2060:102::-;2101:6;2152:2;2148:7;2143:2;2136:5;2132:14;2128:28;2118:38;;2060:102;;;:::o;2168:377::-;2256:3;2284:39;2317:5;2284:39;:::i;:::-;2339:71;2403:6;2398:3;2339:71;:::i;:::-;2332:78;;2419:65;2477:6;2472:3;2465:4;2458:5;2454:16;2419:65;:::i;:::-;2509:29;2531:6;2509:29;:::i;:::-;2504:3;2500:39;2493:46;;2260:285;2168:377;;;;:::o;2551:313::-;2664:4;2702:2;2691:9;2687:18;2679:26;;2751:9;2745:4;2741:20;2737:1;2726:9;2722:17;2715:47;2779:78;2852:4;2843:6;2779:78;:::i;:::-;2771:86;;2551:313;;;;:::o;2870:77::-;2907:7;2936:5;2925:16;;2870:77;;;:::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:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:60::-;4513:3;4534:5;4527:12;;4485:60;;;:::o;4551:142::-;4601:9;4634:53;4652:34;4661:24;4679:5;4661:24;:::i;:::-;4652:34;:::i;:::-;4634:53;:::i;:::-;4621:66;;4551:142;;;:::o;4699:126::-;4749:9;4782:37;4813:5;4782:37;:::i;:::-;4769:50;;4699:126;;;:::o;4831:153::-;4908:9;4941:37;4972:5;4941:37;:::i;:::-;4928:50;;4831:153;;;:::o;4990:185::-;5104:64;5162:5;5104:64;:::i;:::-;5099:3;5092:77;4990:185;;:::o;5181:276::-;5301:4;5339:2;5328:9;5324:18;5316:26;;5352:98;5447:1;5436:9;5432:17;5423:6;5352:98;:::i;:::-;5181:276;;;;:::o;5463:116::-;5533:21;5548:5;5533:21;:::i;:::-;5526:5;5523:32;5513:60;;5569:1;5566;5559:12;5513:60;5463:116;:::o;5585:133::-;5628:5;5666:6;5653:20;5644:29;;5682:30;5706:5;5682:30;:::i;:::-;5585:133;;;;:::o;5724:468::-;5789:6;5797;5846:2;5834:9;5825:7;5821:23;5817:32;5814:119;;;5852:79;;:::i;:::-;5814:119;5972:1;5997:53;6042:7;6033:6;6022:9;6018:22;5997:53;:::i;:::-;5987:63;;5943:117;6099:2;6125:50;6167:7;6158:6;6147:9;6143:22;6125:50;:::i;:::-;6115:60;;6070:115;5724:468;;;;;:::o;6198:117::-;6307:1;6304;6297:12;6321:180;6369:77;6366:1;6359:88;6466:4;6463:1;6456:15;6490:4;6487:1;6480:15;6507:281;6590:27;6612:4;6590:27;:::i;:::-;6582:6;6578:40;6720:6;6708:10;6705:22;6684:18;6672:10;6669:34;6666:62;6663:88;;;6731:18;;:::i;:::-;6663:88;6771:10;6767:2;6760:22;6550:238;6507:281;;:::o;6794:129::-;6828:6;6855:20;;:::i;:::-;6845:30;;6884:33;6912:4;6904:6;6884:33;:::i;:::-;6794:129;;;:::o;6929:311::-;7006:4;7096:18;7088:6;7085:30;7082:56;;;7118:18;;:::i;:::-;7082:56;7168:4;7160:6;7156:17;7148:25;;7228:4;7222;7218:15;7210:23;;6929:311;;;:::o;7246:117::-;7355:1;7352;7345:12;7386:710;7482:5;7507:81;7523:64;7580:6;7523:64;:::i;:::-;7507:81;:::i;:::-;7498:90;;7608:5;7637:6;7630:5;7623:21;7671:4;7664:5;7660:16;7653:23;;7724:4;7716:6;7712:17;7704:6;7700:30;7753:3;7745:6;7742:15;7739:122;;;7772:79;;:::i;:::-;7739:122;7887:6;7870:220;7904:6;7899:3;7896:15;7870:220;;;7979:3;8008:37;8041:3;8029:10;8008:37;:::i;:::-;8003:3;7996:50;8075:4;8070:3;8066:14;8059:21;;7946:144;7930:4;7925:3;7921:14;7914:21;;7870:220;;;7874:21;7488:608;;7386:710;;;;;:::o;8119:370::-;8190:5;8239:3;8232:4;8224:6;8220:17;8216:27;8206:122;;8247:79;;:::i;:::-;8206:122;8364:6;8351:20;8389:94;8479:3;8471:6;8464:4;8456:6;8452:17;8389:94;:::i;:::-;8380:103;;8196:293;8119:370;;;;:::o;8495:311::-;8572:4;8662:18;8654:6;8651:30;8648:56;;;8684:18;;:::i;:::-;8648:56;8734:4;8726:6;8722:17;8714:25;;8794:4;8788;8784:15;8776:23;;8495:311;;;:::o;8829:710::-;8925:5;8950:81;8966:64;9023:6;8966:64;:::i;:::-;8950:81;:::i;:::-;8941:90;;9051:5;9080:6;9073:5;9066:21;9114:4;9107:5;9103:16;9096:23;;9167:4;9159:6;9155:17;9147:6;9143:30;9196:3;9188:6;9185:15;9182:122;;;9215:79;;:::i;:::-;9182:122;9330:6;9313:220;9347:6;9342:3;9339:15;9313:220;;;9422:3;9451:37;9484:3;9472:10;9451:37;:::i;:::-;9446:3;9439:50;9518:4;9513:3;9509:14;9502:21;;9389:144;9373:4;9368:3;9364:14;9357:21;;9313:220;;;9317:21;8931:608;;8829:710;;;;;:::o;9562:370::-;9633:5;9682:3;9675:4;9667:6;9663:17;9659:27;9649:122;;9690:79;;:::i;:::-;9649:122;9807:6;9794:20;9832:94;9922:3;9914:6;9907:4;9899:6;9895:17;9832:94;:::i;:::-;9823:103;;9639:293;9562:370;;;;:::o;9938:894::-;10056:6;10064;10113:2;10101:9;10092:7;10088:23;10084:32;10081:119;;;10119:79;;:::i;:::-;10081:119;10267:1;10256:9;10252:17;10239:31;10297:18;10289:6;10286:30;10283:117;;;10319:79;;:::i;:::-;10283:117;10424:78;10494:7;10485:6;10474:9;10470:22;10424:78;:::i;:::-;10414:88;;10210:302;10579:2;10568:9;10564:18;10551:32;10610:18;10602:6;10599:30;10596:117;;;10632:79;;:::i;:::-;10596:117;10737:78;10807:7;10798:6;10787:9;10783:22;10737:78;:::i;:::-;10727:88;;10522:303;9938:894;;;;;:::o;10838:619::-;10915:6;10923;10931;10980:2;10968:9;10959:7;10955:23;10951:32;10948:119;;;10986:79;;:::i;:::-;10948:119;11106:1;11131:53;11176:7;11167:6;11156:9;11152:22;11131:53;:::i;:::-;11121:63;;11077:117;11233:2;11259:53;11304:7;11295:6;11284:9;11280:22;11259:53;:::i;:::-;11249:63;;11204:118;11361:2;11387:53;11432:7;11423:6;11412:9;11408:22;11387:53;:::i;:::-;11377:63;;11332:118;10838:619;;;;;:::o;11463:323::-;11519:6;11568:2;11556:9;11547:7;11543:23;11539:32;11536:119;;;11574:79;;:::i;:::-;11536:119;11694:1;11719:50;11761:7;11752:6;11741:9;11737:22;11719:50;:::i;:::-;11709:60;;11665:114;11463:323;;;;:::o;11792:86::-;11827:7;11867:4;11860:5;11856:16;11845:27;;11792:86;;;:::o;11884:112::-;11967:22;11983:5;11967:22;:::i;:::-;11962:3;11955:35;11884:112;;:::o;12002:214::-;12091:4;12129:2;12118:9;12114:18;12106:26;;12142:67;12206:1;12195:9;12191:17;12182:6;12142:67;:::i;:::-;12002:214;;;;:::o;12222:329::-;12281:6;12330:2;12318:9;12309:7;12305:23;12301:32;12298:119;;;12336:79;;:::i;:::-;12298:119;12456:1;12481:53;12526:7;12517:6;12506:9;12502:22;12481:53;:::i;:::-;12471:63;;12427:117;12222:329;;;;:::o;12557:474::-;12625:6;12633;12682:2;12670:9;12661:7;12657:23;12653:32;12650:119;;;12688:79;;:::i;:::-;12650:119;12808:1;12833:53;12878:7;12869:6;12858:9;12854:22;12833:53;:::i;:::-;12823:63;;12779:117;12935:2;12961:53;13006:7;12997:6;12986:9;12982:22;12961:53;:::i;:::-;12951:63;;12906:118;12557:474;;;;;:::o;13037:104::-;13082:7;13111:24;13129:5;13111:24;:::i;:::-;13100:35;;13037:104;;;:::o;13147:142::-;13250:32;13276:5;13250:32;:::i;:::-;13245:3;13238:45;13147:142;;:::o;13295:254::-;13404:4;13442:2;13431:9;13427:18;13419:26;;13455:87;13539:1;13528:9;13524:17;13515:6;13455:87;:::i;:::-;13295:254;;;;:::o;13555:474::-;13623:6;13631;13680:2;13668:9;13659:7;13655:23;13651:32;13648:119;;;13686:79;;:::i;:::-;13648:119;13806:1;13831:53;13876:7;13867:6;13856:9;13852:22;13831:53;:::i;:::-;13821:63;;13777:117;13933:2;13959:53;14004:7;13995:6;13984:9;13980:22;13959:53;:::i;:::-;13949:63;;13904:118;13555:474;;;;;:::o;14035:182::-;14175:34;14171:1;14163:6;14159:14;14152:58;14035:182;:::o;14223:366::-;14365:3;14386:67;14450:2;14445:3;14386:67;:::i;:::-;14379:74;;14462:93;14551:3;14462:93;:::i;:::-;14580:2;14575:3;14571:12;14564:19;;14223:366;;;:::o;14595:419::-;14761:4;14799:2;14788:9;14784:18;14776:26;;14848:9;14842:4;14838:20;14834:1;14823:9;14819:17;14812:47;14876:131;15002:4;14876:131;:::i;:::-;14868:139;;14595:419;;;:::o;15020:173::-;15160:25;15156:1;15148:6;15144:14;15137:49;15020:173;:::o;15199:366::-;15341:3;15362:67;15426:2;15421:3;15362:67;:::i;:::-;15355:74;;15438:93;15527:3;15438:93;:::i;:::-;15556:2;15551:3;15547:12;15540:19;;15199:366;;;:::o;15571:419::-;15737:4;15775:2;15764:9;15760:18;15752:26;;15824:9;15818:4;15814:20;15810:1;15799:9;15795:17;15788:47;15852:131;15978:4;15852:131;:::i;:::-;15844:139;;15571:419;;;:::o;15996:143::-;16053:5;16084:6;16078:13;16069:22;;16100:33;16127:5;16100:33;:::i;:::-;15996:143;;;;:::o;16145:351::-;16215:6;16264:2;16252:9;16243:7;16239:23;16235:32;16232:119;;;16270:79;;:::i;:::-;16232:119;16390:1;16415:64;16471:7;16462:6;16451:9;16447:22;16415:64;:::i;:::-;16405:74;;16361:128;16145:351;;;;:::o;16502:332::-;16623:4;16661:2;16650:9;16646:18;16638:26;;16674:71;16742:1;16731:9;16727:17;16718:6;16674:71;:::i;:::-;16755:72;16823:2;16812:9;16808:18;16799:6;16755:72;:::i;:::-;16502:332;;;;;:::o;16840:180::-;16888:77;16885:1;16878:88;16985:4;16982:1;16975:15;17009:4;17006:1;16999:15;17026:320;17070:6;17107:1;17101:4;17097:12;17087:22;;17154:1;17148:4;17144:12;17175:18;17165:81;;17231:4;17223:6;17219:17;17209:27;;17165:81;17293:2;17285:6;17282:14;17262:18;17259:38;17256:84;;17312:18;;:::i;:::-;17256:84;17077:269;17026:320;;;:::o;17352:236::-;17492:34;17488:1;17480:6;17476:14;17469:58;17561:19;17556:2;17548:6;17544:15;17537:44;17352:236;:::o;17594:366::-;17736:3;17757:67;17821:2;17816:3;17757:67;:::i;:::-;17750:74;;17833:93;17922:3;17833:93;:::i;:::-;17951:2;17946:3;17942:12;17935:19;;17594:366;;;:::o;17966:419::-;18132:4;18170:2;18159:9;18155:18;18147:26;;18219:9;18213:4;18209:20;18205:1;18194:9;18190:17;18183:47;18247:131;18373:4;18247:131;:::i;:::-;18239:139;;17966:419;;;:::o;18391:180::-;18439:77;18436:1;18429:88;18536:4;18533:1;18526:15;18560:4;18557:1;18550:15;18577:180;18625:77;18622:1;18615:88;18722:4;18719:1;18712:15;18746:4;18743:1;18736:15;18763:233;18802:3;18825:24;18843:5;18825:24;:::i;:::-;18816:33;;18871:66;18864:5;18861:77;18858:103;;18941:18;;:::i;:::-;18858:103;18988:1;18981:5;18977:13;18970:20;;18763:233;;;:::o;19002:227::-;19142:34;19138:1;19130:6;19126:14;19119:58;19211:10;19206:2;19198:6;19194:15;19187:35;19002:227;:::o;19235:366::-;19377:3;19398:67;19462:2;19457:3;19398:67;:::i;:::-;19391:74;;19474:93;19563:3;19474:93;:::i;:::-;19592:2;19587:3;19583:12;19576:19;;19235:366;;;:::o;19607:419::-;19773:4;19811:2;19800:9;19796:18;19788:26;;19860:9;19854:4;19850:20;19846:1;19835:9;19831:17;19824:47;19888:131;20014:4;19888:131;:::i;:::-;19880:139;;19607:419;;;:::o;20032:228::-;20172:34;20168:1;20160:6;20156:14;20149:58;20241:11;20236:2;20228:6;20224:15;20217:36;20032:228;:::o;20266:366::-;20408:3;20429:67;20493:2;20488:3;20429:67;:::i;:::-;20422:74;;20505:93;20594:3;20505:93;:::i;:::-;20623:2;20618:3;20614:12;20607:19;;20266:366;;;:::o;20638:419::-;20804:4;20842:2;20831:9;20827:18;20819:26;;20891:9;20885:4;20881:20;20877:1;20866:9;20862:17;20855:47;20919:131;21045:4;20919:131;:::i;:::-;20911:139;;20638:419;;;:::o;21063:151::-;21203:3;21199:1;21191:6;21187:14;21180:27;21063:151;:::o;21220:365::-;21362:3;21383:66;21447:1;21442:3;21383:66;:::i;:::-;21376:73;;21458:93;21547:3;21458:93;:::i;:::-;21576:2;21571:3;21567:12;21560:19;;21220:365;;;:::o;21591:419::-;21757:4;21795:2;21784:9;21780:18;21772:26;;21844:9;21838:4;21834:20;21830:1;21819:9;21815:17;21808:47;21872:131;21998:4;21872:131;:::i;:::-;21864:139;;21591:419;;;:::o;22016:410::-;22056:7;22079:20;22097:1;22079:20;:::i;:::-;22074:25;;22113:20;22131:1;22113:20;:::i;:::-;22108:25;;22168:1;22165;22161:9;22190:30;22208:11;22190:30;:::i;:::-;22179:41;;22369:1;22360:7;22356:15;22353:1;22350:22;22330:1;22323:9;22303:83;22280:139;;22399:18;;:::i;:::-;22280:139;22064:362;22016:410;;;;:::o;22432:180::-;22480:77;22477:1;22470:88;22577:4;22574:1;22567:15;22601:4;22598:1;22591:15;22618:185;22658:1;22675:20;22693:1;22675:20;:::i;:::-;22670:25;;22709:20;22727:1;22709:20;:::i;:::-;22704:25;;22748:1;22738:35;;22753:18;;:::i;:::-;22738:35;22795:1;22792;22788:9;22783:14;;22618:185;;;;:::o;22809:191::-;22849:3;22868:20;22886:1;22868:20;:::i;:::-;22863:25;;22902:20;22920:1;22902:20;:::i;:::-;22897:25;;22945:1;22942;22938:9;22931:16;;22966:3;22963:1;22960:10;22957:36;;;22973:18;;:::i;:::-;22957:36;22809:191;;;;:::o;23006:221::-;23146:34;23142:1;23134:6;23130:14;23123:58;23215:4;23210:2;23202:6;23198:15;23191:29;23006:221;:::o;23233:366::-;23375:3;23396:67;23460:2;23455:3;23396:67;:::i;:::-;23389:74;;23472:93;23561:3;23472:93;:::i;:::-;23590:2;23585:3;23581:12;23574:19;;23233:366;;;:::o;23605:419::-;23771:4;23809:2;23798:9;23794:18;23786:26;;23858:9;23852:4;23848:20;23844:1;23833:9;23829:17;23822:47;23886:131;24012:4;23886:131;:::i;:::-;23878:139;;23605:419;;;:::o;24030:225::-;24170:34;24166:1;24158:6;24154:14;24147:58;24239:8;24234:2;24226:6;24222:15;24215:33;24030:225;:::o;24261:366::-;24403:3;24424:67;24488:2;24483:3;24424:67;:::i;:::-;24417:74;;24500:93;24589:3;24500:93;:::i;:::-;24618:2;24613:3;24609:12;24602:19;;24261:366;;;:::o;24633:419::-;24799:4;24837:2;24826:9;24822:18;24814:26;;24886:9;24880:4;24876:20;24872:1;24861:9;24857:17;24850:47;24914:131;25040:4;24914:131;:::i;:::-;24906:139;;24633:419;;;:::o;25058:85::-;25103:7;25132:5;25121:16;;25058:85;;;:::o;25149:158::-;25207:9;25240:61;25258:42;25267:32;25293:5;25267:32;:::i;:::-;25258:42;:::i;:::-;25240:61;:::i;:::-;25227:74;;25149:158;;;:::o;25313:147::-;25408:45;25447:5;25408:45;:::i;:::-;25403:3;25396:58;25313:147;;:::o;25466:114::-;25533:6;25567:5;25561:12;25551:22;;25466:114;;;:::o;25586:184::-;25685:11;25719:6;25714:3;25707:19;25759:4;25754:3;25750:14;25735:29;;25586:184;;;;:::o;25776:132::-;25843:4;25866:3;25858:11;;25896:4;25891:3;25887:14;25879:22;;25776:132;;;:::o;25914:108::-;25991:24;26009:5;25991:24;:::i;:::-;25986:3;25979:37;25914:108;;:::o;26028:179::-;26097:10;26118:46;26160:3;26152:6;26118:46;:::i;:::-;26196:4;26191:3;26187:14;26173:28;;26028:179;;;;:::o;26213:113::-;26283:4;26315;26310:3;26306:14;26298:22;;26213:113;;;:::o;26362:732::-;26481:3;26510:54;26558:5;26510:54;:::i;:::-;26580:86;26659:6;26654:3;26580:86;:::i;:::-;26573:93;;26690:56;26740:5;26690:56;:::i;:::-;26769:7;26800:1;26785:284;26810:6;26807:1;26804:13;26785:284;;;26886:6;26880:13;26913:63;26972:3;26957:13;26913:63;:::i;:::-;26906:70;;26999:60;27052:6;26999:60;:::i;:::-;26989:70;;26845:224;26832:1;26829;26825:9;26820:14;;26785:284;;;26789:14;27085:3;27078:10;;26486:608;;;26362:732;;;;:::o;27100:720::-;27335:4;27373:3;27362:9;27358:19;27350:27;;27387:79;27463:1;27452:9;27448:17;27439:6;27387:79;:::i;:::-;27513:9;27507:4;27503:20;27498:2;27487:9;27483:18;27476:48;27541:108;27644:4;27635:6;27541:108;:::i;:::-;27533:116;;27659:72;27727:2;27716:9;27712:18;27703:6;27659:72;:::i;:::-;27741;27809:2;27798:9;27794:18;27785:6;27741:72;:::i;:::-;27100:720;;;;;;;:::o;27826:223::-;27966:34;27962:1;27954:6;27950:14;27943:58;28035:6;28030:2;28022:6;28018:15;28011:31;27826:223;:::o;28055:366::-;28197:3;28218:67;28282:2;28277:3;28218:67;:::i;:::-;28211:74;;28294:93;28383:3;28294:93;:::i;:::-;28412:2;28407:3;28403:12;28396:19;;28055:366;;;:::o;28427:419::-;28593:4;28631:2;28620:9;28616:18;28608:26;;28680:9;28674:4;28670:20;28666:1;28655:9;28651:17;28644:47;28708:131;28834:4;28708:131;:::i;:::-;28700:139;;28427:419;;;:::o;28852:221::-;28992:34;28988:1;28980:6;28976:14;28969:58;29061:4;29056:2;29048:6;29044:15;29037:29;28852:221;:::o;29079:366::-;29221:3;29242:67;29306:2;29301:3;29242:67;:::i;:::-;29235:74;;29318:93;29407:3;29318:93;:::i;:::-;29436:2;29431:3;29427:12;29420:19;;29079:366;;;:::o;29451:419::-;29617:4;29655:2;29644:9;29640:18;29632:26;;29704:9;29698:4;29694:20;29690:1;29679:9;29675:17;29668:47;29732:131;29858:4;29732:131;:::i;:::-;29724:139;;29451:419;;;:::o;29876:224::-;30016:34;30012:1;30004:6;30000:14;29993:58;30085:7;30080:2;30072:6;30068:15;30061:32;29876:224;:::o;30106:366::-;30248:3;30269:67;30333:2;30328:3;30269:67;:::i;:::-;30262:74;;30345:93;30434:3;30345:93;:::i;:::-;30463:2;30458:3;30454:12;30447:19;;30106:366;;;:::o;30478:419::-;30644:4;30682:2;30671:9;30667:18;30659:26;;30731:9;30725:4;30721:20;30717:1;30706:9;30702:17;30695:47;30759:131;30885:4;30759:131;:::i;:::-;30751:139;;30478:419;;;:::o;30903:222::-;31043:34;31039:1;31031:6;31027:14;31020:58;31112:5;31107:2;31099:6;31095:15;31088:30;30903:222;:::o;31131:366::-;31273:3;31294:67;31358:2;31353:3;31294:67;:::i;:::-;31287:74;;31370:93;31459:3;31370:93;:::i;:::-;31488:2;31483:3;31479:12;31472:19;;31131:366;;;:::o;31503:419::-;31669:4;31707:2;31696:9;31692:18;31684:26;;31756:9;31750:4;31746:20;31742:1;31731:9;31727:17;31720:47;31784:131;31910:4;31784:131;:::i;:::-;31776:139;;31503:419;;;:::o;31928:250::-;32068:34;32064:1;32056:6;32052:14;32045:58;32137:33;32132:2;32124:6;32120:15;32113:58;31928:250;:::o;32184:366::-;32326:3;32347:67;32411:2;32406:3;32347:67;:::i;:::-;32340:74;;32423:93;32512:3;32423:93;:::i;:::-;32541:2;32536:3;32532:12;32525:19;;32184:366;;;:::o;32556:419::-;32722:4;32760:2;32749:9;32745:18;32737:26;;32809:9;32803:4;32799:20;32795:1;32784:9;32780:17;32773:47;32837:131;32963:4;32837:131;:::i;:::-;32829:139;;32556:419;;;:::o;32981:194::-;33021:4;33041:20;33059:1;33041:20;:::i;:::-;33036:25;;33075:20;33093:1;33075:20;:::i;:::-;33070:25;;33119:1;33116;33112:9;33104:17;;33143:1;33137:4;33134:11;33131:37;;;33148:18;;:::i;:::-;33131:37;32981:194;;;;:::o;33181:177::-;33321:29;33317:1;33309:6;33305:14;33298:53;33181:177;:::o;33364:366::-;33506:3;33527:67;33591:2;33586:3;33527:67;:::i;:::-;33520:74;;33603:93;33692:3;33603:93;:::i;:::-;33721:2;33716:3;33712:12;33705:19;;33364:366;;;:::o;33736:419::-;33902:4;33940:2;33929:9;33925:18;33917:26;;33989:9;33983:4;33979:20;33975:1;33964:9;33960:17;33953:47;34017:131;34143:4;34017:131;:::i;:::-;34009:139;;33736:419;;;:::o;34161:167::-;34301:19;34297:1;34289:6;34285:14;34278:43;34161:167;:::o;34334:366::-;34476:3;34497:67;34561:2;34556:3;34497:67;:::i;:::-;34490:74;;34573:93;34662:3;34573:93;:::i;:::-;34691:2;34686:3;34682:12;34675:19;;34334:366;;;:::o;34706:419::-;34872:4;34910:2;34899:9;34895:18;34887:26;;34959:9;34953:4;34949:20;34945:1;34934:9;34930:17;34923:47;34987:131;35113:4;34987:131;:::i;:::-;34979:139;;34706:419;;;:::o;35131:442::-;35280:4;35318:2;35307:9;35303:18;35295:26;;35331:71;35399:1;35388:9;35384:17;35375:6;35331:71;:::i;:::-;35412:72;35480:2;35469:9;35465:18;35456:6;35412:72;:::i;:::-;35494;35562:2;35551:9;35547:18;35538:6;35494:72;:::i;:::-;35131:442;;;;;;:::o;35579:220::-;35719:34;35715:1;35707:6;35703:14;35696:58;35788:3;35783:2;35775:6;35771:15;35764:28;35579:220;:::o;35805:366::-;35947:3;35968:67;36032:2;36027:3;35968:67;:::i;:::-;35961:74;;36044:93;36133:3;36044:93;:::i;:::-;36162:2;36157:3;36153:12;36146:19;;35805:366;;;:::o;36177:419::-;36343:4;36381:2;36370:9;36366:18;36358:26;;36430:9;36424:4;36420:20;36416:1;36405:9;36401:17;36394:47;36458:131;36584:4;36458:131;:::i;:::-;36450:139;;36177:419;;;:::o;36602:831::-;36865:4;36903:3;36892:9;36888:19;36880:27;;36917:71;36985:1;36974:9;36970:17;36961:6;36917:71;:::i;:::-;36998:80;37074:2;37063:9;37059:18;37050:6;36998:80;:::i;:::-;37125:9;37119:4;37115:20;37110:2;37099:9;37095:18;37088:48;37153:108;37256:4;37247:6;37153:108;:::i;:::-;37145:116;;37271:72;37339:2;37328:9;37324:18;37315:6;37271:72;:::i;:::-;37353:73;37421:3;37410:9;37406:19;37397:6;37353:73;:::i;:::-;36602:831;;;;;;;;:::o;37439:483::-;37610:4;37648:2;37637:9;37633:18;37625:26;;37661:71;37729:1;37718:9;37714:17;37705:6;37661:71;:::i;:::-;37779:9;37773:4;37769:20;37764:2;37753:9;37749:18;37742:48;37807:108;37910:4;37901:6;37807:108;:::i;:::-;37799:116;;37439:483;;;;;:::o;37928:807::-;38177:4;38215:3;38204:9;38200:19;38192:27;;38229:71;38297:1;38286:9;38282:17;38273:6;38229:71;:::i;:::-;38310:72;38378:2;38367:9;38363:18;38354:6;38310:72;:::i;:::-;38392:80;38468:2;38457:9;38453:18;38444:6;38392:80;:::i;:::-;38482;38558:2;38547:9;38543:18;38534:6;38482:80;:::i;:::-;38572:73;38640:3;38629:9;38625:19;38616:6;38572:73;:::i;:::-;38655;38723:3;38712:9;38708:19;38699:6;38655:73;:::i;:::-;37928:807;;;;;;;;;:::o;38741:143::-;38798:5;38829:6;38823:13;38814:22;;38845:33;38872:5;38845:33;:::i;:::-;38741:143;;;;:::o;38890:663::-;38978:6;38986;38994;39043:2;39031:9;39022:7;39018:23;39014:32;39011:119;;;39049:79;;:::i;:::-;39011:119;39169:1;39194:64;39250:7;39241:6;39230:9;39226:22;39194:64;:::i;:::-;39184:74;;39140:128;39307:2;39333:64;39389:7;39380:6;39369:9;39365:22;39333:64;:::i;:::-;39323:74;;39278:129;39446:2;39472:64;39528:7;39519:6;39508:9;39504:22;39472:64;:::i;:::-;39462:74;;39417:129;38890:663;;;;;:::o

Swarm Source

ipfs://52d2eea2024f9f749fb3eab43ec70c30ec73bf5d18685cab69fd0ac4fda536a2
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.