ETH Price: $2,391.84 (-0.52%)

Token

ShibaKombat ($SK)
 

Overview

Max Total Supply

100,000,000 $SK

Holders

59

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
993,037.250628124 $SK

Value
$0.00
0xd25c6b0e6f4e0e8c3dcf9a9437efa6ad5be3b658
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ShibaKombat

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**

Shiba Kombat

Website: https://shibakombat.com/

Telegram: https://t.me/ShibaKombat.com/

Twitter: https://www.twitter.com/ShibaKombat

Trailer: https://www.youtube.com/watch?v=rOx7doe9zoI

/**


Total Supply: 100,000,000 / 100000000
Max Wallet: 2% (2,000,000 Tokens) / 2000000
Max Buy: 2% (2,000,000 Tokens) / 2000000
Max Sell: 1% (1,000,000 Tokens) / 1000000
Buy / Sell Tax: 10% 
- 4% Marketing
- 5% LP
- 1% Development


*/

pragma solidity ^0.8.15;

// SPDX-License-Identifier: Unlicensed

interface IERC20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IUniswapV2ERC20 {
    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;
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Router01 {
    function 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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    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;
}



/**
 * @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 {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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://diligence.consensys.net/posts/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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

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

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

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

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

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

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

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

////////// Contract /////////////

contract ShibaKombat is IERC20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    event antiBotBan(address indexed value);

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

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromBuyLock;
    EnumerableSet.AddressSet private _excludedFromStaking;

    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string public _name = "ShibaKombat";
    string public _symbol = "$SK";
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100000000 * 10**_decimals;//equals 100,000,000 tokens 100000000

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
    uint256 public autoBanTime = 20; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
    uint256 public enableAutoBlacklist = 0; //Leave 1 if using, set to 0 if not using.
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (2%))
    uint16 public constant SellLimitDivider=50;
    //Sellers get locked for MaxSellLockTime (put in seconds, works better especially if changing later) so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 0 seconds;
    //Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 0 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public Development=payable(0x999f9663667665491243E03D1B5b9110D6b1Cb58);
    address public Marketing=payable(0x999f9663667665491243E03D1B5b9110D6b1Cb58);
    //MainNet
    address private constant UniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
    uint256 private MaxBuy = 2000000 * 10**_decimals; // 2,000,000 tokens
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _stakingTax;

       
    address private _uniswapv2PairAddress; 
    IUniswapV2Router02 private  _uniswapv2Router;
    
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==Development||addr==Marketing;
    }

    //Constructor///////////

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // UniswapV2 Router
        _uniswapv2Router = IUniswapV2Router02(UniswapV2Router);
        //Creates a UniswapV2 Pair
        _uniswapv2PairAddress = IUniswapV2Factory(_uniswapv2Router.factory()).createPair(address(this), _uniswapv2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;

        //Sets sellLockTime
        sellLockTime=0;
        
        //Sets buyLockTime
        buyLockTime=0;

        //Set Starting Tax 
        
        _buyTax=10;
        _sellTax=10;
        _transferTax=10;

        _burnTax=0;
        _liquidityTax=30;
        _stakingTax=70;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(Development);
        _excluded.add(Marketing);
        _excluded.add(msg.sender);
        //excludes UniswapV2 Router, pair, contract and burn address from staking
        _excludedFromStaking.add(address(_uniswapv2Router));
        _excludedFromStaking.add(_uniswapv2PairAddress);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(0x000000000000000000000000000000000000dEaD);
    
    }

    //Transfer functionality///

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between UniswapV2Router and UniswapV2Pair are tax and lock free
        address uniswapv2Router=address(_uniswapv2Router);
        bool isLiquidityTransfer = ((sender == _uniswapv2PairAddress && recipient == uniswapv2Router) 
        || (recipient == _uniswapv2PairAddress && sender == uniswapv2Router));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_uniswapv2PairAddress|| sender == uniswapv2Router;
        bool isSell=recipient==_uniswapv2PairAddress|| recipient == uniswapv2Router;

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP and stakingETH, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            if(!_excludedFromSellLock.contains(sender)){
                 //If seller sold less than sellLockTime(2h 50m) ago, sell is declined, can be disabled by Team         
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock");
                //Sets the time sellers get locked(2 hours 50 mins by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
            }
            //Sells can't exceed the sell limit(21,000 Tokens at start, can be updated to circulating supply)
            require(amount<=sellLimit,"Dump protection");
            require(_isBlacklisted.contains(sender) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            tax=_sellTax;


        } else if(isBuy){
            if(!_excludedFromBuyLock.contains(recipient)){
                 //If buyer bought less than buyLockTime(2h 50m) ago, buy is declined, can be disabled by Team         
                require(_buyLock[recipient]<=block.timestamp||buyLockDisabled,"Buyer in buyLock");
                //Sets the time buyers get locked(2 hours 50 mins by default)
                _buyLock[recipient]=block.timestamp+buyLockTime;
            }
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            require(amount <= MaxBuy,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }

            tax=_buyTax;

        } else {//Transfer
            //withdraws ETH when sending less or equal to 1 Token
            //that way you can withdraw without connecting to any dApp.
            //might needs higher gas limit
            if(amount<=10**(_decimals)) claimETH(sender);
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            tax=_transferTax;

        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapv2 pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_uniswapv2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _stakingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

        //Removes token and handles staking
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;

        //Adds token and handles staking
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);

    }

    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _addToken(recipient, amount);
        
        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }

     //ETH Autostake/////////////////////////////////////////////////////////////////////////////////////////
       //Autostake uses the balances of each holder to redistribute auto generated ETH.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawETH can be used for any holder to withdraw ETH at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //lock for the withdraw
    bool private _isWithdrawing;
    //Multiplier to add some accuracy to profitPerShare
    uint256 private constant DistributionMultiplier = 2**64;
    //profit for each share a holder holds, a share equals a token.
    uint256 public profitPerShare;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalStakingReward;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    
  
    uint8 public marketingShare=100;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of the already paid out(or missed) shares of each staker
    mapping(address => uint256) private alreadyPaidShares;
    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    //Contract, uniswapv2 and burnAddress are excluded, other addresses like CEX
    //can be manually excluded, excluded list is limited to 30 entries to avoid a
    //out of gas exeption during sells
    function isExcludedFromStaking(address addr) public view returns (bool){
        return _excludedFromStaking.contains(addr);
    }

    //Check if address is blacklisted
    function isBlacklisted(address addr) public view returns (bool){
        return _isBlacklisted.contains(addr);
    }
    //Total shares equals circulating supply minus excluded Balances
    function _getTotalShares() public view returns (uint256){
        uint256 shares=_circulatingSupply;
        //substracts all excluded from shares, excluded list is limited to 30
        // to avoid creating a Honeypot through OutOfGas exeption
        for(uint i=0; i<_excludedFromStaking.length(); i++){
            shares-=_balances[_excludedFromStaking.at(i)];
        }
        return shares;
    }

    //adds Token to balances, adds new ETH to the toBePaid mapping and resets staking
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token, adds ETH to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //sets newBalance
        _balances[addr]=newAmount;
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
    }
    
    
    //gets the not dividents of a staker that aren't in the toBePaid mapping 
    //returns wrong value for excluded accounts
    function _newDividentsOf(address staker) private view returns (uint256) {
        uint256 fullPayout = profitPerShare * _balances[staker];
        // if theres an overflow for some unexpected reason, return 0, instead of 
        // an exeption to still make trades possible
        if(fullPayout<alreadyPaidShares[staker]) return 0;
        return (fullPayout - alreadyPaidShares[staker]) / DistributionMultiplier;
    }

    //distributes eth between marketing share and dividents 
    function _distributeStake(uint256 ETHamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (ETHamount * marketingShare) / 100;
        uint256 amount = ETHamount - marketingSplit;

       marketingBalance+=marketingSplit;
       
        if (amount > 0) {
            totalStakingReward += amount;
            uint256 totalShares=_getTotalShares();
            //when there are 0 shares, add everything to marketing budget
            if (totalShares == 0) {
                marketingBalance += amount;
            }else{
                //Increases profit per share based on current total shares
                profitPerShare += ((amount * DistributionMultiplier) / totalShares);
            }
        }
    }
    event OnWithdrawETH(uint256 amount, address recipient);
    
    //withdraws all dividents of address
    function claimETH(address addr) private{
        require(!_isWithdrawing);
        _isWithdrawing=true;
        uint256 amount;
        if(isExcludedFromStaking(addr)){
            //if excluded just withdraw remaining toBePaid ETH
            amount=toBePaid[addr];
            toBePaid[addr]=0;
        }
        else{
            uint256 newAmount=_newDividentsOf(addr);
            //sets payout mapping to current amount
            alreadyPaidShares[addr] = profitPerShare * _balances[addr];
            //the amount to be paid 
            amount=toBePaid[addr]+newAmount;
            toBePaid[addr]=0;
        }
        if(amount==0){//no withdraw if 0 amount
            _isWithdrawing=false;
            return;
        }


        totalPayouts+=amount;
        address[] memory path = new address[](2);
        path[0] = _uniswapv2Router.WETH(); //ETH
        path[1] = RewardsAddress; //USDC Rewards - Option to enable.

        _uniswapv2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawETH(amount, addr);
        _isWithdrawing=false;
    }
        //Launch Rewards Address - Can be Changed - Rewards not enabled at launch.
    address public RewardsAddress=(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); //USDC
    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////



    //tracks auto generated ETH, useful for ticker etc
    uint256 public totalLPETH;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }
    uint256 currentAmountToSwap = 800000 * 10**_decimals;  // 800,000 tokens (0.5%)
    //swaps the token on the contract for Marketing ETH and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_stakingTax;
        uint256 tokenToSwap = currentAmountToSwap;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqETHToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for ETH
        uint256 swapToken=liqETHToken+tokenForMarketing;
        //Gets the initial ETH balance, so swap won't touch any staked ETH
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        //Get the ETH balance after LP generation to get the
        //exact amount of token left for Staking
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining ETH between stakers and Marketing
        _distributeStake(distributeETH);
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapv2Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapv2Router.WETH();

        _uniswapv2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 ethamount) private {
        totalLPETH+=ethamount;
        _approve(address(this), address(_uniswapv2Router), tokenamount);
        _uniswapv2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    //public functions /////////////////////////////////////////////////////////////////////////////////////

    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function getBurnedTokens() public view returns(uint256){
        return (InitialSupply-_circulatingSupply)/10**_decimals;
    }

    function getLimits() public view returns(uint256 balance, uint256 sell){
        return(balanceLimit/10**_decimals, sellLimit/10**_decimals);
    }

    function getTaxes() public view returns(uint256 burnTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_stakingTax,_buyTax,_sellTax,_transferTax);
    }

    //How long is a given address still locked from selling
    //function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
    //   uint256 lockTime=_sellLock[AddressToCheck];
    //   if(lockTime<=block.timestamp)
    //   {
    //       return 0;
    //   }
    //   return lockTime-block.timestamp;
    //}
    //function getSellLockTimeInSeconds() public view returns(uint256){
    //    return sellLockTime;
    //}
    
    function getcurrentAmountToSwap() public view returns (uint256){
          return currentAmountToSwap;
    }

    //How long is a given address still locked from buying - not used
    //function getAddressBuyLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
    //   uint256 lockTime=_buyLock[AddressToCheck];
    //   if(lockTime<=block.timestamp)
    //   {
    //       return 0;
    //   }
    //   return lockTime-block.timestamp;
    //}
    //function getBuyLockTimeInSeconds() public view returns(uint256){
    //    return buyLockTime;
    //}
    
    //Functions every wallet can call - no sell lock in isde
    //Resets sell lock of caller to the default sellLockTime should something go very wrong
    //function AddressResetSellLock() public{
    //    _sellLock[msg.sender]=block.timestamp+sellLockTime;
    //}
    
    //Resets buy lock of caller to the default buyLockTime should something go very wrong - no buy lock in usde
 //   function AddressResetBuyLock() public{
 //       _buyLock[msg.sender]=block.timestamp+buyLockTime;
    
 //   }

        //withdraws dividents of sender
    function Rewards() public{
        claimETH(msg.sender);
    }

    function getDividents(address addr) public view returns (uint256){
        if(isExcludedFromStaking(addr)) return toBePaid[addr];
        return _newDividentsOf(addr)+toBePaid[addr];
    }

    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
 
    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public buyLockDisabled;
    uint256 public buyLockTime;
    bool public manualConversion; 

    function CollectMarketingETH() public onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(Development).transfer((amount*50) / 100);
        payable(Marketing).transfer((amount*50) / 100);
    } 
    function TeamCollectXMarketingETH(uint256 amount) public onlyOwner{
        require(amount<=marketingBalance);
        marketingBalance-=amount;
        payable(Development).transfer((amount*50) / 100);
        payable(Marketing).transfer((amount*50) / 100);
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) public onlyOwner{
        manualConversion=manual;
    }
    
    function TeamChangeMaxBuy(uint256 newMaxBuy) public onlyOwner{
      MaxBuy=newMaxBuy * 10**_decimals;
    }
    
    function TeamChangeDevelopment(address newDevelopment) public onlyOwner{
      Development=payable(newDevelopment);
    }

    function TeamChangeMarketing(address newMarketing) public onlyOwner{
      Marketing=payable(newMarketing);
    }

    function TeamChangeRewardsAddress(address newRewardsAddress) public onlyOwner{
      RewardsAddress=(newRewardsAddress);
    }

    function updateTokenDetails(string memory newName, string memory newSymbol) public onlyOwner {
        _name = newName;
        _symbol = newSymbol;
    }



    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyOwner{
        sellLockDisabled=disabled;
    }
    
    //Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) public onlyOwner{
        buyLockDisabled=disabled;
    }

    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyOwner{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    } 
    
    //Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds)public onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
    } 

    //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) public onlyOwner{
        currentAmountToSwap = newSwapAmount;
    }
    
    //Allows wallet exclusion to be added after launch
    function AddWalletExclusion(address exclusionAdd) public onlyOwner{
        _excluded.add(exclusionAdd);
    }
    
    //Sets Taxes
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 stakingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+stakingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _stakingTax=stakingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }

    //How much of the staking tax should be allocated for marketing
    function TeamChangeMarketingShare(uint8 newShare) public onlyOwner{
        require(newShare<=100); 
        marketingShare=newShare;
    }
    //manually converts contract token to LP and staking ETH
    function TeamCreateLPandETH() public onlyOwner{
    _swapContractToken();
    }
    
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100);
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

        require((newBalanceLimit>=targetBalanceLimit), 
        "newBalanceLimit needs to be at least target");
        require((newSellLimit>=targetSellLimit), 
        "newSellLimit needs to be at least target");

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }

    //Adds address to blacklist and prevents sells, buys or transfers.
    function addAddressToBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.add(blacklistedAddress);
    }

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
    }
    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() public onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }

    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
    }

    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint256 private _liquidityUnlockTime;

    function TeamExtendLiquidityLock(uint256 secondsUntilUnlock) public onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens generated from LP tax to owner once unlock time is over so they can be locked in liquidity locker.
    function ReleaseTaxedLiquidityToLock() public onlyOwner {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IUniswapV2ERC20 liquidityToken = IUniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        //Liquidity release if something goes wrong at start
        liquidityToken.transfer(Development, amount);
        
    }
    //Removes Liquidity once unlock Time is over - Depreciated function - would add to staking pool for distribution.
    /*
        function REM(bool addToStaking) public onlyOwner{
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        IUniswapV2ERC20 liquidityToken = IUniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_uniswapv2Router),amount);
        //Removes Liquidity and either distributes liquidity ETH to stakers, or 
        // adds them to marketing Balance
        //Token will be converted
        //to Liquidity and Staking ETH again
        uint256 initialETHBalance = address(this).balance;
        _uniswapv2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        if(addToStaking){
            _distributeStake(newETHBalance);
        }
        else{
            marketingBalance+=newETHBalance;
        }

    }
    */
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamCollectRemainingETH() public onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        (bool sent,) =Development.call{value: (address(this).balance)}("");
        require(sent);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    receive() external payable {}
    fallback() external payable {}
    // IERC20

    function getOwner() external view override returns (address) {
        return owner();
    }

