ETH Price: $3,522.16 (+5.00%)

Token

Baby Blue Bird (TWEEP)
 

Overview

Max Total Supply

100,000,000 TWEEP

Holders

117

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.601461901 TWEEP

Value
$0.00
0x2003f1e2168aa943c1a112446679538ce8a65fc3
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:
BabyBlueBird

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity =0.8.9;

// SPDX-License-Identifier: UNLICENSED

interface IBEP20 {
  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() external 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) external 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));
    }
}

//ShibaHood Contract /////////////

contract BabyBlueBird is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    event ContractChanged(uint256 indexed value);
    event ContractChangedBool(bool indexed value);
    event ContractChangedAddress(address indexed value);
    event antiBotBan(address indexed value);
    
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _buyLock;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string private constant _name = 'Baby Blue Bird';
    string private constant _symbol = 'TWEEP';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100000000 * 10**_decimals;

    //Amount to Swap variable
    uint256 currentAmountToSwap = 250000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (0.5%)
    uint8 public constant BalanceLimitDivider=200;
    //Divider for sellLimit based on circulating Supply (0.5%)
    uint16 public constant SellLimitDivider=200;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 15 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //Wallets
    address public TeamWallet=payable(0xD9d2C7dF67B6E8D2d67d84c0cb6f31C972f39565);
    address public CharityWallet=payable(0x62d9fa8e672732403b51D16Ae4fcFCfD8eD98B67);
    //Uniswap router (Main & Testnet)
    address private uniswapRouter=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 antiWhale = 500000 * 10**_decimals;

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 30; // 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 private enableAutoBlacklist = 1; //Leave 1 if using, set to 0 if not using.
    
    //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 _marketingTax;
       
    address private _uniswapV2PairAddress; 
    IuniswapV2Router02 private _uniswapV2Router;

    //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);
        // Uniswap Router
        _uniswapV2Router = IuniswapV2Router02(uniswapRouter);
        //Creates a Uniswap Pair
        _uniswapV2PairAddress = IuniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
		
		//Sets buyLockTime
        buyLockTime=0;

        //Set Starting Taxes 
        
        _buyTax=7;
        _sellTax=7;
        _transferTax=0;

        _burnTax=0;
        _liquidityTax=10;
        _marketingTax=90;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(CharityWallet);
        _excluded.add(msg.sender);
    
    }

    //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 UniswapRouter and UniswapPair 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
    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){
            //Sells can't exceed the sell limit
            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){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
			require(amount <= antiWhale,"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
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            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);
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

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

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

    }

    //Feeless transfer only transfers
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token
        _removeToken(sender,amount);
        //Adds token
        _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;
    }
  
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //adds Token to balances
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }

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

    //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=_marketingTax+_liquidityTax;
        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
        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 marketing
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining BETHNB to Marketing
        marketingBalance+=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 returns (uint256 tAmountSent, uint256 ethAmountSent) {
        totalLPETH+=ethamount;
        uint256 minETH = (ethamount*75) / 100;
        uint256 minTokens = (tokenamount*75) / 100;
        _approve(address(this), address(_uniswapV2Router), tokenamount);
        _uniswapV2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            minTokens,
            minETH,
            address(this),
            block.timestamp
        );
        tAmountSent = tokenamount;
        ethAmountSent = ethamount;
        return (tAmountSent, ethAmountSent);
    }

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

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

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

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

    function getTaxes() external view returns(uint256 burnTax,uint256 liquidityTax, uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }
	
    //How long is a given address still locked from buying
	function getAddressBuyLockTimeInSeconds(address AddressToCheck) external view returns (uint256){
       uint256 lockTime=_buyLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getBuyLockTimeInSeconds() external view returns(uint256){
        return buyLockTime;
    }
    
    //Functions every wallet can call
	
	//Resets buy lock of caller to the default buyLockTime should something go very wrong
    function AddressResetBuyLock() external{
        _buyLock[msg.sender]=block.timestamp+buyLockTime;
	
    }

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

    function TeamWithdrawALLMarketingETH() external onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(TeamWallet).transfer((amount*50) / 100);
        payable(CharityWallet).transfer((amount-(amount*50) / 100));
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(TeamWallet).transfer((amount*66) / 100);
        payable(CharityWallet).transfer((amount-(amount*50) / 100));
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) external onlyOwner{
        manualConversion=manual;
        emit ContractChangedBool(manualConversion);
    }
	
	function TeamChangeAntiWhale(uint256 newAntiWhale) external onlyOwner{
      antiWhale=newAntiWhale * 10**_decimals;
      emit ContractChanged(antiWhale);
    }
    
    function TeamChangeTeamWallet(address newTeamWallet) external onlyOwner{
      require(newTeamWallet != address(0),
      "Error: Cannot be 0 address.");
      TeamWallet=payable(newTeamWallet);
      emit ContractChangedAddress(TeamWallet);
    }
    
    function TeamChangeCharityWallet(address newCharityWallet) external onlyOwner{
      require(newCharityWallet != address(0),
      "Error: Cannot be 0 address.");
      CharityWallet=payable(newCharityWallet);
      emit ContractChangedAddress(CharityWallet);
    }
	
	//Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) external onlyOwner{
        buyLockDisabled=disabled;
        emit ContractChangedBool(buyLockDisabled);
    }
	
	//Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds) external onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
            emit ContractChanged(buyLockTime);
    } 

    //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) external onlyOwner{
        currentAmountToSwap = newSwapAmount;
        emit ContractChanged(currentAmountToSwap);
    }
    
    //Allows wallet exclusion to be added after launch
    function addWalletExclusion(address exclusionAdd) external onlyOwner{
        _excluded.add(exclusionAdd);
        emit ContractChangedAddress(exclusionAdd);
    }

    //Allows you to remove wallet exclusions after launch
    function removeWalletExclusion(address exclusionRemove) external onlyOwner{
        _excluded.remove(exclusionRemove);
        emit ContractChangedAddress(exclusionRemove);
    }

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

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }
    
    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 marketingTaxes, uint8 buyTax, uint8 sellTax, uint8 transferTax) external onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax <= 20,
        "Error: Honeypot prevention prevents buyTax from exceeding 20.");
        require(sellTax <= 20,
        "Error: Honeypot prevention prevents sellTax from exceeding 20.");
        require(transferTax <= 20,
        "Error: Honeypot prevention prevents transferTax from exceeding 20.");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;

        emit ContractChanged(_burnTax);
        emit ContractChanged(_liquidityTax);
        emit ContractChanged(_buyTax);
        emit ContractChanged(_sellTax);
        emit ContractChanged(_transferTax);
    }

    //manually converts contract token to LP
    function TeamCreateLPandETH() external onlyOwner{
    _swapContractToken();
    }
    
    function teamUpdateUniswapRouter(address newRouter) external onlyOwner {
        require(newRouter != address(0),
        "Error: Cannot be 0 address.");
        uniswapRouter=newRouter;
        emit ContractChangedAddress(newRouter);
    }
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) external onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100,
        "Error: New sell limit above 1% of circulating supply.");
        //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;
        emit ContractChanged(balanceLimit);
        emit ContractChanged(sellLimit);
    }

    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;

    //Enables trading for everyone
	function SetupEnableTrading(bool setTrading) external onlyOwner{
        require(!tradingEnabled, "Cannot disable once trading is enabled");
        tradingEnabled=setTrading;
        tradingEnabledAt=block.timestamp;
    }
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) external onlyOwner{
        require(liquidityTokenAddress != address(0),
        "Error: Cannot be 0 address.");
        _liquidityTokenAddress=liquidityTokenAddress;
    }

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

    //Adds time to LP lock in seconds.
    function TeamProlongLiquidityLockInSeconds(uint256 secondsUntilUnlock) external onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
        emit ContractChanged(secondsUntilUnlock+block.timestamp);
    }
    //Adds time to LP lock based on set time.
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime,
        "Error: New unlock time is shorter than old one.");
        _liquidityUnlockTime=newUnlockTime;
        emit ContractChanged(_liquidityUnlockTime);
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() external onlyOwner returns (address tWAddress, uint256 amountSent) {
        //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(TeamWallet, amount);
        emit Transfer(address(this), TeamWallet, amount);
        tWAddress = TeamWallet;
        amountSent = amount;
        return (tWAddress, amountSent);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity() external onlyOwner returns (uint256 newBalance) {
        //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));

        liquidityToken.approve(address(_uniswapV2Router),amount);
        //Removes Liquidity and adds it to marketing Balance
        uint256 initialETHBalance = address(this).balance;
        
        _uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            (amount*75) / 100,
            (amount*75) / 100,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        marketingBalance+=newETHBalance;
        newBalance=newETHBalance;
        return newBalance;
    }
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamRemoveRemainingETH() external onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent,
        "Error: Not sent.");
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

    function name() external pure override returns (string memory) {
        return _name;
    }

    function symbol() external pure 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;
    }

    // IBEP20 - 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":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"ContractChangedAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"ContractChangedBool","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":[],"name":"AddressResetBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CharityWallet","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":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"setTrading","type":"bool"}],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAntiWhale","type":"uint256"}],"name":"TeamChangeAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCharityWallet","type":"address"}],"name":"TeamChangeCharityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTeamWallet","type":"address"}],"name":"TeamChangeTeamWallet","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":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamProlongLiquidityLockInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[{"internalType":"address","name":"tWAddress","type":"address"},{"internalType":"uint256","name":"amountSent","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveLiquidity","outputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","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":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawALLMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"addWalletExclusion","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":"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":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","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":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionRemove","type":"address"}],"name":"removeWalletExclusion","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"teamUpdateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLPETH","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"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a620005c1565b62000021906203d090620005d2565b600855600980546001600160a01b031990811673d9d2c7df67b6e8d2d67d84c0cb6f31c972f39565178255600a805482167362d9fa8e672732403b51d16ae4fcfcfd8ed98b67178155600b8054909216737a250d5630b4cf539739df2c5dacb4c659f2488d17909155620000969190620005c1565b620000a6906305f5e100620005d2565b600c819055600d819055600e55620000c16009600a620005c1565b620000d0906207a120620005d2565b600f55601e6011556001601255348015620000ea57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600b54601480546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001cb57600080fd5b505afa158015620001e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002069190620005f4565b6001600160a01b031663c9c6539630601460009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026457600080fd5b505afa15801562000279573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029f9190620005f4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e857600080fd5b505af1158015620002fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003239190620005f4565b601380546001600160a01b0392909216660100000000000002600160301b600160d01b031990921691909117905560c8620003616009600a620005c1565b62000371906305f5e100620005d2565b6200037d919062000626565b600d5560c8620003906009600a620005c1565b620003a0906305f5e100620005d2565b620003ac919062000626565b600e5560006018556013805465ffffffffffff1916655a0a00000707179055600954620003f1906004906001600160a01b03166200043c602090811b620022e417901c565b50600a5462000418906004906001600160a01b03166200043c602090811b620022e417901c565b50620004343360046200043c60201b620022e41790919060201c565b505062000649565b600062000453836001600160a01b0384166200045c565b90505b92915050565b6000818152600183016020526040812054620004a55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000456565b50600062000456565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000505578160001904821115620004e957620004e9620004ae565b80851615620004f757918102915b93841c9390800290620004c9565b509250929050565b6000826200051e5750600162000456565b816200052d5750600062000456565b8160018114620005465760028114620005515762000571565b600191505062000456565b60ff841115620005655762000565620004ae565b50506001821b62000456565b5060208310610133831016604e8410600b841016171562000596575081810a62000456565b620005a28383620004c4565b8060001904821115620005b957620005b9620004ae565b029392505050565b60006200045360ff8416836200050d565b6000816000190483118215151615620005ef57620005ef620004ae565b500290565b6000602082840312156200060757600080fd5b81516001600160a01b03811681146200061f57600080fd5b9392505050565b6000826200064457634e487b7160e01b600052601260045260246000fd5b500490565b61395a80620006596000396000f3fe6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610a7e578063f2c816ae14610a9e578063f2fde38b14610abe578063f9ab736614610ade57005b8063daf9a47a146109d8578063dd62ed3e146109f8578063e2fd002a14610a3e578063e60ccfb014610a5e57005b8063b766a386116100d3578063b766a3861461096e578063c3a3c0321461098e578063c3f4f54f146109a3578063d11edf74146109b857005b80639fa62d5f1461090e578063a457c2d71461092e578063a9059cbb1461094e57005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461088057806395d89b41146108a05780639bc845fb146108ce5780639bf65770146108ee57005b8063828e8b7e1461083357806386d0ada814610848578063893d20e8146108625780638da5cb5b1461086257005b806370a08231116101a157806370a08231146107b2578063715018a6146107e8578063762bb282146107fd5780637e9ae5da1461081357005b8063677a8870146107305780636eb8c7f1146107685780636f89e4091461078857005b8063395093511161029d5780634cdaf0ae1161024157806358e1df921161021357806358e1df92146106d057806358e55365146106e55780635c69f690146106fb57806361cb27481461071057005b80634cdaf0ae1461065a5780634f91e48c1461067a57806357ad67d11461069057806358780a82146106b057005b80634476f35a1161027a5780634476f35a146105f057806344f3c83a146106105780634ada218b146106265780634cbf8e241461064557005b806339509351146105865780633c7a309b146105a65780633cc39b7a146105da57005b806323b872dd116103045780633054f8a3116102e15780633054f8a31461050c578063311a86971461052b578063313ce5671461055257806335e82f3a1461056657005b806323b872dd1461046c578063243b529a1461048c5780632973ef2d146104a157005b80630fd99e161161033d5780630fd99e161461040557806314ddc0951461042d57806318160ddd146104425780631eb25d131461045757005b806306fdde0314610369578063095ea7b3146103b25780630fa5b215146103e257005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600e81526d1098589e48109b1d5948109a5c9960921b60208201525b6040516103a9919061333a565b60405180910390f35b3480156103be57600080fd5b506103d26103cd3660046133a4565b610afe565b60405190151581526020016103a9565b3480156103ee57600080fd5b506103f7610b15565b6040519081526020016103a9565b34801561041157600080fd5b5061041a60c881565b60405161ffff90911681526020016103a9565b34801561043957600080fd5b506018546103f7565b34801561044e57600080fd5b50600c546103f7565b34801561046357600080fd5b506103f7610d70565b34801561047857600080fd5b506103d26104873660046133d0565b610d8d565b34801561049857600080fd5b50610367610e24565b3480156104ad57600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a9565b34801561051857600080fd5b506017546103d290610100900460ff1681565b34801561053757600080fd5b5061054060c881565b60405160ff90911681526020016103a9565b34801561055e57600080fd5b506009610540565b34801561057257600080fd5b50610367610581366004613411565b610e67565b34801561059257600080fd5b506103d26105a13660046133a4565b610ed1565b3480156105b257600080fd5b506105bb610f08565b604080516001600160a01b0390931683526020830191909152016103a9565b3480156105e657600080fd5b506103f760165481565b3480156105fc57600080fd5b5061036761060b36600461342e565b6110cd565b34801561061c57600080fd5b506103f760185481565b34801561063257600080fd5b506019546103d290610100900460ff1681565b34801561065157600080fd5b50610367611230565b34801561066657600080fd5b50610367610675366004613411565b611324565b34801561068657600080fd5b506103f7600e5481565b34801561069c57600080fd5b506103676106ab36600461345d565b6113ad565b3480156106bc57600080fd5b506103676106cb3660046134df565b611742565b3480156106dc57600080fd5b50610367611800565b3480156106f157600080fd5b506103f760155481565b34801561070757600080fd5b5061041a600f81565b34801561071c57600080fd5b5061036761072b366004613411565b61185e565b34801561073c57600080fd5b50600954610750906001600160a01b031681565b6040516001600160a01b0390911681526020016103a9565b34801561077457600080fd5b5061036761078336600461342e565b6118a2565b34801561079457600080fd5b5061079d611911565b604080519283526020830191909152016103a9565b3480156107be57600080fd5b506103f76107cd366004613411565b6001600160a01b031660009081526001602052604090205490565b3480156107f457600080fd5b5061036761194e565b34801561080957600080fd5b506103f7600d5481565b34801561081f57600080fd5b5061036761082e366004613411565b6119d1565b34801561083f57600080fd5b50610367611a68565b34801561085457600080fd5b506019546103d29060ff1681565b34801561086e57600080fd5b506000546001600160a01b0316610750565b34801561088c57600080fd5b5061036761089b366004613411565b611a8c565b3480156108ac57600080fd5b50604080518082019091526005815264054574545560dc1b602082015261039c565b3480156108da57600080fd5b506103676108e9366004613411565b611b23565b3480156108fa57600080fd5b506103676109093660046134df565b611bba565b34801561091a57600080fd5b506103676109293660046134fc565b611c38565b34801561093a57600080fd5b506103d26109493660046133a4565b611e51565b34801561095a57600080fd5b506103d26109693660046133a4565b611ecd565b34801561097a57600080fd5b506103676109893660046134df565b611eda565b34801561099a57600080fd5b506103f7611f62565b3480156109af57600080fd5b506103f7611f82565b3480156109c457600080fd5b506103676109d336600461342e565b611fc1565b3480156109e457600080fd5b506103676109f336600461342e565b61201b565b348015610a0457600080fd5b506103f7610a1336600461351e565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a4a57600080fd5b50610367610a5936600461342e565b612089565b348015610a6a57600080fd5b50600a54610750906001600160a01b031681565b348015610a8a57600080fd5b506103f7610a99366004613411565b61212d565b348015610aaa57600080fd5b50610367610ab9366004613411565b612167565b348015610aca57600080fd5b50610367610ad9366004613411565b6121ab565b348015610aea57600080fd5b50610367610af9366004613411565b6122a4565b6000610b0b3384846122f9565b5060015b92915050565b600033610b2a6000546001600160a01b031690565b6001600160a01b031614610b595760405162461bcd60e51b8152600401610b5090613557565b60405180910390fd5b601a54421015610b7b5760405162461bcd60e51b8152600401610b509061358c565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bc857600080fd5b505afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0091906135b6565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c5057600080fd5b505af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8891906135cf565b5060145447906001600160a01b031663af2979eb30846064610cab82604b613602565b610cb59190613621565b6064610cc288604b613602565b610ccc9190613621565b30426040518763ffffffff1660e01b8152600401610cef96959493929190613643565b602060405180830381600087803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4191906135b6565b506000610d4e824761367e565b90508060156000828254610d629190613695565b909155509094505050505090565b610d7c6009600a613791565b610d8a906305f5e100613602565b81565b6000610d9a8484846123ec565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e055760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b50565b610e198533610e14868561367e565b6122f9565b506001949350505050565b33610e376000546001600160a01b031690565b6001600160a01b031614610e5d5760405162461bcd60e51b8152600401610b5090613557565b610e65612649565b565b33610e7a6000546001600160a01b031690565b6001600160a01b031614610ea05760405162461bcd60e51b8152600401610b5090613557565b610eab60068261279c565b506040516001600160a01b0382169060008051602061390583398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b0b918590610e14908690613695565b60008033610f1e6000546001600160a01b031690565b6001600160a01b031614610f445760405162461bcd60e51b8152600401610b5090613557565b601a54421015610f665760405162461bcd60e51b8152600401610b509061358c565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fb357600080fd5b505afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb91906135b6565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107391906135cf565b506009546040518281526001600160a01b039091169030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36009546001600160a01b031693509150509091565b336110e06000546001600160a01b031690565b6001600160a01b0316146111065760405162461bcd60e51b8152600401610b5090613557565b60155481111561116e5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b50565b8060156000828254611180919061367e565b90915550506009546001600160a01b03166108fc60646111a1846042613602565b6111ab9190613621565b6040518115909202916000818181858888f193505050501580156111d3573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111f0846032613602565b6111fa9190613621565b611204908461367e565b6040518115909202916000818181858888f1935050505015801561122c573d6000803e3d6000fd5b5050565b336112436000546001600160a01b031690565b6001600160a01b0316146112695760405162461bcd60e51b8152600401610b5090613557565b601a5442101561128b5760405162461bcd60e51b8152600401610b509061358c565b6009546040516000916001600160a01b03169047908381818185875af1925050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b50509050806113215760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b50565b50565b336113376000546001600160a01b031690565b6001600160a01b03161461135d5760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b0381166113835760405162461bcd60e51b8152600401610b50906137a0565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336113c06000546001600160a01b031690565b6001600160a01b0316146113e65760405162461bcd60e51b8152600401610b5090613557565b6000846113f387896137d7565b6113fd91906137d7565b90508060ff166064146114615760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b50565b60148460ff1611156114db5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b50565b60148360ff1611156115555760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b50565b60148260ff1611156115da5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b50565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138e583398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138e583398151915290600090a260135460405160ff909116906000805160206138e583398151915290600090a260135460405161010090910460ff16906000805160206138e583398151915290600090a26013546040516201000090910460ff16906000805160206138e583398151915290600090a250505050505050565b336117556000546001600160a01b031690565b6001600160a01b03161461177b5760405162461bcd60e51b8152600401610b5090613557565b601954610100900460ff16156117e25760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742064697361626c65206f6e63652074726164696e6720697320656044820152651b98589b195960d21b6064820152608401610b50565b601980549115156101000261ff001990921691909117905542601055565b336118136000546001600160a01b031690565b6001600160a01b0316146118395760405162461bcd60e51b8152600401610b5090613557565b6015805460009091556009546001600160a01b03166108fc60646111a1846032613602565b336118716000546001600160a01b031690565b6001600160a01b0316146118975760405162461bcd60e51b8152600401610b5090613557565b610eab60048261279c565b336118b56000546001600160a01b031690565b6001600160a01b0316146118db5760405162461bcd60e51b8152600401610b5090613557565b6118ed6118e84283613695565b6127b1565b6118f74282613695565b6040516000805160206138e583398151915290600090a250565b6000806119206009600a613791565b600d5461192d9190613621565b6119396009600a613791565b600e546119469190613621565b915091509091565b336119616000546001600160a01b031690565b6001600160a01b0316146119875760405162461bcd60e51b8152600401610b5090613557565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119e46000546001600160a01b031690565b6001600160a01b031614611a0a5760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b038116611a305760405162461bcd60e51b8152600401610b50906137a0565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390583398151915290600090a250565b601854611a759042613695565b33600090815260036020526040902055565b905090565b33611a9f6000546001600160a01b031690565b6001600160a01b031614611ac55760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b038116611aeb5760405162461bcd60e51b8152600401610b50906137a0565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390583398151915290600090a250565b33611b366000546001600160a01b031690565b6001600160a01b031614611b5c5760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b038116611b825760405162461bcd60e51b8152600401610b50906137a0565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390583398151915290600090a250565b33611bcd6000546001600160a01b031690565b6001600160a01b031614611bf35760405162461bcd60e51b8152600401610b5090613557565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611c4b6000546001600160a01b031690565b6001600160a01b031614611c715760405162461bcd60e51b8152600401610b5090613557565b6064600c54611c809190613621565b8110611cec5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b50565b611cf86009600a613791565b611d029083613602565b9150611d106009600a613791565b611d1a9082613602565b9050600060c860ff16600c54611d309190613621565b9050600060c861ffff16600c54611d479190613621565b905081841015611dad5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b50565b80831015611e0e5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b50565b600d849055600e83905560405184906000805160206138e583398151915290600090a2600e546040516000805160206138e583398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611eb45760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b50565b611ec33385610e14868561367e565b5060019392505050565b6000610b0b3384846123ec565b33611eed6000546001600160a01b031690565b6001600160a01b031614611f135760405162461bcd60e51b8152600401610b5090613557565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f7c5742601a54611a87919061367e565b50600090565b6000611f906009600a613791565b600c54611f9f6009600a613791565b611fad906305f5e100613602565b611fb7919061367e565b611a879190613621565b33611fd46000546001600160a01b031690565b6001600160a01b031614611ffa5760405162461bcd60e51b8152600401610b5090613557565b600881905560405181906000805160206138e583398151915290600090a250565b3361202e6000546001600160a01b031690565b6001600160a01b0316146120545760405162461bcd60e51b8152600401610b5090613557565b6120606009600a613791565b61206a9082613602565b600f8190556040516000805160206138e583398151915290600090a250565b3361209c6000546001600160a01b031690565b6001600160a01b0316146120c25760405162461bcd60e51b8152600401610b5090613557565b600f81111561210c5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b50565b601881905560405181906000805160206138e583398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121565750600092915050565b612160428261367e565b9392505050565b3361217a6000546001600160a01b031690565b6001600160a01b0316146121a05760405162461bcd60e51b8152600401610b5090613557565b610eab6006826122e4565b336121be6000546001600160a01b031690565b6001600160a01b0316146121e45760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b0381166122495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b50565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b76000546001600160a01b031690565b6001600160a01b0316146122dd5760405162461bcd60e51b8152600401610b5090613557565b610eab6004825b6000612160836001600160a01b03841661283b565b6001600160a01b0383166123435760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b50565b6001600160a01b03821661238b5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b50565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124375760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b50565b6001600160a01b0382166124805760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b50565b600061248d60048561288a565b8061249e575061249e60048461288a565b905060006001600160a01b0385163014806124c157506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125035750816001600160a01b0316866001600160a01b0316145b8061253e57506013546001600160a01b03878116600160301b9092041614801561253e5750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125785750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125b25750836001600160a01b0316886001600160a01b0316145b905084806125bd5750825b806125c55750855b156125da576125d58989896128ac565b61263e565b601954610100900460ff166126315760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b50565b61263e8989898585612977565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269190640100000000810460ff90811691650100000000009004166137d7565b60ff16905060006008549050808310806126ad575061ffff8216155b156126ba57505050612790565b60135460009061ffff8416906126db90640100000000900460ff1684613602565b6126e59190613621565b905060006126f3828461367e565b90506000612702600284613621565b90506000612710828561367e565b9050600061271e8483613695565b90504761272a82612f43565b6000612736824761367e565b90506000836127458684613602565b61274f9190613621565b905061275b86826130ab565b506000905061276a844761367e565b9050806015600082825461277e9190613695565b90915550505050505050505050505050505b6017805460ff19169055565b6000612160836001600160a01b0384166131b0565b601a54811161281a5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b50565b601a81905560405181906000805160206138e583398151915290600090a250565b600081815260018301602052604081205461288257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0f565b506000610b0f565b6001600160a01b03811660009081526001830160205260408120541515612160565b6001600160a01b038316600090815260016020526040902054818110156129105760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b50565b61291a848361329d565b61292483836132e2565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161296991815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129e55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b50565b60008315612af857600e54861115612a315760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b50565b612a3c60068961288a565b15612a805760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b50565b601154601054612a909190613695565b4211158015612aa157506012546001145b15612ae757612ab16006896122e4565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dde565b8415612c6b57600d54612b0b8785613695565b1115612b4c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b50565b600f54861115612ba95760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b50565b612bb460068861288a565b15612bf85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b50565b601154601054612c089190613695565b4211158015612c1957506012546001145b15612c5f57612c296006886122e4565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dde565b612c7660068961288a565b15612cc35760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b50565b612cce60068861288a565b15612d1b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b50565b600d54612d288785613695565b1115612d695760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b50565b601154601054612d799190613695565b4211158015612d8a57506012546001145b15612dd057612d9a6006896122e4565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612e06575060195460ff16155b8015612e15575060175460ff16155b8015612e1e5750835b15612e2b57612e2b612649565b6000612e478783601360039054906101000a900460ff16613306565b601354909150600090612e7d9089908590612e789060ff6401000000008204811691650100000000009004166137d7565b613306565b90506000612e8b8284613695565b612e95908a61367e565b9050612ea18b8a61329d565b3060009081526001602052604081208054849290612ec0908490613695565b9250508190555082600c6000828254612ed9919061367e565b90915550612ee990508a826132e2565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f2e91815260200190565b60405180910390a35050505050505050505050565b601454612f5b9030906001600160a01b0316836122f9565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f9057612f906137fc565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fe457600080fd5b505afa158015612ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301c9190613812565b8160018151811061302f5761302f6137fc565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac9479061307590859060009086903090429060040161382f565b600060405180830381600087803b15801561308f57600080fd5b505af11580156130a3573d6000803e3d6000fd5b505050505050565b60008082601660008282546130c09190613695565b909155506000905060646130d585604b613602565b6130df9190613621565b9050600060646130f087604b613602565b6130fa9190613621565b6014549091506131159030906001600160a01b0316886122f9565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906131519030908b908790899084904290600401613643565b6060604051808303818588803b15801561316a57600080fd5b505af115801561317e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a391906138a0565b5096979596505050505050565b600081815260018301602052604081205480156132935760006131d460018361367e565b85549091506000906131e89060019061367e565b90506000866000018281548110613201576132016137fc565b9060005260206000200154905080876000018481548110613224576132246137fc565b600091825260208083209091019290925582815260018901909152604090208490558654879080613257576132576138ce565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b0f565b6000915050610b0f565b6001600160a01b0382166000908152600160205260408120546132c190839061367e565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132c1908390613695565b60006127108260ff168460ff168661331e9190613602565b6133289190613602565b6133329190613621565b949350505050565b600060208083528351808285015260005b818110156133675785810183015185820160400152820161334b565b81811115613379576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461132157600080fd5b600080604083850312156133b757600080fd5b82356133c28161338f565b946020939093013593505050565b6000806000606084860312156133e557600080fd5b83356133f08161338f565b925060208401356134008161338f565b929592945050506040919091013590565b60006020828403121561342357600080fd5b81356121608161338f565b60006020828403121561344057600080fd5b5035919050565b803560ff8116811461345857600080fd5b919050565b60008060008060008060c0878903121561347657600080fd5b61347f87613447565b955061348d60208801613447565b945061349b60408801613447565b93506134a960608801613447565b92506134b760808801613447565b91506134c560a08801613447565b90509295509295509295565b801515811461132157600080fd5b6000602082840312156134f157600080fd5b8135612160816134d1565b6000806040838503121561350f57600080fd5b50508035926020909101359150565b6000806040838503121561353157600080fd5b823561353c8161338f565b9150602083013561354c8161338f565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156135c857600080fd5b5051919050565b6000602082840312156135e157600080fd5b8151612160816134d1565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561361c5761361c6135ec565b500290565b60008261363e57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082821015613690576136906135ec565b500390565b600082198211156136a8576136a86135ec565b500190565b600181815b808511156136e85781600019048211156136ce576136ce6135ec565b808516156136db57918102915b93841c93908002906136b2565b509250929050565b6000826136ff57506001610b0f565b8161370c57506000610b0f565b8160018114613722576002811461372c57613748565b6001915050610b0f565b60ff84111561373d5761373d6135ec565b50506001821b610b0f565b5060208310610133831016604e8410600b841016171561376b575081810a610b0f565b61377583836136ad565b8060001904821115613789576137896135ec565b029392505050565b600061216060ff8416836136f0565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff038211156137f4576137f46135ec565b019392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561382457600080fd5b81516121608161338f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561387f5784516001600160a01b03168352938301939183019160010161385a565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156138b557600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220412e13734405e36d8bb5723387f22d1f79eb6b4e328ab4703aa98e60c6113b5c64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103605760003560e01c8063677a8870116101c45780639fa62d5f116100f6578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610a7e578063f2c816ae14610a9e578063f2fde38b14610abe578063f9ab736614610ade57005b8063daf9a47a146109d8578063dd62ed3e146109f8578063e2fd002a14610a3e578063e60ccfb014610a5e57005b8063b766a386116100d3578063b766a3861461096e578063c3a3c0321461098e578063c3f4f54f146109a3578063d11edf74146109b857005b80639fa62d5f1461090e578063a457c2d71461092e578063a9059cbb1461094e57005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461088057806395d89b41146108a05780639bc845fb146108ce5780639bf65770146108ee57005b8063828e8b7e1461083357806386d0ada814610848578063893d20e8146108625780638da5cb5b1461086257005b806370a08231116101a157806370a08231146107b2578063715018a6146107e8578063762bb282146107fd5780637e9ae5da1461081357005b8063677a8870146107305780636eb8c7f1146107685780636f89e4091461078857005b8063395093511161029d5780634cdaf0ae1161024157806358e1df921161021357806358e1df92146106d057806358e55365146106e55780635c69f690146106fb57806361cb27481461071057005b80634cdaf0ae1461065a5780634f91e48c1461067a57806357ad67d11461069057806358780a82146106b057005b80634476f35a1161027a5780634476f35a146105f057806344f3c83a146106105780634ada218b146106265780634cbf8e241461064557005b806339509351146105865780633c7a309b146105a65780633cc39b7a146105da57005b806323b872dd116103045780633054f8a3116102e15780633054f8a31461050c578063311a86971461052b578063313ce5671461055257806335e82f3a1461056657005b806323b872dd1461046c578063243b529a1461048c5780632973ef2d146104a157005b80630fd99e161161033d5780630fd99e161461040557806314ddc0951461042d57806318160ddd146104425780631eb25d131461045757005b806306fdde0314610369578063095ea7b3146103b25780630fa5b215146103e257005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600e81526d1098589e48109b1d5948109a5c9960921b60208201525b6040516103a9919061333a565b60405180910390f35b3480156103be57600080fd5b506103d26103cd3660046133a4565b610afe565b60405190151581526020016103a9565b3480156103ee57600080fd5b506103f7610b15565b6040519081526020016103a9565b34801561041157600080fd5b5061041a60c881565b60405161ffff90911681526020016103a9565b34801561043957600080fd5b506018546103f7565b34801561044e57600080fd5b50600c546103f7565b34801561046357600080fd5b506103f7610d70565b34801561047857600080fd5b506103d26104873660046133d0565b610d8d565b34801561049857600080fd5b50610367610e24565b3480156104ad57600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a9565b34801561051857600080fd5b506017546103d290610100900460ff1681565b34801561053757600080fd5b5061054060c881565b60405160ff90911681526020016103a9565b34801561055e57600080fd5b506009610540565b34801561057257600080fd5b50610367610581366004613411565b610e67565b34801561059257600080fd5b506103d26105a13660046133a4565b610ed1565b3480156105b257600080fd5b506105bb610f08565b604080516001600160a01b0390931683526020830191909152016103a9565b3480156105e657600080fd5b506103f760165481565b3480156105fc57600080fd5b5061036761060b36600461342e565b6110cd565b34801561061c57600080fd5b506103f760185481565b34801561063257600080fd5b506019546103d290610100900460ff1681565b34801561065157600080fd5b50610367611230565b34801561066657600080fd5b50610367610675366004613411565b611324565b34801561068657600080fd5b506103f7600e5481565b34801561069c57600080fd5b506103676106ab36600461345d565b6113ad565b3480156106bc57600080fd5b506103676106cb3660046134df565b611742565b3480156106dc57600080fd5b50610367611800565b3480156106f157600080fd5b506103f760155481565b34801561070757600080fd5b5061041a600f81565b34801561071c57600080fd5b5061036761072b366004613411565b61185e565b34801561073c57600080fd5b50600954610750906001600160a01b031681565b6040516001600160a01b0390911681526020016103a9565b34801561077457600080fd5b5061036761078336600461342e565b6118a2565b34801561079457600080fd5b5061079d611911565b604080519283526020830191909152016103a9565b3480156107be57600080fd5b506103f76107cd366004613411565b6001600160a01b031660009081526001602052604090205490565b3480156107f457600080fd5b5061036761194e565b34801561080957600080fd5b506103f7600d5481565b34801561081f57600080fd5b5061036761082e366004613411565b6119d1565b34801561083f57600080fd5b50610367611a68565b34801561085457600080fd5b506019546103d29060ff1681565b34801561086e57600080fd5b506000546001600160a01b0316610750565b34801561088c57600080fd5b5061036761089b366004613411565b611a8c565b3480156108ac57600080fd5b50604080518082019091526005815264054574545560dc1b602082015261039c565b3480156108da57600080fd5b506103676108e9366004613411565b611b23565b3480156108fa57600080fd5b506103676109093660046134df565b611bba565b34801561091a57600080fd5b506103676109293660046134fc565b611c38565b34801561093a57600080fd5b506103d26109493660046133a4565b611e51565b34801561095a57600080fd5b506103d26109693660046133a4565b611ecd565b34801561097a57600080fd5b506103676109893660046134df565b611eda565b34801561099a57600080fd5b506103f7611f62565b3480156109af57600080fd5b506103f7611f82565b3480156109c457600080fd5b506103676109d336600461342e565b611fc1565b3480156109e457600080fd5b506103676109f336600461342e565b61201b565b348015610a0457600080fd5b506103f7610a1336600461351e565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a4a57600080fd5b50610367610a5936600461342e565b612089565b348015610a6a57600080fd5b50600a54610750906001600160a01b031681565b348015610a8a57600080fd5b506103f7610a99366004613411565b61212d565b348015610aaa57600080fd5b50610367610ab9366004613411565b612167565b348015610aca57600080fd5b50610367610ad9366004613411565b6121ab565b348015610aea57600080fd5b50610367610af9366004613411565b6122a4565b6000610b0b3384846122f9565b5060015b92915050565b600033610b2a6000546001600160a01b031690565b6001600160a01b031614610b595760405162461bcd60e51b8152600401610b5090613557565b60405180910390fd5b601a54421015610b7b5760405162461bcd60e51b8152600401610b509061358c565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bc857600080fd5b505afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0091906135b6565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c5057600080fd5b505af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8891906135cf565b5060145447906001600160a01b031663af2979eb30846064610cab82604b613602565b610cb59190613621565b6064610cc288604b613602565b610ccc9190613621565b30426040518763ffffffff1660e01b8152600401610cef96959493929190613643565b602060405180830381600087803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4191906135b6565b506000610d4e824761367e565b90508060156000828254610d629190613695565b909155509094505050505090565b610d7c6009600a613791565b610d8a906305f5e100613602565b81565b6000610d9a8484846123ec565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e055760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b50565b610e198533610e14868561367e565b6122f9565b506001949350505050565b33610e376000546001600160a01b031690565b6001600160a01b031614610e5d5760405162461bcd60e51b8152600401610b5090613557565b610e65612649565b565b33610e7a6000546001600160a01b031690565b6001600160a01b031614610ea05760405162461bcd60e51b8152600401610b5090613557565b610eab60068261279c565b506040516001600160a01b0382169060008051602061390583398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b0b918590610e14908690613695565b60008033610f1e6000546001600160a01b031690565b6001600160a01b031614610f445760405162461bcd60e51b8152600401610b5090613557565b601a54421015610f665760405162461bcd60e51b8152600401610b509061358c565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fb357600080fd5b505afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb91906135b6565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107391906135cf565b506009546040518281526001600160a01b039091169030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36009546001600160a01b031693509150509091565b336110e06000546001600160a01b031690565b6001600160a01b0316146111065760405162461bcd60e51b8152600401610b5090613557565b60155481111561116e5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b50565b8060156000828254611180919061367e565b90915550506009546001600160a01b03166108fc60646111a1846042613602565b6111ab9190613621565b6040518115909202916000818181858888f193505050501580156111d3573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111f0846032613602565b6111fa9190613621565b611204908461367e565b6040518115909202916000818181858888f1935050505015801561122c573d6000803e3d6000fd5b5050565b336112436000546001600160a01b031690565b6001600160a01b0316146112695760405162461bcd60e51b8152600401610b5090613557565b601a5442101561128b5760405162461bcd60e51b8152600401610b509061358c565b6009546040516000916001600160a01b03169047908381818185875af1925050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b50509050806113215760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b50565b50565b336113376000546001600160a01b031690565b6001600160a01b03161461135d5760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b0381166113835760405162461bcd60e51b8152600401610b50906137a0565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336113c06000546001600160a01b031690565b6001600160a01b0316146113e65760405162461bcd60e51b8152600401610b5090613557565b6000846113f387896137d7565b6113fd91906137d7565b90508060ff166064146114615760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b50565b60148460ff1611156114db5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b50565b60148360ff1611156115555760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b50565b60148260ff1611156115da5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b50565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138e583398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138e583398151915290600090a260135460405160ff909116906000805160206138e583398151915290600090a260135460405161010090910460ff16906000805160206138e583398151915290600090a26013546040516201000090910460ff16906000805160206138e583398151915290600090a250505050505050565b336117556000546001600160a01b031690565b6001600160a01b03161461177b5760405162461bcd60e51b8152600401610b5090613557565b601954610100900460ff16156117e25760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742064697361626c65206f6e63652074726164696e6720697320656044820152651b98589b195960d21b6064820152608401610b50565b601980549115156101000261ff001990921691909117905542601055565b336118136000546001600160a01b031690565b6001600160a01b0316146118395760405162461bcd60e51b8152600401610b5090613557565b6015805460009091556009546001600160a01b03166108fc60646111a1846032613602565b336118716000546001600160a01b031690565b6001600160a01b0316146118975760405162461bcd60e51b8152600401610b5090613557565b610eab60048261279c565b336118b56000546001600160a01b031690565b6001600160a01b0316146118db5760405162461bcd60e51b8152600401610b5090613557565b6118ed6118e84283613695565b6127b1565b6118f74282613695565b6040516000805160206138e583398151915290600090a250565b6000806119206009600a613791565b600d5461192d9190613621565b6119396009600a613791565b600e546119469190613621565b915091509091565b336119616000546001600160a01b031690565b6001600160a01b0316146119875760405162461bcd60e51b8152600401610b5090613557565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119e46000546001600160a01b031690565b6001600160a01b031614611a0a5760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b038116611a305760405162461bcd60e51b8152600401610b50906137a0565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390583398151915290600090a250565b601854611a759042613695565b33600090815260036020526040902055565b905090565b33611a9f6000546001600160a01b031690565b6001600160a01b031614611ac55760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b038116611aeb5760405162461bcd60e51b8152600401610b50906137a0565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390583398151915290600090a250565b33611b366000546001600160a01b031690565b6001600160a01b031614611b5c5760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b038116611b825760405162461bcd60e51b8152600401610b50906137a0565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390583398151915290600090a250565b33611bcd6000546001600160a01b031690565b6001600160a01b031614611bf35760405162461bcd60e51b8152600401610b5090613557565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611c4b6000546001600160a01b031690565b6001600160a01b031614611c715760405162461bcd60e51b8152600401610b5090613557565b6064600c54611c809190613621565b8110611cec5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b50565b611cf86009600a613791565b611d029083613602565b9150611d106009600a613791565b611d1a9082613602565b9050600060c860ff16600c54611d309190613621565b9050600060c861ffff16600c54611d479190613621565b905081841015611dad5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b50565b80831015611e0e5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b50565b600d849055600e83905560405184906000805160206138e583398151915290600090a2600e546040516000805160206138e583398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611eb45760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b50565b611ec33385610e14868561367e565b5060019392505050565b6000610b0b3384846123ec565b33611eed6000546001600160a01b031690565b6001600160a01b031614611f135760405162461bcd60e51b8152600401610b5090613557565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f7c5742601a54611a87919061367e565b50600090565b6000611f906009600a613791565b600c54611f9f6009600a613791565b611fad906305f5e100613602565b611fb7919061367e565b611a879190613621565b33611fd46000546001600160a01b031690565b6001600160a01b031614611ffa5760405162461bcd60e51b8152600401610b5090613557565b600881905560405181906000805160206138e583398151915290600090a250565b3361202e6000546001600160a01b031690565b6001600160a01b0316146120545760405162461bcd60e51b8152600401610b5090613557565b6120606009600a613791565b61206a9082613602565b600f8190556040516000805160206138e583398151915290600090a250565b3361209c6000546001600160a01b031690565b6001600160a01b0316146120c25760405162461bcd60e51b8152600401610b5090613557565b600f81111561210c5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b50565b601881905560405181906000805160206138e583398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121565750600092915050565b612160428261367e565b9392505050565b3361217a6000546001600160a01b031690565b6001600160a01b0316146121a05760405162461bcd60e51b8152600401610b5090613557565b610eab6006826122e4565b336121be6000546001600160a01b031690565b6001600160a01b0316146121e45760405162461bcd60e51b8152600401610b5090613557565b6001600160a01b0381166122495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b50565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b76000546001600160a01b031690565b6001600160a01b0316146122dd5760405162461bcd60e51b8152600401610b5090613557565b610eab6004825b6000612160836001600160a01b03841661283b565b6001600160a01b0383166123435760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b50565b6001600160a01b03821661238b5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b50565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124375760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b50565b6001600160a01b0382166124805760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b50565b600061248d60048561288a565b8061249e575061249e60048461288a565b905060006001600160a01b0385163014806124c157506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125035750816001600160a01b0316866001600160a01b0316145b8061253e57506013546001600160a01b03878116600160301b9092041614801561253e5750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125785750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125b25750836001600160a01b0316886001600160a01b0316145b905084806125bd5750825b806125c55750855b156125da576125d58989896128ac565b61263e565b601954610100900460ff166126315760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b50565b61263e8989898585612977565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269190640100000000810460ff90811691650100000000009004166137d7565b60ff16905060006008549050808310806126ad575061ffff8216155b156126ba57505050612790565b60135460009061ffff8416906126db90640100000000900460ff1684613602565b6126e59190613621565b905060006126f3828461367e565b90506000612702600284613621565b90506000612710828561367e565b9050600061271e8483613695565b90504761272a82612f43565b6000612736824761367e565b90506000836127458684613602565b61274f9190613621565b905061275b86826130ab565b506000905061276a844761367e565b9050806015600082825461277e9190613695565b90915550505050505050505050505050505b6017805460ff19169055565b6000612160836001600160a01b0384166131b0565b601a54811161281a5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b50565b601a81905560405181906000805160206138e583398151915290600090a250565b600081815260018301602052604081205461288257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b0f565b506000610b0f565b6001600160a01b03811660009081526001830160205260408120541515612160565b6001600160a01b038316600090815260016020526040902054818110156129105760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b50565b61291a848361329d565b61292483836132e2565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161296991815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129e55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b50565b60008315612af857600e54861115612a315760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b50565b612a3c60068961288a565b15612a805760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b50565b601154601054612a909190613695565b4211158015612aa157506012546001145b15612ae757612ab16006896122e4565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dde565b8415612c6b57600d54612b0b8785613695565b1115612b4c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b50565b600f54861115612ba95760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b50565b612bb460068861288a565b15612bf85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b50565b601154601054612c089190613695565b4211158015612c1957506012546001145b15612c5f57612c296006886122e4565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dde565b612c7660068961288a565b15612cc35760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b50565b612cce60068861288a565b15612d1b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b50565b600d54612d288785613695565b1115612d695760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b50565b601154601054612d799190613695565b4211158015612d8a57506012546001145b15612dd057612d9a6006896122e4565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612e06575060195460ff16155b8015612e15575060175460ff16155b8015612e1e5750835b15612e2b57612e2b612649565b6000612e478783601360039054906101000a900460ff16613306565b601354909150600090612e7d9089908590612e789060ff6401000000008204811691650100000000009004166137d7565b613306565b90506000612e8b8284613695565b612e95908a61367e565b9050612ea18b8a61329d565b3060009081526001602052604081208054849290612ec0908490613695565b9250508190555082600c6000828254612ed9919061367e565b90915550612ee990508a826132e2565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f2e91815260200190565b60405180910390a35050505050505050505050565b601454612f5b9030906001600160a01b0316836122f9565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f9057612f906137fc565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fe457600080fd5b505afa158015612ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301c9190613812565b8160018151811061302f5761302f6137fc565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac9479061307590859060009086903090429060040161382f565b600060405180830381600087803b15801561308f57600080fd5b505af11580156130a3573d6000803e3d6000fd5b505050505050565b60008082601660008282546130c09190613695565b909155506000905060646130d585604b613602565b6130df9190613621565b9050600060646130f087604b613602565b6130fa9190613621565b6014549091506131159030906001600160a01b0316886122f9565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906131519030908b908790899084904290600401613643565b6060604051808303818588803b15801561316a57600080fd5b505af115801561317e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131a391906138a0565b5096979596505050505050565b600081815260018301602052604081205480156132935760006131d460018361367e565b85549091506000906131e89060019061367e565b90506000866000018281548110613201576132016137fc565b9060005260206000200154905080876000018481548110613224576132246137fc565b600091825260208083209091019290925582815260018901909152604090208490558654879080613257576132576138ce565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b0f565b6000915050610b0f565b6001600160a01b0382166000908152600160205260408120546132c190839061367e565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132c1908390613695565b60006127108260ff168460ff168661331e9190613602565b6133289190613602565b6133329190613621565b949350505050565b600060208083528351808285015260005b818110156133675785810183015185820160400152820161334b565b81811115613379576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461132157600080fd5b600080604083850312156133b757600080fd5b82356133c28161338f565b946020939093013593505050565b6000806000606084860312156133e557600080fd5b83356133f08161338f565b925060208401356134008161338f565b929592945050506040919091013590565b60006020828403121561342357600080fd5b81356121608161338f565b60006020828403121561344057600080fd5b5035919050565b803560ff8116811461345857600080fd5b919050565b60008060008060008060c0878903121561347657600080fd5b61347f87613447565b955061348d60208801613447565b945061349b60408801613447565b93506134a960608801613447565b92506134b760808801613447565b91506134c560a08801613447565b90509295509295509295565b801515811461132157600080fd5b6000602082840312156134f157600080fd5b8135612160816134d1565b6000806040838503121561350f57600080fd5b50508035926020909101359150565b6000806040838503121561353157600080fd5b823561353c8161338f565b9150602083013561354c8161338f565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156135c857600080fd5b5051919050565b6000602082840312156135e157600080fd5b8151612160816134d1565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561361c5761361c6135ec565b500290565b60008261363e57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082821015613690576136906135ec565b500390565b600082198211156136a8576136a86135ec565b500190565b600181815b808511156136e85781600019048211156136ce576136ce6135ec565b808516156136db57918102915b93841c93908002906136b2565b509250929050565b6000826136ff57506001610b0f565b8161370c57506000610b0f565b8160018114613722576002811461372c57613748565b6001915050610b0f565b60ff84111561373d5761373d6135ec565b50506001821b610b0f565b5060208310610133831016604e8410600b841016171561376b575081810a610b0f565b61377583836136ad565b8060001904821115613789576137896135ec565b029392505050565b600061216060ff8416836136f0565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff038211156137f4576137f46135ec565b019392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561382457600080fd5b81516121608161338f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561387f5784516001600160a01b03168352938301939183019160010161385a565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156138b557600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220412e13734405e36d8bb5723387f22d1f79eb6b4e328ab4703aa98e60c6113b5c64736f6c63430008090033

