ETH Price: $3,450.25 (+1.73%)
Gas: 4 Gwei

Contract

0xA3cB87080e68AD54D00573983D935Fa85d168FDE
 

Overview

ETH Balance

0.325060579959185523 ETH

Eth Value

$1,121.54 (@ $3,450.25/ETH)

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve201829992024-06-27 12:23:1123 hrs ago1719490991IN
InfinityBit: IBIT Token
0 ETH0.000319766.77014484
Approve201791452024-06-26 23:28:5935 hrs ago1719444539IN
InfinityBit: IBIT Token
0 ETH0.000097783.2792357
Approve201787852024-06-26 22:16:4737 hrs ago1719440207IN
InfinityBit: IBIT Token
0 ETH0.000236414.99914583
Approve201755412024-06-26 11:23:352 days ago1719401015IN
InfinityBit: IBIT Token
0 ETH0.000105182.23906168
Approve201695002024-06-25 15:09:472 days ago1719328187IN
InfinityBit: IBIT Token
0 ETH0.0005979412.72796879
Approve201676442024-06-25 8:56:473 days ago1719305807IN
InfinityBit: IBIT Token
0 ETH0.000227464.80994413
Approve201620432024-06-24 14:09:113 days ago1719238151IN
InfinityBit: IBIT Token
0 ETH0.0005155810.9162338
Approve201570412024-06-23 21:21:594 days ago1719177719IN
InfinityBit: IBIT Token
0 ETH0.000083983.35857539
Approve201548262024-06-23 13:56:114 days ago1719150971IN
InfinityBit: IBIT Token
0 ETH0.000163623.48819155
Transfer201548162024-06-23 13:54:114 days ago1719150851IN
InfinityBit: IBIT Token
0 ETH0.000348313.42360918
Approve201543162024-06-23 12:13:594 days ago1719144839IN
InfinityBit: IBIT Token
0 ETH0.00018673.95303078
Approve201536412024-06-23 9:57:595 days ago1719136679IN
InfinityBit: IBIT Token
0 ETH0.000139342.95033795
Approve201531072024-06-23 8:08:355 days ago1719130115IN
InfinityBit: IBIT Token
0 ETH0.00009263.71226087
Approve201530522024-06-23 7:57:235 days ago1719129443IN
InfinityBit: IBIT Token
0 ETH0.000090893.63462153
Transfer201511402024-06-23 1:32:475 days ago1719106367IN
InfinityBit: IBIT Token
0 ETH0.000192221.98244557
Approve201501602024-06-22 22:16:235 days ago1719094583IN
InfinityBit: IBIT Token
0 ETH0.000172873.66019661
Approve201480182024-06-22 15:03:475 days ago1719068627IN
InfinityBit: IBIT Token
0 ETH0.000210884.46488913
Approve201454462024-06-22 6:26:236 days ago1719037583IN
InfinityBit: IBIT Token
0 ETH0.000119952.55668931
Approve201439762024-06-22 1:29:476 days ago1719019787IN
InfinityBit: IBIT Token
0 ETH0.000208714.41892265
Approve201375692024-06-21 4:00:237 days ago1718942423IN
InfinityBit: IBIT Token
0 ETH0.000232614.92513175
Approve201361802024-06-20 23:21:117 days ago1718925671IN
InfinityBit: IBIT Token
0 ETH0.000161593.42141827
Approve201361042024-06-20 23:05:597 days ago1718924759IN
InfinityBit: IBIT Token
0 ETH0.000224714.75177669
Approve201360882024-06-20 23:02:477 days ago1718924567IN
InfinityBit: IBIT Token
0 ETH0.000203644.31160249
Approve201344862024-06-20 17:40:117 days ago1718905211IN
InfinityBit: IBIT Token
0 ETH0.000468339.96900482
Approve201326892024-06-20 11:38:117 days ago1718883491IN
InfinityBit: IBIT Token
0 ETH0.0005809112.28378461
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
201327682024-06-20 11:54:117 days ago1718884451
InfinityBit: IBIT Token
0.89988757 ETH
201327682024-06-20 11:54:117 days ago1718884451
InfinityBit: IBIT Token
0.89988757 ETH
200594372024-06-10 5:47:2318 days ago1717998443
InfinityBit: IBIT Token
0.88476173 ETH
200594372024-06-10 5:47:2318 days ago1717998443
InfinityBit: IBIT Token
0.88476173 ETH
199623302024-05-27 16:14:2331 days ago1716826463
InfinityBit: IBIT Token
0.96739971 ETH
199623302024-05-27 16:14:2331 days ago1716826463
InfinityBit: IBIT Token
0.96739971 ETH
198995032024-05-18 21:26:3540 days ago1716067595
InfinityBit: IBIT Token
1.08256079 ETH
198995032024-05-18 21:26:3540 days ago1716067595
InfinityBit: IBIT Token
1.08256079 ETH
198562252024-05-12 20:08:2346 days ago1715544503
InfinityBit: IBIT Token
1.66862065 ETH
198562252024-05-12 20:08:2346 days ago1715544503
InfinityBit: IBIT Token
1.66862065 ETH
197897162024-05-03 12:53:5955 days ago1714740839
InfinityBit: IBIT Token
1.08222164 ETH
197897162024-05-03 12:53:5955 days ago1714740839
InfinityBit: IBIT Token
1.08222164 ETH
197260162024-04-24 15:06:5964 days ago1713971219
InfinityBit: IBIT Token
1.31199446 ETH
197260162024-04-24 15:06:5964 days ago1713971219
InfinityBit: IBIT Token
1.31199446 ETH
196943492024-04-20 4:49:3569 days ago1713588575
InfinityBit: IBIT Token
0.93276254 ETH
196943492024-04-20 4:49:3569 days ago1713588575
InfinityBit: IBIT Token
0.93276254 ETH
196684632024-04-16 13:52:4772 days ago1713275567
InfinityBit: IBIT Token
1.05648494 ETH
196684632024-04-16 13:52:4772 days ago1713275567
InfinityBit: IBIT Token
1.05648494 ETH
196344592024-04-11 19:27:3577 days ago1712863655
InfinityBit: IBIT Token
1.08190965 ETH
196344592024-04-11 19:27:3577 days ago1712863655
InfinityBit: IBIT Token
1.08190965 ETH
196113202024-04-08 13:42:4780 days ago1712583767
InfinityBit: IBIT Token
1.05868989 ETH
196113202024-04-08 13:42:4780 days ago1712583767
InfinityBit: IBIT Token
1.05868989 ETH
195951942024-04-06 7:28:3583 days ago1712388515
InfinityBit: IBIT Token
1.17895138 ETH
195951942024-04-06 7:28:3583 days ago1712388515
InfinityBit: IBIT Token
1.17895138 ETH
195776122024-04-03 20:24:4785 days ago1712175887
InfinityBit: IBIT Token
1.0818569 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InfinityBitTokenV2

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: AGPL-3.0-only
// v2.0.03200148

/*
  _____        __ _       _ _         ____  _ _         _
 |_   _|      / _(_)     (_) |       |  _ \(_) |       (_)
   | |  _ __ | |_ _ _ __  _| |_ _   _| |_) |_| |_       _  ___
   | | | '_ \|  _| | '_ \| | __| | | |  _ <| | __|     | |/ _ \
  _| |_| | | | | | | | | | | |_| |_| | |_) | | |_   _  | | (_) |
 |_____|_| |_|_| |_|_| |_|_|\__|\__, |____/|_|\__| (_) |_|\___/
                                 __/ |
                                |___/
  v2
*/
// InfinityBit Token (IBIT) - v2
// https://infinitybit.io
// TG: https://t.me/infinitybit_io
// Twitter: https://twitter.com/infinitybit_io

pragma solidity 0.8.18;


// License: MIT
// pragma solidity ^0.8.0;
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// License: GPL-3.0
// https://github.com/Uniswap

// pragma solidity ^0.8.0;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

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

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


// License: GPL-3.0
// https://github.com/Uniswap

// pragma solidity ^0.8.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}


// License: GPL-3.0
// https://github.com/Uniswap

// pragma solidity >=0.8.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

//
// InfinityBit Token v2
//
// License: AGPL-3.0-only

// pragma solidity 0.8.18;