    function name() external view override returns (string memory) { 
        return _name; 
    }
    function symbol() external view override returns (string memory) 
    { return _symbol; 
    }
    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _circulatingSupply;
    }

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

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address _owner, address spender) external view override returns (uint256) {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    // IERC20 - Helpers

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"OnWithdrawETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"antiBotBan","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"AddWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CollectMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Development","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ReleaseTaxedLiquidityToLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RewardsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevelopment","type":"address"}],"name":"TeamChangeDevelopment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketing","type":"address"}],"name":"TeamChangeMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"TeamChangeMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardsAddress","type":"address"}],"name":"TeamChangeRewardsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCollectRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamCollectXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamExtendLiquidityLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"stakingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBanTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceLimit","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":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"enableAutoBlacklist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getDividents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getcurrentAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"profitPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"},{"internalType":"string","name":"newSymbol","type":"string"}],"name":"updateTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600b60809081526a14da1a589852dbdb58985d60aa1b60a052600f906200002c90826200061a565b5060408051808201909152600381526224534b60e81b60208201526010906200005690826200061a565b50601460128190556000601355805473999f9663667665491243e03d1b5b9110d6b1cb586001600160a01b03199182168117909255601580549091169091179055620000a56009600a620007f9565b620000b5906305f5e1006200080a565b60168190556017819055601855620000d06009600a620007f9565b620000df90621e84806200080a565b601955601f805460ff19166064179055602380546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48179055620001236009600a620007f9565b6200013290620c35006200080a565b6026553480156200014257600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601654336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601b80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000230573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025691906200082c565b6001600160a01b031663c9c6539630601b60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002b9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002df91906200082c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200032d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035391906200082c565b601a80546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003916009600a620007f9565b620003a1906305f5e1006200080a565b620003ad91906200085e565b6017556032620003c06009600a620007f9565b620003d0906305f5e1006200080a565b620003dc91906200085e565b60185560006028819055602a55601a805465ffffffffffff191665461e000a0a0a17905560145462000426906005906001600160a01b031662000503602090811b62001fa217901c565b506015546200044d906005906001600160a01b031662000503602090811b62001fa217901c565b50620004693360056200050360201b62001fa21790919060201c565b50601b546200049090600b906001600160a01b031662000503602090811b62001fa217901c565b50620004c1601a60069054906101000a90046001600160a01b0316600b6200050360201b62001fa21790919060201c565b50620004dd30600b6200050360201b62001fa21790919060201c565b50620004fb61dead600b6200050360201b62001fa21790919060201c565b505062000881565b60006200051a836001600160a01b03841662000523565b90505b92915050565b60008181526001830160205260408120546200056c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200051d565b5060006200051d565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005a057607f821691505b602082108103620005c157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200061557600081815260208120601f850160051c81016020861015620005f05750805b601f850160051c820191505b818110156200061157828155600101620005fc565b5050505b505050565b81516001600160401b0381111562000636576200063662000575565b6200064e816200064784546200058b565b84620005c7565b602080601f8311600181146200068657600084156200066d5750858301515b600019600386901b1c1916600185901b17855562000611565b600085815260208120601f198616915b82811015620006b75788860151825594840194600190910190840162000696565b5085821015620006d65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200073d578160001904821115620007215762000721620006e6565b808516156200072f57918102915b93841c939080029062000701565b509250929050565b60008262000756575060016200051d565b8162000765575060006200051d565b81600181146200077e57600281146200078957620007a9565b60019150506200051d565b60ff8411156200079d576200079d620006e6565b50506001821b6200051d565b5060208310610133831016604e8410600b8410161715620007ce575081810a6200051d565b620007da8383620006fc565b8060001904821115620007f157620007f1620006e6565b029392505050565b60006200051a60ff84168362000745565b6000816000190483118215151615620008275762000827620006e6565b500290565b6000602082840312156200083f57600080fd5b81516001600160a01b03811681146200085757600080fd5b9392505050565b6000826200087c57634e487b7160e01b600052601260045260246000fd5b500490565b613eb480620008916000396000f3fe60806040526004361061041b5760003560e01c8063762bb2821161021c578063c3f4f54f11610122578063e68f136a116100b0578063f2c816ae11610077578063f2c816ae14610c7e578063f2fde38b14610c9e578063f88b0e4614610cbe578063fe002ec214610cd4578063fe575a8714610ce957005b8063e68f136a14610bfe578063e69e03ee14610c1e578063ef12a33014610c33578063f00df36514610c48578063f0cc761214610c5e57005b8063d28d8852116100f4578063d28d885214610b43578063d51f383b14610b58578063db886f2314610b78578063dd62ed3e14610b98578063e2fd002a14610bde57005b8063c3f4f54f14610ace578063cd979a7e14610ae3578063d0291d6614610b03578063d11edf7414610b2357005b80639bf65770116101aa578063b58a56cd11610171578063b58a56cd14610a44578063b766a38614610a64578063c054f2f414610a84578063c280895414610aa4578063c3a3c03214610ab957005b80639bf65770146109af5780639fa62d5f146109cf578063a457c2d7146109ef578063a9059cbb14610a0f578063b09f126614610a2f57005b8063887c60fb116101ee578063887c60fb14610910578063893d20e81461092a5780638da5cb5b1461095c57806394e8075d1461097a57806395d89b411461099a57005b8063762bb282146108b55780637b9e987a146108cb5780638650e92a146108e057806386d0ada8146108f657005b80633cc39b7a116103215780635b80f625116102af5780636f89e409116102765780636f89e4091461080057806370a082311461082a578063715018a6146108605780637335307b1461087557806373ddf08e1461089557005b80635b80f625146107965780635c69f6901461065e5780635ebbc3ca146107ab578063643daaea146107c05780636ea4caab146107e057005b80634ada218b116102f35780634ada218b1461070b5780634cdaf0ae1461072a5780634f91e48c1461074a57806357ad67d11461076057806358e553651461078057005b80633cc39b7a146106b35780633da56f18146106c95780634089b170146106df57806344f3c83a146106f557005b8063243b529a116103a9578063313ce56711610370578063313ce5671461062a57806332ac487f1461063e5780633478154b1461065e57806335e82f3a14610673578063395093511461069357005b8063243b529a14610567578063269a6aae1461057c5780632973ef2d146105925780633054f8a3146105fb578063311a86971461061557005b80630fd99e16116103ed5780630fd99e16146104cb57806314e91377146104f357806318160ddd146105135780631eb25d131461053257806323b872dd1461054757005b80630241047b1461042457806306fdde031461044457806309218ee71461046f578063095ea7b31461049b57005b3661042257005b005b34801561043057600080fd5b5061042261043f3660046136b7565b610d09565b34801561045057600080fd5b50610459610e12565b60405161046691906136d0565b60405180910390f35b34801561047b57600080fd5b50601f546104899060ff1681565b60405160ff9091168152602001610466565b3480156104a757600080fd5b506104bb6104b636600461373a565b610ea4565b6040519015158152602001610466565b3480156104d757600080fd5b506104e0603281565b60405161ffff9091168152602001610466565b3480156104ff57600080fd5b5061042261050e366004613774565b610ebb565b34801561051f57600080fd5b506016545b604051908152602001610466565b34801561053e57600080fd5b50610524610f07565b34801561055357600080fd5b506104bb610562366004613791565b610f24565b34801561057357600080fd5b50610422610fbb565b34801561058857600080fd5b5061052460125481565b34801561059e57600080fd5b50601a546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610466565b34801561060757600080fd5b506029546104bb9060ff1681565b34801561062157600080fd5b50610489603281565b34801561063657600080fd5b506009610489565b34801561064a57600080fd5b506105246106593660046137d2565b610ffe565b34801561066a57600080fd5b506104e0600081565b34801561067f57600080fd5b5061042261068e3660046137d2565b611056565b34801561069f57600080fd5b506104bb6106ae36600461373a565b61109a565b3480156106bf57600080fd5b5061052460245481565b3480156106d557600080fd5b5061052460135481565b3480156106eb57600080fd5b50610524601e5481565b34801561070157600080fd5b50610524602a5481565b34801561071757600080fd5b50602b546104bb90610100900460ff1681565b34801561073657600080fd5b506104226107453660046137d2565b6110d1565b34801561075657600080fd5b5061052460185481565b34801561076c57600080fd5b5061042261077b366004613805565b611134565b34801561078c57600080fd5b5061052460205481565b3480156107a257600080fd5b50602654610524565b3480156107b757600080fd5b50610422611267565b3480156107cc57600080fd5b506104226107db3660046136b7565b611357565b3480156107ec57600080fd5b506104226107fb3660046136b7565b6113a2565b34801561080c57600080fd5b506108156113f7565b60408051928352602083019190915201610466565b34801561083657600080fd5b506105246108453660046137d2565b6001600160a01b031660009081526001602052604090205490565b34801561086c57600080fd5b50610422611434565b34801561088157600080fd5b506104bb6108903660046137d2565b6114b7565b3480156108a157600080fd5b506104226108b0366004613879565b6114c4565b3480156108c157600080fd5b5061052460175481565b3480156108d757600080fd5b50610422611524565b3480156108ec57600080fd5b50610524601c5481565b34801561090257600080fd5b50602b546104bb9060ff1681565b34801561091c57600080fd5b506027546104bb9060ff1681565b34801561093657600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610466565b34801561096857600080fd5b506000546001600160a01b0316610944565b34801561098657600080fd5b50601454610944906001600160a01b031681565b3480156109a657600080fd5b50610459611577565b3480156109bb57600080fd5b506104226109ca366004613774565b611586565b3480156109db57600080fd5b506104226109ea366004613894565b6115d2565b3480156109fb57600080fd5b506104bb610a0a36600461373a565b611754565b348015610a1b57600080fd5b506104bb610a2a36600461373a565b6117d0565b348015610a3b57600080fd5b506104596117dd565b348015610a5057600080fd5b50610422610a5f3660046137d2565b61186b565b348015610a7057600080fd5b50610422610a7f366004613774565b6118c6565b348015610a9057600080fd5b50602354610944906001600160a01b031681565b348015610ab057600080fd5b50610422611912565b348015610ac557600080fd5b5061052461191b565b348015610ada57600080fd5b5061052461193b565b348015610aef57600080fd5b50610422610afe3660046137d2565b61197a565b348015610b0f57600080fd5b50610422610b1e366004613959565b6119be565b348015610b2f57600080fd5b50610422610b3e3660046136b7565b611a15565b348015610b4f57600080fd5b50610459611a53565b348015610b6457600080fd5b50610422610b733660046136b7565b611a60565b348015610b8457600080fd5b50601554610944906001600160a01b031681565b348015610ba457600080fd5b50610524610bb33660046139bd565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610bea57600080fd5b50610422610bf93660046136b7565b611aec565b348015610c0a57600080fd5b50610422610c193660046137d2565b611b71565b348015610c2a57600080fd5b50610524611bcc565b348015610c3f57600080fd5b50610422611c32565b348015610c5457600080fd5b50610524601d5481565b348015610c6a57600080fd5b50610422610c793660046137d2565b611d9f565b348015610c8a57600080fd5b50610422610c993660046137d2565b611dfa565b348015610caa57600080fd5b50610422610cb93660046137d2565b611e3e565b348015610cca57600080fd5b5061052460285481565b348015610ce057600080fd5b50610422611f37565b348015610cf557600080fd5b506104bb610d043660046137d2565b611f95565b33610d1c6000546001600160a01b031690565b6001600160a01b031614610d4b5760405162461bcd60e51b8152600401610d42906139f6565b60405180910390fd5b602054811115610d5a57600080fd5b8060206000828254610d6c9190613a41565b90915550506014546001600160a01b03166108fc6064610d8d846032613a58565b610d979190613a77565b6040518115909202916000818181858888f19350505050158015610dbf573d6000803e3d6000fd5b506015546001600160a01b03166108fc6064610ddc846032613a58565b610de69190613a77565b6040518115909202916000818181858888f19350505050158015610e0e573d6000803e3d6000fd5b5050565b6060600f8054610e2190613a99565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4d90613a99565b8015610e9a5780601f10610e6f57610100808354040283529160200191610e9a565b820191906000526020600020905b815481529060010190602001808311610e7d57829003601f168201915b5050505050905090565b6000610eb1338484611fbe565b5060015b92915050565b33610ece6000546001600160a01b031690565b6001600160a01b031614610ef45760405162461bcd60e51b8152600401610d42906139f6565b6027805460ff1916911515919091179055565b610f136009600a613bb1565b610f21906305f5e100613a58565b81565b6000610f318484846120b1565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f9c5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610d42565b610fb08533610fab8685613a41565b611fbe565b506001949350505050565b33610fce6000546001600160a01b031690565b6001600160a01b031614610ff45760405162461bcd60e51b8152600401610d42906139f6565b610ffc61230e565b565b6000611009826114b7565b1561102a57506001600160a01b031660009081526022602052604090205490565b6001600160a01b03821660009081526022602052604090205461104c8361244e565b610eb59190613bc0565b336110696000546001600160a01b031690565b6001600160a01b03161461108f5760405162461bcd60e51b8152600401610d42906139f6565b610e0e600d826124d4565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610eb1918590610fab908690613bc0565b336110e46000546001600160a01b031690565b6001600160a01b03161461110a5760405162461bcd60e51b8152600401610d42906139f6565b602b80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111476000546001600160a01b031690565b6001600160a01b03161461116d5760405162461bcd60e51b8152600401610d42906139f6565b60008461117a8789613bd8565b6111849190613bd8565b90508060ff166064146111e85760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610d42565b50601a805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b3361127a6000546001600160a01b031690565b6001600160a01b0316146112a05760405162461bcd60e51b8152600401610d42906139f6565b602c544210156112e55760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610d42565b6112f161070842613bc0565b602c556014546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611341576040519150601f19603f3d011682016040523d82523d6000602084013e611346565b606091505b505090508061135457600080fd5b50565b3361136a6000546001600160a01b031690565b6001600160a01b0316146113905760405162461bcd60e51b8152600401610d42906139f6565b61135461139d4283613bc0565b6124e9565b336113b56000546001600160a01b031690565b6001600160a01b0316146113db5760405162461bcd60e51b8152600401610d42906139f6565b6113e76009600a613bb1565b6113f19082613a58565b60195550565b6000806114066009600a613bb1565b6017546114139190613a77565b61141f6009600a613bb1565b60185461142c9190613a77565b915091509091565b336114476000546001600160a01b031690565b6001600160a01b03161461146d5760405162461bcd60e51b8152600401610d42906139f6565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610eb5600b836124fc565b336114d76000546001600160a01b031690565b6001600160a01b0316146114fd5760405162461bcd60e51b8152600401610d42906139f6565b60648160ff16111561150e57600080fd5b601f805460ff191660ff92909216919091179055565b336115376000546001600160a01b031690565b6001600160a01b03161461155d5760405162461bcd60e51b8152600401610d42906139f6565b602b805461ff00191661010017905542601155565b905090565b606060108054610e2190613a99565b336115996000546001600160a01b031690565b6001600160a01b0316146115bf5760405162461bcd60e51b8152600401610d42906139f6565b602b805460ff1916911515919091179055565b336115e56000546001600160a01b031690565b6001600160a01b03161461160b5760405162461bcd60e51b8152600401610d42906139f6565b606460165461161a9190613a77565b811061162557600080fd5b6116316009600a613bb1565b61163b9083613a58565b91506116496009600a613bb1565b6116539082613a58565b90506000603260ff166016546116699190613a77565b90506000603261ffff166016546116809190613a77565b9050818410156116e65760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610d42565b808310156117475760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610d42565b5050601791909155601855565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156117b75760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610d42565b6117c63385610fab8685613a41565b5060019392505050565b6000610eb13384846120b1565b601080546117ea90613a99565b80601f016020809104026020016040519081016040528092919081815260200182805461181690613a99565b80156118635780601f1061183857610100808354040283529160200191611863565b820191906000526020600020905b81548152906001019060200180831161184657829003601f168201915b505050505081565b3361187e6000546001600160a01b031690565b6001600160a01b0316146118a45760405162461bcd60e51b8152600401610d42906139f6565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b336118d96000546001600160a01b031690565b6001600160a01b0316146118ff5760405162461bcd60e51b8152600401610d42906139f6565b6029805460ff1916911515919091179055565b610ffc3361251e565b6000602c544210156119355742602c546115729190613a41565b50600090565b60006119496009600a613bb1565b6016546119586009600a613bb1565b611966906305f5e100613a58565b6119709190613a41565b6115729190613a77565b3361198d6000546001600160a01b031690565b6001600160a01b0316146119b35760405162461bcd60e51b8152600401610d42906139f6565b610e0e600582611fa2565b336119d16000546001600160a01b031690565b6001600160a01b0316146119f75760405162461bcd60e51b8152600401610d42906139f6565b600f611a038382613c43565b506010611a108282613c43565b505050565b33611a286000546001600160a01b031690565b6001600160a01b031614611a4e5760405162461bcd60e51b8152600401610d42906139f6565b602655565b600f80546117ea90613a99565b33611a736000546001600160a01b031690565b6001600160a01b031614611a995760405162461bcd60e51b8152600401610d42906139f6565b8015611ae75760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610d42565b602855565b33611aff6000546001600160a01b031690565b6001600160a01b031614611b255760405162461bcd60e51b8152600401610d42906139f6565b8015611b6c5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610d42565b602a55565b33611b846000546001600160a01b031690565b6001600160a01b031614611baa5760405162461bcd60e51b8152600401610d42906139f6565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b601654600090815b611bde600b6127cf565b811015611c2c5760016000611bf4600b846127d9565b6001600160a01b03168152602081019190915260400160002054611c189083613a41565b915080611c2481613d03565b915050611bd4565b50919050565b33611c456000546001600160a01b031690565b6001600160a01b031614611c6b5760405162461bcd60e51b8152600401610d42906139f6565b602c54421015611cb05760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610d42565b602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d269190613d1c565b60145460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015611d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a109190613d35565b33611db26000546001600160a01b031690565b6001600160a01b031614611dd85760405162461bcd60e51b8152600401610d42906139f6565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b33611e0d6000546001600160a01b031690565b6001600160a01b031614611e335760405162461bcd60e51b8152600401610d42906139f6565b610e0e600d82611fa2565b33611e516000546001600160a01b031690565b6001600160a01b031614611e775760405162461bcd60e51b8152600401610d42906139f6565b6001600160a01b038116611edc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d42565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b33611f4a6000546001600160a01b031690565b6001600160a01b031614611f705760405162461bcd60e51b8152600401610d42906139f6565b6020805460009091556014546001600160a01b03166108fc6064610d8d846032613a58565b6000610eb5600d836124fc565b6000611fb7836001600160a01b0384166127e5565b9392505050565b6001600160a01b0383166120085760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610d42565b6001600160a01b0382166120505760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610d42565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120fc5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610d42565b6001600160a01b0382166121455760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610d42565b60006121526005856124fc565b8061216357506121636005846124fc565b905060006001600160a01b03851630148061218657506001600160a01b03841630145b601b54601a549192506001600160a01b0390811691600091888116600160301b909204161480156121c85750816001600160a01b0316866001600160a01b0316145b806122035750601a546001600160a01b03878116600160301b909204161480156122035750816001600160a01b0316876001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b90920416148061223d5750826001600160a01b0316886001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b9092041614806122775750836001600160a01b0316886001600160a01b0316145b905084806122825750825b8061228a5750855b1561229f5761229a898989612834565b612303565b602b54610100900460ff166122f65760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610d42565b61230389898985856128ff565b505050505050505050565b6025805460ff191660019081179091553060009081526020919091526040812054601a5490919061235490600160281b810460ff90811691640100000000900416613bd8565b60ff1690506000602654905080831080612370575061ffff8216155b1561237d57505050612442565b601a5460009061ffff84169061239e90640100000000900460ff1684613a58565b6123a89190613a77565b905060006123b68284613a41565b905060006123c5600284613a77565b905060006123d38285613a41565b905060006123e18483613bc0565b9050476123ed82613097565b60006123f98247613a41565b90506000836124088684613a58565b6124129190613a77565b905061241e86826131f0565b600061242a8447613a41565b9050612435816132b8565b5050505050505050505050505b6025805460ff19169055565b6001600160a01b038116600090815260016020526040812054601c54829161247591613a58565b6001600160a01b0384166000908152602160205260409020549091508110156124a15750600092915050565b6001600160a01b038316600090815260216020526040902054600160401b906124ca9083613a41565b611fb79190613a77565b6000611fb7836001600160a01b038416613384565b602c5481116124f757600080fd5b602c55565b6001600160a01b03811660009081526001830160205260408120541515611fb7565b601b54600160a01b900460ff161561253557600080fd5b601b805460ff60a01b1916600160a01b1790556000612553826114b7565b1561257b57506001600160a01b038116600090815260226020526040812080549190556125fb565b60006125868361244e565b6001600160a01b038416600090815260016020526040902054601c549192506125ae91613a58565b6001600160a01b0384166000908152602160209081526040808320939093556022905220546125de908290613bc0565b6001600160a01b0384166000908152602260205260408120559150505b80600003612614575050601b805460ff60a01b19169055565b80601e60008282546126269190613bc0565b90915550506040805160028082526060820183526000926020830190803683375050601b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b99190613d52565b816000815181106126cc576126cc613d6f565b6001600160a01b0392831660209182029290920101526023548251911690829060019081106126fd576126fd613d6f565b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590849061274390600090869089904290600401613dc9565b6000604051808303818588803b15801561275c57600080fd5b505af1158015612770573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506127b59050565b60405180910390a15050601b805460ff60a01b1916905550565b6000610eb5825490565b6000611fb78383613471565b600081815260018301602052604081205461282c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eb5565b506000610eb5565b6001600160a01b038316600090815260016020526040902054818110156128985760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d42565b6128a284836134f7565b6128ac83836135b8565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128f191815260200190565b60405180910390a350505050565b6001600160a01b038085166000908152600160205260408082205492881682529020548481101561296d5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d42565b60008315612b20576129806007896124fc565b612a15576001600160a01b038816600090815260036020526040902054421015806129ad575060275460ff165b6129ee5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610d42565b6028546129fb9042613bc0565b6001600160a01b0389166000908152600360205260409020555b601854861115612a595760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610d42565b612a64600d896124fc565b15612aa85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d42565b601254601154612ab89190613bc0565b4211158015612ac957506013546001145b15612b0f57612ad9600d89611fa2565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a54610100900460ff16612f34565b8415612d3157612b316009886124fc565b612bc4576001600160a01b03871660009081526004602052604090205442101580612b5e575060295460ff165b612b9d5760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610d42565b602a54612baa9042613bc0565b6001600160a01b0388166000908152600460205260409020555b601754612bd18785613bc0565b1115612c125760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d42565b601954861115612c6f5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610d42565b612c7a600d886124fc565b15612cbe5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d42565b601254601154612cce9190613bc0565b4211158015612cdf57506013546001145b15612d2557612cef600d88611fa2565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5460ff16612f34565b612d3d6009600a613bb1565b8611612d4c57612d4c8861251e565b601754612d598785613bc0565b1115612d9a5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d42565b612da56007896124fc565b612e0f576001600160a01b03881660009081526003602052604090205442101580612dd2575060275460ff165b612e0f5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610d42565b612e1a600d896124fc565b15612e675760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610d42565b612e72600d886124fc565b15612ebf5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610d42565b601254601154612ecf9190613bc0565b4211158015612ee057506013546001145b15612f2657612ef0600d89611fa2565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5462010000900460ff165b601a546001600160a01b03898116600160301b9092041614801590612f5c5750602b5460ff16155b8015612f6b575060255460ff16155b8015612f745750835b15612f8157612f8161230e565b6000612f9d8783601a60039054906101000a900460ff16613683565b601a54909150600090612fd19089908590612fcc9060ff6401000000008204811691600160281b900416613bd8565b613683565b90506000612fdf8284613bc0565b612fe9908a613a41565b9050612ff58b8a6134f7565b3060009081526001602052604081208054849290613014908490613bc0565b92505081905550826016600082825461302d9190613a41565b9091555061303d90508a826135b8565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308291815260200190565b60405180910390a35050505050505050505050565b601b546130af9030906001600160a01b031683611fbe565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106130e4576130e4613d6f565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561313d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131619190613d52565b8160018151811061317457613174613d6f565b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b815291169063791ac947906131ba908590600090869030904290600401613dfe565b600060405180830381600087803b1580156131d457600080fd5b505af11580156131e8573d6000803e3d6000fd5b505050505050565b80602460008282546132029190613bc0565b9091555050601b5461321f9030906001600160a01b031684611fbe565b601b5460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561328c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132b19190613e3a565b5050505050565b601f546000906064906132ce9060ff1684613a58565b6132d89190613a77565b905060006132e68284613a41565b905081602060008282546132fa9190613bc0565b90915550508015611a105780601d60008282546133179190613bc0565b9091555060009050613327611bcc565b90508060000361334e5781602060008282546133439190613bc0565b9091555061337e9050565b8061335d600160401b84613a58565b6133679190613a77565b601c60008282546133789190613bc0565b90915550505b50505050565b600081815260018301602052604081205480156134675760006133a8600183613a41565b85549091506000906133bc90600190613a41565b905060008660000182815481106133d5576133d5613d6f565b90600052602060002001549050808760000184815481106133f8576133f8613d6f565b60009182526020808320909101929092558281526001890190915260409020849055865487908061342b5761342b613e68565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610eb5565b6000915050610eb5565b815460009082106134cf5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d42565b8260000182815481106134e4576134e4613d6f565b9060005260206000200154905092915050565b6001600160a01b03821660009081526001602052604081205461351b908390613a41565b9050613526836114b7565b1561354b576001600160a01b0390921660009081526001602052604090209190915550565b60006135568461244e565b6001600160a01b0385166000908152600160205260409020839055601c54909150613582908390613a58565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290613378908490613bc0565b6001600160a01b0382166000908152600160205260408120546135dc908390613bc0565b90506135e7836114b7565b1561360c576001600160a01b0390921660009081526001602052604090209190915550565b60006136178461244e565b905081601c546136279190613a58565b6001600160a01b03851660009081526021602090815260408083209390935560229052908120805483929061365d908490613bc0565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff168661369b9190613a58565b6136a59190613a58565b6136af9190613a77565b949350505050565b6000602082840312156136c957600080fd5b5035919050565b600060208083528351808285015260005b818110156136fd578581018301518582016040015282016136e1565b8181111561370f576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461135457600080fd5b6000806040838503121561374d57600080fd5b823561375881613725565b946020939093013593505050565b801515811461135457600080fd5b60006020828403121561378657600080fd5b8135611fb781613766565b6000806000606084860312156137a657600080fd5b83356137b181613725565b925060208401356137c181613725565b929592945050506040919091013590565b6000602082840312156137e457600080fd5b8135611fb781613725565b803560ff8116811461380057600080fd5b919050565b60008060008060008060c0878903121561381e57600080fd5b613827876137ef565b9550613835602088016137ef565b9450613843604088016137ef565b9350613851606088016137ef565b925061385f608088016137ef565b915061386d60a088016137ef565b90509295509295509295565b60006020828403121561388b57600080fd5b611fb7826137ef565b600080604083850312156138a757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126138dd57600080fd5b813567ffffffffffffffff808211156138f8576138f86138b6565b604051601f8301601f19908116603f01168101908282118183101715613920576139206138b6565b8160405283815286602085880101111561393957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561396c57600080fd5b823567ffffffffffffffff8082111561398457600080fd5b613990868387016138cc565b935060208501359150808211156139a657600080fd5b506139b3858286016138cc565b9150509250929050565b600080604083850312156139d057600080fd5b82356139db81613725565b915060208301356139eb81613725565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613a5357613a53613a2b565b500390565b6000816000190483118215151615613a7257613a72613a2b565b500290565b600082613a9457634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613aad57607f821691505b602082108103611c2c57634e487b7160e01b600052602260045260246000fd5b600181815b80851115613b08578160001904821115613aee57613aee613a2b565b80851615613afb57918102915b93841c9390800290613ad2565b509250929050565b600082613b1f57506001610eb5565b81613b2c57506000610eb5565b8160018114613b425760028114613b4c57613b68565b6001915050610eb5565b60ff841115613b5d57613b5d613a2b565b50506001821b610eb5565b5060208310610133831016604e8410600b8410161715613b8b575081810a610eb5565b613b958383613acd565b8060001904821115613ba957613ba9613a2b565b029392505050565b6000611fb760ff841683613b10565b60008219821115613bd357613bd3613a2b565b500190565b600060ff821660ff84168060ff03821115613bf557613bf5613a2b565b019392505050565b601f821115611a1057600081815260208120601f850160051c81016020861015613c245750805b601f850160051c820191505b818110156131e857828155600101613c30565b815167ffffffffffffffff811115613c5d57613c5d6138b6565b613c7181613c6b8454613a99565b84613bfd565b602080601f831160018114613ca65760008415613c8e5750858301515b600019600386901b1c1916600185901b1785556131e8565b600085815260208120601f198616915b82811015613cd557888601518255948401946001909101908401613cb6565b5085821015613cf35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613d1557613d15613a2b565b5060010190565b600060208284031215613d2e57600080fd5b5051919050565b600060208284031215613d4757600080fd5b8151611fb781613766565b600060208284031215613d6457600080fd5b8151611fb781613725565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613dbe5781516001600160a01b031687529582019590820190600101613d99565b509495945050505050565b848152608060208201526000613de26080830186613d85565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000613e1d60a0830186613d85565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613e4f57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205276944abf15f164f4e3eb4f9c69f2c8624c11d138df7818184040be120d4bbb64736f6c634300080f0033