Deployed Bytecode Sourcemap

27387:28441:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53482:94;;;;;;;;;;-1:-1:-1;53563:5:0;;;;;;;;;;;;-1:-1:-1;;;53563:5:0;;;;53482:94;;;;;;;:::i;:::-;;;;;;;;54367:161;;;;;;;;;;-1:-1:-1;54367:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;54367:161:0;1072:187:1;51583:1015:0;;;;;;;;;;;;;:::i;:::-;;;1410:25:1;;;1398:2;1383:18;51583:1015:0;1264:177:1;28544:43:0;;;;;;;;;;;;28584:3;28544:43;;;;;1620:6:1;1608:19;;;1590:38;;1578:2;1563:18;28544:43:0;1446:188:1;42396:102:0;;;;;;;;;;-1:-1:-1;42479:11:0;;42396:102;;53792:108;;;;;;;;;;-1:-1:-1;53874:18:0;;53792:108;;28196:64;;;;;;;;;;;;;:::i;54841:392::-;;;;;;;;;;-1:-1:-1;54841:392:0;;;;;:::i;:::-;;:::i;47623:83::-;;;;;;;;;;;;;:::i;41800:249::-;;;;;;;;;;-1:-1:-1;41974:8:0;;41800:249;;;41974:8;;;;;;2387:25:1;;41983:13:0;;;;;2443:2:1;2428:18;;2421:34;41997:13:0;;;;;2471:18:1;;;2464:34;;;;42011:7:0;;;2529:2:1;2514:18;;2507:34;41974:8:0;42019;;;;2572:3:1;2557:19;;2550:35;42028:12:0;;;;;2616:3:1;2601:19;;2594:35;2374:3;2359:19;41800:249:0;2100:535:1;42867:27:0;;;;;;;;;;-1:-1:-1;42867:27:0;;;;;;;;;;;28428:45;;;;;;;;;;;;28470:3;28428:45;;;;;2812:4:1;2800:17;;;2782:36;;2770:2;2755:18;28428:45:0;2640:184:1;53690:94:0;;;;;;;;;;-1:-1:-1;28188:1:0;53690:94;;46222:201;;;;;;;;;;-1:-1:-1;46222:201:0;;;;;:::i;:::-;;:::i;55268:205::-;;;;;;;;;;-1:-1:-1;55268:205:0;;;;;:::i;:::-;;:::i;50830:695::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3273:32:1;;;3255:51;;3337:2;3322:18;;3315:34;;;;3228:18;50830:695:0;3081:274:1;37841:25:0;;;;;;;;;;;;;;;;43243:342;;;;;;;;;;-1:-1:-1;43243:342:0;;;;;:::i;:::-;;:::i;42901:26::-;;;;;;;;;;;;;;;;49241;;;;;;;;;;-1:-1:-1;49241:26:0;;;;;;;;;;;52684:268;;;;;;;;;;;;;:::i;49647:243::-;;;;;;;;;;-1:-1:-1;49647:243:0;;;;;:::i;:::-;;:::i;29486:46::-;;;;;;;;;;;;;;;;46521:1048;;;;;;;;;;-1:-1:-1;46521:1048:0;;;;;:::i;:::-;;:::i;49354:227::-;;;;;;;;;;-1:-1:-1;49354:227:0;;;;;:::i;:::-;;:::i;42972:264::-;;;;;;;;;;;;;:::i;37103:31::-;;;;;;;;;;;;;;;;28724:49;;;;;;;;;;;;28763:10;28724:49;;45687:181;;;;;;;;;;-1:-1:-1;45687:181:0;;;;;:::i;:::-;;:::i;28940:77::-;;;;;;;;;;-1:-1:-1;28940:77:0;;;;-1:-1:-1;;;;;28940:77:0;;;;;;-1:-1:-1;;;;;4779:32:1;;;4761:51;;4749:2;4734:18;28940:77:0;4615:203:1;50137:232:0;;;;;;;;;;-1:-1:-1;50137:232:0;;;;;:::i;:::-;;:::i;41641:151::-;;;;;;;;;;;;;:::i;:::-;;;;4997:25:1;;;5053:2;5038:18;;5031:34;;;;4970:18;41641:151:0;4823:248:1;53908:121:0;;;;;;;;;;-1:-1:-1;53908:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;54003:18:0;53976:7;54003:18;;;:9;:18;;;;;;;53908:121;9243:142;;;;;;;;;;;;;:::i;29430:49::-;;;;;;;;;;;;;;;;44281:270;;;;;;;;;;-1:-1:-1;44281:270:0;;;;;:::i;:::-;;:::i;42640:109::-;;;;;;;;;;;;;:::i;42934:28::-;;;;;;;;;;-1:-1:-1;42934:28:0;;;;;;;;53380:94;;;;;;;;;;-1:-1:-1;53432:7:0;8667:6;-1:-1:-1;;;;;8667:6:0;53380:94;;47718:245;;;;;;;;;;-1:-1:-1;47718:245:0;;;;;:::i;:::-;;:::i;53584:98::-;;;;;;;;;;-1:-1:-1;53667:7:0;;;;;;;;;;;;-1:-1:-1;;;53667:7:0;;;;53584:98;;44017:252;;;;;;;;;;-1:-1:-1;44017:252:0;;;;;:::i;:::-;;:::i;43670:165::-;;;;;;;;;;-1:-1:-1;43670:165:0;;;;;:::i;:::-;;:::i;48066:1045::-;;;;;;;;;;-1:-1:-1;48066:1045:0;;;;;:::i;:::-;;:::i;55481:342::-;;;;;;;;;;-1:-1:-1;55481:342:0;;;;;:::i;:::-;;:::i;54037:167::-;;;;;;;;;;-1:-1:-1;54037:167:0;;;;;:::i;:::-;;:::i;44612:156::-;;;;;;;;;;-1:-1:-1;44612:156:0;;;;;:::i;:::-;;:::i;41272:222::-;;;;;;;;;;;;;:::i;41502:131::-;;;;;;;;;;;;;:::i;45207:179::-;;;;;;;;;;-1:-1:-1;45207:179:0;;;;;:::i;:::-;;:::i;43841:164::-;;;;;;;;;;-1:-1:-1;43841:164:0;;;;;:::i;:::-;;:::i;54212:147::-;;;;;;;;;;-1:-1:-1;54212:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;54323:19:0;;;54296:7;54323:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;54212:147;44837:246;;;;;;;;;;-1:-1:-1;44837:246:0;;;;;:::i;:::-;;:::i;29024:80::-;;;;;;;;;;-1:-1:-1;29024:80:0;;;;-1:-1:-1;;;;;29024:80:0;;;42115:275;;;;;;;;;;-1:-1:-1;42115:275:0;;;;;:::i;:::-;;:::i;45948:193::-;;;;;;;;;;-1:-1:-1;45948:193:0;;;;;:::i;:::-;;:::i;9540:238::-;;;;;;;;;;-1:-1:-1;9540:238:0;;;;;:::i;:::-;;:::i;45454:166::-;;;;;;;;;;-1:-1:-1;45454:166:0;;;;;:::i;:::-;;:::i;54367:161::-;54444:4;54461:37;54470:10;54482:7;54491:6;54461:8;:37::i;:::-;-1:-1:-1;54516:4:0;54367:161;;;;;:::o;51583:1015::-;51642:18;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;;;;;;;;;51758:20:::1;;51739:15;:39;;51731:68;;;;-1:-1:-1::0;;;51731:68:0::1;;;;;;;:::i;:::-;51859:22;::::0;51910:39:::1;::::0;-1:-1:-1;;;51910:39:0;;51943:4:::1;51910:39;::::0;::::1;4761:51:1::0;51859:22:0;;;::::1;-1:-1:-1::0;;;;;51859:22:0::1;::::0;51810:30:::1;::::0;51859:22;;51910:24:::1;::::0;4734:18:1;;51910:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51993:16;::::0;51962:56:::1;::::0;-1:-1:-1;;;51962:56:0;;-1:-1:-1;;;;;51993:16:0;;::::1;51962:56;::::0;::::1;3255:51:1::0;3322:18;;;3315:34;;;51893:56:0;;-1:-1:-1;51962:22:0;::::1;::::0;::::1;::::0;3228:18:1;;51962:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52161:16:0::1;::::0;52119:21:::1;::::0;-1:-1:-1;;;;;52161:16:0::1;:64;52248:4;52268:6:::0;52303:3:::1;52290:9;52268:6:::0;52297:2:::1;52290:9;:::i;:::-;52289:17;;;;:::i;:::-;52335:3;52322:9;:6:::0;52329:2:::1;52322:9;:::i;:::-;52321:17;;;;:::i;:::-;52361:4;52381:15;52161:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52422:21:0::1;52446:39;52468:17:::0;52446:21:::1;:39;:::i;:::-;52422:63;;52514:13;52496:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;52549:13:0;;-1:-1:-1;;;;;51583:1015:0;:::o;28196:64::-;28247:13;28188:1;28247:2;:13;:::i;:::-;28235:25;;:9;:25;:::i;:::-;28196:64;:::o;54841:392::-;54941:4;54958:36;54968:6;54976:9;54987:6;54958:9;:36::i;:::-;-1:-1:-1;;;;;55034:19:0;;55007:24;55034:19;;;:11;:19;;;;;;;;55054:10;55034:31;;;;;;;;55084:26;;;;55076:59;;;;-1:-1:-1;;;55076:59:0;;9838:2:1;55076:59:0;;;9820:21:1;9877:2;9857:18;;;9850:30;-1:-1:-1;;;9896:18:1;;;9889:50;9956:18;;55076:59:0;9636:344:1;55076:59:0;55148:55;55157:6;55165:10;55177:25;55196:6;55177:16;:25;:::i;:::-;55148:8;:55::i;:::-;-1:-1:-1;55221:4:0;;54841:392;-1:-1:-1;;;;54841:392:0:o;47623:83::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;47678:20:::1;:18;:20::i;:::-;47623:83::o:0;46222:201::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;46316:41:::1;:14;46338:18:::0;46316:21:::1;:41::i;:::-;-1:-1:-1::0;46373:42:0::1;::::0;-1:-1:-1;;;;;46373:42:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46373:42:0;;;::::1;46222:201:::0;:::o;55268:205::-;55376:10;55350:4;55397:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55397:32:0;;;;;;;;;;55350:4;;55367:76;;55388:7;;55397:45;;55432:10;;55397:45;:::i;50830:695::-;50890:17;;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;51025:20:::1;;51006:15;:39;;50998:68;;;;-1:-1:-1::0;;;50998:68:0::1;;;;;;;:::i;:::-;51136:22;::::0;51187:39:::1;::::0;-1:-1:-1;;;51187:39:0;;51220:4:::1;51187:39;::::0;::::1;4761:51:1::0;51136:22:0;;;::::1;-1:-1:-1::0;;;;;51136:22:0::1;::::0;51087:30:::1;::::0;51136:22;;51187:24:::1;::::0;4734:18:1;;51187:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51325:10;::::0;51301:43:::1;::::0;-1:-1:-1;;;51301:43:0;;-1:-1:-1;;;;;51325:10:0;;::::1;51301:43;::::0;::::1;3255:51:1::0;3322:18;;;3315:34;;;51170:56:0;;-1:-1:-1;51301:23:0;::::1;::::0;::::1;::::0;3228:18:1;;51301:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51384:10:0::1;::::0;51360:43:::1;::::0;1410:25:1;;;-1:-1:-1;;;;;51384:10:0;;::::1;::::0;51377:4:::1;::::0;51360:43:::1;::::0;1398:2:1;1383:18;51360:43:0::1;;;;;;;51426:10;::::0;-1:-1:-1;;;;;51426:10:0::1;::::0;-1:-1:-1;51460:6:0;-1:-1:-1;;50830:695:0;;:::o;43243:342::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;43339:16:::1;;43331:6;:24;;43323:91;;;::::0;-1:-1:-1;;;43323:91:0;;10187:2:1;43323:91:0::1;::::0;::::1;10169:21:1::0;10226:2;10206:18;;;10199:30;10265:34;10245:18;;;10238:62;-1:-1:-1;;;10316:18:1;;;10309:43;10369:19;;43323:91:0::1;9985:409:1::0;43323:91:0::1;43443:6;43425:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43468:10:0::1;::::0;-1:-1:-1;;;;;43468:10:0::1;43460:47;43503:3;43490:9;:6:::0;43497:2:::1;43490:9;:::i;:::-;43489:17;;;;:::i;:::-;43460:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43526:13:0::1;::::0;-1:-1:-1;;;;;43526:13:0::1;43518:59;43572:3;43559:9;:6:::0;43566:2:::1;43559:9;:::i;:::-;43558:17;;;;:::i;:::-;43551:24;::::0;:6;:24:::1;:::i;:::-;43518:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43243:342:::0;:::o;52684:268::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;52774:20:::1;;52755:15;:39;;52747:68;;;;-1:-1:-1::0;;;52747:68:0::1;;;;;;;:::i;:::-;52840:10;::::0;:51:::1;::::0;52827:9:::1;::::0;-1:-1:-1;;;;;52840:10:0::1;::::0;52864:21:::1;::::0;52827:9;52840:51;52827:9;52840:51;52864:21;52840:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52826:65;;;52910:4;52902:42;;;::::0;-1:-1:-1;;;52902:42:0;;10811:2:1;52902:42:0::1;::::0;::::1;10793:21:1::0;10850:2;10830:18;;;10823:30;-1:-1:-1;;;10869:18:1;;;10862:46;10925:18;;52902:42:0::1;10609:340:1::0;52902:42:0::1;52736:216;52684:268::o:0;49647:243::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49751:35:0;::::1;49743:84;;;;-1:-1:-1::0;;;49743:84:0::1;;;;;;;:::i;:::-;49838:22;:44:::0;;-1:-1:-1;;;;;49838:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;49838:44:0;;::::1;::::0;;;::::1;::::0;;49647:243::o;46521:1048::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;46681:14:::1;46721::::0;46696:24:::1;46706:14:::0;46696:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;46681:54;;46754:8;:13;;46764:3;46754:13;46746:64;;;::::0;-1:-1:-1;;;46746:64:0;;11721:2:1;46746:64:0::1;::::0;::::1;11703:21:1::0;11760:2;11740:18;;;11733:30;11799:34;11779:18;;;11772:62;-1:-1:-1;;;11850:18:1;;;11843:36;11896:19;;46746:64:0::1;11519:402:1::0;46746:64:0::1;46839:2;46829:6;:12;;;;46821:95;;;::::0;-1:-1:-1;;;46821:95:0;;12128:2:1;46821:95:0::1;::::0;::::1;12110:21:1::0;12167:2;12147:18;;;12140:30;12206:34;12186:18;;;12179:62;12277:31;12257:18;;;12250:59;12326:19;;46821:95:0::1;11926:425:1::0;46821:95:0::1;46946:2;46935:7;:13;;;;46927:97;;;::::0;-1:-1:-1;;;46927:97:0;;12558:2:1;46927:97:0::1;::::0;::::1;12540:21:1::0;12597:2;12577:18;;;12570:30;12636:34;12616:18;;;12609:62;12707:32;12687:18;;;12680:60;12757:19;;46927:97:0::1;12356:426:1::0;46927:97:0::1;47058:2;47043:11;:17;;;;47035:105;;;::::0;-1:-1:-1;;;47035:105:0;;12989:2:1;47035:105:0::1;::::0;::::1;12971:21:1::0;13028:2;13008:18;;;13001:30;13067:34;13047:18;;;13040:62;13138:34;13118:18;;;13111:62;-1:-1:-1;;;13189:19:1;;;13182:33;13232:19;;47035:105:0::1;12787:470:1::0;47035:105:0::1;47162:9;47153:8;;:18;;;;;;;;;;;;;;;;;;47196:14;47182:13;;:28;;;;;;;;;;;;;;;;;;47235:14;47221:13;;:28;;;;;;;;;;;;;;;;;;47278:6;47270:7;;:14;;;;;;;;;;;;;;;;;;47304:7;47295:8;;:16;;;;;;;;;;;;;;;;;;47335:11;47322:12;;:24;;;;;;;;;;;;;;;;;;47380:8;;;;;;;;;;;47364:25;;-1:-1:-1::0;;;;;;;;;;;47364:25:0::1;;;;;;;;;47421:13;::::0;47405:30:::1;::::0;47421:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47405:30:0;;;::::1;47467:7;::::0;47451:24:::1;::::0;47467:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;47451:24:0;47467:7:::1;::::0;47451:24:::1;47507:8;::::0;47491:25:::1;::::0;47507:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47491:25:0;;;::::1;47548:12;::::0;47532:29:::1;::::0;47548:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47532:29:0;;;::::1;46670:899;46521:1048:::0;;;;;;:::o;49354:227::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;49437:14:::1;::::0;::::1;::::0;::::1;;;49436:15;49428:66;;;::::0;-1:-1:-1;;;49428:66:0;;13464:2:1;49428:66:0::1;::::0;::::1;13446:21:1::0;13503:2;13483:18;;;13476:30;13542:34;13522:18;;;13515:62;-1:-1:-1;;;13593:18:1;;;13586:36;13639:19;;49428:66:0::1;13262:402:1::0;49428:66:0::1;49505:14;:25:::0;;;::::1;;;;-1:-1:-1::0;;49505:25:0;;::::1;::::0;;;::::1;::::0;;49558:15:::1;49541:16;:32:::0;49354:227::o;42972:264::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;43055:16:::1;::::0;;43040:14:::1;43082:18:::0;;;43119:10:::1;::::0;-1:-1:-1;;;;;43119:10:0::1;43111:47;43154:3;43141:9;43055:16:::0;43148:2:::1;43141:9;:::i;45687:181::-:0;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;45772:33:::1;:9;45789:15:::0;45772:16:::1;:33::i;50137:232::-:0;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;50237:57:::1;50259:34;50278:15;50259:18:::0;:34:::1;:::i;:::-;50237:21;:57::i;:::-;50326:34;50345:15;50326:18:::0;:34:::1;:::i;:::-;50310:51;::::0;-1:-1:-1;;;;;;;;;;;50310:51:0;;;::::1;50137:232:::0;:::o;41641:151::-;41684:15;;41745:13;28188:1;41745:2;:13;:::i;:::-;41732:12;;:26;;;;:::i;:::-;41770:13;28188:1;41770:2;:13;:::i;:::-;41760:9;;:23;;;;:::i;:::-;41725:59;;;;41641:151;;:::o;9243:142::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;9344:1:::1;9328:6:::0;;9307:40:::1;::::0;-1:-1:-1;;;;;9328:6:0;;::::1;::::0;9307:40:::1;::::0;9344:1;;9307:40:::1;9375:1;9358:19:::0;;-1:-1:-1;;;;;;9358:19:0::1;::::0;;9243:142::o;44281:270::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44375:30:0;::::1;44367:77;;;;-1:-1:-1::0;;;44367:77:0::1;;;;;;;:::i;:::-;44453:13;:39:::0;;-1:-1:-1;;;;;;44453:39:0::1;-1:-1:-1::0;;;;;44453:39:0;::::1;::::0;;::::1;::::0;;;44506:37:::1;::::0;-1:-1:-1;;;;;;;;;;;44506:37:0;-1:-1:-1;;44506:37:0::1;44281:270:::0;:::o;42640:109::-;42727:11;;42711:27;;:15;:27;:::i;:::-;42699:10;42690:20;;;;:8;:20;;;;;:48;42640:109::o;53459:7::-;53452:14;;53380:94;:::o;47718:245::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47808:23:0;::::1;47800:72;;;;-1:-1:-1::0;;;47800:72:0::1;;;;;;;:::i;:::-;47883:13;:23:::0;;-1:-1:-1;;;;;;47883:23:0::1;-1:-1:-1::0;;;;;47883:23:0;::::1;::::0;;::::1;::::0;;;47922:33:::1;::::0;-1:-1:-1;;;;;;;;;;;47922:33:0;-1:-1:-1;;47922:33:0::1;47718:245:::0;:::o;44017:252::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44105:27:0;::::1;44097:74;;;;-1:-1:-1::0;;;44097:74:0::1;;;;;;;:::i;:::-;44180:10;:33:::0;;-1:-1:-1;;;;;;44180:33:0::1;-1:-1:-1::0;;;;;44180:33:0;::::1;::::0;;::::1;::::0;;;44227:34:::1;::::0;-1:-1:-1;;;;;;;;;;;44227:34:0;-1:-1:-1;;44227:34:0::1;44017:252:::0;:::o;43670:165::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;43751:16:::1;:23:::0;;-1:-1:-1;;43751:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43790:37:::1;::::0;43751:23:::1;43810:16:::0;;;43790:37:::1;;::::0;::::1;::::0;-1:-1:-1;;43790:37:0::1;43670:165:::0;:::o;48066:1045::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;48304:3:::1;48285:18;;:22;;;;:::i;:::-;48272:12;:35;48264:110;;;::::0;-1:-1:-1;;;48264:110:0;;13871:2:1;48264:110:0::1;::::0;::::1;13853:21:1::0;13910:2;13890:18;;;13883:30;13949:34;13929:18;;;13922:62;-1:-1:-1;;;14000:18:1;;;13993:51;14061:19;;48264:110:0::1;13669:417:1::0;48264:110:0::1;48452:13;28188:1;48452:2;:13;:::i;:::-;48436:29;::::0;:15;:29:::1;:::i;:::-;48420:45:::0;-1:-1:-1;48502:13:0::1;28188:1;48502:2;:13;:::i;:::-;48489:26;::::0;:12;:26:::1;:::i;:::-;48476:39;;48582:26;28470:3;48609:38;;:18;;:38;;;;:::i;:::-;48582:65;;48658:23;28584:3;48682:35;;:18;;:35;;;;:::i;:::-;48658:59;;48756:18;48739:15;:35;;48730:103;;;::::0;-1:-1:-1;;;48730:103:0;;14293:2:1;48730:103:0::1;::::0;::::1;14275:21:1::0;14332:2;14312:18;;;14305:30;14371:34;14351:18;;;14344:62;-1:-1:-1;;;14422:18:1;;;14415:41;14473:19;;48730:103:0::1;14091:407:1::0;48730:103:0::1;48867:15;48853:12;:29;;48844:94;;;::::0;-1:-1:-1;;;48844:94:0;;14705:2:1;48844:94:0::1;::::0;::::1;14687:21:1::0;14744:2;14724:18;;;14717:30;14783:34;14763:18;;;14756:62;-1:-1:-1;;;14834:18:1;;;14827:38;14882:19;;48844:94:0::1;14503:404:1::0;48844:94:0::1;48951:12;:30:::0;;;48992:9:::1;:24:::0;;;49032:29:::1;::::0;48966:15;;-1:-1:-1;;;;;;;;;;;49032:29:0;-1:-1:-1;;49032:29:0::1;49093:9;::::0;49077:26:::1;::::0;-1:-1:-1;;;;;;;;;;;49077:26:0;;;::::1;48157:954;;48066:1045:::0;;:::o;55481:342::-;55624:10;55568:4;55612:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55612:32:0;;;;;;;;;;55663:35;;;;55655:60;;;;-1:-1:-1;;;55655:60:0;;15114:2:1;55655:60:0;;;15096:21:1;15153:2;15133:18;;;15126:30;-1:-1:-1;;;15172:18:1;;;15165:42;15224:18;;55655:60:0;14912:336:1;55655:60:0;55728:65;55737:10;55749:7;55758:34;55777:15;55758:16;:34;:::i;55728:65::-;-1:-1:-1;55811:4:0;;55481:342;-1:-1:-1;;;55481:342:0:o;54037:167::-;54117:4;54134:40;54144:10;54156:9;54167:6;54134:9;:40::i;44612:156::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;44684:15:::1;:24:::0;;-1:-1:-1;;44684:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;44724:36:::1;::::0;44684:24:::1;44744:15:::0;;;::::1;;44724:36;;::::0;::::1;::::0;-1:-1:-1;;44724:36:0::1;44612:156:::0;:::o;41272:222::-;41339:7;41377:20;;41361:15;:36;41358:110;;;41441:15;41420:20;;:36;;;;:::i;41358:110::-;-1:-1:-1;41485:1:0;;41272:222::o;41502:131::-;41551:7;41612:13;28188:1;41612:2;:13;:::i;:::-;41592:18;;28247:13;28188:1;28247:2;:13;:::i;:::-;28235:25;;:9;:25;:::i;:::-;41578:32;;;;:::i;:::-;41577:48;;;;:::i;45207:179::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;45291:19:::1;:35:::0;;;45342:36:::1;::::0;45313:13;;-1:-1:-1;;;;;;;;;;;45342:36:0;;;::::1;45207:179:::0;:::o;43841:164::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;43944:13:::1;28188:1;43944:2;:13;:::i;:::-;43929:28;::::0;:12;:28:::1;:::i;:::-;43919:9;:38:::0;;;43971:26:::1;::::0;-1:-1:-1;;;;;;;;;;;43971:26:0;;;::::1;43841:164:::0;:::o;44837:246::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;28763:10:::1;44930:30:::0;::::1;;44922:64;;;::::0;-1:-1:-1;;;44922:64:0;;15455:2:1;44922:64:0::1;::::0;::::1;15437:21:1::0;15494:2;15474:18;;;15467:30;-1:-1:-1;;;15513:18:1;;;15506:52;15575:18;;44922:64:0::1;15253:346:1::0;44922:64:0::1;45001:11;:26:::0;;;45047:28:::1;::::0;45013:14;;-1:-1:-1;;;;;;;;;;;45047:28:0;;;::::1;44837:246:::0;:::o;42115:275::-;-1:-1:-1;;;;;42237:24:0;;42202:7;42237:24;;;:8;:24;;;;;;42284:15;42274:25;;42271:71;;-1:-1:-1;42330:1:0;;42115:275;-1:-1:-1;;42115:275:0:o;42271:71::-;42358:24;42367:15;42358:8;:24;:::i;:::-;42351:31;42115:275;-1:-1:-1;;;42115:275:0:o;45948:193::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;46037:38:::1;:14;46056:18:::0;46037::::1;:38::i;9540:238::-:0;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9623:22:0;::::1;9615:73;;;::::0;-1:-1:-1;;;9615:73:0;;15806:2:1;9615:73:0::1;::::0;::::1;15788:21:1::0;15845:2;15825:18;;;15818:30;15884:34;15864:18;;;15857:62;-1:-1:-1;;;15935:18:1;;;15928:36;15981:19;;9615:73:0::1;15604:402:1::0;9615:73:0::1;9725:6;::::0;;9704:38:::1;::::0;-1:-1:-1;;;;;9704:38:0;;::::1;::::0;9725:6;::::1;::::0;9704:38:::1;::::0;::::1;9753:6;:17:::0;;-1:-1:-1;;;;;;9753:17:0::1;-1:-1:-1::0;;;;;9753:17:0;;;::::1;::::0;;;::::1;::::0;;9540:238::o;45454:166::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;45533:27:::1;:9;45547:12:::0;24293:152;24363:4;24387:50;24392:3;-1:-1:-1;;;;;24412:23:0;;24387:4;:50::i;54534:299::-;-1:-1:-1;;;;;54627:19:0;;54619:49;;;;-1:-1:-1;;;54619:49:0;;16213:2:1;54619:49:0;;;16195:21:1;16252:2;16232:18;;;16225:30;-1:-1:-1;;;16271:18:1;;;16264:47;16328:18;;54619:49:0;16011:341:1;54619:49:0;-1:-1:-1;;;;;54687:21:0;;54679:49;;;;-1:-1:-1;;;54679:49:0;;16559:2:1;54679:49:0;;;16541:21:1;16598:2;16578:18;;;16571:30;-1:-1:-1;;;16617:18:1;;;16610:45;16672:18;;54679:49:0;16357:339:1;54679:49:0;-1:-1:-1;;;;;54741:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;54793:32;;1410:25:1;;;54793:32:0;;1383:18:1;54793:32:0;;;;;;;54534:299;;;:::o;31597:1540::-;-1:-1:-1;;;;;31693:20:0;;31685:51;;;;-1:-1:-1;;;31685:51:0;;16903:2:1;31685:51:0;;;16885:21:1;16942:2;16922:18;;;16915:30;-1:-1:-1;;;16961:18:1;;;16954:48;17019:18;;31685:51:0;16701:342:1;31685:51:0;-1:-1:-1;;;;;31755:23:0;;31747:52;;;;-1:-1:-1;;;31747:52:0;;17250:2:1;31747:52:0;;;17232:21:1;17289:2;17269:18;;;17262:30;-1:-1:-1;;;17308:18:1;;;17301:46;17364:18;;31747:52:0;17048:340:1;31747:52:0;31892:15;31911:26;:9;31930:6;31911:18;:26::i;:::-;:59;;;-1:-1:-1;31941:29:0;:9;31960;31941:18;:29::i;:::-;31892:79;-1:-1:-1;32070:23:0;-1:-1:-1;;;;;32095:21:0;;32111:4;32095:21;;:49;;-1:-1:-1;;;;;;32120:24:0;;32139:4;32120:24;32095:49;32279:16;;32346:21;;32070:75;;-1:-1:-1;;;;;;32279:16:0;;;;32247:23;;32336:31;;;-1:-1:-1;;;32346:21:0;;;;32336:31;:63;;;;;32384:15;-1:-1:-1;;;;;32371:28:0;:9;-1:-1:-1;;;;;32371:28:0;;32336:63;32335:144;;;-1:-1:-1;32428:21:0;;-1:-1:-1;;;;;32415:34:0;;;-1:-1:-1;;;32428:21:0;;;;32415:34;:63;;;;;32463:15;-1:-1:-1;;;;;32453:25:0;:6;-1:-1:-1;;;;;32453:25:0;;32415:63;32601:21;;32307:173;;-1:-1:-1;32582:10:0;;-1:-1:-1;;;;;32593:29:0;;;-1:-1:-1;;;32601:21:0;;;;32593:29;;:57;;;32635:15;-1:-1:-1;;;;;32625:25:0;:6;-1:-1:-1;;;;;32625:25:0;;32593:57;32684:21;;32582:68;;-1:-1:-1;32661:11:0;;-1:-1:-1;;;;;32673:32:0;;;-1:-1:-1;;;32684:21:0;;;;32673:32;;:63;;;32721:15;-1:-1:-1;;;;;32708:28:0;:9;-1:-1:-1;;;;;32708:28:0;;32673:63;32661:75;;32777:18;:41;;;;32799:19;32777:41;:55;;;;32822:10;32777:55;32774:356;;;32848:43;32865:6;32873:9;32884:6;32848:16;:43::i;:::-;32774:356;;;33010:14;;;;;;;33002:49;;;;-1:-1:-1;;;33002:49:0;;17595:2:1;33002:49:0;;;17577:21:1;17634:2;17614:18;;;17607:30;17673:25;17653:18;;;17646:53;17716:18;;33002:49:0;17393:347:1;33002:49:0;33066:52;33081:6;33088:9;33098:6;33105:5;33111:6;33066:14;:52::i;:::-;31674:1463;;;;;;31597:1540;;;:::o;38246:1582::-;37994:27;:34;;-1:-1:-1;;37994:34:0;38024:4;37994:34;;;;;;38348:4:::1;37994:27:::0;38330:24;;;::::1;::::0;;;;;;;;38395:13:::1;::::0;38330:24;;37994:27;38381::::1;::::0;38395:13;;::::1;37994:34:::0;38395:13;;::::1;::::0;38381;;::::1;;:27;:::i;:::-;38365:43;;;;38419:19;38441;;38419:41;;38587:11;38571:15;:27;:40;;;-1:-1:-1::0;38600:11:0::1;::::0;::::1;::::0;38571:40:::1;38568:77;;;38627:7;;;;;38568:77;38765:13;::::0;38726:25:::1;::::0;38752:36:::1;::::0;::::1;::::0;38753:25:::1;::::0;38765:13;;::::1;;;38753:11:::0;:25:::1;:::i;:::-;38752:36;;;;:::i;:::-;38726:62:::0;-1:-1:-1;38799:25:0::1;38826:29;38726:62:::0;38826:11;:29:::1;:::i;:::-;38799:56:::0;-1:-1:-1;38916:16:0::1;38933:19;38951:1;38933:17:::0;:19:::1;:::i;:::-;38916:36:::0;-1:-1:-1;38963:19:0::1;38983:26;38916:36:::0;38983:17;:26:::1;:::i;:::-;38963:46:::0;-1:-1:-1;39092:17:0::1;39110:29;39122:17:::0;38963:46;39110:29:::1;:::i;:::-;39092:47:::0;-1:-1:-1;39218:21:0::1;39250:27;39092:47:::0;39250:16:::1;:27::i;:::-;39288:14;39304:41;39328:17:::0;39304:21:::1;:41;:::i;:::-;39288:58:::0;-1:-1:-1;39446:14:0::1;39484:9:::0;39464:18:::1;39471:11:::0;39288:58;39464:18:::1;:::i;:::-;39463:30;;;;:::i;:::-;39446:47;;39504:31;39518:8;39528:6;39504:13;:31::i;:::-;-1:-1:-1::0;39660:21:0::1;::::0;-1:-1:-1;39683:41:0::1;39707:17:::0;39683:21:::1;:41;:::i;:::-;39660:65;;39807:13;39789:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38039:1:0::1;38051:27:::0;:35;;-1:-1:-1;;38051:35:0;;;38246:1582::o;24621:158::-;24694:4;24718:53;24726:3;-1:-1:-1;;;;;24746:23:0;;24718:7;:53::i;50422:343::-;50578:20;;50564:13;:34;50556:103;;;;-1:-1:-1;;;50556:103:0;;17947:2:1;50556:103:0;;;17929:21:1;17986:2;17966:18;;;17959:30;18025:34;18005:18;;;17998:62;-1:-1:-1;;;18076:18:1;;;18069:45;18131:19;;50556:103:0;17745:411:1;50556:103:0;50670:20;:34;;;50720:37;;50691:13;;-1:-1:-1;;;;;;;;;;;50720:37:0;;;;50422:343;:::o;19348:414::-;19411:4;21674:19;;;:12;;;:19;;;;;;19428:327;;-1:-1:-1;19471:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19654:18;;19632:19;;;:12;;;:19;;;;;;:40;;;;19687:11;;19428:327;-1:-1:-1;19738:5:0;19731:12;;24865:167;-1:-1:-1;;;;;24999:23:0;;24945:4;21674:19;;;:12;;;:19;;;;;;:24;;24969:55;21577:129;36437:400;-1:-1:-1;;;;;36556:17:0;;36532:21;36556:17;;;:9;:17;;;;;;36592:23;;;;36584:60;;;;-1:-1:-1;;;36584:60:0;;18363:2:1;36584:60:0;;;18345:21:1;18402:2;18382:18;;;18375:30;-1:-1:-1;;;18421:18:1;;;18414:54;18485:18;;36584:60:0;18161:348:1;36584:60:0;36680:27;36693:6;36700;36680:12;:27::i;:::-;36740:28;36750:9;36761:6;36740:9;:28::i;:::-;36810:9;-1:-1:-1;;;;;36794:33:0;36803:6;-1:-1:-1;;;;;36794:33:0;;36820:6;36794:33;;;;1410:25:1;;1398:2;1383:18;;1264:177;36794:33:0;;;;;;;;36521:316;36437:400;;;:::o;33207:3183::-;-1:-1:-1;;;;;33350:20:0;;;33323:24;33350:20;;;:9;:20;;;;;;;33405:17;;;;;;;;33441:23;;;;33433:60;;;;-1:-1:-1;;;33433:60:0;;18363:2:1;33433:60:0;;;18345:21:1;18402:2;18382:18;;;18375:30;-1:-1:-1;;;18421:18:1;;;18414:54;18485:18;;33433:60:0;18161:348:1;33433:60:0;33506:9;33529:6;33526:1673;;;33616:9;;33608:6;:17;;33600:44;;;;-1:-1:-1;;;33600:44:0;;18716:2:1;33600:44:0;;;18698:21:1;18755:2;18735:18;;;18728:30;-1:-1:-1;;;18774:18:1;;;18767:45;18829:18;;33600:44:0;18514:339:1;33600:44:0;33667:31;:14;33691:6;33667:23;:31::i;:::-;:40;33659:73;;;;-1:-1:-1;;;33659:73:0;;19060:2:1;33659:73:0;;;19042:21:1;19099:2;19079:18;;;19072:30;-1:-1:-1;;;19118:18:1;;;19111:50;19178:18;;33659:73:0;18858:344:1;33659:73:0;33789:11;;33770:16;;:30;;;;:::i;:::-;33751:15;:49;;:77;;;;;33804:19;;33827:1;33804:24;33751:77;33747:186;;;33849:26;:14;33868:6;33849:18;:26::i;:::-;-1:-1:-1;33899:18:0;;-1:-1:-1;;;;;33899:18:0;;;;;;;;33747:186;-1:-1:-1;33951:8:0;;;;;;;33526:1673;;;33984:5;33981:1218;;;34129:12;;34104:23;34121:6;34104:16;:23;:::i;:::-;:37;;34096:65;;;;-1:-1:-1;;;34096:65:0;;19409:2:1;34096:65:0;;;19391:21:1;19448:2;19428:18;;;19421:30;-1:-1:-1;;;19467:18:1;;;19460:46;19523:18;;34096:65:0;19207:340:1;34096:65:0;34185:9;;34175:6;:19;;34167:65;;;;-1:-1:-1;;;34167:65:0;;19754:2:1;34167:65:0;;;19736:21:1;19793:2;19773:18;;;19766:30;19832:34;19812:18;;;19805:62;-1:-1:-1;;;19883:18:1;;;19876:32;19925:19;;34167:65:0;19552:398:1;34167:65:0;34255:34;:14;34279:9;34255:23;:34::i;:::-;:43;34247:76;;;;-1:-1:-1;;;34247:76:0;;19060:2:1;34247:76:0;;;19042:21:1;19099:2;19079:18;;;19072:30;-1:-1:-1;;;19118:18:1;;;19111:50;19178:18;;34247:76:0;18858:344:1;34247:76:0;34380:11;;34361:16;;:30;;;;:::i;:::-;34342:15;:49;;:77;;;;;34395:19;;34418:1;34395:24;34342:77;34338:192;;;34440:29;:14;34459:9;34440:18;:29::i;:::-;-1:-1:-1;34493:21:0;;-1:-1:-1;;;;;34493:21:0;;;;;;;;34338:192;-1:-1:-1;34548:7:0;;;;33981:1218;;;34699:31;:14;34723:6;34699:23;:31::i;:::-;:40;34691:80;;;;-1:-1:-1;;;34691:80:0;;20157:2:1;34691:80:0;;;20139:21:1;20196:2;20176:18;;;20169:30;20235:29;20215:18;;;20208:57;20282:18;;34691:80:0;19955:351:1;34691:80:0;34794:34;:14;34818:9;34794:23;:34::i;:::-;:43;34786:86;;;;-1:-1:-1;;;34786:86:0;;20513:2:1;34786:86:0;;;20495:21:1;20552:2;20532:18;;;20525:30;20591:32;20571:18;;;20564:60;20641:18;;34786:86:0;20311:354:1;34786:86:0;34920:12;;34895:23;34912:6;34895:16;:23;:::i;:::-;:37;;34887:65;;;;-1:-1:-1;;;34887:65:0;;19409:2:1;34887:65:0;;;19391:21:1;19448:2;19428:18;;;19421:30;-1:-1:-1;;;19467:18:1;;;19460:46;19523:18;;34887:65:0;19207:340:1;34887:65:0;35009:11;;34990:16;;:30;;;;:::i;:::-;34971:15;:49;;:77;;;;;35024:19;;35047:1;35024:24;34971:77;34967:186;;;35069:26;:14;35088:6;35069:18;:26::i;:::-;-1:-1:-1;35119:18:0;;-1:-1:-1;;;;;35119:18:0;;;;;;;;34967:186;-1:-1:-1;35171:12:0;;;;;;;33981:1218;35536:21;;-1:-1:-1;;;;;35528:29:0;;;-1:-1:-1;;;35536:21:0;;;;35528:29;;;;35527:52;;-1:-1:-1;35562:16:0;;;;35561:17;35527:52;:84;;;;-1:-1:-1;35583:27:0;;;;35582:28;35527:84;:92;;;;;35613:6;35527:92;35524:130;;;35634:20;:18;:20::i;:::-;35723:23;35747:36;35761:6;35769:3;35774:8;;;;;;;;;;;35747:13;:36::i;:::-;35857:13;;35723:60;;-1:-1:-1;35794:21:0;;35816:55;;35830:6;;35838:3;;35843:27;;35857:13;;;;;;;35843;;;;:27;:::i;:::-;35816:13;:55::i;:::-;35794:77;-1:-1:-1;35935:19:0;35963:31;35794:77;35963:15;:31;:::i;:::-;35955:40;;:6;:40;:::i;:::-;35935:60;;36033:27;36046:6;36053;36033:12;:27::i;:::-;36155:4;36137:24;;;;:9;:24;;;;;:41;;36165:13;;36137:24;:41;;36165:13;;36137:41;:::i;:::-;;;;;;;;36233:15;36213:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36283:33:0;;-1:-1:-1;36293:9:0;36304:11;36283:9;:33::i;:::-;36358:9;-1:-1:-1;;;;;36342:38:0;36351:6;-1:-1:-1;;;;;36342:38:0;;36368:11;36342:38;;;;1410:25:1;;1398:2;1383:18;;1264:177;36342:38:0;;;;;;;;33312:3078;;;;;;33207:3183;;;;;:::o;39878:461::-;39971:16;;39939:58;;39956:4;;-1:-1:-1;;;;;39971:16:0;39990:6;39939:8;:58::i;:::-;40032:16;;;40046:1;40032:16;;;;;;;;40008:21;;40032:16;;;;;;;;;;-1:-1:-1;40032:16:0;40008:40;;40077:4;40059;40064:1;40059:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40059:23:0;;;:7;;;;;;;;;;:23;;;;40103:16;;:23;;;-1:-1:-1;;;40103:23:0;;;;:16;;;;;:21;;:23;;;;;40059:7;;40103:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40093:4;40098:1;40093:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40093:33:0;;;:7;;;;;;;;;:33;40139:16;;:192;;-1:-1:-1;;;40139:192:0;;:16;;;:67;;:192;;40221:6;;40139:16;;40258:4;;40285;;40305:15;;40139:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39928:411;39878:461;:::o;40466:686::-;40546:19;40567:21;40613:9;40601:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40633:14:0;;-1:-1:-1;40667:3:0;40651:12;:9;40661:2;40651:12;:::i;:::-;40650:20;;;;:::i;:::-;40633:37;-1:-1:-1;40681:17:0;40720:3;40702:14;:11;40714:2;40702:14;:::i;:::-;40701:22;;;;:::i;:::-;40766:16;;40681:42;;-1:-1:-1;40734:63:0;;40751:4;;-1:-1:-1;;;;;40766:16:0;40785:11;40734:8;:63::i;:::-;40808:16;;:218;;-1:-1:-1;;;40808:218:0;;-1:-1:-1;;;;;40808:16:0;;;;:32;;40848:9;;40808:218;;40881:4;;40901:11;;40927:9;;40951:6;;40881:4;;41000:15;;40808:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41051:11:0;;41089:9;;-1:-1:-1;;;;;;40466:686:0:o;19938:1553::-;20004:4;20143:19;;;:12;;;:19;;;;;;20179:15;;20175:1309;;20541:21;20565:14;20578:1;20565:10;:14;:::i;:::-;20614:18;;20541:38;;-1:-1:-1;20594:17:0;;20614:22;;20635:1;;20614:22;:::i;:::-;20594:42;;20881:17;20901:3;:11;;20913:9;20901:22;;;;;;;;:::i;:::-;;;;;;;;;20881:42;;21047:9;21018:3;:11;;21030:13;21018:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21124:23;;;:12;;;:23;;;;;;:36;;;21285:17;;21124:3;;21285:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21380:3;:12;;:19;21393:5;21380:19;;;;;;;;;;;21373:26;;;21423:4;21416:11;;;;;;;;20175:1309;21467:5;21460:12;;;;;37437:228;-1:-1:-1;;;;;37572:15:0;;37554:17;37572:15;;;:9;:15;;;;;;:22;;37588:6;;37572:22;:::i;:::-;-1:-1:-1;;;;;37632:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37437:228:0:o;37173:225::-;-1:-1:-1;;;;;37305:15:0;;37287:17;37305:15;;;:9;:15;;;;;;:22;;37321:6;;37305:22;:::i;36892:156::-;36982:7;37035:5;37021:10;37010:21;;37017:3;37010:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37009:31;;;;:::i;:::-;37002:38;36892:156;-1:-1:-1;;;;36892:156:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1639:456::-;1716:6;1724;1732;1785:2;1773:9;1764:7;1760:23;1756:32;1753:52;;;1801:1;1798;1791:12;1753:52;1840:9;1827:23;1859:31;1884:5;1859:31;:::i;:::-;1909:5;-1:-1:-1;1966:2:1;1951:18;;1938:32;1979:33;1938:32;1979:33;:::i;:::-;1639:456;;2031:7;;-1:-1:-1;;;2085:2:1;2070:18;;;;2057:32;;1639:456::o;2829:247::-;2888:6;2941:2;2929:9;2920:7;2916:23;2912:32;2909:52;;;2957:1;2954;2947:12;2909:52;2996:9;2983:23;3015:31;3040:5;3015:31;:::i;3360:180::-;3419:6;3472:2;3460:9;3451:7;3447:23;3443:32;3440:52;;;3488:1;3485;3478:12;3440:52;-1:-1:-1;3511:23:1;;3360:180;-1:-1:-1;3360:180:1:o;3545:156::-;3611:20;;3671:4;3660:16;;3650:27;;3640:55;;3691:1;3688;3681:12;3640:55;3545:156;;;:::o;3706:535::-;3798:6;3806;3814;3822;3830;3838;3891:3;3879:9;3870:7;3866:23;3862:33;3859:53;;;3908:1;3905;3898:12;3859:53;3931:27;3948:9;3931:27;:::i;:::-;3921:37;;3977:36;4009:2;3998:9;3994:18;3977:36;:::i;:::-;3967:46;;4032:36;4064:2;4053:9;4049:18;4032:36;:::i;:::-;4022:46;;4087:36;4119:2;4108:9;4104:18;4087:36;:::i;:::-;4077:46;;4142:37;4174:3;4163:9;4159:19;4142:37;:::i;:::-;4132:47;;4198:37;4230:3;4219:9;4215:19;4198:37;:::i;:::-;4188:47;;3706:535;;;;;;;;:::o;4246:118::-;4332:5;4325:13;4318:21;4311:5;4308:32;4298:60;;4354:1;4351;4344:12;4369:241;4425:6;4478:2;4466:9;4457:7;4453:23;4449:32;4446:52;;;4494:1;4491;4484:12;4446:52;4533:9;4520:23;4552:28;4574:5;4552:28;:::i;5076:248::-;5144:6;5152;5205:2;5193:9;5184:7;5180:23;5176:32;5173:52;;;5221:1;5218;5211:12;5173:52;-1:-1:-1;;5244:23:1;;;5314:2;5299:18;;;5286:32;;-1:-1:-1;5076:248:1:o;5329:388::-;5397:6;5405;5458:2;5446:9;5437:7;5433:23;5429:32;5426:52;;;5474:1;5471;5464:12;5426:52;5513:9;5500:23;5532:31;5557:5;5532:31;:::i;:::-;5582:5;-1:-1:-1;5639:2:1;5624:18;;5611:32;5652:33;5611:32;5652:33;:::i;:::-;5704:7;5694:17;;;5329:388;;;;;:::o;5722:356::-;5924:2;5906:21;;;5943:18;;;5936:30;6002:34;5997:2;5982:18;;5975:62;6069:2;6054:18;;5722:356::o;6083:340::-;6285:2;6267:21;;;6324:2;6304:18;;;6297:30;-1:-1:-1;;;6358:2:1;6343:18;;6336:46;6414:2;6399:18;;6083:340::o;6428:184::-;6498:6;6551:2;6539:9;6530:7;6526:23;6522:32;6519:52;;;6567:1;6564;6557:12;6519:52;-1:-1:-1;6590:16:1;;6428:184;-1:-1:-1;6428:184:1:o;6617:245::-;6684:6;6737:2;6725:9;6716:7;6712:23;6708:32;6705:52;;;6753:1;6750;6743:12;6705:52;6785:9;6779:16;6804:28;6826:5;6804:28;:::i;6867:127::-;6928:10;6923:3;6919:20;6916:1;6909:31;6959:4;6956:1;6949:15;6983:4;6980:1;6973:15;6999:168;7039:7;7105:1;7101;7097:6;7093:14;7090:1;7087:21;7082:1;7075:9;7068:17;7064:45;7061:71;;;7112:18;;:::i;:::-;-1:-1:-1;7152:9:1;;6999:168::o;7172:217::-;7212:1;7238;7228:132;;7282:10;7277:3;7273:20;7270:1;7263:31;7317:4;7314:1;7307:15;7345:4;7342:1;7335:15;7228:132;-1:-1:-1;7374:9:1;;7172:217::o;7394:591::-;-1:-1:-1;;;;;7737:15:1;;;7719:34;;7784:2;7769:18;;7762:34;;;;7827:2;7812:18;;7805:34;;;;7870:2;7855:18;;7848:34;;;;7919:15;;;7913:3;7898:19;;7891:44;7699:3;7951:19;;7944:35;;;;7668:3;7653:19;;7394:591::o;7990:125::-;8030:4;8058:1;8055;8052:8;8049:34;;;8063:18;;:::i;:::-;-1:-1:-1;8100:9:1;;7990:125::o;8120:128::-;8160:3;8191:1;8187:6;8184:1;8181:13;8178:39;;;8197:18;;:::i;:::-;-1:-1:-1;8233:9:1;;8120:128::o;8253:422::-;8342:1;8385:5;8342:1;8399:270;8420:7;8410:8;8407:21;8399:270;;;8479:4;8475:1;8471:6;8467:17;8461:4;8458:27;8455:53;;;8488:18;;:::i;:::-;8538:7;8528:8;8524:22;8521:55;;;8558:16;;;;8521:55;8637:22;;;;8597:15;;;;8399:270;;;8403:3;8253:422;;;;;:::o;8680:806::-;8729:5;8759:8;8749:80;;-1:-1:-1;8800:1:1;8814:5;;8749:80;8848:4;8838:76;;-1:-1:-1;8885:1:1;8899:5;;8838:76;8930:4;8948:1;8943:59;;;;9016:1;9011:130;;;;8923:218;;8943:59;8973:1;8964:10;;8987:5;;;9011:130;9048:3;9038:8;9035:17;9032:43;;;9055:18;;:::i;:::-;-1:-1:-1;;9111:1:1;9097:16;;9126:5;;8923:218;;9225:2;9215:8;9212:16;9206:3;9200:4;9197:13;9193:36;9187:2;9177:8;9174:16;9169:2;9163:4;9160:12;9156:35;9153:77;9150:159;;;-1:-1:-1;9262:19:1;;;9294:5;;9150:159;9341:34;9366:8;9360:4;9341:34;:::i;:::-;9411:6;9407:1;9403:6;9399:19;9390:7;9387:32;9384:58;;;9422:18;;:::i;:::-;9460:20;;8680:806;-1:-1:-1;;;8680:806:1:o;9491:140::-;9549:5;9578:47;9619:4;9609:8;9605:19;9599:4;9578:47;:::i;10954:351::-;11156:2;11138:21;;;11195:2;11175:18;;;11168:30;11234:29;11229:2;11214:18;;11207:57;11296:2;11281:18;;10954:351::o;11310:204::-;11348:3;11384:4;11381:1;11377:12;11416:4;11413:1;11409:12;11451:3;11445:4;11441:14;11436:3;11433:23;11430:49;;;11459:18;;:::i;:::-;11495:13;;11310:204;-1:-1:-1;;;11310:204:1:o;20802:127::-;20863:10;20858:3;20854:20;20851:1;20844:31;20894:4;20891:1;20884:15;20918:4;20915:1;20908:15;20934:251;21004:6;21057:2;21045:9;21036:7;21032:23;21028:32;21025:52;;;21073:1;21070;21063:12;21025:52;21105:9;21099:16;21124:31;21149:5;21124:31;:::i;21190:980::-;21452:4;21500:3;21489:9;21485:19;21531:6;21520:9;21513:25;21557:2;21595:6;21590:2;21579:9;21575:18;21568:34;21638:3;21633:2;21622:9;21618:18;21611:31;21662:6;21697;21691:13;21728:6;21720;21713:22;21766:3;21755:9;21751:19;21744:26;;21805:2;21797:6;21793:15;21779:29;;21826:1;21836:195;21850:6;21847:1;21844:13;21836:195;;;21915:13;;-1:-1:-1;;;;;21911:39:1;21899:52;;22006:15;;;;21971:12;;;;21947:1;21865:9;21836:195;;;-1:-1:-1;;;;;;;22087:32:1;;;;22082:2;22067:18;;22060:60;-1:-1:-1;;;22151:3:1;22136:19;22129:35;22048:3;21190:980;-1:-1:-1;;;21190:980:1:o;22175:306::-;22263:6;22271;22279;22332:2;22320:9;22311:7;22307:23;22303:32;22300:52;;;22348:1;22345;22338:12;22300:52;22377:9;22371:16;22361:26;;22427:2;22416:9;22412:18;22406:25;22396:35;;22471:2;22460:9;22456:18;22450:25;22440:35;;22175:306;;;;;:::o;22486:127::-;22547:10;22542:3;22538:20;22535:1;22528:31;22578:4;22575:1;22568:15;22602:4;22599:1;22592:15

Swarm Source

ipfs://412e13734405e36d8bb5723387f22d1f79eb6b4e328ab4703aa98e60c6113b5c
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.