contract InfinityBitTokenV2 is IERC20, Ownable {
    using Address for address;

    event TaxesAutoswap(uint256 amount_eth);

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals = 8;
    uint256 private _deployHeight;
    address private _contractDeployer;

    // flags
    bool private _maxWalletEnabled = true;
    bool public _autoSwapTokens = true;
    bool public _transfersEnabled = false;
    bool public _sellFromTaxWallets = true;

    // Maximum Supply is 5,700,000,000. This is immutable and cannot be changed.
    uint256 private immutable _maxSupply = 5_700_000_000 * (10 ** uint256(_decimals));

    // Maximum total tax rate. This is immutable and cannot be changed.
    uint8 private immutable _maxTax = 50; // 5%
    // Maximum wallet. This is immutable and cannot be changed.
    uint256 private immutable _maxWallet = 125000000 * (10 ** uint256(_decimals));

    // Marketing Tax - has one decimal.
    uint8 private _marketingTax = 30; // 3%
    address payable private _marketingWallet = payable(0xd1CB9007D51FB812805d80618A97418Fd388B0C5);
    address payable immutable private _legacyMarketingWallet = payable(0xA6e18D5F6b20dFA84d7d245bb656561f1f9aff69);

    // Developer Tax
    uint8 private _devTax = 18; // 1.8%
    address payable private _devWallet = payable(0x02DAb704810C40C87374eBD85927c3D8a9815Eb0);
    address payable immutable private _legacyDevWallet = payable(0x9d0D8E5e651Ab7d54Af5B0F655b3978504E67E0C);

    // LP Tax
    uint8 private _lpTax = 0; // 0%

    // Burn Address
    address private immutable _burnAddress = 0x000000000000000000000000000000000000D34d;

    // Deadline in seconds for UniswapV2 autoswap
    uint8 private _autoSwapDeadlineSeconds = 0;

    // Taxless Allow-List
    //  This is a list of wallets which are exempt from taxes.
    mapping(address=>bool) TaxlessAllowList;

    // IgnoreMaxWallet Allow-List
    //  This is a list of wallets which are exempt from the maximum wallet.
    mapping(address=>bool) IgnoreMaxWalletAllowList;

    // SwapThreshold - Amount that will be autoswapped- has one decimal.
    uint8 public _swapLimit = 25; // 2.5%
    uint8 public immutable _swapLimitMax = 50; // 5% hardcoded max
    uint8 public _swapThreshold = 10; // 1%
    uint8 public immutable _swapThresholdMax = 50; // 5% hardcoded max

    // Required to recieve ETH from UniswapV2Router on automated token swaps
    receive() external payable {}

    // Uniswap V2
    IUniswapV2Router02 public _uniswapV2Router;
    address private _uniswapV2RouterAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private _uniswapUniversalRouter = 0x4648a43B2C14Da09FdF82B161150d3F634f40491;
    address private _uniswapV2PairAddress;
    IUniswapV2Factory public _uniswapV2Factory;

    constructor() payable {
        _name = "InfinityBit Token";
        _symbol = "IBIT";
        _decimals = 8;

        IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(_uniswapV2RouterAddress);
        _uniswapV2Router = uniswapV2Router;

        // Create Uniswap V2 Pair
        _uniswapV2Factory = IUniswapV2Factory(_uniswapV2Router.factory());
        _uniswapV2PairAddress = _uniswapV2Factory.createPair(address(this), _uniswapV2Router.WETH());
        _uniswapV2Router = uniswapV2Router;

        // Mint Supply
        _mint(msg.sender, _maxSupply);
        _totalSupply = _maxSupply;

        // IgnoreMaxWallet Allowlist
        IgnoreMaxWalletAllowList[_uniswapUniversalRouter] = true;
        IgnoreMaxWalletAllowList[_uniswapV2RouterAddress] = true;
        IgnoreMaxWalletAllowList[_uniswapV2PairAddress] = true;
        IgnoreMaxWalletAllowList[_marketingWallet] = true;
        IgnoreMaxWalletAllowList[_devWallet] = true;
        IgnoreMaxWalletAllowList[_legacyMarketingWallet] = true;
        IgnoreMaxWalletAllowList[_legacyDevWallet] = true;
        IgnoreMaxWalletAllowList[address(owner())] = true;

        // Taxless Allowlist
        TaxlessAllowList[_uniswapUniversalRouter] = true;
        TaxlessAllowList[_uniswapV2RouterAddress] = true;
        TaxlessAllowList[_marketingWallet] = true;
        TaxlessAllowList[_devWallet] = true;
        TaxlessAllowList[address(owner())] = true;
    }

    //
    //
    //

    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 returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address to, uint256 amount) public returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }
    function _approve(address from, address spender, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[from][spender] = amount;
        emit Approval(from, spender, amount);
    }
    function _spendAllowance(address from, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(from, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
        unchecked {
            _approve(from, spender, currentAllowance - amount);
        }
        }
    }
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = allowance(msg.sender, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(msg.sender, spender, currentAllowance - subtractedValue);
    }

        return true;
    }


    //
    //
    //


    function _mint(address to, uint value) internal {
        _totalSupply = _totalSupply+value;
        _balances[to] = _balances[to] + value;
        emit Transfer(address(0), to, value);
    }

    // Once transfers are enabled, they cannot be disabled.
    function enableTransfers() public onlyOwner() {
        _transfersEnabled = true;
    }

    // Set the Dev Wallet Address
    function setDevWallet(address devWallet) public onlyOwner {
        require(devWallet != address(0), "IBIT: cannot set to the zero address");
        _devWallet = payable(devWallet);
    }

    // Set the Marketing Wallet Address
    function setMarketingWallet(address marketingWallet) public onlyOwner {
        require(marketingWallet != address(0), "IBIT: cannot set to the zero address");
        _marketingWallet = payable(marketingWallet);
    }

    function isSell(address sender, address recipient) private view returns (bool) {
        if(sender == _uniswapV2RouterAddress || sender == _uniswapV2PairAddress || sender == _uniswapUniversalRouter) {
            return false;
        }

        if(recipient == _uniswapV2PairAddress || recipient == address(_uniswapV2Router)) {
            return true;
        }

        return false;
    }

    function isBuy(address sender) private view returns (bool) {
        return sender == _uniswapV2PairAddress || sender == address(_uniswapV2Router);
    }

    event AutoswapFailed(uint256 amount);

    function _swapTokensForETH(uint256 amount) private {
        if(amount == 0) {
            return;
        }

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _approve(address(this), address(_uniswapV2Router), amount);

        try _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp+_autoSwapDeadlineSeconds
        ) {

        } catch {
            emit AutoswapFailed(amount);
        }
    }

    function addLiquidity(uint256 amount_tokens, uint256 amount_eth) private returns (bool) {
        if(amount_tokens == 0 || amount_eth == 0) {
            return true;
        }

        _approve(address(this), address(_uniswapV2Router), amount_tokens);
        try _uniswapV2Router.addLiquidityETH{value: amount_eth}(
            address(this),
            amount_tokens,
            0,
            0,
            owner(),
            block.timestamp
        ) {
            return true;
        } catch {
            return false;
        }
    }

    function getDevTax() public view returns (uint8) {
        return _devTax;
    }

    function toggleAutoSwapTokens(bool enable) public onlyOwner {
        _autoSwapTokens = enable;
    }

    function getLpTax() public view returns (uint8) {
        return _lpTax;
    }

    function getMarketingTax() public view returns (uint8) {
        return _marketingTax;
    }

    function setDevTax(uint8 tax) public onlyOwner {
        require(_lpTax+_marketingTax+tax <= _maxTax, "IBIT: total tax cannot exceed max tax");
        _devTax = tax;
    }

    function setLpTax(uint8 tax) public onlyOwner {
        require((_devTax+_marketingTax+tax) <= _maxTax, "IBIT: total tax cannot exceed max tax");
        _lpTax = tax;
    }

    function setMarketingTax(uint8 tax) public onlyOwner {
        require(_devTax+_lpTax+tax <= _maxTax, "IBIT: total tax cannot exceed max tax");
        _marketingTax = tax;
    }

    function setAutoswapDeadline(uint8 deadline_seconds) public onlyOwner {
        _autoSwapDeadlineSeconds = deadline_seconds;
    }

    function DetectMaxWalletEnabled() public view returns (bool) {
        return _maxWalletEnabled;
    }

    function ToggleMaxWallet(bool _enable) public onlyOwner {
        _maxWalletEnabled = _enable;
    }

    function SetUniswapV2Pair(address _w) public onlyOwner {
        _uniswapV2PairAddress = _w;
    }

    function GetUniswapV2Pair() public view returns (address) {
        return _uniswapV2PairAddress;
    }

    // Add a wallet address to the taxless allow-list.
    function SetTaxlessAllowList(address _w) public onlyOwner {
        TaxlessAllowList[_w] = true;
    }

    // Remove a wallet address from the taxless allow-list.
    function UnsetTaxlessAllowList(address _w) public onlyOwner {
        TaxlessAllowList[_w] = false;
    }

    // Add a wallet address to the max wallet allow-list.
    function SetMaxWalletAllowList(address _w) public onlyOwner {
        IgnoreMaxWalletAllowList[_w] = true;
    }

    // Remove a wallet address from the max wallet allow-list.
    function UnsetMaxWalletAllowList(address _w) public onlyOwner {
        IgnoreMaxWalletAllowList[_w] = false;
    }

    // Returns true if the provided address is tax-exempt, otherwise returns false.
    function isTaxExempt(address from, address to) public view returns(bool) {
        if(TaxlessAllowList[from] || TaxlessAllowList[to])
        {
            return true;
        }

        if(from == owner() || to == owner())
        {
            return true;
        }

        return false;
    }

    // Returns true if the provided address is maxWallet-exempt, otherwise returns false.
    function isMaxWalletExempt(address _w) public view returns (bool) {
        if(_w == address(owner()))
        {
            return true;
        }

        return IgnoreMaxWalletAllowList[_w];
    }

    // Returns the total tax %
    function totalTax() public view returns (uint8) {
        return _lpTax+_devTax+_marketingTax;
    }

    // Sends Ether to specified 'to' address
    function sendEther(address payable to, uint256 amount) private returns (bool) {
        return to.send(amount);
    }

    // Returns the amount of IBIT tokens in the Liquidity Pool
    function getLiquidityIBIT() public view returns (uint256) {
        return _balances[_uniswapV2PairAddress];
    }

    // Limit the maximum autoswap based on _swapLimit percent
    function getMaxAutoswap() public view returns (uint256 max_autoswap_limit) {
        return (_swapLimit * getLiquidityIBIT()) / 1000;
    }

    // Returns the autoswap limit (ie, the maximum which will be autoswapped) as a percent with one decimal, i.e. 50 = 5%
    function getAutoswapLimit() public view returns (uint8 autoswap_limit_percent) {
        return _swapLimit;
    }

    function setAutoswapLimit(uint8 swapLimit) public onlyOwner {
        require(swapLimit < _swapLimitMax, "IBIT: swapLimit exceeds max");
        _swapLimit = swapLimit;
    }

    // Returns the autoswap threshold,  the minimum tokens which must be
    // reached before an autoswap will occur. expressed as a percent with one decimal, i.e. 50 = 5%
    function getAutoswapThreshold() public view returns (uint8 autoswap_threshold_percent) {
        return _swapThreshold;
    }

    function setAutoswapThreshold(uint8 swapThreshold) public onlyOwner {
        require(_swapThreshold < _swapThresholdMax, "IBIT: swapThreshold exceeds max");
        _swapThreshold = swapThreshold;
    }

    event AutoLiquidityFailed(uint256 token_amount, uint256 eth_amount, uint256 tokens_collected, uint256 tokens_swapped, uint256 eth_collected);
    event AutoLiquiditySuccess(uint256 token_amount, uint256 eth_amount, uint256 tokens_collected, uint256 tokens_swapped, uint256 eth_collected);
    event DeductTaxes(uint256 dev_tax_amount, uint256 marketing_tax_amount, uint256 lp_tax_amount);

    // Returns the maximum amount which can be autoswapped if everything is sold
    function autoswapTotalTokensAvailable(uint256 amount) public view returns (uint256) {
        return _calcLpTaxAmount(amount)/2 + _calcDevTaxAmount(amount) + _calcMarketingTaxAmount(amount) + _balances[_devWallet] + _balances[_marketingWallet];
    }

    function calcAutoswapAmount(uint256 sell_amount) public view returns (uint256) {
        uint256 lp_tokens = _calcLpTaxAmount(sell_amount)/2;
        return lp_tokens + _calcDevTaxAmount(sell_amount) + _calcMarketingTaxAmount(sell_amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(_balances[from] >= amount, "ERC20: transfer amount exceeds balance");

        if(!_transfersEnabled) {
            require(from == owner() || to == owner(), "IBIT: transfers disabled until initial LP");
        }

        uint256 tax_amount;

        // Begin Tax Check
        if(isTaxExempt(from, to))
        {
            tax_amount = 0;
        }
        else
        {
            tax_amount = _calcTaxes(amount);
        }

        uint256 transfer_amount = amount - tax_amount;

        // Begin Max Wallet Check, owner always ignores max wallet check.
        if(!isMaxWalletExempt(to) && from != owner() && _maxWalletEnabled)
        {
            require((balanceOf(to) + transfer_amount) <= _maxWallet, "IBIT: maximum wallet cannot be exceeded");
        }

        if(tax_amount == 0)
        {
            _taxlessTransfer(from, to, amount);
            return;
        }

        // Take taxes
        _takeTaxes(from, tax_amount);
        emit DeductTaxes(_calcDevTaxAmount(amount), _calcMarketingTaxAmount(amount), _calcLpTaxAmount(amount));

        if(autoSwapConditionCheck(from, to, amount))
        {
            _autoSwapTaxForEth(from, to, amount);
        }
        else
        {
            // Distribute Taxes (Tokens)
            _balances[_devWallet] += _calcDevTaxAmount(amount);
            _balances[_marketingWallet] += _calcMarketingTaxAmount(amount);
            _balances[address(this)] += _calcLpTaxAmount(amount);
        }

        // Emit
        _taxlessTransfer(from, to, transfer_amount);
    }

    function _autoSwapTaxForEth(address from, address to, uint256 amount) private {
        uint256 autoswap_amount = calcAutoswapAmount(amount);

        if(autoswap_amount == 0)
        {
            return;
        }

        uint256 max_autoswap = getMaxAutoswap();

        if(autoswap_amount < max_autoswap)
        {
            // Take tokens from marketing and dev wallets
            uint256 max_extra_autoswap = max_autoswap-autoswap_amount;
            autoswap_amount += _takeTokensFromMarketingAndDevWallets(max_extra_autoswap);
        }
        else if(autoswap_amount > max_autoswap)
        {
            autoswap_amount = max_autoswap;
        }

        // Execute autoswap
        uint256 startingBalance = address(this).balance;
        _swapTokensForETH(autoswap_amount);
        uint256 ethCollected = address(this).balance - startingBalance;
        emit TaxesAutoswap(ethCollected);

        // Auto Liquidity (LP Tax)
        if(_lpTax > 0 && !isTaxExempt(from, to))
        {
            uint256 tax_amount = _calcTaxes(amount);
            uint256 lp_tokens = _calcLpTaxAmount(amount)/2;
            if(to == _uniswapV2PairAddress && from != _uniswapV2RouterAddress && from != _uniswapUniversalRouter)
            {
                uint256 lp_tax_eth = _calcTaxDistribution(ethCollected, _lpTax);
                if(!addLiquidity(lp_tokens, lp_tax_eth)) {
                    emit AutoLiquidityFailed(lp_tokens, lp_tax_eth, tax_amount, autoswap_amount, ethCollected);
                } else {
                    emit AutoLiquiditySuccess(lp_tokens, lp_tax_eth, tax_amount, autoswap_amount, ethCollected);
                }
            }
        }

        // Distribute Taxes (ETH)
        uint256 marketing_tax_eth = _calcTaxDistribution(ethCollected, _marketingTax);
        uint256 dev_tax_eth = _calcTaxDistribution(ethCollected, _devTax);

        if(marketing_tax_eth > 0) {
            sendEther(_marketingWallet, marketing_tax_eth);
        }

        if(dev_tax_eth > 0) {
            sendEther(_devWallet, dev_tax_eth);
        }
    }

    // Returns true if the conditions are met for an autoswap, otherwise returns false.
    function autoSwapConditionCheck(address from, address to, uint256 amount) public view returns (bool) {
        if(!_autoSwapTokens) {
            return false;
        }

        if(!isSell(from, to)) {
            return false;
        }

        if(_swapThreshold == 0) {
            return true;
        }

        uint256 swapThresholdAmountTokens = (getLiquidityIBIT() * _swapThreshold)/1000;
        if(autoswapTotalTokensAvailable(amount) >= swapThresholdAmountTokens) {
            return true;
        }

        return false;
    }

    function toggleSellFromTaxWallets(bool enable) public onlyOwner {
        _sellFromTaxWallets = enable;
    }

    function takeTokensFromTaxWallets(uint256 max_amount) public onlyOwner returns (uint256 amount_taken) {
        return _takeTokensFromMarketingAndDevWallets(max_amount);
    }

    // Try to take max_extra_autoswap from marketing and dev wallets
    function _takeTokensFromMarketingAndDevWallets(uint256 max_extra_autoswap) private returns (uint256 amount_taken) {
        if(_sellFromTaxWallets == false) {
            return 0;
        }

        // Don't take tokens unless there are at least 100K
        if(_balances[_marketingWallet] + _balances[_devWallet] < 10000000000000)
        {
            return 0;
        }

        uint256 extra_amount_taken = 0;

        if(_balances[_marketingWallet] >= max_extra_autoswap)
        {
            unchecked {
                _balances[_marketingWallet] -= max_extra_autoswap;
                _balances[address(this)] += max_extra_autoswap;
            }
            return max_extra_autoswap;
        }

        if(_balances[_devWallet] >= max_extra_autoswap)
        {
            unchecked {
                _balances[_devWallet] -= max_extra_autoswap;
                _balances[address(this)] += max_extra_autoswap;
            }
            return max_extra_autoswap;
        }

        extra_amount_taken = _balances[_devWallet];

        unchecked {
            _balances[_devWallet] = 0;
            _balances[address(this)] += extra_amount_taken;
        }

        if(extra_amount_taken >= max_extra_autoswap)
        {
            return max_extra_autoswap;
        }

        uint256 mwBalance;
        if(extra_amount_taken + _balances[_marketingWallet] <= max_extra_autoswap)
        {
            mwBalance = _balances[_marketingWallet];

            unchecked {
                _balances[address(this)] += mwBalance;
                _balances[_marketingWallet] = 0;
            }
            return extra_amount_taken + mwBalance;
        }

        uint256 left_to_take = max_extra_autoswap - amount_taken;
        if(_balances[_marketingWallet] >= left_to_take)
        {
            unchecked {
                _balances[_marketingWallet] -= left_to_take;
                _balances[address(this)] += left_to_take;
            }
            return max_extra_autoswap;
        }

        mwBalance = _balances[_marketingWallet];
        unchecked {
            _balances[_marketingWallet] = 0;
            _balances[address(this)] += mwBalance;
        }
        return extra_amount_taken + mwBalance;
    }

    function _calcTaxDistribution(uint256 eth_collected, uint256 tax_rate) private view returns(uint256 distribution_eth)
    {
        // Equivilent to (eth_collected * (tax_rate/totalTax))
        return (eth_collected * tax_rate) / totalTax();
    }

    function _calcLpTaxAmount(uint256 amount) private view returns(uint256 tax)
    {
        return (amount * _lpTax) / 1000;
    }
    function _calcDevTaxAmount(uint256 amount) private view returns(uint256 tax)
    {
        return (amount * _devTax) / 1000;
    }
    function _calcMarketingTaxAmount(uint256 amount) private view returns(uint256 tax)
    {
        return (amount * _marketingTax) / 1000;
    }

    // Given an amount, calculate the taxes which would be collected. Excludes LP tax.
    function _calcTaxes(uint256 amount) public view returns (uint256 tax_to_collect) {
        return _calcDevTaxAmount(amount) + _calcMarketingTaxAmount(amount) + _calcLpTaxAmount(amount);
    }

    // Taxes taxes as specified by 'tax_amount'
    function _takeTaxes(address from, uint256 tax_amount) private {
        if(tax_amount == 0 || totalTax() == 0)
        {
            return;
        }

        // Remove tokens from sender
    unchecked {
        _balances[from] -= tax_amount;
    }

        // Collect taxes
    unchecked {
        _balances[address(this)] += tax_amount;
    }
    }

    function _taxlessTransfer(address from, address to, uint256 amount) private {
    unchecked {
        _balances[from] -= amount;
        _balances[to] += amount;
    }
        emit Transfer(from, to, amount);
    }

    // Migrate from Legacy
    address[] _legacyHolders;
    mapping(address=>uint256) _legacyHoldersBalances;

    bool _holdersAirdropped = false;

    function setLegacyHolder(address _w, uint256 balance) private {
        if(_legacyHoldersBalances[_w] != 0) {
            return; // duplicate
        }

        if(balance == 0) {
            return;
        }

        _legacyHolders.push(_w);
        _legacyHoldersBalances[_w] = balance;
    }

    // Airdrop Legacy Holders
    function initialAirdrop() public onlyOwner {
        require(_holdersAirdropped == false, "IBIT: Holders can only be airdropped once");
        _holdersAirdropped = true;

        setLegacyBalancesFromSnapshot();

        for(uint i = 0; i < _legacyHolders.length; i++) {
            address to = _legacyHolders[i];
            uint256 balance = _legacyHoldersBalances[to];

            _taxlessTransfer(owner(), to, balance);
        }
    }

    function setLegacyBalancesFromSnapshot() private {

        // NULS Partnership
        // 0x649Fd8b99b1d61d8FE7A9C7eec86dcfF829633F0, 14210000100000000); // 142,100,001 IBIT
        _taxlessTransfer(owner(), _legacyMarketingWallet, 14210000100000000);

        // These wallets completed migration from legacy
        setLegacyHolder(0x89Abd93CaBa3657919674a663D55E1C185A4CA25, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0x2e9EdC685510F3B6B92B5aA8B14E66a18707F5aB, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0xDB1C0B51328D40c11ebE5C9C7098477B88551e8d, 2500000000000000); // 25,000,000 IBIT
        setLegacyHolder(0x52747Fd7866eF249b015bB99E95a3169B9eC4497, 10490511753749771); // 104,905,118 IBIT
        setLegacyHolder(0xb2C91Cf2Fd763F2cC4558ed3cEDE401Fc1d1B675, 4000000000000000); // 40,000,000 IBIT
        setLegacyHolder(0x2E64b76130819f30bE2df0A0740D990d706B9926, 9317247665468201); // 93,172,477 IBIT
        setLegacyHolder(0x1E69003E5267E945962ae38578a76222CA408584, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0x16F39f8ff59caead81bC680e6cd663069Eb978BE, 10100000000000000); // 101,000,000 IBIT
        setLegacyHolder(0x6d102206CB3F043E22A62B4b7ecC83b877f85d9A, 5001685678902763); // 50,016,857 IBIT
        setLegacyHolder(0xEC61A284Df18c4937B50880F70EB181d38fe86Bb, 1660752476400742); // 16,607,525 IBIT
        setLegacyHolder(0x4C999827Bc4b51fbd6911f066d8b82baaC286a9b, 3500000000000000); // 35,000,000 IBIT
        setLegacyHolder(0x5415672D7334F8d2798022242675829B16bf94db, 1441870099079523); // 14,418,701 IBIT
        setLegacyHolder(0xdF10d9688528b5b60957D1727a70A30450cE9604, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0x831114051c0edDe239ae672EdcC4c63371deC82b, 3869772286660397); // 38,697,723 IBIT
        setLegacyHolder(0x1d9c8Ae02d75db48dF0d13424cF7fb188dfa4B6E, 2112190583266945); // 21,121,906 IBIT
        setLegacyHolder(0x6e7182cFe90cC9AaD11f7082cC4c462dbFD2D73C, 1083000000000000); // 10,830,000 IBIT
        setLegacyHolder(0x287044c98a99F08764d681eD898aECb68A5543BC, 2320032256026266); // 23,200,323 IBIT
        setLegacyHolder(0x5159cD8087B040E3E5F95e1489ce1018E186795C, 2250000000000000); // 22,500,000 IBIT
        setLegacyHolder(0x5eD277Af83D32fa421091244Fa802e90FE8e896d, 5464909136753054); // 54,649,091 IBIT
        setLegacyHolder(0x7aBc57C6f67853D16a4400685d18eE53980A3F4F, 7697889041792168); // 76,978,890 IBIT
        setLegacyHolder(0x09b3a9Ea542713dcC182728F9DebBdfCB1a0112F, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0xF3598aD305Bbd8b40A480947e00a5dc3E29dC5a5, 4875000000000000); // 48,750,000 IBIT
        setLegacyHolder(0x2Aeda0568E111Da6A465bb735D912899A15015c2, 10782747817992883); // 107,827,478 IBIT
        setLegacyHolder(0xb578B5157Bcc9Fd2e73AcACf7E853FD9F861F55d, 2000000000000000); // 20,000,000 IBIT
        setLegacyHolder(0x16C73eaFAA9c6f915d9026D3C2d1b6E9407d2F73, 5159396904718724); // 51,593,969 IBIT
        setLegacyHolder(0x3140dD4B65C557Fda703B081C475CE4945EaaCa3, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0xe632450E74165110459fEf989bc11E90Ee9029D1, 9350739929318052); // 93,507,399 IBIT
        setLegacyHolder(0xF6E82162D8938D91b44EFd4C307DBa91EcBD6950, 2907543953360030); // 29,075,440 IBIT
        setLegacyHolder(0x33AF2064Be09C34302C4cA8B8529A0E659243016, 660000000000000); // 6,600,000 IBIT
        setLegacyHolder(0xAA9d9D742b5c915D65649C636fb2D485911ece4D, 1318142836424375); // 13,181,428 IBIT
        setLegacyHolder(0x5507F5a1076742e3299cE8199fEEd98079ECeE34, 2500000000000000); // 25,000,000 IBIT
        setLegacyHolder(0x5e75d35893200849889DD98a50fce78E3D5641F3, 3263084246964091); // 32,630,842 IBIT
        setLegacyHolder(0x0665d03bDDFd7bA36b1bDC7aDdB26C48273111c8, 500000000000000); // 5,000,000 IBIT
        setLegacyHolder(0x8A541f614A14B00366d92dCe6e927bF550f1c897, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0xC8aFB078896B5780bD7b7174429AF2DAff61199b, 6139352996536699); // 61,393,530 IBIT
        setLegacyHolder(0xffa25D69EF4909454825904904A2D876eA43E437, 2968750000000000); // 29,687,500 IBIT
        setLegacyHolder(0xCd0951939b77e22e497895820Ea7BD3AeF480E1C, 121526011734471); // 1,215,260 IBIT
        setLegacyHolder(0x1ca92Baf56A806527952Ebe610d06A66B54Bf5f1, 800000000000000); // 8,000,000 IBIT
        setLegacyHolder(0xa51670db54Edf9Dd5D5E3570f619FF46535E3679, 9500000000000); // 95,000 IBIT
        setLegacyHolder(0xdd30235DC68011F4de01A5c4059fC20145D5c874, 2509039665732949); // 25,090,397 IBIT
        setLegacyHolder(0x9161c6B026e65Ba6B583fE8F552FA26b6D39eA89, 1425000000000000); // 14,250,000 IBIT
        setLegacyHolder(0xDa85C4A66eBea97aa48a6e1741EC0E639fFe1783, 3138834219770145); // 31,388,342 IBIT
        setLegacyHolder(0xCEe85e997E80B724c69a1474a9489dBFA4cF5d2C, 484424921158839); // 4,844,249 IBIT
        setLegacyHolder(0x79D6F80D880f1bc1671b6fe3f88977D09eAe4DAA, 1814845856095380); // 18,148,459 IBIT
        setLegacyHolder(0x6D9e1352e1F8f66F96669CC28FDCfE8e7FCF5524, 3200000000000000); // 32,000,000 IBIT
        setLegacyHolder(0xA6e18D5F6b20dFA84d7d245bb656561f1f9aff69, 11246699192462885); // 112,466,992 IBIT
        setLegacyHolder(0x9d0D8E5e651Ab7d54Af5B0F655b3978504E67E0C, 11031132794975236); // 110,311,328 IBIT
        setLegacyHolder(0x141278EF1F894a60cBC8637871E4d19c3f2a7336, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0x8AefCE4e323DbB2eCD5818869acF90e5415559C5, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0x5ea0c07ADa402b67F1a9467d008EC11eD9Ca1127, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0x2B09aCED766f8290de1F5E4E0d3B3B8915C49189, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0xFb1BAD0Dc29a9a485F08F4FE6bFBFEdeba10ad8d, 12125000000000000); // 121,250,000 IBIT
        setLegacyHolder(0x56be74F547b1c3b01E97f87461E2f3C75902374A, 1124603943161942); // 11,246,039 IBIT
        setLegacyHolder(0x4A9381E176D676A07DD17A83d8BFd1287b342c77, 4810000000000000); // 48,100,000 IBIT
        setLegacyHolder(0xFCe082295b4db70097c4135Ca254B13B070800E7, 10000000000000000); // 100,000,000 IBIT
        setLegacyHolder(0x7ea69F87f9836FFc6797B6B2D045c11e0881b740, 5000000000000000); // 50,000,000 IBIT
        setLegacyHolder(0x1cC4A2522c3847687aF45AcdA2b5d6EbB64490A9, 402527671912807); // 4,025,277 IBIT
        setLegacyHolder(0x89E364598BDa1f96B6618EBE5D9879F070066358, 4750000000000000); // 47,500,000 IBIT

        // These wallets did not migrate. 50% penalty as decided by the community.
        setLegacyHolder(0x7FF0373F706E07eE326d538f6a6B2Cf8F7397e77, uint256(uint256(1250924993795650) / 2));
        setLegacyHolder(0x5F7425396747897F91b68149915826aFc2C14c16, uint256(uint256(1097767093335720) / 2));
        setLegacyHolder(0xa9b809Cfe8d95EdbDD61603Ba40081Ba6da4F24b, uint256(uint256(711944117144372) / 2));
        setLegacyHolder(0x817271eA29E0297D26e87c0fCae5d7086c06ae94, uint256(uint256(263389054436059) / 2));
        setLegacyHolder(0x15Cd32F5e9C286FaD0c6E6F40D1fc07c2c1a8584, uint256(uint256(130033069564332) / 2));
        setLegacyHolder(0x90a71A274Cf69c0AD430481241206cd8fec7a1ED, uint256(uint256(117107416670239) / 2));
        setLegacyHolder(0xC5DcAdf158Dc6DE2D6Bc1dDBB40Fb03572000D32, uint256(uint256(45488054291697) / 2));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":false,"internalType":"uint256","name":"token_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eth_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens_collected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens_swapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eth_collected","type":"uint256"}],"name":"AutoLiquidityFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"token_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eth_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens_collected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens_swapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eth_collected","type":"uint256"}],"name":"AutoLiquiditySuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AutoswapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dev_tax_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing_tax_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lp_tax_amount","type":"uint256"}],"name":"DeductTaxes","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":"amount_eth","type":"uint256"}],"name":"TaxesAutoswap","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":"DetectMaxWalletEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetUniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_w","type":"address"}],"name":"SetMaxWalletAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_w","type":"address"}],"name":"SetTaxlessAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_w","type":"address"}],"name":"SetUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"ToggleMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_w","type":"address"}],"name":"UnsetMaxWalletAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_w","type":"address"}],"name":"UnsetTaxlessAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_autoSwapTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"_calcTaxes","outputs":[{"internalType":"uint256","name":"tax_to_collect","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellFromTaxWallets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapLimitMax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapThreshold","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapThresholdMax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapV2Factory","outputs":[{"internalType":"contract IUniswapV2Factory","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":"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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"autoSwapConditionCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"autoswapTotalTokensAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"sell_amount","type":"uint256"}],"name":"calcAutoswapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAutoswapLimit","outputs":[{"internalType":"uint8","name":"autoswap_limit_percent","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutoswapThreshold","outputs":[{"internalType":"uint8","name":"autoswap_threshold_percent","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDevTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityIBIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLpTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketingTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxAutoswap","outputs":[{"internalType":"uint256","name":"max_autoswap_limit","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":[],"name":"initialAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_w","type":"address"}],"name":"isMaxWalletExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"isTaxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint8","name":"deadline_seconds","type":"uint8"}],"name":"setAutoswapDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"swapLimit","type":"uint8"}],"name":"setAutoswapLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"swapThreshold","type":"uint8"}],"name":"setAutoswapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tax","type":"uint8"}],"name":"setDevTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tax","type":"uint8"}],"name":"setLpTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"tax","type":"uint8"}],"name":"setMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"max_amount","type":"uint256"}],"name":"takeTokensFromTaxWallets","outputs":[{"internalType":"uint256","name":"amount_taken","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"toggleAutoSwapTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"toggleSellFromTaxWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101806040526008600660006101000a81548160ff021916908360ff1602179055506001600860146101000a81548160ff0219169083151502179055506001600860156101000a81548160ff0219169083151502179055506000600860166101000a81548160ff0219169083151502179055506001600860176101000a81548160ff021916908315150217905550600660009054906101000a900460ff1660ff16600a620000ae91906200114a565b640153bf1900620000c091906200119b565b608090815250603260ff1660a09060ff16815250600660009054906101000a900460ff1660ff16600a620000f591906200114a565b63077359406200010691906200119b565b60c090815250601e600860186101000a81548160ff021916908360ff16021790555073d1cb9007d51fb812805d80618a97418fd388b0c5600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a6e18d5f6b20dfa84d7d245bb656561f1f9aff6973ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff168152506012600960146101000a81548160ff021916908360ff1602179055507302dab704810c40c87374ebd85927c3d8a9815eb0600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739d0d8e5e651ab7d54af5b0f655b3978504e67e0c73ffffffffffffffffffffffffffffffffffffffff166101009073ffffffffffffffffffffffffffffffffffffffff168152506000600a60146101000a81548160ff021916908360ff16021790555061d34d73ffffffffffffffffffffffffffffffffffffffff166101209073ffffffffffffffffffffffffffffffffffffffff168152506000600a60156101000a81548160ff021916908360ff1602179055506019600d60006101000a81548160ff021916908360ff160217905550603260ff166101409060ff16815250600a600d60016101000a81548160ff021916908360ff160217905550603260ff166101609060ff16815250737a250d5630b4cf539739df2c5dacb4c659f2488d600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734648a43b2c14da09fdf82b161150d3f634f40491600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601460006101000a81548160ff021916908315150217905550620004266200041a62000db660201b60201c565b62000dbe60201b60201c565b6040518060400160405280601181526020017f496e66696e69747942697420546f6b656e000000000000000000000000000000815250600490816200046c919062001456565b506040518060400160405280600481526020017f494249540000000000000000000000000000000000000000000000000000000081525060059081620004b3919062001456565b506008600660006101000a81548160ff021916908360ff1602179055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005a6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cc9190620015a7565b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620006b9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006df9190620015a7565b6040518363ffffffff1660e01b8152600401620006fe929190620015ea565b6020604051808303816000875af11580156200071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007449190620015a7565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007d93360805162000e8260201b60201c565b6080516003819055506001600c6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c600060e05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60006101005173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c600062000b0f62000f9460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600062000d5e62000f9460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062001680565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060035462000e92919062001617565b60038190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ee5919062001617565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000f88919062001663565b60405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200104b5780860481111562001023576200102262000fbd565b5b6001851615620010335780820291505b8081029050620010438562000fec565b945062001003565b94509492505050565b60008262001066576001905062001139565b8162001076576000905062001139565b81600181146200108f57600281146200109a57620010d0565b600191505062001139565b60ff841115620010af57620010ae62000fbd565b5b8360020a915084821115620010c957620010c862000fbd565b5b5062001139565b5060208310610133831016604e8410600b84101617156200110a5782820a90508381111562001104576200110362000fbd565b5b62001139565b62001119848484600162000ff9565b9250905081840481111562001133576200113262000fbd565b5b81810290505b9392505050565b6000819050919050565b6000620011578262001140565b9150620011648362001140565b9250620011937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001054565b905092915050565b6000620011a88262001140565b9150620011b58362001140565b9250828202620011c58162001140565b91508282048414831517620011df57620011de62000fbd565b5b5092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200126857607f821691505b6020821081036200127e576200127d62001220565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620012e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620012a9565b620012f48683620012a9565b95508019841693508086168417925050509392505050565b6000819050919050565b600062001337620013316200132b8462001140565b6200130c565b62001140565b9050919050565b6000819050919050565b620013538362001316565b6200136b62001362826200133e565b848454620012b6565b825550505050565b600090565b6200138262001373565b6200138f81848462001348565b505050565b5b81811015620013b757620013ab60008262001378565b60018101905062001395565b5050565b601f8211156200140657620013d08162001284565b620013db8462001299565b81016020851015620013eb578190505b62001403620013fa8562001299565b83018262001394565b50505b505050565b600082821c905092915050565b60006200142b600019846008026200140b565b1980831691505092915050565b600062001446838362001418565b9150826002028217905092915050565b6200146182620011e6565b67ffffffffffffffff8111156200147d576200147c620011f1565b5b6200148982546200124f565b62001496828285620013bb565b600060209050601f831160018114620014ce5760008415620014b9578287015190505b620014c5858262001438565b86555062001535565b601f198416620014de8662001284565b60005b828110156200150857848901518255600182019150602085019450602081019050620014e1565b8683101562001528578489015162001524601f89168262001418565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200156f8262001542565b9050919050565b620015818162001562565b81146200158d57600080fd5b50565b600081519050620015a18162001576565b92915050565b600060208284031215620015c057620015bf6200153d565b5b6000620015d08482850162001590565b91505092915050565b620015e48162001562565b82525050565b6000604082019050620016016000830185620015d9565b620016106020830184620015d9565b9392505050565b6000620016248262001140565b9150620016318362001140565b92508282019050808211156200164c576200164b62000fbd565b5b92915050565b6200165d8162001140565b82525050565b60006020820190506200167a600083018462001652565b92915050565b60805160a05160c05160e05161010051610120516101405161016051615c52620016f9600039600081816116240152611a5c01526000818161184f0152611b01015260005050600050506000613550015260006128c80152600081816111fa015281816113510152611c61015260005050615c526000f3fe6080604052600436106103855760003560e01c806370a08231116101d1578063af35c6c711610102578063dd62ed3e116100a0578063f187f44f1161006f578063f187f44f14610d31578063f2fde38b14610d5c578063fe85b42b14610d85578063fe9e014214610db05761038c565b8063dd62ed3e14610c75578063e036a05e14610cb2578063e78f4c2f14610cdd578063ea33df1614610d085761038c565b8063c8380919116100dc578063c838091914610be1578063cfd10a1214610c0a578063da48567c14610c33578063dbc34ee414610c4a5761038c565b8063af35c6c714610b64578063b0b39e6214610b7b578063ba6dd9b614610ba45761038c565b806395d89b411161016f578063a2e84abc11610149578063a2e84abc14610a94578063a457c2d714610abf578063a9059cbb14610afc578063ad995b5a14610b395761038c565b806395d89b4114610a155780639d86ccc714610a405780639f9aac7e14610a695761038c565b80637dcee9bc116101ab5780637dcee9bc14610959578063852c33cf1461099657806385438bc0146109bf5780638da5cb5b146109ea5761038c565b806370a08231146108dc578063715018a61461091957806377ce78fd146109305761038c565b806333862533116102b65780634a3273bf11610254578063583e056811610223578063583e0568146108345780635d098b381461085f578063633537c51461088857806370551007146108b15761038c565b80634a3273bf1461077c5780634f2fcbfc146107a5578063538faaec146107ce578063568b61dc1461080b5761038c565b80633c01439c116102905780633c01439c146106c05780633e89a813146106e95780633f374f1e1461072657806340a55915146107515761038c565b8063338625331461062f5780633950935114610658578063397186d0146106955761038c565b806318160ddd116103235780631d3635bc116102fd5780631d3635bc146105735780631f53ac021461059e57806323b872dd146105c7578063313ce567146106045761038c565b806318160ddd146104f457806319ea8ad51461051f5780631c0153991461054a5761038c565b80630bd11f8a1161035f5780630bd11f8a146104245780630c004ab8146104615780630e5a92311461048c5780630fa8eaa5146104b75761038c565b806306fdde0314610391578063083c78b2146103bc578063095ea7b3146103e75761038c565b3661038c57005b600080fd5b34801561039d57600080fd5b506103a6610ded565b6040516103b39190614a27565b60405180910390f35b3480156103c857600080fd5b506103d1610e7f565b6040516103de9190614a65565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190614b19565b610e96565b60405161041b9190614b74565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190614b8f565b610eb9565b6040516104589190614b74565b60405180910390f35b34801561046d57600080fd5b50610476610f53565b6040516104839190614a65565b60405180910390f35b34801561049857600080fd5b506104a1610f6a565b6040516104ae9190614a65565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190614bbc565b610f7d565b6040516104eb9190614b74565b60405180910390f35b34801561050057600080fd5b50610509611032565b6040516105169190614c1e565b60405180910390f35b34801561052b57600080fd5b5061053461103c565b6040516105419190614a65565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190614b8f565b611053565b005b34801561057f57600080fd5b506105886110b6565b6040516105959190614c1e565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190614b8f565b6110ef565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190614bbc565b6111aa565b6040516105fb9190614b74565b60405180910390f35b34801561061057600080fd5b506106196111d9565b6040516106269190614a65565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190614c65565b6111f0565b005b34801561066457600080fd5b5061067f600480360381019061067a9190614b19565b6112b3565b60405161068c9190614b74565b60405180910390f35b3480156106a157600080fd5b506106aa6112de565b6040516106b79190614c1e565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190614c65565b611347565b005b3480156106f557600080fd5b50610710600480360381019061070b9190614c92565b61140a565b60405161071d9190614c1e565b60405180910390f35b34801561073257600080fd5b5061073b611442565b6040516107489190614a65565b60405180910390f35b34801561075d57600080fd5b50610766611455565b6040516107739190614a65565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e9190614ceb565b61146c565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190614b8f565b611491565b005b3480156107da57600080fd5b506107f560048036038101906107f09190614d18565b6114dd565b6040516108029190614b74565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190614c65565b61161a565b005b34801561084057600080fd5b506108496116b7565b6040516108569190614db7565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190614b8f565b6116dd565b005b34801561089457600080fd5b506108af60048036038101906108aa9190614c65565b611798565b005b3480156108bd57600080fd5b506108c66117be565b6040516108d39190614de1565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe9190614b8f565b6117e8565b6040516109109190614c1e565b60405180910390f35b34801561092557600080fd5b5061092e611831565b005b34801561093c57600080fd5b5061095760048036038101906109529190614c65565b611845565b005b34801561096557600080fd5b50610980600480360381019061097b9190614c92565b6118d3565b60405161098d9190614c1e565b60405180910390f35b3480156109a257600080fd5b506109bd60048036038101906109b89190614b8f565b6118ed565b005b3480156109cb57600080fd5b506109d4611950565b6040516109e19190614b74565b60405180910390f35b3480156109f657600080fd5b506109ff611963565b604051610a0c9190614de1565b60405180910390f35b348015610a2157600080fd5b50610a2a61198c565b604051610a379190614a27565b60405180910390f35b348015610a4c57600080fd5b50610a676004803603810190610a629190614ceb565b611a1e565b005b348015610a7557600080fd5b50610a7e611a43565b604051610a8b9190614a65565b60405180910390f35b348015610aa057600080fd5b50610aa9611a5a565b604051610ab69190614a65565b60405180910390f35b348015610acb57600080fd5b50610ae66004803603810190610ae19190614b19565b611a7e565b604051610af39190614b74565b60405180910390f35b348015610b0857600080fd5b50610b236004803603810190610b1e9190614b19565b611ae8565b604051610b309190614b74565b60405180910390f35b348015610b4557600080fd5b50610b4e611aff565b604051610b5b9190614a65565b60405180910390f35b348015610b7057600080fd5b50610b79611b23565b005b348015610b8757600080fd5b50610ba26004803603810190610b9d9190614b8f565b611b48565b005b348015610bb057600080fd5b50610bcb6004803603810190610bc69190614c92565b611bab565b604051610bd89190614c1e565b60405180910390f35b348015610bed57600080fd5b50610c086004803603810190610c039190614b8f565b611bf4565b005b348015610c1657600080fd5b50610c316004803603810190610c2c9190614c65565b611c57565b005b348015610c3f57600080fd5b50610c48611d1a565b005b348015610c5657600080fd5b50610c5f611e5c565b604051610c6c9190614b74565b60405180910390f35b348015610c8157600080fd5b50610c9c6004803603810190610c979190614d18565b611e6f565b604051610ca99190614c1e565b60405180910390f35b348015610cbe57600080fd5b50610cc7611ef6565b604051610cd49190614e1d565b60405180910390f35b348015610ce957600080fd5b50610cf2611f1c565b604051610cff9190614b74565b60405180910390f35b348015610d1457600080fd5b50610d2f6004803603810190610d2a9190614ceb565b611f33565b005b348015610d3d57600080fd5b50610d46611f58565b604051610d539190614b74565b60405180910390f35b348015610d6857600080fd5b50610d836004803603810190610d7e9190614b8f565b611f6b565b005b348015610d9157600080fd5b50610d9a611fee565b604051610da79190614a65565b60405180910390f35b348015610dbc57600080fd5b50610dd76004803603810190610dd29190614c92565b612039565b604051610de49190614c1e565b60405180910390f35b606060048054610dfc90614e67565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2890614e67565b8015610e755780601f10610e4a57610100808354040283529160200191610e75565b820191906000526020600020905b815481529060010190602001808311610e5857829003601f168201915b5050505050905090565b6000600d60009054906101000a900460ff16905090565b600080610ea1612155565b9050610eae81858561215d565b600191505092915050565b6000610ec3611963565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610efe5760019050610f4e565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b919050565b6000600860189054906101000a900460ff16905090565b600d60019054906101000a900460ff1681565b6000600860159054906101000a900460ff16610f9c576000905061102b565b610fa68484612326565b610fb3576000905061102b565b6000600d60019054906101000a900460ff1660ff1603610fd6576001905061102b565b60006103e8600d60019054906101000a900460ff1660ff16610ff66112de565b6110009190614ec7565b61100a9190614f38565b90508061101684612039565b1061102557600191505061102b565b60009150505b9392505050565b6000600354905090565b6000600d60019054906101000a900460ff16905090565b61105b6124f9565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006103e86110c36112de565b600d60009054906101000a900460ff1660ff166110e09190614ec7565b6110ea9190614f38565b905090565b6110f76124f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614fdb565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111b5612155565b90506111c2858285612577565b6111cd858585612603565b60019150509392505050565b6000600660009054906101000a900460ff16905090565b6111f86124f9565b7f000000000000000000000000000000000000000000000000000000000000000060ff1681600860189054906101000a900460ff16600960149054906101000a900460ff166112479190614ffb565b6112519190614ffb565b60ff161115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c906150a2565b60405180910390fd5b80600a60146101000a81548160ff021916908360ff16021790555050565b60006112d43384846112c53388611e6f565b6112cf91906150c2565b61215d565b6001905092915050565b600060016000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61134f6124f9565b7f000000000000000000000000000000000000000000000000000000000000000060ff1681600a60149054906101000a900460ff16600960149054906101000a900460ff1661139e9190614ffb565b6113a89190614ffb565b60ff1611156113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e3906150a2565b60405180910390fd5b80600860186101000a81548160ff021916908360ff16021790555050565b600061141582612b46565b61141e83612b7a565b61142784612bae565b61143191906150c2565b61143b91906150c2565b9050919050565b600d60009054906101000a900460ff1681565b6000600960149054906101000a900460ff16905090565b6114746124f9565b80600860146101000a81548160ff02191690831515021790555050565b6114996124f9565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806115805750600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561158e5760019050611614565b611596611963565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061160157506115d2611963565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561160f5760019050611614565b600090505b92915050565b6116226124f9565b7f000000000000000000000000000000000000000000000000000000000000000060ff16600d60019054906101000a900460ff1660ff1610611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090615142565b60405180910390fd5b80600d60016101000a81548160ff021916908360ff16021790555050565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116e56124f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614fdb565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117a06124f9565b80600a60156101000a81548160ff021916908360ff16021790555050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118396124f9565b6118436000612be2565b565b61184d6124f9565b7f000000000000000000000000000000000000000000000000000000000000000060ff168160ff16106118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac906151ae565b60405180910390fd5b80600d60006101000a81548160ff021916908360ff16021790555050565b60006118dd6124f9565b6118e682612ca6565b9050919050565b6118f56124f9565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600860169054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461199b90614e67565b80601f01602080910402602001604051908101604052809291908181526020018280546119c790614e67565b8015611a145780601f106119e957610100808354040283529160200191611a14565b820191906000526020600020905b8154815290600101906020018083116119f757829003601f168201915b5050505050905090565b611a266124f9565b80600860176101000a81548160ff02191690831515021790555050565b6000600a60149054906101000a900460ff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080611a8b3385611e6f565b905082811015611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac790615240565b60405180910390fd5b611add338585840361215d565b600191505092915050565b6000611af5338484612603565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611b2b6124f9565b6001600860166101000a81548160ff021916908315150217905550565b611b506124f9565b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000806002611bb984612b46565b611bc39190614f38565b9050611bce83612b7a565b611bd784612bae565b82611be291906150c2565b611bec91906150c2565b915050919050565b611bfc6124f9565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611c5f6124f9565b7f000000000000000000000000000000000000000000000000000000000000000060ff1681600860189054906101000a900460ff16600a60149054906101000a900460ff16611cae9190614ffb565b611cb89190614ffb565b60ff161115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf3906150a2565b60405180910390fd5b80600960146101000a81548160ff021916908360ff16021790555050565b611d226124f9565b60001515601460009054906101000a900460ff16151514611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906152d2565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550611d9b613543565b60005b601280549050811015611e5957600060128281548110611dc157611dc06152f2565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611e44611e3d611963565b8383613f31565b50508080611e5190615321565b915050611d9e565b50565b600860159054906101000a900460ff1681565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860149054906101000a900460ff16905090565b611f3b6124f9565b80600860156101000a81548160ff02191690831515021790555050565b600860179054906101000a900460ff1681565b611f736124f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd9906153db565b60405180910390fd5b611feb81612be2565b50565b6000600860189054906101000a900460ff16600960149054906101000a900460ff16600a60149054906101000a900460ff1661202a9190614ffb565b6120349190614ffb565b905090565b600060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461210884612b7a565b61211185612bae565b600261211c87612b46565b6121269190614f38565b61213091906150c2565b61213a91906150c2565b61214491906150c2565b61214e91906150c2565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c39061546d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361223b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612232906154ff565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123199190614c1e565b60405180910390a3505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806123d15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806124295750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b1561243757600090506124f3565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806124e05750600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156124ee57600190506124f3565b600090505b92915050565b612501612155565b73ffffffffffffffffffffffffffffffffffffffff1661251f611963565b73ffffffffffffffffffffffffffffffffffffffff1614612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256c9061556b565b60405180910390fd5b565b60006125838484611e6f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125fd57818110156125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e6906155d7565b60405180910390fd5b6125fc848484840361215d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990615669565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8906156fb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275a9061578d565b60405180910390fd5b600860169054906101000a900460ff1661282a5761277f611963565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127ea57506127bb611963565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061581f565b60405180910390fd5b5b600061283684846114dd565b156128445760009050612850565b61284d8261140a565b90505b6000818361285e919061583f565b905061286984610eb9565b1580156128a95750612879611963565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156128c15750600860149054906101000a900460ff165b1561293d577f0000000000000000000000000000000000000000000000000000000000000000816128f1866117e8565b6128fb91906150c2565b111561293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906158e5565b60405180910390fd5b5b6000820361295757612950858585613f31565b5050612b41565b6129618583614035565b7f61d847c27904e7734ffb013f218c1c7d71fe34cd6f7117855e6f61b44864b83d61298b84612bae565b61299485612b7a565b61299d86612b46565b6040516129ac93929190615905565b60405180910390a16129bf858585610f7d565b156129d4576129cf8585856140f1565b612b33565b6129dd83612bae565b60016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4d91906150c2565b92505081905550612a5d83612b7a565b60016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612acd91906150c2565b92505081905550612add83612b46565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2b91906150c2565b925050819055505b612b3e858583613f31565b50505b505050565b60006103e8600a60149054906101000a900460ff1660ff1683612b699190614ec7565b612b739190614f38565b9050919050565b60006103e8600860189054906101000a900460ff1660ff1683612b9d9190614ec7565b612ba79190614f38565b9050919050565b60006103e8600960149054906101000a900460ff1660ff1683612bd19190614ec7565b612bdb9190614f38565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000801515600860179054906101000a900460ff16151503612ccb576000905061353e565b6509184e72a00060016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612da091906150c2565b1015612daf576000905061353e565b60008260016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612ede578260016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555082600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508291505061353e565b8260016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061300b578260016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555082600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508291505061353e565b60016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600060016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550828110613133578291505061353e565b60008360016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836131a391906150c2565b116132d55760016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080826132cc91906150c2565b9250505061353e565b600083856132e3919061583f565b90508060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410613414578060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555084935050505061353e565b60016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550818361353891906150c2565b93505050505b919050565b61357c61354e611963565b7f000000000000000000000000000000000000000000000000000000000000000066327beb78380100613f31565b6135a17389abd93caba3657919674a663d55e1c185a4ca256611c37937e0800061447d565b6135c6732e9edc685510f3b6b92b5aa8b14e66a18707f5ab6611c37937e0800061447d565b6135eb73db1c0b51328d40c11ebe5c9c7098477b88551e8d6608e1bc9bf0400061447d565b6136107352747fd7866ef249b015bb99e95a3169b9ec4497662545109a98250b61447d565b61363573b2c91cf2fd763f2cc4558ed3cede401fc1d1b675660e35fa931a000061447d565b61365a732e64b76130819f30be2df0a0740d990d706b9926662119fcc562732961447d565b61367f731e69003e5267e945962ae38578a76222ca4085846611c37937e0800061447d565b6136a47316f39f8ff59caead81bc680e6cd663069eb978be6623e1e5803b400061447d565b6136c9736d102206cb3f043e22a62b4b7ecc83b877f85d9a6611c501b22b4deb61447d565b6136ee73ec61a284df18c4937b50880f70eb181d38fe86bb6605e672116a6c6661447d565b613713734c999827bc4b51fbd6911f066d8b82baac286a9b660c6f3b40b6c00061447d565b613738735415672d7334f8d2798022242675829b16bf94db66051f5f8b11616361447d565b61375d73df10d9688528b5b60957d1727a70a30450ce96046611c37937e0800061447d565b61378273831114051c0edde239ae672edcc4c63371dec82b660dbf8992820f2d61447d565b6137a7731d9c8ae02d75db48df0d13424cf7fb188dfa4b6e66078106b169de8161447d565b6137cc736e7182cfe90cc9aad11f7082cc4c462dbfd2d73c6603d8fb964ab00061447d565b6137f173287044c98a99f08764d681ed898aecb68a5543bc66083e0e9a7ce69a61447d565b613816735159cd8087b040e3e5f95e1489ce1018e186795c6607fe5cf2bea00061447d565b61383b735ed277af83d32fa421091244fa802e90fe8e896d66136a4e4fd3719e61447d565b613860737abc57c6f67853d16a4400685d18ee53980a3f4f661b593075db3ca861447d565b6138857309b3a9ea542713dcc182728f9debbdfcb1a0112f6611c37937e0800061447d565b6138aa73f3598ad305bbd8b40a480947e00a5dc3e29dc5a5661151c96347b00061447d565b6138cf732aeda0568e111da6a465bb735d912899a15015c266264eda1d64e2b361447d565b6138f473b578b5157bcc9fd2e73acacf7e853fd9f861f55d66071afd498d000061447d565b6139197316c73eafaa9c6f915d9026d3c2d1b6e9407d2f7366125471b3c2d18461447d565b61393e733140dd4b65c557fda703b081c475ce4945eaaca36611c37937e0800061447d565b61396373e632450e74165110459fef989bc11e90ee9029d166213872cbdfc2a461447d565b61398873f6e82162d8938d91b44efd4c307dba91ecbd6950660a54655482449e61447d565b6139ad7333af2064be09c34302c4ca8b8529a0e65924301666025844398d400061447d565b6139d273aa9d9d742b5c915d65649c636fb2d485911ece4d6604aed80b873eb761447d565b6139f7735507f5a1076742e3299ce8199feed98079ecee346608e1bc9bf0400061447d565b613a1c735e75d35893200849889dd98a50fce78e3d5641f3660b97c20169977b61447d565b613a41730665d03bddfd7ba36b1bdc7addb26c48273111c86601c6bf5263400061447d565b613a66738a541f614a14b00366d92dce6e927bf550f1c8976611c37937e0800061447d565b613a8b73c8afb078896b5780bd7b7174429af2daff61199b6615cfb58282617b61447d565b613ab073ffa25d69ef4909454825904904a2d876ea43e437660a8c0ff92d4c0061447d565b613ad473cd0951939b77e22e497895820ea7bd3aef480e1c656e86fac2a9c761447d565b613af9731ca92baf56a806527952ebe610d06a66b54bf5f16602d79883d2000061447d565b613b1d73a51670db54edf9dd5d5e3570f619ff46535e36796508a3e420180061447d565b613b4273dd30235dc68011f4de01a5c4059fc20145d5c8746608e9f55200dd5561447d565b613b67739161c6b026e65ba6b583fe8f552fa26b6d39ea8966051007aace100061447d565b613b8c73da85c4a66ebea97aa48a6e1741ec0e639ffe1783660b26c0caada12161447d565b613bb173cee85e997e80b724c69a1474a9489dbfa4cf5d2c6601b894f75894b761447d565b613bd67379d6f80d880f1bc1671b6fe3f88977d09eae4daa66067297ba931c9461447d565b613bfb736d9e1352e1f8f66f96669cc28fdcfe8e7fcf5524660b5e620f48000061447d565b613c2073a6e18d5f6b20dfa84d7d245bb656561f1f9aff696627f4d036432e2561447d565b613c45739d0d8e5e651ab7d54af5b0f655b3978504e67e0c662730c1bfb6f40461447d565b613c6a73141278ef1f894a60cbc8637871e4d19c3f2a73366611c37937e0800061447d565b613c8f738aefce4e323dbb2ecd5818869acf90e5415559c56611c37937e0800061447d565b613cb4735ea0c07ada402b67f1a9467d008ec11ed9ca11276611c37937e0800061447d565b613cd9732b09aced766f8290de1f5e4e0d3b3b8915c491896611c37937e0800061447d565b613cfe73fb1bad0dc29a9a485f08f4fe6bfbfedeba10ad8d662b139f8de6d00061447d565b613d237356be74f547b1c3b01e97f87461e2f3c75902374a6603fed2428b905661447d565b613d48734a9381e176d676a07dd17a83d8bfd1287b342c77661116ab655ea00061447d565b613d6d73fce082295b4db70097c4135ca254b13b070800e7662386f26fc1000061447d565b613d92737ea69f87f9836ffc6797b6b2d045c11e0881b7406611c37937e0800061447d565b613db7731cc4a2522c3847687af45acda2b5d6ebb64490a966016e18c6e5896761447d565b613ddc7389e364598bda1f96b6618ebe5d9879f0700663586610e0198eaee00061447d565b613e0d737ff0373f706e07ee326d538f6a6b2cf8f7397e776002660471b5abe55642613e089190614f38565b61447d565b613e3e735f7425396747897f91b68149915826afc2c14c1660026603e669d1a4f6a8613e399190614f38565b61447d565b613e6f73a9b809cfe8d95edbdd61603ba40081ba6da4f24b6002660287826833cb34613e6a9190614f38565b61447d565b613e9f73817271ea29e0297d26e87c0fcae5d7086c06ae94600265ef8d0b0702db613e9a9190614f38565b61447d565b613ecf7315cd32f5e9c286fad0c6e6f40d1fc07c2c1a85846002657643aeeba1ac613eca9190614f38565b61447d565b613eff7390a71a274cf69c0ad430481241206cd8fec7a1ed6002656a8231f8a01f613efa9190614f38565b61447d565b613f2f73c5dcadf158dc6de2d6bc1ddbb40fb03572000d32600265295f03514cf1613f2a9190614f38565b61447d565b565b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516140289190614c1e565b60405180910390a3505050565b600081148061404e57506000614049611fee565b60ff16145b6140ed5780600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b5050565b60006140fc82611bab565b90506000810361410c5750614478565b60006141166110b6565b90508082101561414c576000828261412e919061583f565b905061413981612ca6565b8361414491906150c2565b925050614159565b80821115614158578091505b5b600047905061416783614579565b60008147614175919061583f565b90507f9572f600ac02e9bafd8e4f025ea488d19cb1821776401f4b0e1884e81167cc44816040516141a69190614c1e565b60405180910390a16000600a60149054906101000a900460ff1660ff161180156141d757506141d587876114dd565b155b156143c35760006141e78661140a565b9050600060026141f688612b46565b6142009190614f38565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480156142ad5750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b80156143075750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b156143c057600061432a84600a60149054906101000a900460ff1660ff1661481d565b90506143368282614848565b61437e577f1d8c0ffe523a60028885b523cb9cbc740eb32636db62bbf322ecb63a6dc1e8bf8282858a8860405161437195949392919061593c565b60405180910390a16143be565b7ff1639dd60f5b6dfa121767af35709c4735f2eeb213811f714d1bbf88938c6f1f8282858a886040516143b595949392919061593c565b60405180910390a15b505b50505b60006143e182600860189054906101000a900460ff1660ff1661481d565b9050600061440183600960149054906101000a900460ff1660ff1661481d565b9050600082111561443a57614438600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614958565b505b60008111156144715761446f600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614958565b505b5050505050505b505050565b6000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403614575576000810315614575576012829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b600081031561481a576000600267ffffffffffffffff81111561459f5761459e61598f565b5b6040519080825280602002602001820160405280156145cd5781602001602082028036833780820191505090505b50905030816000815181106145e5576145e46152f2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561468c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146b091906159d3565b816001815181106146c4576146c36152f2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061472b30600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461215d565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430600a60159054906101000a900460ff1660ff164261478c91906150c2565b6040518663ffffffff1660e01b81526004016147ac959493929190615af9565b600060405180830381600087803b1580156147c657600080fd5b505af19250505080156147d7575060015b614817577f163865970267fb5cd79322dcc0cc0b193c52d963f284585552f2bf323d9e27d68260405161480a9190614c1e565b60405180910390a1614818565b5b505b50565b6000614827611fee565b60ff1682846148369190614ec7565b6148409190614f38565b905092915050565b6000808314806148585750600082145b156148665760019050614952565b61489330600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561215d565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198330866000806148df611963565b426040518863ffffffff1660e01b815260040161490196959493929190615b53565b60606040518083038185885af19350505050801561493d57506040513d601f19601f8201168201806040525081019061493a9190615bc9565b60015b61494a5760009050614952565b505050600190505b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149d15780820151818401526020810190506149b6565b60008484015250505050565b6000601f19601f8301169050919050565b60006149f982614997565b614a0381856149a2565b9350614a138185602086016149b3565b614a1c816149dd565b840191505092915050565b60006020820190508181036000830152614a4181846149ee565b905092915050565b600060ff82169050919050565b614a5f81614a49565b82525050565b6000602082019050614a7a6000830184614a56565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614ab082614a85565b9050919050565b614ac081614aa5565b8114614acb57600080fd5b50565b600081359050614add81614ab7565b92915050565b6000819050919050565b614af681614ae3565b8114614b0157600080fd5b50565b600081359050614b1381614aed565b92915050565b60008060408385031215614b3057614b2f614a80565b5b6000614b3e85828601614ace565b9250506020614b4f85828601614b04565b9150509250929050565b60008115159050919050565b614b6e81614b59565b82525050565b6000602082019050614b896000830184614b65565b92915050565b600060208284031215614ba557614ba4614a80565b5b6000614bb384828501614ace565b91505092915050565b600080600060608486031215614bd557614bd4614a80565b5b6000614be386828701614ace565b9350506020614bf486828701614ace565b9250506040614c0586828701614b04565b9150509250925092565b614c1881614ae3565b82525050565b6000602082019050614c336000830184614c0f565b92915050565b614c4281614a49565b8114614c4d57600080fd5b50565b600081359050614c5f81614c39565b92915050565b600060208284031215614c7b57614c7a614a80565b5b6000614c8984828501614c50565b91505092915050565b600060208284031215614ca857614ca7614a80565b5b6000614cb684828501614b04565b91505092915050565b614cc881614b59565b8114614cd357600080fd5b50565b600081359050614ce581614cbf565b92915050565b600060208284031215614d0157614d00614a80565b5b6000614d0f84828501614cd6565b91505092915050565b60008060408385031215614d2f57614d2e614a80565b5b6000614d3d85828601614ace565b9250506020614d4e85828601614ace565b9150509250929050565b6000819050919050565b6000614d7d614d78614d7384614a85565b614d58565b614a85565b9050919050565b6000614d8f82614d62565b9050919050565b6000614da182614d84565b9050919050565b614db181614d96565b82525050565b6000602082019050614dcc6000830184614da8565b92915050565b614ddb81614aa5565b82525050565b6000602082019050614df66000830184614dd2565b92915050565b6000614e0782614d84565b9050919050565b614e1781614dfc565b82525050565b6000602082019050614e326000830184614e0e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e7f57607f821691505b602082108103614e9257614e91614e38565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ed282614ae3565b9150614edd83614ae3565b9250828202614eeb81614ae3565b91508282048414831517614f0257614f01614e98565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f4382614ae3565b9150614f4e83614ae3565b925082614f5e57614f5d614f09565b5b828204905092915050565b7f494249543a2063616e6e6f742073657420746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614fc56024836149a2565b9150614fd082614f69565b604082019050919050565b60006020820190508181036000830152614ff481614fb8565b9050919050565b600061500682614a49565b915061501183614a49565b9250828201905060ff81111561502a57615029614e98565b5b92915050565b7f494249543a20746f74616c207461782063616e6e6f7420657863656564206d6160008201527f7820746178000000000000000000000000000000000000000000000000000000602082015250565b600061508c6025836149a2565b915061509782615030565b604082019050919050565b600060208201905081810360008301526150bb8161507f565b9050919050565b60006150cd82614ae3565b91506150d883614ae3565b92508282019050808211156150f0576150ef614e98565b5b92915050565b7f494249543a20737761705468726573686f6c642065786365656473206d617800600082015250565b600061512c601f836149a2565b9150615137826150f6565b602082019050919050565b6000602082019050818103600083015261515b8161511f565b9050919050565b7f494249543a20737761704c696d69742065786365656473206d61780000000000600082015250565b6000615198601b836149a2565b91506151a382615162565b602082019050919050565b600060208201905081810360008301526151c78161518b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061522a6025836149a2565b9150615235826151ce565b604082019050919050565b600060208201905081810360008301526152598161521d565b9050919050565b7f494249543a20486f6c646572732063616e206f6e6c792062652061697264726f60008201527f70706564206f6e63650000000000000000000000000000000000000000000000602082015250565b60006152bc6029836149a2565b91506152c782615260565b604082019050919050565b600060208201905081810360008301526152eb816152af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061532c82614ae3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361535e5761535d614e98565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153c56026836149a2565b91506153d082615369565b604082019050919050565b600060208201905081810360008301526153f4816153b8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006154576024836149a2565b9150615462826153fb565b604082019050919050565b600060208201905081810360008301526154868161544a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006154e96022836149a2565b91506154f48261548d565b604082019050919050565b60006020820190508181036000830152615518816154dc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006155556020836149a2565b91506155608261551f565b602082019050919050565b6000602082019050818103600083015261558481615548565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006155c1601d836149a2565b91506155cc8261558b565b602082019050919050565b600060208201905081810360008301526155f0816155b4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156536025836149a2565b915061565e826155f7565b604082019050919050565b6000602082019050818103600083015261568281615646565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006156e56023836149a2565b91506156f082615689565b604082019050919050565b60006020820190508181036000830152615714816156d8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006157776026836149a2565b91506157828261571b565b604082019050919050565b600060208201905081810360008301526157a68161576a565b9050919050565b7f494249543a207472616e73666572732064697361626c656420756e74696c206960008201527f6e697469616c204c500000000000000000000000000000000000000000000000602082015250565b60006158096029836149a2565b9150615814826157ad565b604082019050919050565b60006020820190508181036000830152615838816157fc565b9050919050565b600061584a82614ae3565b915061585583614ae3565b925082820390508181111561586d5761586c614e98565b5b92915050565b7f494249543a206d6178696d756d2077616c6c65742063616e6e6f74206265206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b60006158cf6027836149a2565b91506158da82615873565b604082019050919050565b600060208201905081810360008301526158fe816158c2565b9050919050565b600060608201905061591a6000830186614c0f565b6159276020830185614c0f565b6159346040830184614c0f565b949350505050565b600060a0820190506159516000830188614c0f565b61595e6020830187614c0f565b61596b6040830186614c0f565b6159786060830185614c0f565b6159856080830184614c0f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506159cd81614ab7565b92915050565b6000602082840312156159e9576159e8614a80565b5b60006159f7848285016159be565b91505092915050565b6000819050919050565b6000615a25615a20615a1b84615a00565b614d58565b614ae3565b9050919050565b615a3581615a0a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615a7081614aa5565b82525050565b6000615a828383615a67565b60208301905092915050565b6000602082019050919050565b6000615aa682615a3b565b615ab08185615a46565b9350615abb83615a57565b8060005b83811015615aec578151615ad38882615a76565b9750615ade83615a8e565b925050600181019050615abf565b5085935050505092915050565b600060a082019050615b0e6000830188614c0f565b615b1b6020830187615a2c565b8181036040830152615b2d8186615a9b565b9050615b3c6060830185614dd2565b615b496080830184614c0f565b9695505050505050565b600060c082019050615b686000830189614dd2565b615b756020830188614c0f565b615b826040830187615a2c565b615b8f6060830186615a2c565b615b9c6080830185614dd2565b615ba960a0830184614c0f565b979650505050505050565b600081519050615bc381614aed565b92915050565b600080600060608486031215615be257615be1614a80565b5b6000615bf086828701615bb4565b9350506020615c0186828701615bb4565b9250506040615c1286828701615bb4565b915050925092509256fea2646970667358221220dacac630edb96b2f23823c50b32e8a3e618537b3ca279da728d1666d693bfd9c64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106103855760003560e01c806370a08231116101d1578063af35c6c711610102578063dd62ed3e116100a0578063f187f44f1161006f578063f187f44f14610d31578063f2fde38b14610d5c578063fe85b42b14610d85578063fe9e014214610db05761038c565b8063dd62ed3e14610c75578063e036a05e14610cb2578063e78f4c2f14610cdd578063ea33df1614610d085761038c565b8063c8380919116100dc578063c838091914610be1578063cfd10a1214610c0a578063da48567c14610c33578063dbc34ee414610c4a5761038c565b8063af35c6c714610b64578063b0b39e6214610b7b578063ba6dd9b614610ba45761038c565b806395d89b411161016f578063a2e84abc11610149578063a2e84abc14610a94578063a457c2d714610abf578063a9059cbb14610afc578063ad995b5a14610b395761038c565b806395d89b4114610a155780639d86ccc714610a405780639f9aac7e14610a695761038c565b80637dcee9bc116101ab5780637dcee9bc14610959578063852c33cf1461099657806385438bc0146109bf5780638da5cb5b146109ea5761038c565b806370a08231146108dc578063715018a61461091957806377ce78fd146109305761038c565b806333862533116102b65780634a3273bf11610254578063583e056811610223578063583e0568146108345780635d098b381461085f578063633537c51461088857806370551007146108b15761038c565b80634a3273bf1461077c5780634f2fcbfc146107a5578063538faaec146107ce578063568b61dc1461080b5761038c565b80633c01439c116102905780633c01439c146106c05780633e89a813146106e95780633f374f1e1461072657806340a55915146107515761038c565b8063338625331461062f5780633950935114610658578063397186d0146106955761038c565b806318160ddd116103235780631d3635bc116102fd5780631d3635bc146105735780631f53ac021461059e57806323b872dd146105c7578063313ce567146106045761038c565b806318160ddd146104f457806319ea8ad51461051f5780631c0153991461054a5761038c565b80630bd11f8a1161035f5780630bd11f8a146104245780630c004ab8146104615780630e5a92311461048c5780630fa8eaa5146104b75761038c565b806306fdde0314610391578063083c78b2146103bc578063095ea7b3146103e75761038c565b3661038c57005b600080fd5b34801561039d57600080fd5b506103a6610ded565b6040516103b39190614a27565b60405180910390f35b3480156103c857600080fd5b506103d1610e7f565b6040516103de9190614a65565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190614b19565b610e96565b60405161041b9190614b74565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190614b8f565b610eb9565b6040516104589190614b74565b60405180910390f35b34801561046d57600080fd5b50610476610f53565b6040516104839190614a65565b60405180910390f35b34801561049857600080fd5b506104a1610f6a565b6040516104ae9190614a65565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190614bbc565b610f7d565b6040516104eb9190614b74565b60405180910390f35b34801561050057600080fd5b50610509611032565b6040516105169190614c1e565b60405180910390f35b34801561052b57600080fd5b5061053461103c565b6040516105419190614a65565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190614b8f565b611053565b005b34801561057f57600080fd5b506105886110b6565b6040516105959190614c1e565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190614b8f565b6110ef565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190614bbc565b6111aa565b6040516105fb9190614b74565b60405180910390f35b34801561061057600080fd5b506106196111d9565b6040516106269190614a65565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190614c65565b6111f0565b005b34801561066457600080fd5b5061067f600480360381019061067a9190614b19565b6112b3565b60405161068c9190614b74565b60405180910390f35b3480156106a157600080fd5b506106aa6112de565b6040516106b79190614c1e565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190614c65565b611347565b005b3480156106f557600080fd5b50610710600480360381019061070b9190614c92565b61140a565b60405161071d9190614c1e565b60405180910390f35b34801561073257600080fd5b5061073b611442565b6040516107489190614a65565b60405180910390f35b34801561075d57600080fd5b50610766611455565b6040516107739190614a65565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e9190614ceb565b61146c565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190614b8f565b611491565b005b3480156107da57600080fd5b506107f560048036038101906107f09190614d18565b6114dd565b6040516108029190614b74565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190614c65565b61161a565b005b34801561084057600080fd5b506108496116b7565b6040516108569190614db7565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190614b8f565b6116dd565b005b34801561089457600080fd5b506108af60048036038101906108aa9190614c65565b611798565b005b3480156108bd57600080fd5b506108c66117be565b6040516108d39190614de1565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe9190614b8f565b6117e8565b6040516109109190614c1e565b60405180910390f35b34801561092557600080fd5b5061092e611831565b005b34801561093c57600080fd5b5061095760048036038101906109529190614c65565b611845565b005b34801561096557600080fd5b50610980600480360381019061097b9190614c92565b6118d3565b60405161098d9190614c1e565b60405180910390f35b3480156109a257600080fd5b506109bd60048036038101906109b89190614b8f565b6118ed565b005b3480156109cb57600080fd5b506109d4611950565b6040516109e19190614b74565b60405180910390f35b3480156109f657600080fd5b506109ff611963565b604051610a0c9190614de1565b60405180910390f35b348015610a2157600080fd5b50610a2a61198c565b604051610a379190614a27565b60405180910390f35b348015610a4c57600080fd5b50610a676004803603810190610a629190614ceb565b611a1e565b005b348015610a7557600080fd5b50610a7e611a43565b604051610a8b9190614a65565b60405180910390f35b348015610aa057600080fd5b50610aa9611a5a565b604051610ab69190614a65565b60405180910390f35b348015610acb57600080fd5b50610ae66004803603810190610ae19190614b19565b611a7e565b604051610af39190614b74565b60405180910390f35b348015610b0857600080fd5b50610b236004803603810190610b1e9190614b19565b611ae8565b604051610b309190614b74565b60405180910390f35b348015610b4557600080fd5b50610b4e611aff565b604051610b5b9190614a65565b60405180910390f35b348015610b7057600080fd5b50610b79611b23565b005b348015610b8757600080fd5b50610ba26004803603810190610b9d9190614b8f565b611b48565b005b348015610bb057600080fd5b50610bcb6004803603810190610bc69190614c92565b611bab565b604051610bd89190614c1e565b60405180910390f35b348015610bed57600080fd5b50610c086004803603810190610c039190614b8f565b611bf4565b005b348015610c1657600080fd5b50610c316004803603810190610c2c9190614c65565b611c57565b005b348015610c3f57600080fd5b50610c48611d1a565b005b348015610c5657600080fd5b50610c5f611e5c565b604051610c6c9190614b74565b60405180910390f35b348015610c8157600080fd5b50610c9c6004803603810190610c979190614d18565b611e6f565b604051610ca99190614c1e565b60405180910390f35b348015610cbe57600080fd5b50610cc7611ef6565b604051610cd49190614e1d565b60405180910390f35b348015610ce957600080fd5b50610cf2611f1c565b604051610cff9190614b74565b60405180910390f35b348015610d1457600080fd5b50610d2f6004803603810190610d2a9190614ceb565b611f33565b005b348015610d3d57600080fd5b50610d46611f58565b604051610d539190614b74565b60405180910390f35b348015610d6857600080fd5b50610d836004803603810190610d7e9190614b8f565b611f6b565b005b348015610d9157600080fd5b50610d9a611fee565b604051610da79190614a65565b60405180910390f35b348015610dbc57600080fd5b50610dd76004803603810190610dd29190614c92565b612039565b604051610de49190614c1e565b60405180910390f35b606060048054610dfc90614e67565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2890614e67565b8015610e755780601f10610e4a57610100808354040283529160200191610e75565b820191906000526020600020905b815481529060010190602001808311610e5857829003601f168201915b5050505050905090565b6000600d60009054906101000a900460ff16905090565b600080610ea1612155565b9050610eae81858561215d565b600191505092915050565b6000610ec3611963565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610efe5760019050610f4e565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b919050565b6000600860189054906101000a900460ff16905090565b600d60019054906101000a900460ff1681565b6000600860159054906101000a900460ff16610f9c576000905061102b565b610fa68484612326565b610fb3576000905061102b565b6000600d60019054906101000a900460ff1660ff1603610fd6576001905061102b565b60006103e8600d60019054906101000a900460ff1660ff16610ff66112de565b6110009190614ec7565b61100a9190614f38565b90508061101684612039565b1061102557600191505061102b565b60009150505b9392505050565b6000600354905090565b6000600d60019054906101000a900460ff16905090565b61105b6124f9565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006103e86110c36112de565b600d60009054906101000a900460ff1660ff166110e09190614ec7565b6110ea9190614f38565b905090565b6110f76124f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614fdb565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111b5612155565b90506111c2858285612577565b6111cd858585612603565b60019150509392505050565b6000600660009054906101000a900460ff16905090565b6111f86124f9565b7f000000000000000000000000000000000000000000000000000000000000003260ff1681600860189054906101000a900460ff16600960149054906101000a900460ff166112479190614ffb565b6112519190614ffb565b60ff161115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c906150a2565b60405180910390fd5b80600a60146101000a81548160ff021916908360ff16021790555050565b60006112d43384846112c53388611e6f565b6112cf91906150c2565b61215d565b6001905092915050565b600060016000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61134f6124f9565b7f000000000000000000000000000000000000000000000000000000000000003260ff1681600a60149054906101000a900460ff16600960149054906101000a900460ff1661139e9190614ffb565b6113a89190614ffb565b60ff1611156113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e3906150a2565b60405180910390fd5b80600860186101000a81548160ff021916908360ff16021790555050565b600061141582612b46565b61141e83612b7a565b61142784612bae565b61143191906150c2565b61143b91906150c2565b9050919050565b600d60009054906101000a900460ff1681565b6000600960149054906101000a900460ff16905090565b6114746124f9565b80600860146101000a81548160ff02191690831515021790555050565b6114996124f9565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806115805750600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561158e5760019050611614565b611596611963565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061160157506115d2611963565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561160f5760019050611614565b600090505b92915050565b6116226124f9565b7f000000000000000000000000000000000000000000000000000000000000003260ff16600d60019054906101000a900460ff1660ff1610611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090615142565b60405180910390fd5b80600d60016101000a81548160ff021916908360ff16021790555050565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116e56124f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614fdb565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117a06124f9565b80600a60156101000a81548160ff021916908360ff16021790555050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118396124f9565b6118436000612be2565b565b61184d6124f9565b7f000000000000000000000000000000000000000000000000000000000000003260ff168160ff16106118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac906151ae565b60405180910390fd5b80600d60006101000a81548160ff021916908360ff16021790555050565b60006118dd6124f9565b6118e682612ca6565b9050919050565b6118f56124f9565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600860169054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461199b90614e67565b80601f01602080910402602001604051908101604052809291908181526020018280546119c790614e67565b8015611a145780601f106119e957610100808354040283529160200191611a14565b820191906000526020600020905b8154815290600101906020018083116119f757829003601f168201915b5050505050905090565b611a266124f9565b80600860176101000a81548160ff02191690831515021790555050565b6000600a60149054906101000a900460ff16905090565b7f000000000000000000000000000000000000000000000000000000000000003281565b600080611a8b3385611e6f565b905082811015611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac790615240565b60405180910390fd5b611add338585840361215d565b600191505092915050565b6000611af5338484612603565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000003281565b611b2b6124f9565b6001600860166101000a81548160ff021916908315150217905550565b611b506124f9565b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000806002611bb984612b46565b611bc39190614f38565b9050611bce83612b7a565b611bd784612bae565b82611be291906150c2565b611bec91906150c2565b915050919050565b611bfc6124f9565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611c5f6124f9565b7f000000000000000000000000000000000000000000000000000000000000003260ff1681600860189054906101000a900460ff16600a60149054906101000a900460ff16611cae9190614ffb565b611cb89190614ffb565b60ff161115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf3906150a2565b60405180910390fd5b80600960146101000a81548160ff021916908360ff16021790555050565b611d226124f9565b60001515601460009054906101000a900460ff16151514611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906152d2565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550611d9b613543565b60005b601280549050811015611e5957600060128281548110611dc157611dc06152f2565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611e44611e3d611963565b8383613f31565b50508080611e5190615321565b915050611d9e565b50565b600860159054906101000a900460ff1681565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860149054906101000a900460ff16905090565b611f3b6124f9565b80600860156101000a81548160ff02191690831515021790555050565b600860179054906101000a900460ff1681565b611f736124f9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd9906153db565b60405180910390fd5b611feb81612be2565b50565b6000600860189054906101000a900460ff16600960149054906101000a900460ff16600a60149054906101000a900460ff1661202a9190614ffb565b6120349190614ffb565b905090565b600060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461210884612b7a565b61211185612bae565b600261211c87612b46565b6121269190614f38565b61213091906150c2565b61213a91906150c2565b61214491906150c2565b61214e91906150c2565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c39061546d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361223b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612232906154ff565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123199190614c1e565b60405180910390a3505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806123d15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806124295750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b1561243757600090506124f3565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806124e05750600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156124ee57600190506124f3565b600090505b92915050565b612501612155565b73ffffffffffffffffffffffffffffffffffffffff1661251f611963565b73ffffffffffffffffffffffffffffffffffffffff1614612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256c9061556b565b60405180910390fd5b565b60006125838484611e6f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125fd57818110156125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e6906155d7565b60405180910390fd5b6125fc848484840361215d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266990615669565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8906156fb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275a9061578d565b60405180910390fd5b600860169054906101000a900460ff1661282a5761277f611963565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127ea57506127bb611963565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128209061581f565b60405180910390fd5b5b600061283684846114dd565b156128445760009050612850565b61284d8261140a565b90505b6000818361285e919061583f565b905061286984610eb9565b1580156128a95750612879611963565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156128c15750600860149054906101000a900460ff165b1561293d577f000000000000000000000000000000000000000000000000002c68af0bb14000816128f1866117e8565b6128fb91906150c2565b111561293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906158e5565b60405180910390fd5b5b6000820361295757612950858585613f31565b5050612b41565b6129618583614035565b7f61d847c27904e7734ffb013f218c1c7d71fe34cd6f7117855e6f61b44864b83d61298b84612bae565b61299485612b7a565b61299d86612b46565b6040516129ac93929190615905565b60405180910390a16129bf858585610f7d565b156129d4576129cf8585856140f1565b612b33565b6129dd83612bae565b60016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4d91906150c2565b92505081905550612a5d83612b7a565b60016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612acd91906150c2565b92505081905550612add83612b46565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2b91906150c2565b925050819055505b612b3e858583613f31565b50505b505050565b60006103e8600a60149054906101000a900460ff1660ff1683612b699190614ec7565b612b739190614f38565b9050919050565b60006103e8600860189054906101000a900460ff1660ff1683612b9d9190614ec7565b612ba79190614f38565b9050919050565b60006103e8600960149054906101000a900460ff1660ff1683612bd19190614ec7565b612bdb9190614f38565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000801515600860179054906101000a900460ff16151503612ccb576000905061353e565b6509184e72a00060016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612da091906150c2565b1015612daf576000905061353e565b60008260016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612ede578260016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555082600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508291505061353e565b8260016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061300b578260016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555082600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508291505061353e565b60016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600060016000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550828110613133578291505061353e565b60008360016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836131a391906150c2565b116132d55760016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080826132cc91906150c2565b9250505061353e565b600083856132e3919061583f565b90508060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410613414578060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555084935050505061353e565b60016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150600060016000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550818361353891906150c2565b93505050505b919050565b61357c61354e611963565b7f000000000000000000000000a6e18d5f6b20dfa84d7d245bb656561f1f9aff6966327beb78380100613f31565b6135a17389abd93caba3657919674a663d55e1c185a4ca256611c37937e0800061447d565b6135c6732e9edc685510f3b6b92b5aa8b14e66a18707f5ab6611c37937e0800061447d565b6135eb73db1c0b51328d40c11ebe5c9c7098477b88551e8d6608e1bc9bf0400061447d565b6136107352747fd7866ef249b015bb99e95a3169b9ec4497662545109a98250b61447d565b61363573b2c91cf2fd763f2cc4558ed3cede401fc1d1b675660e35fa931a000061447d565b61365a732e64b76130819f30be2df0a0740d990d706b9926662119fcc562732961447d565b61367f731e69003e5267e945962ae38578a76222ca4085846611c37937e0800061447d565b6136a47316f39f8ff59caead81bc680e6cd663069eb978be6623e1e5803b400061447d565b6136c9736d102206cb3f043e22a62b4b7ecc83b877f85d9a6611c501b22b4deb61447d565b6136ee73ec61a284df18c4937b50880f70eb181d38fe86bb6605e672116a6c6661447d565b613713734c999827bc4b51fbd6911f066d8b82baac286a9b660c6f3b40b6c00061447d565b613738735415672d7334f8d2798022242675829b16bf94db66051f5f8b11616361447d565b61375d73df10d9688528b5b60957d1727a70a30450ce96046611c37937e0800061447d565b61378273831114051c0edde239ae672edcc4c63371dec82b660dbf8992820f2d61447d565b6137a7731d9c8ae02d75db48df0d13424cf7fb188dfa4b6e66078106b169de8161447d565b6137cc736e7182cfe90cc9aad11f7082cc4c462dbfd2d73c6603d8fb964ab00061447d565b6137f173287044c98a99f08764d681ed898aecb68a5543bc66083e0e9a7ce69a61447d565b613816735159cd8087b040e3e5f95e1489ce1018e186795c6607fe5cf2bea00061447d565b61383b735ed277af83d32fa421091244fa802e90fe8e896d66136a4e4fd3719e61447d565b613860737abc57c6f67853d16a4400685d18ee53980a3f4f661b593075db3ca861447d565b6138857309b3a9ea542713dcc182728f9debbdfcb1a0112f6611c37937e0800061447d565b6138aa73f3598ad305bbd8b40a480947e00a5dc3e29dc5a5661151c96347b00061447d565b6138cf732aeda0568e111da6a465bb735d912899a15015c266264eda1d64e2b361447d565b6138f473b578b5157bcc9fd2e73acacf7e853fd9f861f55d66071afd498d000061447d565b6139197316c73eafaa9c6f915d9026d3c2d1b6e9407d2f7366125471b3c2d18461447d565b61393e733140dd4b65c557fda703b081c475ce4945eaaca36611c37937e0800061447d565b61396373e632450e74165110459fef989bc11e90ee9029d166213872cbdfc2a461447d565b61398873f6e82162d8938d91b44efd4c307dba91ecbd6950660a54655482449e61447d565b6139ad7333af2064be09c34302c4ca8b8529a0e65924301666025844398d400061447d565b6139d273aa9d9d742b5c915d65649c636fb2d485911ece4d6604aed80b873eb761447d565b6139f7735507f5a1076742e3299ce8199feed98079ecee346608e1bc9bf0400061447d565b613a1c735e75d35893200849889dd98a50fce78e3d5641f3660b97c20169977b61447d565b613a41730665d03bddfd7ba36b1bdc7addb26c48273111c86601c6bf5263400061447d565b613a66738a541f614a14b00366d92dce6e927bf550f1c8976611c37937e0800061447d565b613a8b73c8afb078896b5780bd7b7174429af2daff61199b6615cfb58282617b61447d565b613ab073ffa25d69ef4909454825904904a2d876ea43e437660a8c0ff92d4c0061447d565b613ad473cd0951939b77e22e497895820ea7bd3aef480e1c656e86fac2a9c761447d565b613af9731ca92baf56a806527952ebe610d06a66b54bf5f16602d79883d2000061447d565b613b1d73a51670db54edf9dd5d5e3570f619ff46535e36796508a3e420180061447d565b613b4273dd30235dc68011f4de01a5c4059fc20145d5c8746608e9f55200dd5561447d565b613b67739161c6b026e65ba6b583fe8f552fa26b6d39ea8966051007aace100061447d565b613b8c73da85c4a66ebea97aa48a6e1741ec0e639ffe1783660b26c0caada12161447d565b613bb173cee85e997e80b724c69a1474a9489dbfa4cf5d2c6601b894f75894b761447d565b613bd67379d6f80d880f1bc1671b6fe3f88977d09eae4daa66067297ba931c9461447d565b613bfb736d9e1352e1f8f66f96669cc28fdcfe8e7fcf5524660b5e620f48000061447d565b613c2073a6e18d5f6b20dfa84d7d245bb656561f1f9aff696627f4d036432e2561447d565b613c45739d0d8e5e651ab7d54af5b0f655b3978504e67e0c662730c1bfb6f40461447d565b613c6a73141278ef1f894a60cbc8637871e4d19c3f2a73366611c37937e0800061447d565b613c8f738aefce4e323dbb2ecd5818869acf90e5415559c56611c37937e0800061447d565b613cb4735ea0c07ada402b67f1a9467d008ec11ed9ca11276611c37937e0800061447d565b613cd9732b09aced766f8290de1f5e4e0d3b3b8915c491896611c37937e0800061447d565b613cfe73fb1bad0dc29a9a485f08f4fe6bfbfedeba10ad8d662b139f8de6d00061447d565b613d237356be74f547b1c3b01e97f87461e2f3c75902374a6603fed2428b905661447d565b613d48734a9381e176d676a07dd17a83d8bfd1287b342c77661116ab655ea00061447d565b613d6d73fce082295b4db70097c4135ca254b13b070800e7662386f26fc1000061447d565b613d92737ea69f87f9836ffc6797b6b2d045c11e0881b7406611c37937e0800061447d565b613db7731cc4a2522c3847687af45acda2b5d6ebb64490a966016e18c6e5896761447d565b613ddc7389e364598bda1f96b6618ebe5d9879f0700663586610e0198eaee00061447d565b613e0d737ff0373f706e07ee326d538f6a6b2cf8f7397e776002660471b5abe55642613e089190614f38565b61447d565b613e3e735f7425396747897f91b68149915826afc2c14c1660026603e669d1a4f6a8613e399190614f38565b61447d565b613e6f73a9b809cfe8d95edbdd61603ba40081ba6da4f24b6002660287826833cb34613e6a9190614f38565b61447d565b613e9f73817271ea29e0297d26e87c0fcae5d7086c06ae94600265ef8d0b0702db613e9a9190614f38565b61447d565b613ecf7315cd32f5e9c286fad0c6e6f40d1fc07c2c1a85846002657643aeeba1ac613eca9190614f38565b61447d565b613eff7390a71a274cf69c0ad430481241206cd8fec7a1ed6002656a8231f8a01f613efa9190614f38565b61447d565b613f2f73c5dcadf158dc6de2d6bc1ddbb40fb03572000d32600265295f03514cf1613f2a9190614f38565b61447d565b565b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516140289190614c1e565b60405180910390a3505050565b600081148061404e57506000614049611fee565b60ff16145b6140ed5780600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b5050565b60006140fc82611bab565b90506000810361410c5750614478565b60006141166110b6565b90508082101561414c576000828261412e919061583f565b905061413981612ca6565b8361414491906150c2565b925050614159565b80821115614158578091505b5b600047905061416783614579565b60008147614175919061583f565b90507f9572f600ac02e9bafd8e4f025ea488d19cb1821776401f4b0e1884e81167cc44816040516141a69190614c1e565b60405180910390a16000600a60149054906101000a900460ff1660ff161180156141d757506141d587876114dd565b155b156143c35760006141e78661140a565b9050600060026141f688612b46565b6142009190614f38565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480156142ad5750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b80156143075750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b156143c057600061432a84600a60149054906101000a900460ff1660ff1661481d565b90506143368282614848565b61437e577f1d8c0ffe523a60028885b523cb9cbc740eb32636db62bbf322ecb63a6dc1e8bf8282858a8860405161437195949392919061593c565b60405180910390a16143be565b7ff1639dd60f5b6dfa121767af35709c4735f2eeb213811f714d1bbf88938c6f1f8282858a886040516143b595949392919061593c565b60405180910390a15b505b50505b60006143e182600860189054906101000a900460ff1660ff1661481d565b9050600061440183600960149054906101000a900460ff1660ff1661481d565b9050600082111561443a57614438600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614958565b505b60008111156144715761446f600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614958565b505b5050505050505b505050565b6000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403614575576000810315614575576012829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b600081031561481a576000600267ffffffffffffffff81111561459f5761459e61598f565b5b6040519080825280602002602001820160405280156145cd5781602001602082028036833780820191505090505b50905030816000815181106145e5576145e46152f2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561468c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146b091906159d3565b816001815181106146c4576146c36152f2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061472b30600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461215d565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430600a60159054906101000a900460ff1660ff164261478c91906150c2565b6040518663ffffffff1660e01b81526004016147ac959493929190615af9565b600060405180830381600087803b1580156147c657600080fd5b505af19250505080156147d7575060015b614817577f163865970267fb5cd79322dcc0cc0b193c52d963f284585552f2bf323d9e27d68260405161480a9190614c1e565b60405180910390a1614818565b5b505b50565b6000614827611fee565b60ff1682846148369190614ec7565b6148409190614f38565b905092915050565b6000808314806148585750600082145b156148665760019050614952565b61489330600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561215d565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198330866000806148df611963565b426040518863ffffffff1660e01b815260040161490196959493929190615b53565b60606040518083038185885af19350505050801561493d57506040513d601f19601f8201168201806040525081019061493a9190615bc9565b60015b61494a5760009050614952565b505050600190505b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149d15780820151818401526020810190506149b6565b60008484015250505050565b6000601f19601f8301169050919050565b60006149f982614997565b614a0381856149a2565b9350614a138185602086016149b3565b614a1c816149dd565b840191505092915050565b60006020820190508181036000830152614a4181846149ee565b905092915050565b600060ff82169050919050565b614a5f81614a49565b82525050565b6000602082019050614a7a6000830184614a56565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614ab082614a85565b9050919050565b614ac081614aa5565b8114614acb57600080fd5b50565b600081359050614add81614ab7565b92915050565b6000819050919050565b614af681614ae3565b8114614b0157600080fd5b50565b600081359050614b1381614aed565b92915050565b60008060408385031215614b3057614b2f614a80565b5b6000614b3e85828601614ace565b9250506020614b4f85828601614b04565b9150509250929050565b60008115159050919050565b614b6e81614b59565b82525050565b6000602082019050614b896000830184614b65565b92915050565b600060208284031215614ba557614ba4614a80565b5b6000614bb384828501614ace565b91505092915050565b600080600060608486031215614bd557614bd4614a80565b5b6000614be386828701614ace565b9350506020614bf486828701614ace565b9250506040614c0586828701614b04565b9150509250925092565b614c1881614ae3565b82525050565b6000602082019050614c336000830184614c0f565b92915050565b614c4281614a49565b8114614c4d57600080fd5b50565b600081359050614c5f81614c39565b92915050565b600060208284031215614c7b57614c7a614a80565b5b6000614c8984828501614c50565b91505092915050565b600060208284031215614ca857614ca7614a80565b5b6000614cb684828501614b04565b91505092915050565b614cc881614b59565b8114614cd357600080fd5b50565b600081359050614ce581614cbf565b92915050565b600060208284031215614d0157614d00614a80565b5b6000614d0f84828501614cd6565b91505092915050565b60008060408385031215614d2f57614d2e614a80565b5b6000614d3d85828601614ace565b9250506020614d4e85828601614ace565b9150509250929050565b6000819050919050565b6000614d7d614d78614d7384614a85565b614d58565b614a85565b9050919050565b6000614d8f82614d62565b9050919050565b6000614da182614d84565b9050919050565b614db181614d96565b82525050565b6000602082019050614dcc6000830184614da8565b92915050565b614ddb81614aa5565b82525050565b6000602082019050614df66000830184614dd2565b92915050565b6000614e0782614d84565b9050919050565b614e1781614dfc565b82525050565b6000602082019050614e326000830184614e0e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e7f57607f821691505b602082108103614e9257614e91614e38565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ed282614ae3565b9150614edd83614ae3565b9250828202614eeb81614ae3565b91508282048414831517614f0257614f01614e98565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f4382614ae3565b9150614f4e83614ae3565b925082614f5e57614f5d614f09565b5b828204905092915050565b7f494249543a2063616e6e6f742073657420746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614fc56024836149a2565b9150614fd082614f69565b604082019050919050565b60006020820190508181036000830152614ff481614fb8565b9050919050565b600061500682614a49565b915061501183614a49565b9250828201905060ff81111561502a57615029614e98565b5b92915050565b7f494249543a20746f74616c207461782063616e6e6f7420657863656564206d6160008201527f7820746178000000000000000000000000000000000000000000000000000000602082015250565b600061508c6025836149a2565b915061509782615030565b604082019050919050565b600060208201905081810360008301526150bb8161507f565b9050919050565b60006150cd82614ae3565b91506150d883614ae3565b92508282019050808211156150f0576150ef614e98565b5b92915050565b7f494249543a20737761705468726573686f6c642065786365656473206d617800600082015250565b600061512c601f836149a2565b9150615137826150f6565b602082019050919050565b6000602082019050818103600083015261515b8161511f565b9050919050565b7f494249543a20737761704c696d69742065786365656473206d61780000000000600082015250565b6000615198601b836149a2565b91506151a382615162565b602082019050919050565b600060208201905081810360008301526151c78161518b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061522a6025836149a2565b9150615235826151ce565b604082019050919050565b600060208201905081810360008301526152598161521d565b9050919050565b7f494249543a20486f6c646572732063616e206f6e6c792062652061697264726f60008201527f70706564206f6e63650000000000000000000000000000000000000000000000602082015250565b60006152bc6029836149a2565b91506152c782615260565b604082019050919050565b600060208201905081810360008301526152eb816152af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061532c82614ae3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361535e5761535d614e98565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153c56026836149a2565b91506153d082615369565b604082019050919050565b600060208201905081810360008301526153f4816153b8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006154576024836149a2565b9150615462826153fb565b604082019050919050565b600060208201905081810360008301526154868161544a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006154e96022836149a2565b91506154f48261548d565b604082019050919050565b60006020820190508181036000830152615518816154dc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006155556020836149a2565b91506155608261551f565b602082019050919050565b6000602082019050818103600083015261558481615548565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006155c1601d836149a2565b91506155cc8261558b565b602082019050919050565b600060208201905081810360008301526155f0816155b4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156536025836149a2565b915061565e826155f7565b604082019050919050565b6000602082019050818103600083015261568281615646565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006156e56023836149a2565b91506156f082615689565b604082019050919050565b60006020820190508181036000830152615714816156d8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006157776026836149a2565b91506157828261571b565b604082019050919050565b600060208201905081810360008301526157a68161576a565b9050919050565b7f494249543a207472616e73666572732064697361626c656420756e74696c206960008201527f6e697469616c204c500000000000000000000000000000000000000000000000602082015250565b60006158096029836149a2565b9150615814826157ad565b604082019050919050565b60006020820190508181036000830152615838816157fc565b9050919050565b600061584a82614ae3565b915061585583614ae3565b925082820390508181111561586d5761586c614e98565b5b92915050565b7f494249543a206d6178696d756d2077616c6c65742063616e6e6f74206265206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b60006158cf6027836149a2565b91506158da82615873565b604082019050919050565b600060208201905081810360008301526158fe816158c2565b9050919050565b600060608201905061591a6000830186614c0f565b6159276020830185614c0f565b6159346040830184614c0f565b949350505050565b600060a0820190506159516000830188614c0f565b61595e6020830187614c0f565b61596b6040830186614c0f565b6159786060830185614c0f565b6159856080830184614c0f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506159cd81614ab7565b92915050565b6000602082840312156159e9576159e8614a80565b5b60006159f7848285016159be565b91505092915050565b6000819050919050565b6000615a25615a20615a1b84615a00565b614d58565b614ae3565b9050919050565b615a3581615a0a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615a7081614aa5565b82525050565b6000615a828383615a67565b60208301905092915050565b6000602082019050919050565b6000615aa682615a3b565b615ab08185615a46565b9350615abb83615a57565b8060005b83811015615aec578151615ad38882615a76565b9750615ade83615a8e565b925050600181019050615abf565b5085935050505092915050565b600060a082019050615b0e6000830188614c0f565b615b1b6020830187615a2c565b8181036040830152615b2d8186615a9b565b9050615b3c6060830185614dd2565b615b496080830184614c0f565b9695505050505050565b600060c082019050615b686000830189614dd2565b615b756020830188614c0f565b615b826040830187615a2c565b615b8f6060830186615a2c565b615b9c6080830185614dd2565b615ba960a0830184614c0f565b979650505050505050565b600081519050615bc381614aed565b92915050565b600080600060608486031215615be257615be1614a80565b5b6000615bf086828701615bb4565b9350506020615c0186828701615bb4565b9250506040615c1286828701615bb4565b915050925092509256fea2646970667358221220dacac630edb96b2f23823c50b32e8a3e618537b3ca279da728d1666d693bfd9c64736f6c63430008120033

Deployed Bytecode Sourcemap

23337:32773:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27851:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37003:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29398:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35951:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33502:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25779:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42892:560;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28122:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37486:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35146:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36731:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30916:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29605:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28033:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33787:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29872:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36544:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33971:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46917:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25668:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33213:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34412:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34522:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35542:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37621:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26032:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31156:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34160:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34630:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28219:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11482:103;;;;;;;;;;;;;:::i;:::-;;37126:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43579;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34972:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23905:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10841:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27940;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43460:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33414:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25824:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30087:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28335:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25711:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30784:89;;;;;;;;;;;;;:::i;:::-;;34799:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38575:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35332:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33604:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48271:454;;;;;;;;;;;;;:::i;:::-;;23864:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29241:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26307:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34300:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33303:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23949:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11740:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36197:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38315:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27851:83;27888:13;27921:5;27914:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27851:83;:::o;37003:115::-;37052:28;37100:10;;;;;;;;;;;37093:17;;37003:115;:::o;29398:201::-;29481:4;29498:13;29514:12;:10;:12::i;:::-;29498:28;;29537:32;29546:5;29553:7;29562:6;29537:8;:32::i;:::-;29587:4;29580:11;;;29398:201;;;;:::o;35951:206::-;36011:4;36045:7;:5;:7::i;:::-;36031:22;;:2;:22;;;36028:74;;36086:4;36079:11;;;;36028:74;36121:24;:28;36146:2;36121:28;;;;;;;;;;;;;;;;;;;;;;;;;36114:35;;35951:206;;;;:::o;33502:94::-;33550:5;33575:13;;;;;;;;;;;33568:20;;33502:94;:::o;25779:32::-;;;;;;;;;;;;;:::o;42892:560::-;42987:4;43008:15;;;;;;;;;;;43004:60;;43047:5;43040:12;;;;43004:60;43080:16;43087:4;43093:2;43080:6;:16::i;:::-;43076:61;;43120:5;43113:12;;;;43076:61;43170:1;43152:14;;;;;;;;;;;:19;;;43149:62;;43195:4;43188:11;;;;43149:62;43223:33;43297:4;43281:14;;;;;;;;;;;43260:35;;:18;:16;:18::i;:::-;:35;;;;:::i;:::-;43259:42;;;;:::i;:::-;43223:78;;43355:25;43315:36;43344:6;43315:28;:36::i;:::-;:65;43312:108;;43404:4;43397:11;;;;;43312:108;43439:5;43432:12;;;42892:560;;;;;;:::o;28122:91::-;28166:7;28193:12;;28186:19;;28122:91;:::o;37486:127::-;37539:32;37591:14;;;;;;;;;;;37584:21;;37486:127;:::o;35146:114::-;10727:13;:11;:13::i;:::-;35248:4:::1;35217:24;:28;35242:2;35217:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;35146:114:::0;:::o;36731:141::-;36778:26;36860:4;36838:18;:16;:18::i;:::-;36825:10;;;;;;;;;;;:31;;;;;;:::i;:::-;36824:40;;;;:::i;:::-;36817:47;;36731:141;:::o;30916:191::-;10727:13;:11;:13::i;:::-;31014:1:::1;30993:23;;:9;:23;;::::0;30985:72:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;31089:9;31068:10;;:31;;;;;;;;;;;;;;;;;;30916:191:::0;:::o;29605:261::-;29702:4;29719:15;29737:12;:10;:12::i;:::-;29719:30;;29760:38;29776:4;29782:7;29791:6;29760:15;:38::i;:::-;29809:27;29819:4;29825:2;29829:6;29809:9;:27::i;:::-;29854:4;29847:11;;;29605:261;;;;;:::o;28033:83::-;28074:5;28099:9;;;;;;;;;;;28092:16;;28033:83;:::o;33787:176::-;10727:13;:11;:13::i;:::-;33883:7:::1;33852:38;;33875:3;33861:13;;;;;;;;;;;33853:7;;;;;;;;;;;:21;;;;:::i;:::-;:25;;;;:::i;:::-;33852:38;;;;33844:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;33952:3;33943:6;;:12;;;;;;;;;;;;;;;;;;33787:176:::0;:::o;29872:209::-;29960:4;29977:74;29986:10;29998:7;30040:10;30007:30;30017:10;30029:7;30007:9;:30::i;:::-;:43;;;;:::i;:::-;29977:8;:74::i;:::-;30069:4;30062:11;;29872:209;;;;:::o;36544:116::-;36593:7;36620:9;:32;36630:21;;;;;;;;;;;36620:32;;;;;;;;;;;;;;;;36613:39;;36544:116;:::o;33971:181::-;10727:13;:11;:13::i;:::-;34065:7:::1;34043:29;;34058:3;34051:6;;;;;;;;;;;34043:7;;;;;;;;;;;:14;;;;:::i;:::-;:18;;;;:::i;:::-;:29;;;;34035:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;34141:3;34125:13;;:19;;;;;;;;;;;;;;;;;;33971:181:::0;:::o;46917:193::-;46974:22;47078:24;47095:6;47078:16;:24::i;:::-;47044:31;47068:6;47044:23;:31::i;:::-;47016:25;47034:6;47016:17;:25::i;:::-;:59;;;;:::i;:::-;:86;;;;:::i;:::-;47009:93;;46917:193;;;:::o;25668:28::-;;;;;;;;;;;;;:::o;33213:82::-;33255:5;33280:7;;;;;;;;;;;33273:14;;33213:82;:::o;34412:102::-;10727:13;:11;:13::i;:::-;34499:7:::1;34479:17;;:27;;;;;;;;;;;;;;;;;;34412:102:::0;:::o;34522:100::-;10727:13;:11;:13::i;:::-;34612:2:::1;34588:21;;:26;;;;;;;;;;;;;;;;;;34522:100:::0;:::o;35542:310::-;35609:4;35629:16;:22;35646:4;35629:22;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;35655:16;:20;35672:2;35655:20;;;;;;;;;;;;;;;;;;;;;;;;;35629:46;35626:98;;;35708:4;35701:11;;;;35626:98;35747:7;:5;:7::i;:::-;35739:15;;:4;:15;;;:32;;;;35764:7;:5;:7::i;:::-;35758:13;;:2;:13;;;35739:32;35736:84;;;35804:4;35797:11;;;;35736:84;35839:5;35832:12;;35542:310;;;;;:::o;37621:206::-;10727:13;:11;:13::i;:::-;37725:17:::1;37708:34;;:14;;;;;;;;;;;:34;;;37700:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;37806:13;37789:14;;:30;;;;;;;;;;;;;;;;;;37621:206:::0;:::o;26032:42::-;;;;;;;;;;;;;:::o;31156:221::-;10727:13;:11;:13::i;:::-;31272:1:::1;31245:29;;:15;:29;;::::0;31237:78:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;31353:15;31326:16;;:43;;;;;;;;;;;;;;;;;;31156:221:::0;:::o;34160:132::-;10727:13;:11;:13::i;:::-;34268:16:::1;34241:24;;:43;;;;;;;;;;;;;;;;;;34160:132:::0;:::o;34630:105::-;34679:7;34706:21;;;;;;;;;;;34699:28;;34630:105;:::o;28219:110::-;28276:7;28303:9;:18;28313:7;28303:18;;;;;;;;;;;;;;;;28296:25;;28219:110;;;:::o;11482:103::-;10727:13;:11;:13::i;:::-;11547:30:::1;11574:1;11547:18;:30::i;:::-;11482:103::o:0;37126:177::-;10727:13;:11;:13::i;:::-;37217::::1;37205:25;;:9;:25;;;37197:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37286:9;37273:10;;:22;;;;;;;;;;;;;;;;;;37126:177:::0;:::o;43579:::-;43659:20;10727:13;:11;:13::i;:::-;43699:49:::1;43737:10;43699:37;:49::i;:::-;43692:56;;43579:177:::0;;;:::o;34972:107::-;10727:13;:11;:13::i;:::-;35066:5:::1;35043:16;:20;35060:2;35043:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;34972:107:::0;:::o;23905:37::-;;;;;;;;;;;;;:::o;10841:87::-;10887:7;10914:6;;;;;;;;;;;10907:13;;10841:87;:::o;27940:::-;27979:13;28012:7;28005:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27940:87;:::o;43460:111::-;10727:13;:11;:13::i;:::-;43557:6:::1;43535:19;;:28;;;;;;;;;;;;;;;;;;43460:111:::0;:::o;33414:80::-;33455:5;33480:6;;;;;;;;;;;33473:13;;33414:80;:::o;25824:45::-;;;:::o;30087:395::-;30180:4;30197:24;30224:30;30234:10;30246:7;30224:9;:30::i;:::-;30197:57;;30293:15;30273:16;:35;;30265:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30378:65;30387:10;30399:7;30427:15;30408:16;:34;30378:8;:65::i;:::-;30470:4;30463:11;;;30087:395;;;;:::o;28335:142::-;28397:4;28414:33;28424:10;28436:2;28440:6;28414:9;:33::i;:::-;28465:4;28458:11;;28335:142;;;;:::o;25711:41::-;;;:::o;30784:89::-;10727:13;:11;:13::i;:::-;30861:4:::1;30841:17;;:24;;;;;;;;;;;;;;;;;;30784:89::o:0;34799:104::-;10727:13;:11;:13::i;:::-;34891:4:::1;34868:16;:20;34885:2;34868:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;34799:104:::0;:::o;38575:248::-;38645:7;38665:17;38715:1;38685:29;38702:11;38685:16;:29::i;:::-;:31;;;;:::i;:::-;38665:51;;38779:36;38803:11;38779:23;:36::i;:::-;38746:30;38764:11;38746:17;:30::i;:::-;38734:9;:42;;;;:::i;:::-;:81;;;;:::i;:::-;38727:88;;;38575:248;;;:::o;35332:117::-;10727:13;:11;:13::i;:::-;35436:5:::1;35405:24;:28;35430:2;35405:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;35332:117:::0;:::o;33604:175::-;10727:13;:11;:13::i;:::-;33698:7:::1;33670:35;;33691:3;33677:13;;;;;;;;;;;33670:6;;;;;;;;;;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:35;;;;33662:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33768:3;33758:7;;:13;;;;;;;;;;;;;;;;;;33604:175:::0;:::o;48271:454::-;10727:13;:11;:13::i;:::-;48355:5:::1;48333:27;;:18;;;;;;;;;;;:27;;;48325:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48438:4;48417:18;;:25;;;;;;;;;;;;;;;;;;48455:31;:29;:31::i;:::-;48503:6;48499:219;48519:14;:21;;;;48515:1;:25;48499:219;;;48562:10;48575:14;48590:1;48575:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48562:30;;48607:15;48625:22;:26;48648:2;48625:26;;;;;;;;;;;;;;;;48607:44;;48668:38;48685:7;:5;:7::i;:::-;48694:2;48698:7;48668:16;:38::i;:::-;48547:171;;48542:3;;;;;:::i;:::-;;;;48499:219;;;;48271:454::o:0;23864:34::-;;;;;;;;;;;;;:::o;29241:151::-;29330:7;29357:11;:18;29369:5;29357:18;;;;;;;;;;;;;;;:27;29376:7;29357:27;;;;;;;;;;;;;;;;29350:34;;29241:151;;;;:::o;26307:42::-;;;;;;;;;;;;;:::o;34300:104::-;34355:4;34379:17;;;;;;;;;;;34372:24;;34300:104;:::o;33303:103::-;10727:13;:11;:13::i;:::-;33392:6:::1;33374:15;;:24;;;;;;;;;;;;;;;;;;33303:103:::0;:::o;23949:38::-;;;;;;;;;;;;;:::o;11740:201::-;10727:13;:11;:13::i;:::-;11849:1:::1;11829:22;;:8;:22;;::::0;11821:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11905:28;11924:8;11905:18;:28::i;:::-;11740:201:::0;:::o;36197:102::-;36238:5;36278:13;;;;;;;;;;;36270:7;;;;;;;;;;;36263:6;;;;;;;;;;;:14;;;;:::i;:::-;:28;;;;:::i;:::-;36256:35;;36197:102;:::o;38315:252::-;38390:7;38532:9;:27;38542:16;;;;;;;;;;;38532:27;;;;;;;;;;;;;;;;38508:9;:21;38518:10;;;;;;;;;;;38508:21;;;;;;;;;;;;;;;;38474:31;38498:6;38474:23;:31::i;:::-;38446:25;38464:6;38446:17;:25::i;:::-;38442:1;38417:24;38434:6;38417:16;:24::i;:::-;:26;;;;:::i;:::-;:54;;;;:::i;:::-;:88;;;;:::i;:::-;:112;;;;:::i;:::-;:142;;;;:::i;:::-;38410:149;;38315:252;;;:::o;9550:98::-;9603:7;9630:10;9623:17;;9550:98;:::o;28483:342::-;28600:1;28584:18;;:4;:18;;;28576:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28681:1;28662:21;;:7;:21;;;28654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28764:6;28735:11;:17;28747:4;28735:17;;;;;;;;;;;;;;;:26;28753:7;28735:26;;;;;;;;;;;;;;;:35;;;;28801:7;28786:31;;28795:4;28786:31;;;28810:6;28786:31;;;;;;:::i;:::-;;;;;;;;28483:342;;;:::o;31385:402::-;31458:4;31488:23;;;;;;;;;;;31478:33;;:6;:33;;;:68;;;;31525:21;;;;;;;;;;;31515:31;;:6;:31;;;31478:68;:105;;;;31560:23;;;;;;;;;;;31550:33;;:6;:33;;;31478:105;31475:149;;;31607:5;31600:12;;;;31475:149;31652:21;;;;;;;;;;;31639:34;;:9;:34;;;:76;;;;31698:16;;;;;;;;;;;31677:38;;:9;:38;;;31639:76;31636:119;;;31739:4;31732:11;;;;31636:119;31774:5;31767:12;;31385:402;;;;;:::o;11006:132::-;11081:12;:10;:12::i;:::-;11070:23;;:7;:5;:7::i;:::-;:23;;;11062:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11006:132::o;28831:404::-;28931:24;28958;28968:4;28974:7;28958:9;:24::i;:::-;28931:51;;29017:17;28997:16;:37;28993:235;;29079:6;29059:16;:26;;29051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29155:50;29164:4;29170:7;29198:6;29179:16;:25;29155:8;:50::i;:::-;28993:235;28920:315;28831:404;;;:::o;38831:1831::-;38935:1;38919:18;;:4;:18;;;38911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39012:1;38998:16;;:2;:16;;;38990:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;39092:6;39073:9;:15;39083:4;39073:15;;;;;;;;;;;;;;;;:25;;39065:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39158:17;;;;;;;;;;;39154:136;;39208:7;:5;:7::i;:::-;39200:15;;:4;:15;;;:32;;;;39225:7;:5;:7::i;:::-;39219:13;;:2;:13;;;39200:32;39192:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;39154:136;39302:18;39364:21;39376:4;39382:2;39364:11;:21::i;:::-;39361:158;;;39424:1;39411:14;;39361:158;;;39489:18;39500:6;39489:10;:18::i;:::-;39476:31;;39361:158;39531:23;39566:10;39557:6;:19;;;;:::i;:::-;39531:45;;39668:21;39686:2;39668:17;:21::i;:::-;39667:22;:41;;;;;39701:7;:5;:7::i;:::-;39693:15;;:4;:15;;;;39667:41;:62;;;;;39712:17;;;;;;;;;;;39667:62;39664:202;;;39800:10;39780:15;39764:13;39774:2;39764:9;:13::i;:::-;:31;;;;:::i;:::-;39763:47;;39755:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39664:202;39895:1;39881:10;:15;39878:111;;39922:34;39939:4;39945:2;39949:6;39922:16;:34::i;:::-;39971:7;;;;39878:111;40024:28;40035:4;40041:10;40024;:28::i;:::-;40068:97;40080:25;40098:6;40080:17;:25::i;:::-;40107:31;40131:6;40107:23;:31::i;:::-;40140:24;40157:6;40140:16;:24::i;:::-;40068:97;;;;;;;;:::i;:::-;;;;;;;;40181:40;40204:4;40210:2;40214:6;40181:22;:40::i;:::-;40178:404;;;40247:36;40266:4;40272:2;40276:6;40247:18;:36::i;:::-;40178:404;;;40401:25;40419:6;40401:17;:25::i;:::-;40376:9;:21;40386:10;;;;;;;;;;;40376:21;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;40472:31;40496:6;40472:23;:31::i;:::-;40441:9;:27;40451:16;;;;;;;;;;;40441:27;;;;;;;;;;;;;;;;:62;;;;;;;:::i;:::-;;;;;;;;40546:24;40563:6;40546:16;:24::i;:::-;40518:9;:24;40536:4;40518:24;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;40178:404;40611:43;40628:4;40634:2;40638:15;40611:16;:43::i;:::-;38900:1762;;38831:1831;;;;:::o;46400:131::-;46463:11;46519:4;46509:6;;;;;;;;;;;46500:15;;:6;:15;;;;:::i;:::-;46499:24;;;;:::i;:::-;46492:31;;46400:131;;;:::o;46676:145::-;46746:11;46809:4;46792:13;;;;;;;;;;;46783:22;;:6;:22;;;;:::i;:::-;46782:31;;;;:::i;:::-;46775:38;;46676:145;;;:::o;46537:133::-;46601:11;46658:4;46647:7;;;;;;;;;;;46638:16;;:6;:16;;;;:::i;:::-;46637:25;;;;:::i;:::-;46630:32;;46537:133;;;:::o;12101:191::-;12175:16;12194:6;;;;;;;;;;;12175:25;;12220:8;12211:6;;:17;;;;;;;;;;;;;;;;;;12275:8;12244:40;;12265:8;12244:40;;;;;;;;;;;;12164:128;12101:191;:::o;43834:2298::-;43926:20;43985:5;43962:28;;:19;;;;;;;;;;;:28;;;43959:68;;44014:1;44007:8;;;;43959:68;44157:14;44133:9;:21;44143:10;;;;;;;;;;;44133:21;;;;;;;;;;;;;;;;44103:9;:27;44113:16;;;;;;;;;;;44103:27;;;;;;;;;;;;;;;;:51;;;;:::i;:::-;:68;44100:117;;;44204:1;44197:8;;;;44100:117;44229:26;44306:18;44275:9;:27;44285:16;;;;;;;;;;;44275:27;;;;;;;;;;;;;;;;:49;44272:288;;44410:18;44379:9;:27;44389:16;;;;;;;;;;;44379:27;;;;;;;;;;;;;;;;:49;;;;;;;;;;;44475:18;44447:9;:24;44465:4;44447:24;;;;;;;;;;;;;;;;:46;;;;;;;;;;;44530:18;44523:25;;;;;44272:288;44600:18;44575:9;:21;44585:10;;;;;;;;;;;44575:21;;;;;;;;;;;;;;;;:43;44572:276;;44698:18;44673:9;:21;44683:10;;;;;;;;;;;44673:21;;;;;;;;;;;;;;;;:43;;;;;;;;;;;44763:18;44735:9;:24;44753:4;44735:24;;;;;;;;;;;;;;;;:46;;;;;;;;;;;44818:18;44811:25;;;;;44572:276;44881:9;:21;44891:10;;;;;;;;;;;44881:21;;;;;;;;;;;;;;;;44860:42;;44964:1;44940:9;:21;44950:10;;;;;;;;;;;44940:21;;;;;;;;;;;;;;;:25;;;;45008:18;44980:9;:24;44998:4;44980:24;;;;;;;;;;;;;;;;:46;;;;;;;;;;;45075:18;45053;:40;45050:106;;45126:18;45119:25;;;;;45050:106;45168:17;45251:18;45220:9;:27;45230:16;;;;;;;;;;;45220:27;;;;;;;;;;;;;;;;45199:18;:48;;;;:::i;:::-;:70;45196:350;;45307:9;:27;45317:16;;;;;;;;;;;45307:27;;;;;;;;;;;;;;;;45295:39;;45408:9;45380;:24;45398:4;45380:24;;;;;;;;;;;;;;;;:37;;;;;;;;;;;45466:1;45436:9;:27;45446:16;;;;;;;;;;;45436:27;;;;;;;;;;;;;;;:31;;;;45525:9;45504:18;:30;;;;:::i;:::-;45497:37;;;;;;45196:350;45558:20;45602:12;45581:18;:33;;;;:::i;:::-;45558:56;;45659:12;45628:9;:27;45638:16;;;;;;;;;;;45628:27;;;;;;;;;;;;;;;;:43;45625:270;;45757:12;45726:9;:27;45736:16;;;;;;;;;;;45726:27;;;;;;;;;;;;;;;;:43;;;;;;;;;;;45816:12;45788:9;:24;45806:4;45788:24;;;;;;;;;;;;;;;;:40;;;;;;;;;;;45865:18;45858:25;;;;;;;45625:270;45919:9;:27;45929:16;;;;;;;;;;;45919:27;;;;;;;;;;;;;;;;45907:39;;46012:1;45982:9;:27;45992:16;;;;;;;;;;;45982:27;;;;;;;;;;;;;;;:31;;;;46056:9;46028;:24;46046:4;46028:24;;;;;;;;;;;;;;;;:37;;;;;;;;;;;46115:9;46094:18;:30;;;;:::i;:::-;46087:37;;;;;43834:2298;;;;:::o;48733:7374::-;48920:68;48937:7;:5;:7::i;:::-;48946:22;48970:17;48920:16;:68::i;:::-;49059:77;49075:42;49119:16;49059:15;:77::i;:::-;49166;49182:42;49226:16;49166:15;:77::i;:::-;49273;49289:42;49333:16;49273:15;:77::i;:::-;49380:78;49396:42;49440:17;49380:15;:78::i;:::-;49489:77;49505:42;49549:16;49489:15;:77::i;:::-;49596;49612:42;49656:16;49596:15;:77::i;:::-;49703;49719:42;49763:16;49703:15;:77::i;:::-;49810:78;49826:42;49870:17;49810:15;:78::i;:::-;49919:77;49935:42;49979:16;49919:15;:77::i;:::-;50026;50042:42;50086:16;50026:15;:77::i;:::-;50133;50149:42;50193:16;50133:15;:77::i;:::-;50240;50256:42;50300:16;50240:15;:77::i;:::-;50347;50363:42;50407:16;50347:15;:77::i;:::-;50454;50470:42;50514:16;50454:15;:77::i;:::-;50561;50577:42;50621:16;50561:15;:77::i;:::-;50668;50684:42;50728:16;50668:15;:77::i;:::-;50775;50791:42;50835:16;50775:15;:77::i;:::-;50882;50898:42;50942:16;50882:15;:77::i;:::-;50989;51005:42;51049:16;50989:15;:77::i;:::-;51096;51112:42;51156:16;51096:15;:77::i;:::-;51203;51219:42;51263:16;51203:15;:77::i;:::-;51310;51326:42;51370:16;51310:15;:77::i;:::-;51417:78;51433:42;51477:17;51417:15;:78::i;:::-;51526:77;51542:42;51586:16;51526:15;:77::i;:::-;51633;51649:42;51693:16;51633:15;:77::i;:::-;51740;51756:42;51800:16;51740:15;:77::i;:::-;51847;51863:42;51907:16;51847:15;:77::i;:::-;51954;51970:42;52014:16;51954:15;:77::i;:::-;52061:76;52077:42;52121:15;52061;:76::i;:::-;52166:77;52182:42;52226:16;52166:15;:77::i;:::-;52273;52289:42;52333:16;52273:15;:77::i;:::-;52380;52396:42;52440:16;52380:15;:77::i;:::-;52487:76;52503:42;52547:15;52487;:76::i;:::-;52592:77;52608:42;52652:16;52592:15;:77::i;:::-;52699;52715:42;52759:16;52699:15;:77::i;:::-;52806;52822:42;52866:16;52806:15;:77::i;:::-;52913:76;52929:42;52973:15;52913;:76::i;:::-;53018;53034:42;53078:15;53018;:76::i;:::-;53123:74;53139:42;53183:13;53123:15;:74::i;:::-;53223:77;53239:42;53283:16;53223:15;:77::i;:::-;53330;53346:42;53390:16;53330:15;:77::i;:::-;53437;53453:42;53497:16;53437:15;:77::i;:::-;53544:76;53560:42;53604:15;53544;:76::i;:::-;53649:77;53665:42;53709:16;53649:15;:77::i;:::-;53756;53772:42;53816:16;53756:15;:77::i;:::-;53863:78;53879:42;53923:17;53863:15;:78::i;:::-;53972;53988:42;54032:17;53972:15;:78::i;:::-;54081:77;54097:42;54141:16;54081:15;:77::i;:::-;54188;54204:42;54248:16;54188:15;:77::i;:::-;54295;54311:42;54355:16;54295:15;:77::i;:::-;54402;54418:42;54462:16;54402:15;:77::i;:::-;54509:78;54525:42;54569:17;54509:15;:78::i;:::-;54618:77;54634:42;54678:16;54618:15;:77::i;:::-;54725;54741:42;54785:16;54725:15;:77::i;:::-;54832:78;54848:42;54892:17;54832:15;:78::i;:::-;54941:77;54957:42;55001:16;54941:15;:77::i;:::-;55048:76;55064:42;55108:15;55048;:76::i;:::-;55153:77;55169:42;55213:16;55153:15;:77::i;:::-;55346:99;55362:42;55442:1;55422:16;55414:29;;;;:::i;:::-;55346:15;:99::i;:::-;55456;55472:42;55552:1;55532:16;55524:29;;;;:::i;:::-;55456:15;:99::i;:::-;55566:98;55582:42;55661:1;55642:15;55634:28;;;;:::i;:::-;55566:15;:98::i;:::-;55675;55691:42;55770:1;55751:15;55743:28;;;;:::i;:::-;55675:15;:98::i;:::-;55784;55800:42;55879:1;55860:15;55852:28;;;;:::i;:::-;55784:15;:98::i;:::-;55893;55909:42;55988:1;55969:15;55961:28;;;;:::i;:::-;55893:15;:98::i;:::-;56002:97;56018:42;56096:1;56078:14;56070:27;;;;:::i;:::-;56002:15;:97::i;:::-;48733:7374::o;47541:220::-;47664:6;47645:9;:15;47655:4;47645:15;;;;;;;;;;;;;;;;:25;;;;;;;;;;;47698:6;47681:9;:13;47691:2;47681:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;47742:2;47727:26;;47736:4;47727:26;;;47746:6;47727:26;;;;;;:::i;:::-;;;;;;;;47541:220;;;:::o;47167:366::-;47257:1;47243:10;:15;:34;;;;47276:1;47262:10;:8;:10::i;:::-;:15;;;47243:34;47303:7;47240:81;47407:10;47388:9;:15;47398:4;47388:15;;;;;;;;;;;;;;;;:29;;;;;;;;;;;47508:10;47480:9;:24;47498:4;47480:24;;;;;;;;;;;;;;;;:38;;;;;;;;;;;47167:366;;;:::o;40670:2125::-;40759:23;40785:26;40804:6;40785:18;:26::i;:::-;40759:52;;40846:1;40827:15;:20;40824:67;;40873:7;;;40824:67;40903:20;40926:16;:14;:16::i;:::-;40903:39;;40976:12;40958:15;:30;40955:394;;;41073:26;41115:15;41102:12;:28;;;;:::i;:::-;41073:57;;41164;41202:18;41164:37;:57::i;:::-;41145:76;;;;;:::i;:::-;;;40999:234;40955:394;;;41269:12;41251:15;:30;41248:101;;;41325:12;41307:30;;41248:101;40955:394;41390:23;41416:21;41390:47;;41448:34;41466:15;41448:17;:34::i;:::-;41493:20;41540:15;41516:21;:39;;;;:::i;:::-;41493:62;;41571:27;41585:12;41571:27;;;;;;:::i;:::-;;;;;;;;41659:1;41650:6;;;;;;;;;;;:10;;;:36;;;;;41665:21;41677:4;41683:2;41665:11;:21::i;:::-;41664:22;41650:36;41647:736;;;41712:18;41733;41744:6;41733:10;:18::i;:::-;41712:39;;41766:17;41811:1;41786:24;41803:6;41786:16;:24::i;:::-;:26;;;;:::i;:::-;41766:46;;41836:21;;;;;;;;;;;41830:27;;:2;:27;;;:62;;;;;41869:23;;;;;;;;;;;41861:31;;:4;:31;;;;41830:62;:97;;;;;41904:23;;;;;;;;;;;41896:31;;:4;:31;;;;41830:97;41827:545;;;41961:18;41982:42;42003:12;42017:6;;;;;;;;;;;41982:42;;:20;:42::i;:::-;41961:63;;42047:35;42060:9;42071:10;42047:12;:35::i;:::-;42043:314;;42112:85;42132:9;42143:10;42155;42167:15;42184:12;42112:85;;;;;;;;;;:::i;:::-;;;;;;;;42043:314;;;42251:86;42272:9;42283:10;42295;42307:15;42324:12;42251:86;;;;;;;;;;:::i;:::-;;;;;;;;42043:314;41942:430;41827:545;41697:686;;41647:736;42430:25;42458:49;42479:12;42493:13;;;;;;;;;;;42458:49;;:20;:49::i;:::-;42430:77;;42518:19;42540:43;42561:12;42575:7;;;;;;;;;;;42540:43;;:20;:43::i;:::-;42518:65;;42619:1;42599:17;:21;42596:99;;;42637:46;42647:16;;;;;;;;;;;42665:17;42637:9;:46::i;:::-;;42596:99;42724:1;42710:11;:15;42707:81;;;42742:34;42752:10;;;;;;;;;;;42764:11;42742:9;:34::i;:::-;;42707:81;40748:2047;;;;;;40670:2125;;;;:::o;47925:307::-;48031:1;48001:22;:26;48024:2;48001:26;;;;;;;;;;;;;;;;:31;48049:7;47998:82;48106:1;48095:7;:12;48092:50;48124:7;48092:50;48154:14;48174:2;48154:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48217:7;48188:22;:26;48211:2;48188:26;;;;;;;;;;;;;;;:36;;;;47925:307;;;:::o;32003:629::-;32078:1;32068:6;:11;32065:49;32096:7;32065:49;32126:21;32164:1;32150:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32126:40;;32195:4;32177;32182:1;32177:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;32221:16;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32211:4;32216:1;32211:7;;;;;;;;:::i;:::-;;;;;;;:33;;;;;;;;;;;32257:58;32274:4;32289:16;;;;;;;;;;;32308:6;32257:8;:58::i;:::-;32332:16;;;;;;;;;;;:67;;;32414:6;32435:1;32451:4;32478;32514:24;;;;;;;;;;;32498:40;;:15;:40;;;;:::i;:::-;32332:217;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32328:297;;32591:22;32606:6;32591:22;;;;;;:::i;:::-;;;;;;;;32328:297;;;;32054:578;32003:629;;:::o;46140:252::-;46232:24;46374:10;:8;:10::i;:::-;46345:39;;46362:8;46346:13;:24;;;;:::i;:::-;46345:39;;;;:::i;:::-;46338:46;;46140:252;;;;:::o;32640:565::-;32722:4;32759:1;32742:13;:18;:37;;;;32778:1;32764:10;:15;32742:37;32739:80;;;32803:4;32796:11;;;;32739:80;32831:65;32848:4;32863:16;;;;;;;;;;;32882:13;32831:8;:65::i;:::-;32911:16;;;;;;;;;;;:32;;;32951:10;32985:4;33005:13;33033:1;33049;33065:7;:5;:7::i;:::-;33087:15;32911:202;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32907:291;;33181:5;33174:12;;;;32907:291;;;;33136:4;33129:11;;32640:565;;;;;:::o;36353:119::-;36425:4;36449:2;:7;;:15;36457:6;36449:15;;;;;;;;;;;;;;;;;;;;;;;36442:22;;36353:119;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:86::-;1384:7;1424:4;1417:5;1413:16;1402:27;;1349:86;;;:::o;1441:112::-;1524:22;1540:5;1524:22;:::i;:::-;1519:3;1512:35;1441:112;;:::o;1559:214::-;1648:4;1686:2;1675:9;1671:18;1663:26;;1699:67;1763:1;1752:9;1748:17;1739:6;1699:67;:::i;:::-;1559:214;;;;:::o;1860:117::-;1969:1;1966;1959:12;2106:126;2143:7;2183:42;2176:5;2172:54;2161:65;;2106:126;;;:::o;2238:96::-;2275:7;2304:24;2322:5;2304:24;:::i;:::-;2293:35;;2238:96;;;:::o;2340:122::-;2413:24;2431:5;2413:24;:::i;:::-;2406:5;2403:35;2393:63;;2452:1;2449;2442:12;2393:63;2340:122;:::o;2468:139::-;2514:5;2552:6;2539:20;2530:29;;2568:33;2595:5;2568:33;:::i;:::-;2468:139;;;;:::o;2613:77::-;2650:7;2679:5;2668:16;;2613:77;;;:::o;2696:122::-;2769:24;2787:5;2769:24;:::i;:::-;2762:5;2759:35;2749:63;;2808:1;2805;2798:12;2749:63;2696:122;:::o;2824:139::-;2870:5;2908:6;2895:20;2886:29;;2924:33;2951:5;2924:33;:::i;:::-;2824:139;;;;:::o;2969:474::-;3037:6;3045;3094:2;3082:9;3073:7;3069:23;3065:32;3062:119;;;3100:79;;:::i;:::-;3062:119;3220:1;3245:53;3290:7;3281:6;3270:9;3266:22;3245:53;:::i;:::-;3235:63;;3191:117;3347:2;3373:53;3418:7;3409:6;3398:9;3394:22;3373:53;:::i;:::-;3363:63;;3318:118;2969:474;;;;;:::o;3449:90::-;3483:7;3526:5;3519:13;3512:21;3501:32;;3449:90;;;:::o;3545:109::-;3626:21;3641:5;3626:21;:::i;:::-;3621:3;3614:34;3545:109;;:::o;3660:210::-;3747:4;3785:2;3774:9;3770:18;3762:26;;3798:65;3860:1;3849:9;3845:17;3836:6;3798:65;:::i;:::-;3660:210;;;;:::o;3876:329::-;3935:6;3984:2;3972:9;3963:7;3959:23;3955:32;3952:119;;;3990:79;;:::i;:::-;3952:119;4110:1;4135:53;4180:7;4171:6;4160:9;4156:22;4135:53;:::i;:::-;4125:63;;4081:117;3876:329;;;;:::o;4211:619::-;4288:6;4296;4304;4353:2;4341:9;4332:7;4328:23;4324:32;4321:119;;;4359:79;;:::i;:::-;4321:119;4479:1;4504:53;4549:7;4540:6;4529:9;4525:22;4504:53;:::i;:::-;4494:63;;4450:117;4606:2;4632:53;4677:7;4668:6;4657:9;4653:22;4632:53;:::i;:::-;4622:63;;4577:118;4734:2;4760:53;4805:7;4796:6;4785:9;4781:22;4760:53;:::i;:::-;4750:63;;4705:118;4211:619;;;;;:::o;4836:118::-;4923:24;4941:5;4923:24;:::i;:::-;4918:3;4911:37;4836:118;;:::o;4960:222::-;5053:4;5091:2;5080:9;5076:18;5068:26;;5104:71;5172:1;5161:9;5157:17;5148:6;5104:71;:::i;:::-;4960:222;;;;:::o;5188:118::-;5259:22;5275:5;5259:22;:::i;:::-;5252:5;5249:33;5239:61;;5296:1;5293;5286:12;5239:61;5188:118;:::o;5312:135::-;5356:5;5394:6;5381:20;5372:29;;5410:31;5435:5;5410:31;:::i;:::-;5312:135;;;;:::o;5453:325::-;5510:6;5559:2;5547:9;5538:7;5534:23;5530:32;5527:119;;;5565:79;;:::i;:::-;5527:119;5685:1;5710:51;5753:7;5744:6;5733:9;5729:22;5710:51;:::i;:::-;5700:61;;5656:115;5453:325;;;;:::o;5784:329::-;5843:6;5892:2;5880:9;5871:7;5867:23;5863:32;5860:119;;;5898:79;;:::i;:::-;5860:119;6018:1;6043:53;6088:7;6079:6;6068:9;6064:22;6043:53;:::i;:::-;6033:63;;5989:117;5784:329;;;;:::o;6119:116::-;6189:21;6204:5;6189:21;:::i;:::-;6182:5;6179:32;6169:60;;6225:1;6222;6215:12;6169:60;6119:116;:::o;6241:133::-;6284:5;6322:6;6309:20;6300:29;;6338:30;6362:5;6338:30;:::i;:::-;6241:133;;;;:::o;6380:323::-;6436:6;6485:2;6473:9;6464:7;6460:23;6456:32;6453:119;;;6491:79;;:::i;:::-;6453:119;6611:1;6636:50;6678:7;6669:6;6658:9;6654:22;6636:50;:::i;:::-;6626:60;;6582:114;6380:323;;;;:::o;6709:474::-;6777:6;6785;6834:2;6822:9;6813:7;6809:23;6805:32;6802:119;;;6840:79;;:::i;:::-;6802:119;6960:1;6985:53;7030:7;7021:6;7010:9;7006:22;6985:53;:::i;:::-;6975:63;;6931:117;7087:2;7113:53;7158:7;7149:6;7138:9;7134:22;7113:53;:::i;:::-;7103:63;;7058:118;6709:474;;;;;:::o;7189:60::-;7217:3;7238:5;7231:12;;7189:60;;;:::o;7255:142::-;7305:9;7338:53;7356:34;7365:24;7383:5;7365:24;:::i;:::-;7356:34;:::i;:::-;7338:53;:::i;:::-;7325:66;;7255:142;;;:::o;7403:126::-;7453:9;7486:37;7517:5;7486:37;:::i;:::-;7473:50;;7403:126;;;:::o;7535:152::-;7611:9;7644:37;7675:5;7644:37;:::i;:::-;7631:50;;7535:152;;;:::o;7693:183::-;7806:63;7863:5;7806:63;:::i;:::-;7801:3;7794:76;7693:183;;:::o;7882:274::-;8001:4;8039:2;8028:9;8024:18;8016:26;;8052:97;8146:1;8135:9;8131:17;8122:6;8052:97;:::i;:::-;7882:274;;;;:::o;8162:118::-;8249:24;8267:5;8249:24;:::i;:::-;8244:3;8237:37;8162:118;;:::o;8286:222::-;8379:4;8417:2;8406:9;8402:18;8394:26;;8430:71;8498:1;8487:9;8483:17;8474:6;8430:71;:::i;:::-;8286:222;;;;:::o;8514:151::-;8589:9;8622:37;8653:5;8622:37;:::i;:::-;8609:50;;8514:151;;;:::o;8671:181::-;8783:62;8839:5;8783:62;:::i;:::-;8778:3;8771:75;8671:181;;:::o;8858:272::-;8976:4;9014:2;9003:9;8999:18;8991:26;;9027:96;9120:1;9109:9;9105:17;9096:6;9027:96;:::i;:::-;8858:272;;;;:::o;9136:180::-;9184:77;9181:1;9174:88;9281:4;9278:1;9271:15;9305:4;9302:1;9295:15;9322:320;9366:6;9403:1;9397:4;9393:12;9383:22;;9450:1;9444:4;9440:12;9471:18;9461:81;;9527:4;9519:6;9515:17;9505:27;;9461:81;9589:2;9581:6;9578:14;9558:18;9555:38;9552:84;;9608:18;;:::i;:::-;9552:84;9373:269;9322:320;;;:::o;9648:180::-;9696:77;9693:1;9686:88;9793:4;9790:1;9783:15;9817:4;9814:1;9807:15;9834:410;9874:7;9897:20;9915:1;9897:20;:::i;:::-;9892:25;;9931:20;9949:1;9931:20;:::i;:::-;9926:25;;9986:1;9983;9979:9;10008:30;10026:11;10008:30;:::i;:::-;9997:41;;10187:1;10178:7;10174:15;10171:1;10168:22;10148:1;10141:9;10121:83;10098:139;;10217:18;;:::i;:::-;10098:139;9882:362;9834:410;;;;:::o;10250:180::-;10298:77;10295:1;10288:88;10395:4;10392:1;10385:15;10419:4;10416:1;10409:15;10436:185;10476:1;10493:20;10511:1;10493:20;:::i;:::-;10488:25;;10527:20;10545:1;10527:20;:::i;:::-;10522:25;;10566:1;10556:35;;10571:18;;:::i;:::-;10556:35;10613:1;10610;10606:9;10601:14;;10436:185;;;;:::o;10627:223::-;10767:34;10763:1;10755:6;10751:14;10744:58;10836:6;10831:2;10823:6;10819:15;10812:31;10627:223;:::o;10856:366::-;10998:3;11019:67;11083:2;11078:3;11019:67;:::i;:::-;11012:74;;11095:93;11184:3;11095:93;:::i;:::-;11213:2;11208:3;11204:12;11197:19;;10856:366;;;:::o;11228:419::-;11394:4;11432:2;11421:9;11417:18;11409:26;;11481:9;11475:4;11471:20;11467:1;11456:9;11452:17;11445:47;11509:131;11635:4;11509:131;:::i;:::-;11501:139;;11228:419;;;:::o;11653:188::-;11691:3;11710:18;11726:1;11710:18;:::i;:::-;11705:23;;11742:18;11758:1;11742:18;:::i;:::-;11737:23;;11783:1;11780;11776:9;11769:16;;11806:4;11801:3;11798:13;11795:39;;;11814:18;;:::i;:::-;11795:39;11653:188;;;;:::o;11847:224::-;11987:34;11983:1;11975:6;11971:14;11964:58;12056:7;12051:2;12043:6;12039:15;12032:32;11847:224;:::o;12077:366::-;12219:3;12240:67;12304:2;12299:3;12240:67;:::i;:::-;12233:74;;12316:93;12405:3;12316:93;:::i;:::-;12434:2;12429:3;12425:12;12418:19;;12077:366;;;:::o;12449:419::-;12615:4;12653:2;12642:9;12638:18;12630:26;;12702:9;12696:4;12692:20;12688:1;12677:9;12673:17;12666:47;12730:131;12856:4;12730:131;:::i;:::-;12722:139;;12449:419;;;:::o;12874:191::-;12914:3;12933:20;12951:1;12933:20;:::i;:::-;12928:25;;12967:20;12985:1;12967:20;:::i;:::-;12962:25;;13010:1;13007;13003:9;12996:16;;13031:3;13028:1;13025:10;13022:36;;;13038:18;;:::i;:::-;13022:36;12874:191;;;;:::o;13071:181::-;13211:33;13207:1;13199:6;13195:14;13188:57;13071:181;:::o;13258:366::-;13400:3;13421:67;13485:2;13480:3;13421:67;:::i;:::-;13414:74;;13497:93;13586:3;13497:93;:::i;:::-;13615:2;13610:3;13606:12;13599:19;;13258:366;;;:::o;13630:419::-;13796:4;13834:2;13823:9;13819:18;13811:26;;13883:9;13877:4;13873:20;13869:1;13858:9;13854:17;13847:47;13911:131;14037:4;13911:131;:::i;:::-;13903:139;;13630:419;;;:::o;14055:177::-;14195:29;14191:1;14183:6;14179:14;14172:53;14055:177;:::o;14238:366::-;14380:3;14401:67;14465:2;14460:3;14401:67;:::i;:::-;14394:74;;14477:93;14566:3;14477:93;:::i;:::-;14595:2;14590:3;14586:12;14579:19;;14238:366;;;:::o;14610:419::-;14776:4;14814:2;14803:9;14799:18;14791:26;;14863:9;14857:4;14853:20;14849:1;14838:9;14834:17;14827:47;14891:131;15017:4;14891:131;:::i;:::-;14883:139;;14610:419;;;:::o;15035:224::-;15175:34;15171:1;15163:6;15159:14;15152:58;15244:7;15239:2;15231:6;15227:15;15220:32;15035:224;:::o;15265:366::-;15407:3;15428:67;15492:2;15487:3;15428:67;:::i;:::-;15421:74;;15504:93;15593:3;15504:93;:::i;:::-;15622:2;15617:3;15613:12;15606:19;;15265:366;;;:::o;15637:419::-;15803:4;15841:2;15830:9;15826:18;15818:26;;15890:9;15884:4;15880:20;15876:1;15865:9;15861:17;15854:47;15918:131;16044:4;15918:131;:::i;:::-;15910:139;;15637:419;;;:::o;16062:228::-;16202:34;16198:1;16190:6;16186:14;16179:58;16271:11;16266:2;16258:6;16254:15;16247:36;16062:228;:::o;16296:366::-;16438:3;16459:67;16523:2;16518:3;16459:67;:::i;:::-;16452:74;;16535:93;16624:3;16535:93;:::i;:::-;16653:2;16648:3;16644:12;16637:19;;16296:366;;;:::o;16668:419::-;16834:4;16872:2;16861:9;16857:18;16849:26;;16921:9;16915:4;16911:20;16907:1;16896:9;16892:17;16885:47;16949:131;17075:4;16949:131;:::i;:::-;16941:139;;16668:419;;;:::o;17093:180::-;17141:77;17138:1;17131:88;17238:4;17235:1;17228:15;17262:4;17259:1;17252:15;17279:233;17318:3;17341:24;17359:5;17341:24;:::i;:::-;17332:33;;17387:66;17380:5;17377:77;17374:103;;17457:18;;:::i;:::-;17374:103;17504:1;17497:5;17493:13;17486:20;;17279:233;;;:::o;17518:225::-;17658:34;17654:1;17646:6;17642:14;17635:58;17727:8;17722:2;17714:6;17710:15;17703:33;17518:225;:::o;17749:366::-;17891:3;17912:67;17976:2;17971:3;17912:67;:::i;:::-;17905:74;;17988:93;18077:3;17988:93;:::i;:::-;18106:2;18101:3;18097:12;18090:19;;17749:366;;;:::o;18121:419::-;18287:4;18325:2;18314:9;18310:18;18302:26;;18374:9;18368:4;18364:20;18360:1;18349:9;18345:17;18338:47;18402:131;18528:4;18402:131;:::i;:::-;18394:139;;18121:419;;;:::o;18546:223::-;18686:34;18682:1;18674:6;18670:14;18663:58;18755:6;18750:2;18742:6;18738:15;18731:31;18546:223;:::o;18775:366::-;18917:3;18938:67;19002:2;18997:3;18938:67;:::i;:::-;18931:74;;19014:93;19103:3;19014:93;:::i;:::-;19132:2;19127:3;19123:12;19116:19;;18775:366;;;:::o;19147:419::-;19313:4;19351:2;19340:9;19336:18;19328:26;;19400:9;19394:4;19390:20;19386:1;19375:9;19371:17;19364:47;19428:131;19554:4;19428:131;:::i;:::-;19420:139;;19147:419;;;:::o;19572:221::-;19712:34;19708:1;19700:6;19696:14;19689:58;19781:4;19776:2;19768:6;19764:15;19757:29;19572:221;:::o;19799:366::-;19941:3;19962:67;20026:2;20021:3;19962:67;:::i;:::-;19955:74;;20038:93;20127:3;20038:93;:::i;:::-;20156:2;20151:3;20147:12;20140:19;;19799:366;;;:::o;20171:419::-;20337:4;20375:2;20364:9;20360:18;20352:26;;20424:9;20418:4;20414:20;20410:1;20399:9;20395:17;20388:47;20452:131;20578:4;20452:131;:::i;:::-;20444:139;;20171:419;;;:::o;20596:182::-;20736:34;20732:1;20724:6;20720:14;20713:58;20596:182;:::o;20784:366::-;20926:3;20947:67;21011:2;21006:3;20947:67;:::i;:::-;20940:74;;21023:93;21112:3;21023:93;:::i;:::-;21141:2;21136:3;21132:12;21125:19;;20784:366;;;:::o;21156:419::-;21322:4;21360:2;21349:9;21345:18;21337:26;;21409:9;21403:4;21399:20;21395:1;21384:9;21380:17;21373:47;21437:131;21563:4;21437:131;:::i;:::-;21429:139;;21156:419;;;:::o;21581:179::-;21721:31;21717:1;21709:6;21705:14;21698:55;21581:179;:::o;21766:366::-;21908:3;21929:67;21993:2;21988:3;21929:67;:::i;:::-;21922:74;;22005:93;22094:3;22005:93;:::i;:::-;22123:2;22118:3;22114:12;22107:19;;21766:366;;;:::o;22138:419::-;22304:4;22342:2;22331:9;22327:18;22319:26;;22391:9;22385:4;22381:20;22377:1;22366:9;22362:17;22355:47;22419:131;22545:4;22419:131;:::i;:::-;22411:139;;22138:419;;;:::o;22563:224::-;22703:34;22699:1;22691:6;22687:14;22680:58;22772:7;22767:2;22759:6;22755:15;22748:32;22563:224;:::o;22793:366::-;22935:3;22956:67;23020:2;23015:3;22956:67;:::i;:::-;22949:74;;23032:93;23121:3;23032:93;:::i;:::-;23150:2;23145:3;23141:12;23134:19;;22793:366;;;:::o;23165:419::-;23331:4;23369:2;23358:9;23354:18;23346:26;;23418:9;23412:4;23408:20;23404:1;23393:9;23389:17;23382:47;23446:131;23572:4;23446:131;:::i;:::-;23438:139;;23165:419;;;:::o;23590:222::-;23730:34;23726:1;23718:6;23714:14;23707:58;23799:5;23794:2;23786:6;23782:15;23775:30;23590:222;:::o;23818:366::-;23960:3;23981:67;24045:2;24040:3;23981:67;:::i;:::-;23974:74;;24057:93;24146:3;24057:93;:::i;:::-;24175:2;24170:3;24166:12;24159:19;;23818:366;;;:::o;24190:419::-;24356:4;24394:2;24383:9;24379:18;24371:26;;24443:9;24437:4;24433:20;24429:1;24418:9;24414:17;24407:47;24471:131;24597:4;24471:131;:::i;:::-;24463:139;;24190:419;;;:::o;24615:225::-;24755:34;24751:1;24743:6;24739:14;24732:58;24824:8;24819:2;24811:6;24807:15;24800:33;24615:225;:::o;24846:366::-;24988:3;25009:67;25073:2;25068:3;25009:67;:::i;:::-;25002:74;;25085:93;25174:3;25085:93;:::i;:::-;25203:2;25198:3;25194:12;25187:19;;24846:366;;;:::o;25218:419::-;25384:4;25422:2;25411:9;25407:18;25399:26;;25471:9;25465:4;25461:20;25457:1;25446:9;25442:17;25435:47;25499:131;25625:4;25499:131;:::i;:::-;25491:139;;25218:419;;;:::o;25643:228::-;25783:34;25779:1;25771:6;25767:14;25760:58;25852:11;25847:2;25839:6;25835:15;25828:36;25643:228;:::o;25877:366::-;26019:3;26040:67;26104:2;26099:3;26040:67;:::i;:::-;26033:74;;26116:93;26205:3;26116:93;:::i;:::-;26234:2;26229:3;26225:12;26218:19;;25877:366;;;:::o;26249:419::-;26415:4;26453:2;26442:9;26438:18;26430:26;;26502:9;26496:4;26492:20;26488:1;26477:9;26473:17;26466:47;26530:131;26656:4;26530:131;:::i;:::-;26522:139;;26249:419;;;:::o;26674:194::-;26714:4;26734:20;26752:1;26734:20;:::i;:::-;26729:25;;26768:20;26786:1;26768:20;:::i;:::-;26763:25;;26812:1;26809;26805:9;26797:17;;26836:1;26830:4;26827:11;26824:37;;;26841:18;;:::i;:::-;26824:37;26674:194;;;;:::o;26874:226::-;27014:34;27010:1;27002:6;26998:14;26991:58;27083:9;27078:2;27070:6;27066:15;27059:34;26874:226;:::o;27106:366::-;27248:3;27269:67;27333:2;27328:3;27269:67;:::i;:::-;27262:74;;27345:93;27434:3;27345:93;:::i;:::-;27463:2;27458:3;27454:12;27447:19;;27106:366;;;:::o;27478:419::-;27644:4;27682:2;27671:9;27667:18;27659:26;;27731:9;27725:4;27721:20;27717:1;27706:9;27702:17;27695:47;27759:131;27885:4;27759:131;:::i;:::-;27751:139;;27478:419;;;:::o;27903:442::-;28052:4;28090:2;28079:9;28075:18;28067:26;;28103:71;28171:1;28160:9;28156:17;28147:6;28103:71;:::i;:::-;28184:72;28252:2;28241:9;28237:18;28228:6;28184:72;:::i;:::-;28266;28334:2;28323:9;28319:18;28310:6;28266:72;:::i;:::-;27903:442;;;;;;:::o;28351:664::-;28556:4;28594:3;28583:9;28579:19;28571:27;;28608:71;28676:1;28665:9;28661:17;28652:6;28608:71;:::i;:::-;28689:72;28757:2;28746:9;28742:18;28733:6;28689:72;:::i;:::-;28771;28839:2;28828:9;28824:18;28815:6;28771:72;:::i;:::-;28853;28921:2;28910:9;28906:18;28897:6;28853:72;:::i;:::-;28935:73;29003:3;28992:9;28988:19;28979:6;28935:73;:::i;:::-;28351:664;;;;;;;;:::o;29021:180::-;29069:77;29066:1;29059:88;29166:4;29163:1;29156:15;29190:4;29187:1;29180:15;29207:143;29264:5;29295:6;29289:13;29280:22;;29311:33;29338:5;29311:33;:::i;:::-;29207:143;;;;:::o;29356:351::-;29426:6;29475:2;29463:9;29454:7;29450:23;29446:32;29443:119;;;29481:79;;:::i;:::-;29443:119;29601:1;29626:64;29682:7;29673:6;29662:9;29658:22;29626:64;:::i;:::-;29616:74;;29572:128;29356:351;;;;:::o;29713:85::-;29758:7;29787:5;29776:16;;29713:85;;;:::o;29804:158::-;29862:9;29895:61;29913:42;29922:32;29948:5;29922:32;:::i;:::-;29913:42;:::i;:::-;29895:61;:::i;:::-;29882:74;;29804:158;;;:::o;29968:147::-;30063:45;30102:5;30063:45;:::i;:::-;30058:3;30051:58;29968:147;;:::o;30121:114::-;30188:6;30222:5;30216:12;30206:22;;30121:114;;;:::o;30241:184::-;30340:11;30374:6;30369:3;30362:19;30414:4;30409:3;30405:14;30390:29;;30241:184;;;;:::o;30431:132::-;30498:4;30521:3;30513:11;;30551:4;30546:3;30542:14;30534:22;;30431:132;;;:::o;30569:108::-;30646:24;30664:5;30646:24;:::i;:::-;30641:3;30634:37;30569:108;;:::o;30683:179::-;30752:10;30773:46;30815:3;30807:6;30773:46;:::i;:::-;30851:4;30846:3;30842:14;30828:28;;30683:179;;;;:::o;30868:113::-;30938:4;30970;30965:3;30961:14;30953:22;;30868:113;;;:::o;31017:732::-;31136:3;31165:54;31213:5;31165:54;:::i;:::-;31235:86;31314:6;31309:3;31235:86;:::i;:::-;31228:93;;31345:56;31395:5;31345:56;:::i;:::-;31424:7;31455:1;31440:284;31465:6;31462:1;31459:13;31440:284;;;31541:6;31535:13;31568:63;31627:3;31612:13;31568:63;:::i;:::-;31561:70;;31654:60;31707:6;31654:60;:::i;:::-;31644:70;;31500:224;31487:1;31484;31480:9;31475:14;;31440:284;;;31444:14;31740:3;31733:10;;31141:608;;;31017:732;;;;:::o;31755:831::-;32018:4;32056:3;32045:9;32041:19;32033:27;;32070:71;32138:1;32127:9;32123:17;32114:6;32070:71;:::i;:::-;32151:80;32227:2;32216:9;32212:18;32203:6;32151:80;:::i;:::-;32278:9;32272:4;32268:20;32263:2;32252:9;32248:18;32241:48;32306:108;32409:4;32400:6;32306:108;:::i;:::-;32298:116;;32424:72;32492:2;32481:9;32477:18;32468:6;32424:72;:::i;:::-;32506:73;32574:3;32563:9;32559:19;32550:6;32506:73;:::i;:::-;31755:831;;;;;;;;:::o;32592:807::-;32841:4;32879:3;32868:9;32864:19;32856:27;;32893:71;32961:1;32950:9;32946:17;32937:6;32893:71;:::i;:::-;32974:72;33042:2;33031:9;33027:18;33018:6;32974:72;:::i;:::-;33056:80;33132:2;33121:9;33117:18;33108:6;33056:80;:::i;:::-;33146;33222:2;33211:9;33207:18;33198:6;33146:80;:::i;:::-;33236:73;33304:3;33293:9;33289:19;33280:6;33236:73;:::i;:::-;33319;33387:3;33376:9;33372:19;33363:6;33319:73;:::i;:::-;32592:807;;;;;;;;;:::o;33405:143::-;33462:5;33493:6;33487:13;33478:22;;33509:33;33536:5;33509:33;:::i;:::-;33405:143;;;;:::o;33554:663::-;33642:6;33650;33658;33707:2;33695:9;33686:7;33682:23;33678:32;33675:119;;;33713:79;;:::i;:::-;33675:119;33833:1;33858:64;33914:7;33905:6;33894:9;33890:22;33858:64;:::i;:::-;33848:74;;33804:128;33971:2;33997:64;34053:7;34044:6;34033:9;34029:22;33997:64;:::i;:::-;33987:74;;33942:129;34110:2;34136:64;34192:7;34183:6;34172:9;34168:22;34136:64;:::i;:::-;34126:74;;34081:129;33554:663;;;;;:::o

Swarm Source

ipfs://dacac630edb96b2f23823c50b32e8a3e618537b3ca279da728d1666d693bfd9c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

IBIT functions as the currency for InfinityBit, an on-chain CEX. It also provides access to an automated AI-powered trading system and the greater InfinityBit ecosystem.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.