Deployed Bytecode

0x60806040526004361061041b5760003560e01c8063762bb2821161021c578063c3f4f54f11610122578063e68f136a116100b0578063f2c816ae11610077578063f2c816ae14610c7e578063f2fde38b14610c9e578063f88b0e4614610cbe578063fe002ec214610cd4578063fe575a8714610ce957005b8063e68f136a14610bfe578063e69e03ee14610c1e578063ef12a33014610c33578063f00df36514610c48578063f0cc761214610c5e57005b8063d28d8852116100f4578063d28d885214610b43578063d51f383b14610b58578063db886f2314610b78578063dd62ed3e14610b98578063e2fd002a14610bde57005b8063c3f4f54f14610ace578063cd979a7e14610ae3578063d0291d6614610b03578063d11edf7414610b2357005b80639bf65770116101aa578063b58a56cd11610171578063b58a56cd14610a44578063b766a38614610a64578063c054f2f414610a84578063c280895414610aa4578063c3a3c03214610ab957005b80639bf65770146109af5780639fa62d5f146109cf578063a457c2d7146109ef578063a9059cbb14610a0f578063b09f126614610a2f57005b8063887c60fb116101ee578063887c60fb14610910578063893d20e81461092a5780638da5cb5b1461095c57806394e8075d1461097a57806395d89b411461099a57005b8063762bb282146108b55780637b9e987a146108cb5780638650e92a146108e057806386d0ada8146108f657005b80633cc39b7a116103215780635b80f625116102af5780636f89e409116102765780636f89e4091461080057806370a082311461082a578063715018a6146108605780637335307b1461087557806373ddf08e1461089557005b80635b80f625146107965780635c69f6901461065e5780635ebbc3ca146107ab578063643daaea146107c05780636ea4caab146107e057005b80634ada218b116102f35780634ada218b1461070b5780634cdaf0ae1461072a5780634f91e48c1461074a57806357ad67d11461076057806358e553651461078057005b80633cc39b7a146106b35780633da56f18146106c95780634089b170146106df57806344f3c83a146106f557005b8063243b529a116103a9578063313ce56711610370578063313ce5671461062a57806332ac487f1461063e5780633478154b1461065e57806335e82f3a14610673578063395093511461069357005b8063243b529a14610567578063269a6aae1461057c5780632973ef2d146105925780633054f8a3146105fb578063311a86971461061557005b80630fd99e16116103ed5780630fd99e16146104cb57806314e91377146104f357806318160ddd146105135780631eb25d131461053257806323b872dd1461054757005b80630241047b1461042457806306fdde031461044457806309218ee71461046f578063095ea7b31461049b57005b3661042257005b005b34801561043057600080fd5b5061042261043f3660046136b7565b610d09565b34801561045057600080fd5b50610459610e12565b60405161046691906136d0565b60405180910390f35b34801561047b57600080fd5b50601f546104899060ff1681565b60405160ff9091168152602001610466565b3480156104a757600080fd5b506104bb6104b636600461373a565b610ea4565b6040519015158152602001610466565b3480156104d757600080fd5b506104e0603281565b60405161ffff9091168152602001610466565b3480156104ff57600080fd5b5061042261050e366004613774565b610ebb565b34801561051f57600080fd5b506016545b604051908152602001610466565b34801561053e57600080fd5b50610524610f07565b34801561055357600080fd5b506104bb610562366004613791565b610f24565b34801561057357600080fd5b50610422610fbb565b34801561058857600080fd5b5061052460125481565b34801561059e57600080fd5b50601a546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610466565b34801561060757600080fd5b506029546104bb9060ff1681565b34801561062157600080fd5b50610489603281565b34801561063657600080fd5b506009610489565b34801561064a57600080fd5b506105246106593660046137d2565b610ffe565b34801561066a57600080fd5b506104e0600081565b34801561067f57600080fd5b5061042261068e3660046137d2565b611056565b34801561069f57600080fd5b506104bb6106ae36600461373a565b61109a565b3480156106bf57600080fd5b5061052460245481565b3480156106d557600080fd5b5061052460135481565b3480156106eb57600080fd5b50610524601e5481565b34801561070157600080fd5b50610524602a5481565b34801561071757600080fd5b50602b546104bb90610100900460ff1681565b34801561073657600080fd5b506104226107453660046137d2565b6110d1565b34801561075657600080fd5b5061052460185481565b34801561076c57600080fd5b5061042261077b366004613805565b611134565b34801561078c57600080fd5b5061052460205481565b3480156107a257600080fd5b50602654610524565b3480156107b757600080fd5b50610422611267565b3480156107cc57600080fd5b506104226107db3660046136b7565b611357565b3480156107ec57600080fd5b506104226107fb3660046136b7565b6113a2565b34801561080c57600080fd5b506108156113f7565b60408051928352602083019190915201610466565b34801561083657600080fd5b506105246108453660046137d2565b6001600160a01b031660009081526001602052604090205490565b34801561086c57600080fd5b50610422611434565b34801561088157600080fd5b506104bb6108903660046137d2565b6114b7565b3480156108a157600080fd5b506104226108b0366004613879565b6114c4565b3480156108c157600080fd5b5061052460175481565b3480156108d757600080fd5b50610422611524565b3480156108ec57600080fd5b50610524601c5481565b34801561090257600080fd5b50602b546104bb9060ff1681565b34801561091c57600080fd5b506027546104bb9060ff1681565b34801561093657600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610466565b34801561096857600080fd5b506000546001600160a01b0316610944565b34801561098657600080fd5b50601454610944906001600160a01b031681565b3480156109a657600080fd5b50610459611577565b3480156109bb57600080fd5b506104226109ca366004613774565b611586565b3480156109db57600080fd5b506104226109ea366004613894565b6115d2565b3480156109fb57600080fd5b506104bb610a0a36600461373a565b611754565b348015610a1b57600080fd5b506104bb610a2a36600461373a565b6117d0565b348015610a3b57600080fd5b506104596117dd565b348015610a5057600080fd5b50610422610a5f3660046137d2565b61186b565b348015610a7057600080fd5b50610422610a7f366004613774565b6118c6565b348015610a9057600080fd5b50602354610944906001600160a01b031681565b348015610ab057600080fd5b50610422611912565b348015610ac557600080fd5b5061052461191b565b348015610ada57600080fd5b5061052461193b565b348015610aef57600080fd5b50610422610afe3660046137d2565b61197a565b348015610b0f57600080fd5b50610422610b1e366004613959565b6119be565b348015610b2f57600080fd5b50610422610b3e3660046136b7565b611a15565b348015610b4f57600080fd5b50610459611a53565b348015610b6457600080fd5b50610422610b733660046136b7565b611a60565b348015610b8457600080fd5b50601554610944906001600160a01b031681565b348015610ba457600080fd5b50610524610bb33660046139bd565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610bea57600080fd5b50610422610bf93660046136b7565b611aec565b348015610c0a57600080fd5b50610422610c193660046137d2565b611b71565b348015610c2a57600080fd5b50610524611bcc565b348015610c3f57600080fd5b50610422611c32565b348015610c5457600080fd5b50610524601d5481565b348015610c6a57600080fd5b50610422610c793660046137d2565b611d9f565b348015610c8a57600080fd5b50610422610c993660046137d2565b611dfa565b348015610caa57600080fd5b50610422610cb93660046137d2565b611e3e565b348015610cca57600080fd5b5061052460285481565b348015610ce057600080fd5b50610422611f37565b348015610cf557600080fd5b506104bb610d043660046137d2565b611f95565b33610d1c6000546001600160a01b031690565b6001600160a01b031614610d4b5760405162461bcd60e51b8152600401610d42906139f6565b60405180910390fd5b602054811115610d5a57600080fd5b8060206000828254610d6c9190613a41565b90915550506014546001600160a01b03166108fc6064610d8d846032613a58565b610d979190613a77565b6040518115909202916000818181858888f19350505050158015610dbf573d6000803e3d6000fd5b506015546001600160a01b03166108fc6064610ddc846032613a58565b610de69190613a77565b6040518115909202916000818181858888f19350505050158015610e0e573d6000803e3d6000fd5b5050565b6060600f8054610e2190613a99565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4d90613a99565b8015610e9a5780601f10610e6f57610100808354040283529160200191610e9a565b820191906000526020600020905b815481529060010190602001808311610e7d57829003601f168201915b5050505050905090565b6000610eb1338484611fbe565b5060015b92915050565b33610ece6000546001600160a01b031690565b6001600160a01b031614610ef45760405162461bcd60e51b8152600401610d42906139f6565b6027805460ff1916911515919091179055565b610f136009600a613bb1565b610f21906305f5e100613a58565b81565b6000610f318484846120b1565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f9c5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610d42565b610fb08533610fab8685613a41565b611fbe565b506001949350505050565b33610fce6000546001600160a01b031690565b6001600160a01b031614610ff45760405162461bcd60e51b8152600401610d42906139f6565b610ffc61230e565b565b6000611009826114b7565b1561102a57506001600160a01b031660009081526022602052604090205490565b6001600160a01b03821660009081526022602052604090205461104c8361244e565b610eb59190613bc0565b336110696000546001600160a01b031690565b6001600160a01b03161461108f5760405162461bcd60e51b8152600401610d42906139f6565b610e0e600d826124d4565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610eb1918590610fab908690613bc0565b336110e46000546001600160a01b031690565b6001600160a01b03161461110a5760405162461bcd60e51b8152600401610d42906139f6565b602b80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111476000546001600160a01b031690565b6001600160a01b03161461116d5760405162461bcd60e51b8152600401610d42906139f6565b60008461117a8789613bd8565b6111849190613bd8565b90508060ff166064146111e85760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610d42565b50601a805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b3361127a6000546001600160a01b031690565b6001600160a01b0316146112a05760405162461bcd60e51b8152600401610d42906139f6565b602c544210156112e55760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610d42565b6112f161070842613bc0565b602c556014546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611341576040519150601f19603f3d011682016040523d82523d6000602084013e611346565b606091505b505090508061135457600080fd5b50565b3361136a6000546001600160a01b031690565b6001600160a01b0316146113905760405162461bcd60e51b8152600401610d42906139f6565b61135461139d4283613bc0565b6124e9565b336113b56000546001600160a01b031690565b6001600160a01b0316146113db5760405162461bcd60e51b8152600401610d42906139f6565b6113e76009600a613bb1565b6113f19082613a58565b60195550565b6000806114066009600a613bb1565b6017546114139190613a77565b61141f6009600a613bb1565b60185461142c9190613a77565b915091509091565b336114476000546001600160a01b031690565b6001600160a01b03161461146d5760405162461bcd60e51b8152600401610d42906139f6565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610eb5600b836124fc565b336114d76000546001600160a01b031690565b6001600160a01b0316146114fd5760405162461bcd60e51b8152600401610d42906139f6565b60648160ff16111561150e57600080fd5b601f805460ff191660ff92909216919091179055565b336115376000546001600160a01b031690565b6001600160a01b03161461155d5760405162461bcd60e51b8152600401610d42906139f6565b602b805461ff00191661010017905542601155565b905090565b606060108054610e2190613a99565b336115996000546001600160a01b031690565b6001600160a01b0316146115bf5760405162461bcd60e51b8152600401610d42906139f6565b602b805460ff1916911515919091179055565b336115e56000546001600160a01b031690565b6001600160a01b03161461160b5760405162461bcd60e51b8152600401610d42906139f6565b606460165461161a9190613a77565b811061162557600080fd5b6116316009600a613bb1565b61163b9083613a58565b91506116496009600a613bb1565b6116539082613a58565b90506000603260ff166016546116699190613a77565b90506000603261ffff166016546116809190613a77565b9050818410156116e65760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610d42565b808310156117475760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610d42565b5050601791909155601855565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156117b75760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610d42565b6117c63385610fab8685613a41565b5060019392505050565b6000610eb13384846120b1565b601080546117ea90613a99565b80601f016020809104026020016040519081016040528092919081815260200182805461181690613a99565b80156118635780601f1061183857610100808354040283529160200191611863565b820191906000526020600020905b81548152906001019060200180831161184657829003601f168201915b505050505081565b3361187e6000546001600160a01b031690565b6001600160a01b0316146118a45760405162461bcd60e51b8152600401610d42906139f6565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b336118d96000546001600160a01b031690565b6001600160a01b0316146118ff5760405162461bcd60e51b8152600401610d42906139f6565b6029805460ff1916911515919091179055565b610ffc3361251e565b6000602c544210156119355742602c546115729190613a41565b50600090565b60006119496009600a613bb1565b6016546119586009600a613bb1565b611966906305f5e100613a58565b6119709190613a41565b6115729190613a77565b3361198d6000546001600160a01b031690565b6001600160a01b0316146119b35760405162461bcd60e51b8152600401610d42906139f6565b610e0e600582611fa2565b336119d16000546001600160a01b031690565b6001600160a01b0316146119f75760405162461bcd60e51b8152600401610d42906139f6565b600f611a038382613c43565b506010611a108282613c43565b505050565b33611a286000546001600160a01b031690565b6001600160a01b031614611a4e5760405162461bcd60e51b8152600401610d42906139f6565b602655565b600f80546117ea90613a99565b33611a736000546001600160a01b031690565b6001600160a01b031614611a995760405162461bcd60e51b8152600401610d42906139f6565b8015611ae75760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610d42565b602855565b33611aff6000546001600160a01b031690565b6001600160a01b031614611b255760405162461bcd60e51b8152600401610d42906139f6565b8015611b6c5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610d42565b602a55565b33611b846000546001600160a01b031690565b6001600160a01b031614611baa5760405162461bcd60e51b8152600401610d42906139f6565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b601654600090815b611bde600b6127cf565b811015611c2c5760016000611bf4600b846127d9565b6001600160a01b03168152602081019190915260400160002054611c189083613a41565b915080611c2481613d03565b915050611bd4565b50919050565b33611c456000546001600160a01b031690565b6001600160a01b031614611c6b5760405162461bcd60e51b8152600401610d42906139f6565b602c54421015611cb05760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610d42565b602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d269190613d1c565b60145460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015611d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a109190613d35565b33611db26000546001600160a01b031690565b6001600160a01b031614611dd85760405162461bcd60e51b8152600401610d42906139f6565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b33611e0d6000546001600160a01b031690565b6001600160a01b031614611e335760405162461bcd60e51b8152600401610d42906139f6565b610e0e600d82611fa2565b33611e516000546001600160a01b031690565b6001600160a01b031614611e775760405162461bcd60e51b8152600401610d42906139f6565b6001600160a01b038116611edc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d42565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b33611f4a6000546001600160a01b031690565b6001600160a01b031614611f705760405162461bcd60e51b8152600401610d42906139f6565b6020805460009091556014546001600160a01b03166108fc6064610d8d846032613a58565b6000610eb5600d836124fc565b6000611fb7836001600160a01b0384166127e5565b9392505050565b6001600160a01b0383166120085760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610d42565b6001600160a01b0382166120505760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610d42565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120fc5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610d42565b6001600160a01b0382166121455760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610d42565b60006121526005856124fc565b8061216357506121636005846124fc565b905060006001600160a01b03851630148061218657506001600160a01b03841630145b601b54601a549192506001600160a01b0390811691600091888116600160301b909204161480156121c85750816001600160a01b0316866001600160a01b0316145b806122035750601a546001600160a01b03878116600160301b909204161480156122035750816001600160a01b0316876001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b90920416148061223d5750826001600160a01b0316886001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b9092041614806122775750836001600160a01b0316886001600160a01b0316145b905084806122825750825b8061228a5750855b1561229f5761229a898989612834565b612303565b602b54610100900460ff166122f65760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610d42565b61230389898985856128ff565b505050505050505050565b6025805460ff191660019081179091553060009081526020919091526040812054601a5490919061235490600160281b810460ff90811691640100000000900416613bd8565b60ff1690506000602654905080831080612370575061ffff8216155b1561237d57505050612442565b601a5460009061ffff84169061239e90640100000000900460ff1684613a58565b6123a89190613a77565b905060006123b68284613a41565b905060006123c5600284613a77565b905060006123d38285613a41565b905060006123e18483613bc0565b9050476123ed82613097565b60006123f98247613a41565b90506000836124088684613a58565b6124129190613a77565b905061241e86826131f0565b600061242a8447613a41565b9050612435816132b8565b5050505050505050505050505b6025805460ff19169055565b6001600160a01b038116600090815260016020526040812054601c54829161247591613a58565b6001600160a01b0384166000908152602160205260409020549091508110156124a15750600092915050565b6001600160a01b038316600090815260216020526040902054600160401b906124ca9083613a41565b611fb79190613a77565b6000611fb7836001600160a01b038416613384565b602c5481116124f757600080fd5b602c55565b6001600160a01b03811660009081526001830160205260408120541515611fb7565b601b54600160a01b900460ff161561253557600080fd5b601b805460ff60a01b1916600160a01b1790556000612553826114b7565b1561257b57506001600160a01b038116600090815260226020526040812080549190556125fb565b60006125868361244e565b6001600160a01b038416600090815260016020526040902054601c549192506125ae91613a58565b6001600160a01b0384166000908152602160209081526040808320939093556022905220546125de908290613bc0565b6001600160a01b0384166000908152602260205260408120559150505b80600003612614575050601b805460ff60a01b19169055565b80601e60008282546126269190613bc0565b90915550506040805160028082526060820183526000926020830190803683375050601b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b99190613d52565b816000815181106126cc576126cc613d6f565b6001600160a01b0392831660209182029290920101526023548251911690829060019081106126fd576126fd613d6f565b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590849061274390600090869089904290600401613dc9565b6000604051808303818588803b15801561275c57600080fd5b505af1158015612770573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506127b59050565b60405180910390a15050601b805460ff60a01b1916905550565b6000610eb5825490565b6000611fb78383613471565b600081815260018301602052604081205461282c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eb5565b506000610eb5565b6001600160a01b038316600090815260016020526040902054818110156128985760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d42565b6128a284836134f7565b6128ac83836135b8565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128f191815260200190565b60405180910390a350505050565b6001600160a01b038085166000908152600160205260408082205492881682529020548481101561296d5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d42565b60008315612b20576129806007896124fc565b612a15576001600160a01b038816600090815260036020526040902054421015806129ad575060275460ff165b6129ee5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610d42565b6028546129fb9042613bc0565b6001600160a01b0389166000908152600360205260409020555b601854861115612a595760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610d42565b612a64600d896124fc565b15612aa85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d42565b601254601154612ab89190613bc0565b4211158015612ac957506013546001145b15612b0f57612ad9600d89611fa2565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a54610100900460ff16612f34565b8415612d3157612b316009886124fc565b612bc4576001600160a01b03871660009081526004602052604090205442101580612b5e575060295460ff165b612b9d5760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610d42565b602a54612baa9042613bc0565b6001600160a01b0388166000908152600460205260409020555b601754612bd18785613bc0565b1115612c125760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d42565b601954861115612c6f5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610d42565b612c7a600d886124fc565b15612cbe5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d42565b601254601154612cce9190613bc0565b4211158015612cdf57506013546001145b15612d2557612cef600d88611fa2565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5460ff16612f34565b612d3d6009600a613bb1565b8611612d4c57612d4c8861251e565b601754612d598785613bc0565b1115612d9a5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d42565b612da56007896124fc565b612e0f576001600160a01b03881660009081526003602052604090205442101580612dd2575060275460ff165b612e0f5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610d42565b612e1a600d896124fc565b15612e675760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610d42565b612e72600d886124fc565b15612ebf5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610d42565b601254601154612ecf9190613bc0565b4211158015612ee057506013546001145b15612f2657612ef0600d89611fa2565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5462010000900460ff165b601a546001600160a01b03898116600160301b9092041614801590612f5c5750602b5460ff16155b8015612f6b575060255460ff16155b8015612f745750835b15612f8157612f8161230e565b6000612f9d8783601a60039054906101000a900460ff16613683565b601a54909150600090612fd19089908590612fcc9060ff6401000000008204811691600160281b900416613bd8565b613683565b90506000612fdf8284613bc0565b612fe9908a613a41565b9050612ff58b8a6134f7565b3060009081526001602052604081208054849290613014908490613bc0565b92505081905550826016600082825461302d9190613a41565b9091555061303d90508a826135b8565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308291815260200190565b60405180910390a35050505050505050505050565b601b546130af9030906001600160a01b031683611fbe565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106130e4576130e4613d6f565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561313d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131619190613d52565b8160018151811061317457613174613d6f565b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b815291169063791ac947906131ba908590600090869030904290600401613dfe565b600060405180830381600087803b1580156131d457600080fd5b505af11580156131e8573d6000803e3d6000fd5b505050505050565b80602460008282546132029190613bc0565b9091555050601b5461321f9030906001600160a01b031684611fbe565b601b5460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561328c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132b19190613e3a565b5050505050565b601f546000906064906132ce9060ff1684613a58565b6132d89190613a77565b905060006132e68284613a41565b905081602060008282546132fa9190613bc0565b90915550508015611a105780601d60008282546133179190613bc0565b9091555060009050613327611bcc565b90508060000361334e5781602060008282546133439190613bc0565b9091555061337e9050565b8061335d600160401b84613a58565b6133679190613a77565b601c60008282546133789190613bc0565b90915550505b50505050565b600081815260018301602052604081205480156134675760006133a8600183613a41565b85549091506000906133bc90600190613a41565b905060008660000182815481106133d5576133d5613d6f565b90600052602060002001549050808760000184815481106133f8576133f8613d6f565b60009182526020808320909101929092558281526001890190915260409020849055865487908061342b5761342b613e68565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610eb5565b6000915050610eb5565b815460009082106134cf5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d42565b8260000182815481106134e4576134e4613d6f565b9060005260206000200154905092915050565b6001600160a01b03821660009081526001602052604081205461351b908390613a41565b9050613526836114b7565b1561354b576001600160a01b0390921660009081526001602052604090209190915550565b60006135568461244e565b6001600160a01b0385166000908152600160205260409020839055601c54909150613582908390613a58565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290613378908490613bc0565b6001600160a01b0382166000908152600160205260408120546135dc908390613bc0565b90506135e7836114b7565b1561360c576001600160a01b0390921660009081526001602052604090209190915550565b60006136178461244e565b905081601c546136279190613a58565b6001600160a01b03851660009081526021602090815260408083209390935560229052908120805483929061365d908490613bc0565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff168661369b9190613a58565b6136a59190613a58565b6136af9190613a77565b949350505050565b6000602082840312156136c957600080fd5b5035919050565b600060208083528351808285015260005b818110156136fd578581018301518582016040015282016136e1565b8181111561370f576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461135457600080fd5b6000806040838503121561374d57600080fd5b823561375881613725565b946020939093013593505050565b801515811461135457600080fd5b60006020828403121561378657600080fd5b8135611fb781613766565b6000806000606084860312156137a657600080fd5b83356137b181613725565b925060208401356137c181613725565b929592945050506040919091013590565b6000602082840312156137e457600080fd5b8135611fb781613725565b803560ff8116811461380057600080fd5b919050565b60008060008060008060c0878903121561381e57600080fd5b613827876137ef565b9550613835602088016137ef565b9450613843604088016137ef565b9350613851606088016137ef565b925061385f608088016137ef565b915061386d60a088016137ef565b90509295509295509295565b60006020828403121561388b57600080fd5b611fb7826137ef565b600080604083850312156138a757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126138dd57600080fd5b813567ffffffffffffffff808211156138f8576138f86138b6565b604051601f8301601f19908116603f01168101908282118183101715613920576139206138b6565b8160405283815286602085880101111561393957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561396c57600080fd5b823567ffffffffffffffff8082111561398457600080fd5b613990868387016138cc565b935060208501359150808211156139a657600080fd5b506139b3858286016138cc565b9150509250929050565b600080604083850312156139d057600080fd5b82356139db81613725565b915060208301356139eb81613725565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613a5357613a53613a2b565b500390565b6000816000190483118215151615613a7257613a72613a2b565b500290565b600082613a9457634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613aad57607f821691505b602082108103611c2c57634e487b7160e01b600052602260045260246000fd5b600181815b80851115613b08578160001904821115613aee57613aee613a2b565b80851615613afb57918102915b93841c9390800290613ad2565b509250929050565b600082613b1f57506001610eb5565b81613b2c57506000610eb5565b8160018114613b425760028114613b4c57613b68565b6001915050610eb5565b60ff841115613b5d57613b5d613a2b565b50506001821b610eb5565b5060208310610133831016604e8410600b8410161715613b8b575081810a610eb5565b613b958383613acd565b8060001904821115613ba957613ba9613a2b565b029392505050565b6000611fb760ff841683613b10565b60008219821115613bd357613bd3613a2b565b500190565b600060ff821660ff84168060ff03821115613bf557613bf5613a2b565b019392505050565b601f821115611a1057600081815260208120601f850160051c81016020861015613c245750805b601f850160051c820191505b818110156131e857828155600101613c30565b815167ffffffffffffffff811115613c5d57613c5d6138b6565b613c7181613c6b8454613a99565b84613bfd565b602080601f831160018114613ca65760008415613c8e5750858301515b600019600386901b1c1916600185901b1785556131e8565b600085815260208120601f198616915b82811015613cd557888601518255948401946001909101908401613cb6565b5085821015613cf35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613d1557613d15613a2b565b5060010190565b600060208284031215613d2e57600080fd5b5051919050565b600060208284031215613d4757600080fd5b8151611fb781613766565b600060208284031215613d6457600080fd5b8151611fb781613725565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613dbe5781516001600160a01b031687529582019590820190600101613d99565b509495945050505050565b848152608060208201526000613de26080830186613d85565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000613e1d60a0830186613d85565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613e4f57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205276944abf15f164f4e3eb4f9c69f2c8624c11d138df7818184040be120d4bbb64736f6c634300080f0033

Deployed Bytecode Sourcemap

27843:37037:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53655:269;;;;;;;;;;-1:-1:-1;53655:269:0;;;;;:::i;:::-;;:::i;62538:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41252:31;;;;;;;;;;-1:-1:-1;41252:31:0;;;;;;;;;;;973:4:1;961:17;;;943:36;;931:2;916:18;41252:31:0;801:184:1;63419:161:0;;;;;;;;;;-1:-1:-1;63419:161:0;;;;;:::i;:::-;;:::i;:::-;;;1611:14:1;;1604:22;1586:41;;1574:2;1559:18;63419:161:0;1446:187:1;29382:42:0;;;;;;;;;;;;29422:2;29382:42;;;;;1812:6:1;1800:19;;;1782:38;;1770:2;1755:18;29382:42:0;1638:188:1;54868:104:0;;;;;;;;;;-1:-1:-1;54868:104:0;;;;;:::i;:::-;;:::i;62844:108::-;;;;;;;;;;-1:-1:-1;62926:18:0;;62844:108;;;2346:25:1;;;2334:2;2319:18;62844:108:0;2200:177:1;28695:64:0;;;;;;;;;;;;;:::i;63893:392::-;;;;;;;;;;-1:-1:-1;63893:392:0;;;;;:::i;:::-;;:::i;56925:81::-;;;;;;;;;;;;;:::i;28932:31::-;;;;;;;;;;;;;;;;50958:244;;;;;;;;;;-1:-1:-1;51129:8:0;;50958:244;;;51129:8;;;;;;3130:25:1;;51138:13:0;;;;;3186:2:1;3171:18;;3164:34;-1:-1:-1;;;51152:11:0;;;;3214:18:1;;;3207:34;;;;51164:7:0;;;3272:2:1;3257:18;;3250:34;51129:8:0;51172;;;;3315:3:1;3300:19;;3293:35;51181:12:0;;;;;3359:3:1;3344:19;;3337:35;3117:3;3102:19;50958:244:0;2843:535:1;53301:27:0;;;;;;;;;;-1:-1:-1;53301:27:0;;;;;;;;29268:44;;;;;;;;;;;;29310:2;29268:44;;62742:94;;;;;;;;;;-1:-1:-1;28687:1:0;62742:94;;52920:191;;;;;;;;;;-1:-1:-1;52920:191:0;;;;;:::i;:::-;;:::i;29567:49::-;;;;;;;;;;;;29607:9;29567:49;;58306:143;;;;;;;;;;-1:-1:-1;58306:143:0;;;;;:::i;:::-;;:::i;64320:205::-;;;;;;;;;;-1:-1:-1;64320:205:0;;;;;:::i;:::-;;:::i;47161:25::-;;;;;;;;;;;;;;;;29113:38;;;;;;;;;;;;;;;;41208:27;;;;;;;;;;;;;;;;53335:26;;;;;;;;;;;;;;;;58577;;;;;;;;;;-1:-1:-1;58577:26:0;;;;;;;;;;;58886:146;;;;;;;;;;-1:-1:-1;58886:146:0;;;;;:::i;:::-;;:::i;30502:46::-;;;;;;;;;;;;;;;;56146:492;;;;;;;;;;-1:-1:-1;56146:492:0;;;;;:::i;:::-;;:::i;41335:31::-;;;;;;;;;;;;;;;;51688:110;;;;;;;;;;-1:-1:-1;51771:19:0;;51688:110;;61699:311;;;;;;;;;;;;;:::i;59239:153::-;;;;;;;;;;-1:-1:-1;59239:153:0;;;;;:::i;:::-;;:::i;54131:110::-;;;;;;;;;;-1:-1:-1;54131:110:0;;;;;:::i;:::-;;:::i;50801:149::-;;;;;;;;;;;;;:::i;:::-;;;;4510:25:1;;;4566:2;4551:18;;4544:34;;;;4483:18;50801:149:0;4336:248:1;62960:121:0;;;;;;;;;;-1:-1:-1;62960:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;63055:18:0;63028:7;63055:18;;;:9;:18;;;;;;;62960:121;9704:140;;;;;;;;;;;;;:::i;41819:132::-;;;;;;;;;;-1:-1:-1;41819:132:0;;;;;:::i;:::-;;:::i;56715:142::-;;;;;;;;;;-1:-1:-1;56715:142:0;;;;;:::i;:::-;;:::i;30446:49::-;;;;;;;;;;;;;;;;58691:127;;;;;;;;;;;;;:::i;40994:29::-;;;;;;;;;;;;;;;;53368:28;;;;;;;;;;-1:-1:-1;53368:28:0;;;;;;;;53232;;;;;;;;;;-1:-1:-1;53232:28:0;;;;;;;;62436:94;;;;;;;;;;-1:-1:-1;62488:7:0;9128:6;-1:-1:-1;;;;;9128:6:0;62436:94;;;-1:-1:-1;;;;;4940:32:1;;;4922:51;;4910:2;4895:18;62436:94:0;4776:203:1;9063:79:0;;;;;;;;;;-1:-1:-1;9101:7:0;9128:6;-1:-1:-1;;;;;9128:6:0;9063:79;;29974:78;;;;;;;;;;-1:-1:-1;29974:78:0;;;;-1:-1:-1;;;;;29974:78:0;;;62640:96;;;;;;;;;;;;;:::i;54009:110::-;;;;;;;;;;-1:-1:-1;54009:110:0;;;;;:::i;:::-;;:::i;57115:895::-;;;;;;;;;;-1:-1:-1;57115:895:0;;;;;:::i;:::-;;:::i;64533:342::-;;;;;;;;;;-1:-1:-1;64533:342:0;;;;;:::i;:::-;;:::i;63089:167::-;;;;;;;;;;-1:-1:-1;63089:167:0;;;;;:::i;:::-;;:::i;28616:29::-;;;;;;;;;;;;;:::i;54384:115::-;;;;;;;;;;-1:-1:-1;54384:115:0;;;;;:::i;:::-;;:::i;55039:102::-;;;;;;;;;;-1:-1:-1;55039:102:0;;;;;:::i;:::-;;:::i;46901:74::-;;;;;;;;;;-1:-1:-1;46901:74:0;;;;-1:-1:-1;;;;;46901:74:0;;;52848:64;;;;;;;;;;;;;:::i;50436:220::-;;;;;;;;;;;;;:::i;50664:129::-;;;;;;;;;;;;;:::i;56004:112::-;;;;;;;;;;-1:-1:-1;56004:112:0;;;;;:::i;:::-;;:::i;54643:157::-;;;;;;;;;;-1:-1:-1;54643:157:0;;;;;:::i;:::-;;:::i;55811:125::-;;;;;;;;;;-1:-1:-1;55811:125:0;;;;;:::i;:::-;;:::i;28574:35::-;;;;;;;;;;;;;:::i;55214:202::-;;;;;;;;;;-1:-1:-1;55214:202:0;;;;;:::i;:::-;;:::i;30059:76::-;;;;;;;;;;-1:-1:-1;30059:76:0;;;;-1:-1:-1;;;;;30059:76:0;;;63264:147;;;;;;;;;;-1:-1:-1;63264:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;63375:19:0;;;63348:7;63375:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;63264:147;55492:195;;;;;;;;;;-1:-1:-1;55492:195:0;;;;;:::i;:::-;;:::i;54253:123::-;;;;;;;;;;-1:-1:-1;54253:123:0;;;;;:::i;:::-;;:::i;42192:411::-;;;;;;;;;;;;;:::i;59767:490::-;;;;;;;;;;;;;:::i;41105:33::-;;;;;;;;;;;;;;;;54507:128;;;;;;;;;;-1:-1:-1;54507:128:0;;;;;:::i;:::-;;:::i;58090:135::-;;;;;;;;;;-1:-1:-1;58090:135:0;;;;;:::i;:::-;;:::i;9999:236::-;;;;;;;;;;-1:-1:-1;9999:236:0;;;;;:::i;:::-;;:::i;53267:27::-;;;;;;;;;;;;;;;;53406:242;;;;;;;;;;;;;:::i;41998:118::-;;;;;;;;;;-1:-1:-1;41998:118:0;;;;;:::i;:::-;;:::i;53655:269::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;;;;;;;;;53748:16:::1;;53740:6;:24;;53732:33;;;::::0;::::1;;53794:6;53776:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53819:11:0::1;::::0;-1:-1:-1;;;;;53819:11:0::1;53811:48;53855:3;53842:9;:6:::0;53849:2:::1;53842:9;:::i;:::-;53841:17;;;;:::i;:::-;53811:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;53878:9:0::1;::::0;-1:-1:-1;;;;;53878:9:0::1;53870:46;53912:3;53899:9;:6:::0;53906:2:::1;53899:9;:::i;:::-;53898:17;;;;:::i;:::-;53870:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53655:269:::0;:::o;62538:96::-;62586:13;62620:5;62613:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62538:96;:::o;63419:161::-;63496:4;63513:37;63522:10;63534:7;63543:6;63513:8;:37::i;:::-;-1:-1:-1;63568:4:0;63419:161;;;;;:::o;54868:104::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;54939:16:::1;:25:::0;;-1:-1:-1;;54939:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54868:104::o;28695:64::-;28746:13;28687:1;28746:2;:13;:::i;:::-;28734:25;;:9;:25;:::i;:::-;28695:64;:::o;63893:392::-;63993:4;64010:36;64020:6;64028:9;64039:6;64010:9;:36::i;:::-;-1:-1:-1;;;;;64086:19:0;;64059:24;64086:19;;;:11;:19;;;;;;;;64106:10;64086:31;;;;;;;;64136:26;;;;64128:59;;;;-1:-1:-1;;;64128:59:0;;10022:2:1;64128:59:0;;;10004:21:1;10061:2;10041:18;;;10034:30;-1:-1:-1;;;10080:18:1;;;10073:50;10140:18;;64128:59:0;9820:344:1;64128:59:0;64200:55;64209:6;64217:10;64229:25;64248:6;64229:16;:25;:::i;:::-;64200:8;:55::i;:::-;-1:-1:-1;64273:4:0;;63893:392;-1:-1:-1;;;;63893:392:0:o;56925:81::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;56978:20:::1;:18;:20::i;:::-;56925:81::o:0;52920:191::-;52977:7;52999:27;53021:4;52999:21;:27::i;:::-;52996:53;;;-1:-1:-1;;;;;;53035:14:0;;;;;:8;:14;;;;;;;52920:191::o;52996:53::-;-1:-1:-1;;;;;53089:14:0;;;;;;:8;:14;;;;;;53067:21;53098:4;53067:15;:21::i;:::-;:36;;;;:::i;58306:143::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;58400:41:::1;:14;58422:18:::0;58400:21:::1;:41::i;64320:205::-:0;64428:10;64402:4;64449:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;64449:32:0;;;;;;;;;;64402:4;;64419:76;;64440:7;;64449:45;;64484:10;;64449:45;:::i;58886:146::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;58980:22:::1;:44:::0;;-1:-1:-1;;;;;58980:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;58980:44:0;;::::1;::::0;;;::::1;::::0;;58886:146::o;56146:492::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;56301:14:::1;56341:12:::0;56316:24:::1;56326:14:::0;56316:9;:24:::1;:::i;:::-;:37;;;;:::i;:::-;56301:52;;56372:8;:13;;56382:3;56372:13;56364:64;;;::::0;-1:-1:-1;;;56364:64:0;;10713:2:1;56364:64:0::1;::::0;::::1;10695:21:1::0;10752:2;10732:18;;;10725:30;10791:34;10771:18;;;10764:62;-1:-1:-1;;;10842:18:1;;;10835:36;10888:19;;56364:64:0::1;10511:402:1::0;56364:64:0::1;-1:-1:-1::0;56441:8:0::1;:18:::0;;::::1;56606:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;56579:16:0;;::::1;56441:18;56579:16;-1:-1:-1::0;;56509:24:0;;::::1;-1:-1:-1::0;;;56509:24:0::1;56579:16:::0;;;;-1:-1:-1;;56470:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;56441:18:0;;::::1;::::0;::::1;56470:28:::0;;;;-1:-1:-1;;56470:28:0;;;;;;;;;;::::1;56579:16:::0;;;;;;;;56554:14;::::1;56579:16:::0;;;;;;;::::1;56606:24;::::0;;;::::1;::::0;;56146:492::o;61699:311::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;61788:20:::1;;61769:15;:39;;61761:68;;;::::0;-1:-1:-1;;;61761:68:0;;11120:2:1;61761:68:0::1;::::0;::::1;11102:21:1::0;11159:2;11139:18;;;11132:30;-1:-1:-1;;;11178:18:1;;;11171:46;11234:18;;61761:68:0::1;10918:340:1::0;61761:68:0::1;61861:40;29945:4;61861:15;:40;:::i;:::-;61840:20;:61:::0;61926:11:::1;::::0;:52:::1;::::0;61913:9:::1;::::0;-1:-1:-1;;;;;61926:11:0::1;::::0;61951:21:::1;::::0;61913:9;61926:52;61913:9;61926:52;61951:21;61926:11;:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61912:66;;;61997:4;61989:13;;;::::0;::::1;;61750:260;61699:311::o:0;59239:153::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;59327:57:::1;59349:34;59368:15;59349:18:::0;:34:::1;:::i;:::-;59327:21;:57::i;54131:110::-:0;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;54220:13:::1;28687:1;54220:2;:13;:::i;:::-;54208:25;::::0;:9;:25:::1;:::i;:::-;54201:6;:32:::0;-1:-1:-1;54131:110:0:o;50801:149::-;50842:15;;50903:13;28687:1;50903:2;:13;:::i;:::-;50890:12;;:26;;;;:::i;:::-;50928:13;28687:1;50928:2;:13;:::i;:::-;50918:9;;:23;;;;:::i;:::-;50883:59;;;;50801:149;;:::o;9704:140::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;9803:1:::1;9787:6:::0;;9766:40:::1;::::0;-1:-1:-1;;;;;9787:6:0;;::::1;::::0;9766:40:::1;::::0;9803:1;;9766:40:::1;9834:1;9817:19:::0;;-1:-1:-1;;;;;;9817:19:0::1;::::0;;9704:140::o;41819:132::-;41885:4;41908:35;:20;41938:4;41908:29;:35::i;56715:142::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;56810:3:::1;56800:8;:13;;;;56792:22;;;::::0;::::1;;56826:14;:23:::0;;-1:-1:-1;;56826:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;56715:142::o;58691:127::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;58748:14:::1;:19:::0;;-1:-1:-1;;58748:19:0::1;;;::::0;;58795:15:::1;58778:16;:32:::0;58691:127::o;62515:7::-;62508:14;;62436:94;:::o;62640:96::-;62690:13;62720:7;62713:14;;;;;:::i;54009:110::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;54088:16:::1;:23:::0;;-1:-1:-1;;54088:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54009:110::o;57115:895::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;57351:3:::1;57332:18;;:22;;;;:::i;:::-;57319:12;:35;57311:44;;;::::0;::::1;;57433:13;28687:1;57433:2;:13;:::i;:::-;57417:29;::::0;:15;:29:::1;:::i;:::-;57401:45:::0;-1:-1:-1;57483:13:0::1;28687:1;57483:2;:13;:::i;:::-;57470:26;::::0;:12;:26:::1;:::i;:::-;57457:39;;57563:26;29310:2;57590:38;;:18;;:38;;;;:::i;:::-;57563:65;;57639:23;29422:2;57663:35;;:18;;:35;;;;:::i;:::-;57639:59;;57737:18;57720:15;:35;;57711:103;;;::::0;-1:-1:-1;;;57711:103:0;;11675:2:1;57711:103:0::1;::::0;::::1;11657:21:1::0;11714:2;11694:18;;;11687:30;11753:34;11733:18;;;11726:62;-1:-1:-1;;;11804:18:1;;;11797:41;11855:19;;57711:103:0::1;11473:407:1::0;57711:103:0::1;57848:15;57834:12;:29;;57825:94;;;::::0;-1:-1:-1;;;57825:94:0;;12087:2:1;57825:94:0::1;::::0;::::1;12069:21:1::0;12126:2;12106:18;;;12099:30;12165:34;12145:18;;;12138:62;-1:-1:-1;;;12216:18:1;;;12209:38;12264:19;;57825:94:0::1;11885:404:1::0;57825:94:0::1;-1:-1:-1::0;;57932:12:0::1;:30:::0;;;;57973:9:::1;:24:::0;57115:895::o;64533:342::-;64676:10;64620:4;64664:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;64664:32:0;;;;;;;;;;64715:35;;;;64707:60;;;;-1:-1:-1;;;64707:60:0;;12496:2:1;64707:60:0;;;12478:21:1;12535:2;12515:18;;;12508:30;-1:-1:-1;;;12554:18:1;;;12547:42;12606:18;;64707:60:0;12294:336:1;64707:60:0;64780:65;64789:10;64801:7;64810:34;64829:15;64810:16;:34;:::i;64780:65::-;-1:-1:-1;64863:4:0;;64533:342;-1:-1:-1;;;64533:342:0:o;63089:167::-;63169:4;63186:40;63196:10;63208:9;63219:6;63186:9;:40::i;28616:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54384:115::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;54460:9:::1;:31:::0;;-1:-1:-1;;;;;;54460:31:0::1;-1:-1:-1::0;;;;;54460:31:0;;;::::1;::::0;;;::::1;::::0;;54384:115::o;55039:102::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;55109:15:::1;:24:::0;;-1:-1:-1;;55109:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55039:102::o;52848:64::-;52884:20;52893:10;52884:8;:20::i;50436:220::-;50501:7;50539:20;;50523:15;:36;50520:110;;;50603:15;50582:20;;:36;;;;:::i;50520:110::-;-1:-1:-1;50647:1:0;;50436:220::o;50664:129::-;50711:7;50772:13;28687:1;50772:2;:13;:::i;:::-;50752:18;;28746:13;28687:1;28746:2;:13;:::i;:::-;28734:25;;:9;:25;:::i;:::-;50738:32;;;;:::i;:::-;50737:48;;;;:::i;56004:112::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;56081:27:::1;:9;56095:12:::0;56081:13:::1;:27::i;54643:157::-:0;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;54747:5:::1;:15;54755:7:::0;54747:5;:15:::1;:::i;:::-;-1:-1:-1::0;54773:7:0::1;:19;54783:9:::0;54773:7;:19:::1;:::i;:::-;;54643:157:::0;;:::o;55811:125::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;55893:19:::1;:35:::0;55811:125::o;28574:35::-;;;;;;;:::i;55214:202::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;55306:32;;55298:67:::1;;;::::0;-1:-1:-1;;;55298:67:0;;15041:2:1;55298:67:0::1;::::0;::::1;15023:21:1::0;15080:2;15060:18;;;15053:30;15119:25;15099:18;;;15092:53;15162:18;;55298:67:0::1;14839:347:1::0;55298:67:0::1;55380:12;:28:::0;55214:202::o;55492:195::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;55582:30;;55574:64:::1;;;::::0;-1:-1:-1;;;55574:64:0;;15393:2:1;55574:64:0::1;::::0;::::1;15375:21:1::0;15432:2;15412:18;;;15405:30;-1:-1:-1;;;15451:18:1;;;15444:52;15513:18;;55574:64:0::1;15191:346:1::0;55574:64:0::1;55653:11;:26:::0;55492:195::o;54253:123::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;54333:11:::1;:35:::0;;-1:-1:-1;;;;;;54333:35:0::1;-1:-1:-1::0;;;;;54333:35:0;;;::::1;::::0;;;::::1;::::0;;54253:123::o;42192:411::-;42274:18;;42240:7;;;42449:123;42465:29;:20;:27;:29::i;:::-;42463:1;:31;42449:123;;;42523:9;:37;42533:26;:20;42557:1;42533:23;:26::i;:::-;-1:-1:-1;;;;;42523:37:0;;;;;;;;;;;;-1:-1:-1;42523:37:0;;42515:45;;;;:::i;:::-;;-1:-1:-1;42496:3:0;;;;:::i;:::-;;;;42449:123;;;-1:-1:-1;42589:6:0;42192:411;-1:-1:-1;42192:411:0:o;59767:490::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;59919:20:::1;;59900:15;:39;;59892:68;;;::::0;-1:-1:-1;;;59892:68:0;;11120:2:1;59892:68:0::1;::::0;::::1;11102:21:1::0;11159:2;11139:18;;;11132:30;-1:-1:-1;;;11178:18:1;;;11171:46;11234:18;;59892:68:0::1;10918:340:1::0;59892:68:0::1;60030:22;::::0;60081:39:::1;::::0;-1:-1:-1;;;60081:39:0;;60114:4:::1;60081:39;::::0;::::1;4922:51:1::0;60030:22:0;;;::::1;-1:-1:-1::0;;;;;60030:22:0::1;::::0;59981:30:::1;::::0;60030:22;;60081:24:::1;::::0;4895:18:1;;60081:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60219:11;::::0;60195:44:::1;::::0;-1:-1:-1;;;60195:44:0;;-1:-1:-1;;;;;60219:11:0;;::::1;60195:44;::::0;::::1;16045:51:1::0;16112:18;;;16105:34;;;60064:56:0;;-1:-1:-1;60195:23:0;::::1;::::0;::::1;::::0;16018:18:1;;60195:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54507:128::-:0;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;54593:14:::1;:34:::0;;-1:-1:-1;;;;;;54593:34:0::1;-1:-1:-1::0;;;;;54593:34:0;;;::::1;::::0;;;::::1;::::0;;54507:128::o;58090:135::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;58179:38:::1;:14;58198:18:::0;58179::::1;:38::i;9999:236::-:0;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10080:22:0;::::1;10072:73;;;::::0;-1:-1:-1;;;10072:73:0;;16602:2:1;10072:73:0::1;::::0;::::1;16584:21:1::0;16641:2;16621:18;;;16614:30;16680:34;16660:18;;;16653:62;-1:-1:-1;;;16731:18:1;;;16724:36;16777:19;;10072:73:0::1;16400:402:1::0;10072:73:0::1;10182:6;::::0;;10161:38:::1;::::0;-1:-1:-1;;;;;10161:38:0;;::::1;::::0;10182:6;::::1;::::0;10161:38:::1;::::0;::::1;10210:6;:17:::0;;-1:-1:-1;;;;;;10210:17:0::1;-1:-1:-1::0;;;;;10210:17:0;;;::::1;::::0;;;::::1;::::0;;9999:236::o;53406:242::-;9286:10;9275:7;9101;9128:6;-1:-1:-1;;;;;9128:6:0;;9063:79;9275:7;-1:-1:-1;;;;;9275:21:0;;9267:66;;;;-1:-1:-1;;;9267:66:0;;;;;;;:::i;:::-;53479:16:::1;::::0;;53464:14:::1;53506:18:::0;;;53543:11:::1;::::0;-1:-1:-1;;;;;53543:11:0::1;53535:48;53579:3;53566:9;53479:16:::0;53573:2:::1;53566:9;:::i;41998:118::-:0;42056:4;42079:29;:14;42103:4;42079:23;:29::i;24750:152::-;24820:4;24844:50;24849:3;-1:-1:-1;;;;;24869:23:0;;24844:4;:50::i;:::-;24837:57;24750:152;-1:-1:-1;;;24750:152:0:o;63586:299::-;-1:-1:-1;;;;;63679:19:0;;63671:49;;;;-1:-1:-1;;;63671:49:0;;17009:2:1;63671:49:0;;;16991:21:1;17048:2;17028:18;;;17021:30;-1:-1:-1;;;17067:18:1;;;17060:47;17124:18;;63671:49:0;16807:341:1;63671:49:0;-1:-1:-1;;;;;63739:21:0;;63731:49;;;;-1:-1:-1;;;63731:49:0;;17355:2:1;63731:49:0;;;17337:21:1;17394:2;17374:18;;;17367:30;-1:-1:-1;;;17413:18:1;;;17406:45;17468:18;;63731:49:0;17153:339:1;63731:49:0;-1:-1:-1;;;;;63793:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;63845:32;;2346:25:1;;;63845:32:0;;2319:18:1;63845:32:0;;;;;;;63586:299;;;:::o;33000:1544::-;-1:-1:-1;;;;;33096:20:0;;33088:51;;;;-1:-1:-1;;;33088:51:0;;17699:2:1;33088:51:0;;;17681:21:1;17738:2;17718:18;;;17711:30;-1:-1:-1;;;17757:18:1;;;17750:48;17815:18;;33088:51:0;17497:342:1;33088:51:0;-1:-1:-1;;;;;33158:23:0;;33150:52;;;;-1:-1:-1;;;33150:52:0;;18046:2:1;33150:52:0;;;18028:21:1;18085:2;18065:18;;;18058:30;-1:-1:-1;;;18104:18:1;;;18097:46;18160:18;;33150:52:0;17844:340:1;33150:52:0;33295:15;33314:26;:9;33333:6;33314:18;:26::i;:::-;:59;;;-1:-1:-1;33344:29:0;:9;33363;33344:18;:29::i;:::-;33295:79;-1:-1:-1;33473:23:0;-1:-1:-1;;;;;33498:21:0;;33514:4;33498:21;;:49;;-1:-1:-1;;;;;;33523:24:0;;33542:4;33523:24;33498:49;33686:16;;33753:21;;33473:75;;-1:-1:-1;;;;;;33686:16:0;;;;33654:23;;33743:31;;;-1:-1:-1;;;33753:21:0;;;;33743:31;:63;;;;;33791:15;-1:-1:-1;;;;;33778:28:0;:9;-1:-1:-1;;;;;33778:28:0;;33743:63;33742:144;;;-1:-1:-1;33835:21:0;;-1:-1:-1;;;;;33822:34:0;;;-1:-1:-1;;;33835:21:0;;;;33822:34;:63;;;;;33870:15;-1:-1:-1;;;;;33860:25:0;:6;-1:-1:-1;;;;;33860:25:0;;33822:63;34008:21;;33714:173;;-1:-1:-1;33989:10:0;;-1:-1:-1;;;;;34000:29:0;;;-1:-1:-1;;;34008:21:0;;;;34000:29;;:57;;;34042:15;-1:-1:-1;;;;;34032:25:0;:6;-1:-1:-1;;;;;34032:25:0;;34000:57;34091:21;;33989:68;;-1:-1:-1;34068:11:0;;-1:-1:-1;;;;;34080:32:0;;;-1:-1:-1;;;34091:21:0;;;;34080:32;;:63;;;34128:15;-1:-1:-1;;;;;34115:28:0;:9;-1:-1:-1;;;;;34115:28:0;;34080:63;34068:75;;34184:18;:41;;;;34206:19;34184:41;:55;;;;34229:10;34184:55;34181:356;;;34255:43;34272:6;34280:9;34291:6;34255:16;:43::i;:::-;34181:356;;;34417:14;;;;;;;34409:49;;;;-1:-1:-1;;;34409:49:0;;18391:2:1;34409:49:0;;;18373:21:1;18430:2;18410:18;;;18403:30;18469:25;18449:18;;;18442:53;18512:18;;34409:49:0;18189:347:1;34409:49:0;34473:52;34488:6;34495:9;34505:6;34512:5;34518:6;34473:14;:52::i;:::-;33077:1467;;;;;;33000:1544;;;:::o;47649:1628::-;47314:27;:34;;-1:-1:-1;;47314:34:0;47344:4;47314:34;;;;;;47751:4:::1;47314:27:::0;47733:24;;;::::1;::::0;;;;;;;;47798:11:::1;::::0;47733:24;;47314:27;47784:25:::1;::::0;-1:-1:-1;;;47798:11:0;::::1;47314:34:::0;47798:11;;::::1;::::0;47784:13;;::::1;;:25;:::i;:::-;47768:41;;;;47820:19;47842;;47820:41;;47988:11;47972:15;:27;:40;;;-1:-1:-1::0;48001:11:0::1;::::0;::::1;::::0;47972:40:::1;47969:77;;;48028:7;;;;;47969:77;48166:13;::::0;48127:25:::1;::::0;48153:36:::1;::::0;::::1;::::0;48154:25:::1;::::0;48166:13;;::::1;;;48154:11:::0;:25:::1;:::i;:::-;48153:36;;;;:::i;:::-;48127:62:::0;-1:-1:-1;48200:25:0::1;48227:29;48127:62:::0;48227:11;:29:::1;:::i;:::-;48200:56:::0;-1:-1:-1;48317:16:0::1;48334:19;48352:1;48334:17:::0;:19:::1;:::i;:::-;48317:36:::0;-1:-1:-1;48364:19:0::1;48384:26;48317:36:::0;48384:17;:26:::1;:::i;:::-;48364:46:::0;-1:-1:-1;48493:17:0::1;48511:29;48523:17:::0;48364:46;48511:29:::1;:::i;:::-;48493:47:::0;-1:-1:-1;48655:21:0::1;48687:27;48493:47:::0;48687:16:::1;:27::i;:::-;48725:14;48741:41;48765:17:::0;48741:21:::1;:41;:::i;:::-;48725:58:::0;-1:-1:-1;48883:14:0::1;48921:9:::0;48901:18:::1;48908:11:::0;48725:58;48901:18:::1;:::i;:::-;48900:30;;;;:::i;:::-;48883:47;;48941:31;48955:8;48965:6;48941:13;:31::i;:::-;49095:21;49118:41;49142:17:::0;49118:21:::1;:41;:::i;:::-;49095:65;;49238:31;49255:13;49238:16;:31::i;:::-;47698:1579;;;;;;;;;;;;47359:1;47371:27:::0;:35;;-1:-1:-1;;47371:35:0;;;47649:1628::o;44229:427::-;-1:-1:-1;;;;;44350:17:0;;44292:7;44350:17;;;:9;:17;;;;;;44333:14;;44292:7;;44333:34;;;:::i;:::-;-1:-1:-1;;;;;44530:25:0;;;;;;:17;:25;;;;;;44312:55;;-1:-1:-1;44519:36:0;;44516:49;;;-1:-1:-1;44564:1:0;;44229:427;-1:-1:-1;;44229:427:0:o;44516:49::-;-1:-1:-1;;;;;44597:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;40913:5:0;44584:38;;:10;:38;:::i;:::-;44583:65;;;;:::i;25078:158::-;25151:4;25175:53;25183:3;-1:-1:-1;;;;;25203:23:0;;25175:7;:53::i;59398:230::-;59554:20;;59540:13;:34;59532:43;;;;;;59586:20;:34;59398:230::o;25322:167::-;-1:-1:-1;;;;;25456:23:0;;25402:4;22131:19;;;:12;;;:19;;;;;;:24;;25426:55;22034:129;45599:1212;45658:14;;-1:-1:-1;;;45658:14:0;;;;45657:15;45649:24;;;;;;45684:14;:19;;-1:-1:-1;;;;45684:19:0;-1:-1:-1;;;45684:19:0;;;;45742:27;45764:4;45742:21;:27::i;:::-;45739:495;;;-1:-1:-1;;;;;;45856:14:0;;;;;;:8;:14;;;;;;;45885:16;;;45739:495;;;45942:17;45960:21;45976:4;45960:15;:21::i;:::-;-1:-1:-1;;;;;46092:15:0;;;;;;:9;:15;;;;;;46075:14;;45942:39;;-1:-1:-1;46075:32:0;;;:::i;:::-;-1:-1:-1;;;;;46049:23:0;;;;;;:17;:23;;;;;;;;:58;;;;46167:8;:14;;;;:24;;46182:9;;46167:24;:::i;:::-;-1:-1:-1;;;;;46206:14:0;;46221:1;46206:14;;;:8;:14;;;;;:16;46160:31;-1:-1:-1;;45739:495:0;46247:6;46255:1;46247:9;46244:106;;-1:-1:-1;;46297:14:0;:20;;-1:-1:-1;;;;46297:20:0;;;45599:1212::o;46244:106::-;46378:6;46364:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;46419:16:0;;;46433:1;46419:16;;;;;;;;46395:21;;46419:16;;;;;;;;-1:-1:-1;;46456:16:0;;:23;;;-1:-1:-1;;;46456:23:0;;;;46395:40;;-1:-1:-1;;;;;;46456:16:0;;;;:21;;-1:-1:-1;46456:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46446:4;46451:1;46446:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46446:33:0;;;:7;;;;;;;;;:33;46506:14;;46496:7;;46506:14;;;46496:4;;46506:14;;46496:7;;;;;;:::i;:::-;-1:-1:-1;;;;;46496:24:0;;;:7;;;;;;;;;:24;46568:16;;:151;;-1:-1:-1;;;46568:151:0;;:16;;;:67;;46643:6;;46568:151;;:16;;46673:4;;46688;;46703:15;;46568:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46745:27:0;;;20084:25:1;;;-1:-1:-1;;;;;20145:32:1;;20140:2;20125:18;;20118:60;46745:27:0;;-1:-1:-1;20057:18:1;;-1:-1:-1;46745:27:0;;-1:-1:-1;19910:274:1;46745:27:0;;;;;;;;-1:-1:-1;;46783:14:0;:20;;-1:-1:-1;;;;46783:20:0;;;-1:-1:-1;45599:1212:0:o;25575:117::-;25638:7;25665:19;25673:3;22332:18;;22249:109;26036:158;26110:7;26161:22;26165:3;26177:5;26161:3;:22::i;19805:414::-;19868:4;22131:19;;;:12;;;:19;;;;;;19885:327;;-1:-1:-1;19928:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;20111:18;;20089:19;;;:12;;;:19;;;;;;:40;;;;20144:11;;19885:327;-1:-1:-1;20195:5:0;20188:12;;39609:440;-1:-1:-1;;;;;39728:17:0;;39704:21;39728:17;;;:9;:17;;;;;;39764:23;;;;39756:60;;;;-1:-1:-1;;;39756:60:0;;20391:2:1;39756:60:0;;;20373:21:1;20430:2;20410:18;;;20403:30;-1:-1:-1;;;20449:18:1;;;20442:54;20513:18;;39756:60:0;20189:348:1;39756:60:0;39872:27;39885:6;39892;39872:12;:27::i;:::-;39952:28;39962:9;39973:6;39952:9;:28::i;:::-;40022:9;-1:-1:-1;;;;;40006:33:0;40015:6;-1:-1:-1;;;;;40006:33:0;;40032:6;40006:33;;;;2346:25:1;;2334:2;2319:18;;2200:177;40006:33:0;;;;;;;;39693:356;39609:440;;;:::o;34645:4902::-;-1:-1:-1;;;;;34788:20:0;;;34761:24;34788:20;;;:9;:20;;;;;;;34843:17;;;;;;;;34879:23;;;;34871:60;;;;-1:-1:-1;;;34871:60:0;;20391:2:1;34871:60:0;;;20373:21:1;20430:2;20410:18;;;20403:30;-1:-1:-1;;;20449:18:1;;;20442:54;20513:18;;34871:60:0;20189:348:1;34871:60:0;34944:9;34967:6;34964:3257;;;34993:38;:21;35024:6;34993:30;:38::i;:::-;34989:427;;-1:-1:-1;;;;;35181:17:0;;;;;;:9;:17;;;;;;35200:15;-1:-1:-1;35181:34:0;;:52;;-1:-1:-1;35217:16:0;;;;35181:52;35173:82;;;;-1:-1:-1;;;35173:82:0;;20744:2:1;35173:82:0;;;20726:21:1;20783:2;20763:18;;;20756:30;-1:-1:-1;;;20802:18:1;;;20795:48;20860:18;;35173:82:0;20542:342:1;35173:82:0;35388:12;;35372:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;35354:17:0;;;;;;:9;:17;;;;;:46;34989:427;35557:9;;35549:6;:17;;35541:44;;;;-1:-1:-1;;;35541:44:0;;21091:2:1;35541:44:0;;;21073:21:1;21130:2;21110:18;;;21103:30;-1:-1:-1;;;21149:18:1;;;21142:45;21204:18;;35541:44:0;20889:339:1;35541:44:0;35608:31;:14;35632:6;35608:23;:31::i;:::-;:40;35600:73;;;;-1:-1:-1;;;35600:73:0;;21435:2:1;35600:73:0;;;21417:21:1;21474:2;21454:18;;;21447:30;-1:-1:-1;;;21493:18:1;;;21486:50;21553:18;;35600:73:0;21233:344:1;35600:73:0;35732:11;;35713:16;;:30;;;;:::i;:::-;35694:15;:49;;:77;;;;;35747:19;;35770:1;35747:24;35694:77;35690:186;;;35792:26;:14;35811:6;35792:18;:26::i;:::-;-1:-1:-1;35842:18:0;;-1:-1:-1;;;;;35842:18:0;;;;;;;;35690:186;-1:-1:-1;35896:8:0;;;;;;;34964:3257;;;35929:5;35926:2295;;;35954:40;:20;35984:9;35954:29;:40::i;:::-;35950:427;;-1:-1:-1;;;;;36143:19:0;;;;;;:8;:19;;;;;;36164:15;-1:-1:-1;36143:36:0;;:53;;-1:-1:-1;36181:15:0;;;;36143:53;36135:81;;;;-1:-1:-1;;;36135:81:0;;21784:2:1;36135:81:0;;;21766:21:1;21823:2;21803:18;;;21796:30;-1:-1:-1;;;21842:18:1;;;21835:46;21898:18;;36135:81:0;21582:340:1;36135:81:0;36350:11;;36334:27;;:15;:27;:::i;:::-;-1:-1:-1;;;;;36314:19:0;;;;;;:8;:19;;;;;:47;35950:427;36515:12;;36490:23;36507:6;36490:16;:23;:::i;:::-;:37;;36482:65;;;;-1:-1:-1;;;36482:65:0;;22129:2:1;36482:65:0;;;22111:21:1;22168:2;22148:18;;;22141:30;-1:-1:-1;;;22187:18:1;;;22180:46;22243:18;;36482:65:0;21927:340:1;36482:65:0;36580:6;;36570;:16;;36562:62;;;;-1:-1:-1;;;36562:62:0;;22474:2:1;36562:62:0;;;22456:21:1;22513:2;22493:18;;;22486:30;22552:34;22532:18;;;22525:62;-1:-1:-1;;;22603:18:1;;;22596:32;22645:19;;36562:62:0;22272:398:1;36562:62:0;36647:34;:14;36671:9;36647:23;:34::i;:::-;:43;36639:76;;;;-1:-1:-1;;;36639:76:0;;21435:2:1;36639:76:0;;;21417:21:1;21474:2;21454:18;;;21447:30;-1:-1:-1;;;21493:18:1;;;21486:50;21553:18;;36639:76:0;21233:344:1;36639:76:0;36774:11;;36755:16;;:30;;;;:::i;:::-;36736:15;:49;;:77;;;;;36789:19;;36812:1;36789:24;36736:77;36732:192;;;36834:29;:14;36853:9;36834:18;:29::i;:::-;-1:-1:-1;36887:21:0;;-1:-1:-1;;;;;36887:21:0;;;;;;;;36732:192;-1:-1:-1;36944:7:0;;;;35926:2295;;;37191:15;28687:1;37191:2;:15;:::i;:::-;37183:6;:23;37180:44;;37208:16;37217:6;37208:8;:16::i;:::-;37363:12;;37338:23;37355:6;37338:16;:23;:::i;:::-;:37;;37330:65;;;;-1:-1:-1;;;37330:65:0;;22129:2:1;37330:65:0;;;22111:21:1;22168:2;22148:18;;;22141:30;-1:-1:-1;;;22187:18:1;;;22180:46;22243:18;;37330:65:0;21927:340:1;37330:65:0;37627:38;:21;37658:6;37627:30;:38::i;:::-;37623:139;;-1:-1:-1;;;;;37692:17:0;;;;;;:9;:17;;;;;;37711:15;-1:-1:-1;37692:34:0;;:52;;-1:-1:-1;37728:16:0;;;;37692:52;37684:78;;;;-1:-1:-1;;;37684:78:0;;22877:2:1;37684:78:0;;;22859:21:1;22916:2;22896:18;;;22889:30;-1:-1:-1;;;22935:18:1;;;22928:44;22989:18;;37684:78:0;22675:338:1;37684:78:0;37799:31;:14;37823:6;37799:23;:31::i;:::-;:40;37791:80;;;;-1:-1:-1;;;37791:80:0;;23220:2:1;37791:80:0;;;23202:21:1;23259:2;23239:18;;;23232:30;23298:29;23278:18;;;23271:57;23345:18;;37791:80:0;23018:351:1;37791:80:0;37894:34;:14;37918:9;37894:23;:34::i;:::-;:43;37886:86;;;;-1:-1:-1;;;37886:86:0;;23576:2:1;37886:86:0;;;23558:21:1;23615:2;23595:18;;;23588:30;23654:32;23634:18;;;23627:60;23704:18;;37886:86:0;23374:354:1;37886:86:0;38031:11;;38012:16;;:30;;;;:::i;:::-;37993:15;:49;;:77;;;;;38046:19;;38069:1;38046:24;37993:77;37989:186;;;38091:26;:14;38110:6;38091:18;:26::i;:::-;-1:-1:-1;38141:18:0;;-1:-1:-1;;;;;38141:18:0;;;;;;;;37989:186;-1:-1:-1;38195:12:0;;;;;;;35926:2295;38558:21;;-1:-1:-1;;;;;38550:29:0;;;-1:-1:-1;;;38558:21:0;;;;38550:29;;;;38549:52;;-1:-1:-1;38584:16:0;;;;38583:17;38549:52;:84;;;;-1:-1:-1;38605:27:0;;;;38604:28;38549:84;:92;;;;;38635:6;38549:92;38546:130;;;38656:20;:18;:20::i;:::-;38745:23;38769:36;38783:6;38791:3;38796:8;;;;;;;;;;;38769:13;:36::i;:::-;38974:13;;38745:60;;-1:-1:-1;38913:21:0;;38935:53;;38949:6;;38957:3;;38962:25;;38974:13;;;;;;;-1:-1:-1;;;38962:11:0;;;:25;:::i;:::-;38935:13;:53::i;:::-;38913:75;-1:-1:-1;39052:19:0;39080:31;38913:75;39080:15;:31;:::i;:::-;39072:40;;:6;:40;:::i;:::-;39052:60;;39170:27;39183:6;39190;39170:12;:27::i;:::-;39292:4;39274:24;;;;:9;:24;;;;;:41;;39302:13;;39274:24;:41;;39302:13;;39274:41;:::i;:::-;;;;;;;;39370:15;39350:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;39440:33:0;;-1:-1:-1;39450:9:0;39461:11;39440:9;:33::i;:::-;39515:9;-1:-1:-1;;;;;39499:38:0;39508:6;-1:-1:-1;;;;;39499:38:0;;39525:11;39499:38;;;;2346:25:1;;2334:2;2319:18;;2200:177;39499:38:0;;;;;;;;34750:4797;;;;;;34645:4902;;;;;:::o;49327:461::-;49420:16;;49388:58;;49405:4;;-1:-1:-1;;;;;49420:16:0;49439:6;49388:8;:58::i;:::-;49481:16;;;49495:1;49481:16;;;;;;;;49457:21;;49481:16;;;;;;;;;;-1:-1:-1;49481:16:0;49457:40;;49526:4;49508;49513:1;49508:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49508:23:0;;;:7;;;;;;;;;;:23;;;;49552:16;;:23;;;-1:-1:-1;;;49552:23:0;;;;:16;;;;;:21;;:23;;;;;49508:7;;49552:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49542:4;49547:1;49542:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49542:33:0;;;:7;;;;;;;;;:33;49588:16;;:192;;-1:-1:-1;;;49588:192:0;;:16;;;:67;;:192;;49670:6;;49588:16;;49707:4;;49734;;49754:15;;49588:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49377:411;49327:461;:::o;49915:401::-;50009:9;49997:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;50061:16:0;;50029:63;;50046:4;;-1:-1:-1;;;;;50061:16:0;50080:11;50029:8;:63::i;:::-;50103:16;;:205;;-1:-1:-1;;;50103:205:0;;50176:4;50103:205;;;24661:34:1;;;24711:18;;;24704:34;;;50103:16:0;24754:18:1;;;24747:34;;;24797:18;;;24790:34;24840:19;;;24833:44;50282:15:0;24893:19:1;;;24886:35;-1:-1:-1;;;;;50103:16:0;;;;:32;;50143:9;;24595:19:1;;50103:205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;49915:401;;:::o;44726:758::-;44861:14;;44823:22;;44879:3;;44849:26;;44861:14;;44849:9;:26;:::i;:::-;44848:34;;;;:::i;:::-;44823:59;-1:-1:-1;44893:14:0;44910:26;44823:59;44910:9;:26;:::i;:::-;44893:43;;44966:14;44948:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;45004:10:0;;45000:477;;45053:6;45031:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;45074:19:0;;-1:-1:-1;45094:17:0;:15;:17::i;:::-;45074:37;;45205:11;45220:1;45205:16;45201:265;;45262:6;45242:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;45201:265:0;;-1:-1:-1;45201:265:0;;45438:11;45403:31;-1:-1:-1;;;45403:6:0;:31;:::i;:::-;45402:47;;;;:::i;:::-;45383:14;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;45201:265:0;45016:461;44779:705;;44726:758;:::o;20395:1553::-;20461:4;20600:19;;;:12;;;:19;;;;;;20636:15;;20632:1309;;20998:21;21022:14;21035:1;21022:10;:14;:::i;:::-;21071:18;;20998:38;;-1:-1:-1;21051:17:0;;21071:22;;21092:1;;21071:22;:::i;:::-;21051:42;;21338:17;21358:3;:11;;21370:9;21358:22;;;;;;;;:::i;:::-;;;;;;;;;21338:42;;21504:9;21475:3;:11;;21487:13;21475:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21581:23;;;:12;;;:23;;;;;;:36;;;21742:17;;21581:3;;21742:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21837:3;:12;;:19;21850:5;21837:19;;;;;;;;;;;21830:26;;;21880:4;21873:11;;;;;;;;20632:1309;21924:5;21917:12;;;;;22702:204;22797:18;;22769:7;;22797:26;-1:-1:-1;22789:73:0;;;;-1:-1:-1;;;22789:73:0;;25577:2:1;22789:73:0;;;25559:21:1;25616:2;25596:18;;;25589:30;25655:34;25635:18;;;25628:62;-1:-1:-1;;;25706:18:1;;;25699:32;25748:19;;22789:73:0;25375:398:1;22789:73:0;22880:3;:11;;22892:5;22880:18;;;;;;;;:::i;:::-;;;;;;;;;22873:25;;22702:204;;;;:::o;43435:648::-;-1:-1:-1;;;;;43570:15:0;;43552:17;43570:15;;;:9;:15;;;;;;:22;;43586:6;;43570:22;:::i;:::-;43552:40;;43616:27;43638:4;43616:21;:27::i;:::-;43613:102;;;-1:-1:-1;;;;;43658:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;43435:648:0:o;43613:102::-;43780:15;43796:21;43812:4;43796:15;:21::i;:::-;-1:-1:-1;;;;;43855:15:0;;;;;;:9;:15;;;;;:25;;;43964:14;;43780:37;;-1:-1:-1;43964:26:0;;43871:9;;43964:26;:::i;:::-;-1:-1:-1;;;;;43938:23:0;;;;;;:17;:23;;;;;;;;:52;;;;44051:8;:14;;;;;:23;;44067:7;;43938:23;44051;;44067:7;;44051:23;:::i;42698:645::-;-1:-1:-1;;;;;42830:15:0;;42812:17;42830:15;;;:9;:15;;;;;;:22;;42846:6;;42830:22;:::i;:::-;42812:40;;42876:27;42898:4;42876:21;:27::i;:::-;42873:102;;;-1:-1:-1;;;;;42918:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42698:645:0:o;42873:102::-;43040:15;43056:21;43072:4;43056:15;:21::i;:::-;43040:37;;43178:9;43161:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;43135:23:0;;;;;;:17;:23;;;;;;;;:52;;;;43248:8;:14;;;;;:23;;43264:7;;43135:23;43248;;43264:7;;43248:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;43310:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42698:645:0:o;40104:156::-;40194:7;40247:5;40233:10;40222:21;;40229:3;40222:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;40221:31;;;;:::i;:::-;40214:38;40104:156;-1:-1:-1;;;;40104:156:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:597::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;637:6;634:1;631:13;628:91;;;707:1;702:2;693:6;682:9;678:22;674:31;667:42;628:91;-1:-1:-1;780:2:1;759:15;-1:-1:-1;;755:29:1;740:45;;;;787:2;736:54;;199:597;-1:-1:-1;;;199:597:1:o;990:131::-;-1:-1:-1;;;;;1065:31:1;;1055:42;;1045:70;;1111:1;1108;1101:12;1126:315;1194:6;1202;1255:2;1243:9;1234:7;1230:23;1226:32;1223:52;;;1271:1;1268;1261:12;1223:52;1310:9;1297:23;1329:31;1354:5;1329:31;:::i;:::-;1379:5;1431:2;1416:18;;;;1403:32;;-1:-1:-1;;;1126:315:1:o;1831:118::-;1917:5;1910:13;1903:21;1896:5;1893:32;1883:60;;1939:1;1936;1929:12;1954:241;2010:6;2063:2;2051:9;2042:7;2038:23;2034:32;2031:52;;;2079:1;2076;2069:12;2031:52;2118:9;2105:23;2137:28;2159:5;2137:28;:::i;2382:456::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2583:9;2570:23;2602:31;2627:5;2602:31;:::i;:::-;2652:5;-1:-1:-1;2709:2:1;2694:18;;2681:32;2722:33;2681:32;2722:33;:::i;:::-;2382:456;;2774:7;;-1:-1:-1;;;2828:2:1;2813:18;;;;2800:32;;2382:456::o;3383:247::-;3442:6;3495:2;3483:9;3474:7;3470:23;3466:32;3463:52;;;3511:1;3508;3501:12;3463:52;3550:9;3537:23;3569:31;3594:5;3569:31;:::i;3635:156::-;3701:20;;3761:4;3750:16;;3740:27;;3730:55;;3781:1;3778;3771:12;3730:55;3635:156;;;:::o;3796:535::-;3888:6;3896;3904;3912;3920;3928;3981:3;3969:9;3960:7;3956:23;3952:33;3949:53;;;3998:1;3995;3988:12;3949:53;4021:27;4038:9;4021:27;:::i;:::-;4011:37;;4067:36;4099:2;4088:9;4084:18;4067:36;:::i;:::-;4057:46;;4122:36;4154:2;4143:9;4139:18;4122:36;:::i;:::-;4112:46;;4177:36;4209:2;4198:9;4194:18;4177:36;:::i;:::-;4167:46;;4232:37;4264:3;4253:9;4249:19;4232:37;:::i;:::-;4222:47;;4288:37;4320:3;4309:9;4305:19;4288:37;:::i;:::-;4278:47;;3796:535;;;;;;;;:::o;4589:182::-;4646:6;4699:2;4687:9;4678:7;4674:23;4670:32;4667:52;;;4715:1;4712;4705:12;4667:52;4738:27;4755:9;4738:27;:::i;4984:248::-;5052:6;5060;5113:2;5101:9;5092:7;5088:23;5084:32;5081:52;;;5129:1;5126;5119:12;5081:52;-1:-1:-1;;5152:23:1;;;5222:2;5207:18;;;5194:32;;-1:-1:-1;4984:248:1:o;5237:127::-;5298:10;5293:3;5289:20;5286:1;5279:31;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5369:719;5412:5;5465:3;5458:4;5450:6;5446:17;5442:27;5432:55;;5483:1;5480;5473:12;5432:55;5519:6;5506:20;5545:18;5582:2;5578;5575:10;5572:36;;;5588:18;;:::i;:::-;5663:2;5657:9;5631:2;5717:13;;-1:-1:-1;;5713:22:1;;;5737:2;5709:31;5705:40;5693:53;;;5761:18;;;5781:22;;;5758:46;5755:72;;;5807:18;;:::i;:::-;5847:10;5843:2;5836:22;5882:2;5874:6;5867:18;5928:3;5921:4;5916:2;5908:6;5904:15;5900:26;5897:35;5894:55;;;5945:1;5942;5935:12;5894:55;6009:2;6002:4;5994:6;5990:17;5983:4;5975:6;5971:17;5958:54;6056:1;6049:4;6044:2;6036:6;6032:15;6028:26;6021:37;6076:6;6067:15;;;;;;5369:719;;;;:::o;6093:543::-;6181:6;6189;6242:2;6230:9;6221:7;6217:23;6213:32;6210:52;;;6258:1;6255;6248:12;6210:52;6298:9;6285:23;6327:18;6368:2;6360:6;6357:14;6354:34;;;6384:1;6381;6374:12;6354:34;6407:50;6449:7;6440:6;6429:9;6425:22;6407:50;:::i;:::-;6397:60;;6510:2;6499:9;6495:18;6482:32;6466:48;;6539:2;6529:8;6526:16;6523:36;;;6555:1;6552;6545:12;6523:36;;6578:52;6622:7;6611:8;6600:9;6596:24;6578:52;:::i;:::-;6568:62;;;6093:543;;;;;:::o;6641:388::-;6709:6;6717;6770:2;6758:9;6749:7;6745:23;6741:32;6738:52;;;6786:1;6783;6776:12;6738:52;6825:9;6812:23;6844:31;6869:5;6844:31;:::i;:::-;6894:5;-1:-1:-1;6951:2:1;6936:18;;6923:32;6964:33;6923:32;6964:33;:::i;:::-;7016:7;7006:17;;;6641:388;;;;;:::o;7034:356::-;7236:2;7218:21;;;7255:18;;;7248:30;7314:34;7309:2;7294:18;;7287:62;7381:2;7366:18;;7034:356::o;7395:127::-;7456:10;7451:3;7447:20;7444:1;7437:31;7487:4;7484:1;7477:15;7511:4;7508:1;7501:15;7527:125;7567:4;7595:1;7592;7589:8;7586:34;;;7600:18;;:::i;:::-;-1:-1:-1;7637:9:1;;7527:125::o;7657:168::-;7697:7;7763:1;7759;7755:6;7751:14;7748:1;7745:21;7740:1;7733:9;7726:17;7722:45;7719:71;;;7770:18;;:::i;:::-;-1:-1:-1;7810:9:1;;7657:168::o;7830:217::-;7870:1;7896;7886:132;;7940:10;7935:3;7931:20;7928:1;7921:31;7975:4;7972:1;7965:15;8003:4;8000:1;7993:15;7886:132;-1:-1:-1;8032:9:1;;7830:217::o;8052:380::-;8131:1;8127:12;;;;8174;;;8195:61;;8249:4;8241:6;8237:17;8227:27;;8195:61;8302:2;8294:6;8291:14;8271:18;8268:38;8265:161;;8348:10;8343:3;8339:20;8336:1;8329:31;8383:4;8380:1;8373:15;8411:4;8408:1;8401:15;8437:422;8526:1;8569:5;8526:1;8583:270;8604:7;8594:8;8591:21;8583:270;;;8663:4;8659:1;8655:6;8651:17;8645:4;8642:27;8639:53;;;8672:18;;:::i;:::-;8722:7;8712:8;8708:22;8705:55;;;8742:16;;;;8705:55;8821:22;;;;8781:15;;;;8583:270;;;8587:3;8437:422;;;;;:::o;8864:806::-;8913:5;8943:8;8933:80;;-1:-1:-1;8984:1:1;8998:5;;8933:80;9032:4;9022:76;;-1:-1:-1;9069:1:1;9083:5;;9022:76;9114:4;9132:1;9127:59;;;;9200:1;9195:130;;;;9107:218;;9127:59;9157:1;9148:10;;9171:5;;;9195:130;9232:3;9222:8;9219:17;9216:43;;;9239:18;;:::i;:::-;-1:-1:-1;;9295:1:1;9281:16;;9310:5;;9107:218;;9409:2;9399:8;9396:16;9390:3;9384:4;9381:13;9377:36;9371:2;9361:8;9358:16;9353:2;9347:4;9344:12;9340:35;9337:77;9334:159;;;-1:-1:-1;9446:19:1;;;9478:5;;9334:159;9525:34;9550:8;9544:4;9525:34;:::i;:::-;9595:6;9591:1;9587:6;9583:19;9574:7;9571:32;9568:58;;;9606:18;;:::i;:::-;9644:20;;8864:806;-1:-1:-1;;;8864:806:1:o;9675:140::-;9733:5;9762:47;9803:4;9793:8;9789:19;9783:4;9762:47;:::i;10169:128::-;10209:3;10240:1;10236:6;10233:1;10230:13;10227:39;;;10246:18;;:::i;:::-;-1:-1:-1;10282:9:1;;10169:128::o;10302:204::-;10340:3;10376:4;10373:1;10369:12;10408:4;10405:1;10401:12;10443:3;10437:4;10433:14;10428:3;10425:23;10422:49;;;10451:18;;:::i;:::-;10487:13;;10302:204;-1:-1:-1;;;10302:204:1:o;12761:545::-;12863:2;12858:3;12855:11;12852:448;;;12899:1;12924:5;12920:2;12913:17;12969:4;12965:2;12955:19;13039:2;13027:10;13023:19;13020:1;13016:27;13010:4;13006:38;13075:4;13063:10;13060:20;13057:47;;;-1:-1:-1;13098:4:1;13057:47;13153:2;13148:3;13144:12;13141:1;13137:20;13131:4;13127:31;13117:41;;13208:82;13226:2;13219:5;13216:13;13208:82;;;13271:17;;;13252:1;13241:13;13208:82;;13482:1352;13608:3;13602:10;13635:18;13627:6;13624:30;13621:56;;;13657:18;;:::i;:::-;13686:97;13776:6;13736:38;13768:4;13762:11;13736:38;:::i;:::-;13730:4;13686:97;:::i;:::-;13838:4;;13902:2;13891:14;;13919:1;13914:663;;;;14621:1;14638:6;14635:89;;;-1:-1:-1;14690:19:1;;;14684:26;14635:89;-1:-1:-1;;13439:1:1;13435:11;;;13431:24;13427:29;13417:40;13463:1;13459:11;;;13414:57;14737:81;;13884:944;;13914:663;12708:1;12701:14;;;12745:4;12732:18;;-1:-1:-1;;13950:20:1;;;14068:236;14082:7;14079:1;14076:14;14068:236;;;14171:19;;;14165:26;14150:42;;14263:27;;;;14231:1;14219:14;;;;14098:19;;14068:236;;;14072:3;14332:6;14323:7;14320:19;14317:201;;;14393:19;;;14387:26;-1:-1:-1;;14476:1:1;14472:14;;;14488:3;14468:24;14464:37;14460:42;14445:58;14430:74;;14317:201;-1:-1:-1;;;;;14564:1:1;14548:14;;;14544:22;14531:36;;-1:-1:-1;13482:1352:1:o;15542:135::-;15581:3;15602:17;;;15599:43;;15622:18;;:::i;:::-;-1:-1:-1;15669:1:1;15658:13;;15542:135::o;15682:184::-;15752:6;15805:2;15793:9;15784:7;15780:23;15776:32;15773:52;;;15821:1;15818;15811:12;15773:52;-1:-1:-1;15844:16:1;;15682:184;-1:-1:-1;15682:184:1:o;16150:245::-;16217:6;16270:2;16258:9;16249:7;16245:23;16241:32;16238:52;;;16286:1;16283;16276:12;16238:52;16318:9;16312:16;16337:28;16359:5;16337:28;:::i;18541:251::-;18611:6;18664:2;18652:9;18643:7;18639:23;18635:32;18632:52;;;18680:1;18677;18670:12;18632:52;18712:9;18706:16;18731:31;18756:5;18731:31;:::i;18797:127::-;18858:10;18853:3;18849:20;18846:1;18839:31;18889:4;18886:1;18879:15;18913:4;18910:1;18903:15;18929:461;18982:3;19020:5;19014:12;19047:6;19042:3;19035:19;19073:4;19102:2;19097:3;19093:12;19086:19;;19139:2;19132:5;19128:14;19160:1;19170:195;19184:6;19181:1;19178:13;19170:195;;;19249:13;;-1:-1:-1;;;;;19245:39:1;19233:52;;19305:12;;;;19340:15;;;;19281:1;19199:9;19170:195;;;-1:-1:-1;19381:3:1;;18929:461;-1:-1:-1;;;;;18929:461:1:o;19395:510::-;19666:6;19655:9;19648:25;19709:3;19704:2;19693:9;19689:18;19682:31;19629:4;19730:57;19782:3;19771:9;19767:19;19759:6;19730:57;:::i;:::-;-1:-1:-1;;;;;19823:32:1;;;;19818:2;19803:18;;19796:60;-1:-1:-1;19887:2:1;19872:18;19865:34;19722:65;19395:510;-1:-1:-1;;19395:510:1:o;23733:582::-;24032:6;24021:9;24014:25;24075:6;24070:2;24059:9;24055:18;24048:34;24118:3;24113:2;24102:9;24098:18;24091:31;23995:4;24139:57;24191:3;24180:9;24176:19;24168:6;24139:57;:::i;:::-;-1:-1:-1;;;;;24232:32:1;;;;24227:2;24212:18;;24205:60;-1:-1:-1;24296:3:1;24281:19;24274:35;24131:65;23733:582;-1:-1:-1;;;23733:582:1:o;24932:306::-;25020:6;25028;25036;25089:2;25077:9;25068:7;25064:23;25060:32;25057:52;;;25105:1;25102;25095:12;25057:52;25134:9;25128:16;25118:26;;25184:2;25173:9;25169:18;25163:25;25153:35;;25228:2;25217:9;25213:18;25207:25;25197:35;;24932:306;;;;;:::o;25243:127::-;25304:10;25299:3;25295:20;25292:1;25285:31;25335:4;25332:1;25325:15;25359:4;25356:1;25349:15

Swarm Source

ipfs://5276944abf15f164f4e3eb4f9c69f2c8624c11d138df7818184040be120d4bbb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.