ETH Price: $2,491.86 (-1.08%)

Token

CatGirls ($CGRLS)
 

Overview

Max Total Supply

10,000,000 $CGRLS

Holders

47

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
90,000 $CGRLS

Value
$0.00
0x805c8d6e93747fe4a6a53e21f87845ea54d0bad2
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:
CatGirls

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-10
*/

/**

TG: https://t.me/CatGirlsPortal

NFT's - NFT Lottery - NFT Staking - Token Staking.

Supply: 10 000 000
Max Wallet: 200 000 (2%)
Max TX: 100 000 (1%)

Tax: 10% 

Liquidity: 4%
Marketing: 4%
Development: 2%

DO NOT BUY UNTIL CONTRACT ADDRESS IS POSTED IN TELEGRAM

*
*/

pragma solidity =0.8.7;

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

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

contract CatGirls 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 = 'CatGirls';
    string private constant _symbol = '$CGRLS';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 10000000 * 10**_decimals;

    //Amount to Swap variable
    uint256 currentAmountToSwap = 70000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (1%)
    uint16 public constant SellLimitDivider=100;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 0 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public Marketing=payable(0xb68A1a3aB92FE82adF7A4D01c307c328d16f7B3D);
    address public Development=payable(0x97A520b634Ea785373658E97D1Aaa6C6ee7D5FC1);
    //Uniswap router (Main & Testnet)
    address private uniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;


    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
	uint256 private MaxBuy = 100000 * 10**_decimals;

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 60; // 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 = 0; //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(uniswapV2Router);
        //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=10;
        _sellTax=10;
        _transferTax=10;

        _burnTax=0;
        _liquidityTax=25;
        _marketingTax=75;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(Marketing);
        _excluded.add(Development);
        _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 <= MaxBuy,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }
            tax=_buyTax;

        } else {//Transfer
            //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(Marketing).transfer((amount*75) / 100);
        payable(Development).transfer((amount-(amount*25) / 100));
        emit Transfer(address(this), Marketing, (amount*75) / 100);
        emit Transfer(address(this), Development, (amount-(amount*25) / 100));
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(Marketing).transfer((amount*75) / 100);
        payable(Development).transfer((amount-(amount*25) / 100));
        emit Transfer(address(this), Marketing, (amount*75) / 100);
        emit Transfer(address(this), Development, (amount-(amount*25) / 100));
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) external onlyOwner{
        manualConversion=manual;
        emit ContractChangedBool(manualConversion);
    }
	
	function TeamChangeMaxBuy(uint256 newMaxBuy) external onlyOwner{
      MaxBuy=newMaxBuy * 10**_decimals;
      emit ContractChanged(MaxBuy);
    }
    
    function TeamChangeMarketing(address newMarketing) external onlyOwner{
      require(newMarketing != address(0),
      "Error: Cannot be 0 address.");
      Marketing=payable(newMarketing);
      emit ContractChangedAddress(Marketing);
    }
    
    function TeamChangeDevelopment(address newDevelopment) external onlyOwner{
      require(newDevelopment != address(0),
      "Error: Cannot be 0 address.");
      Development=payable(newDevelopment);
      emit ContractChangedAddress(Development);
    }
	
	//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.");
        uniswapV2Router=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() external onlyOwner{
        tradingEnabled=true;
        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(Marketing, amount);
        emit Transfer(address(this), Marketing, amount);
        tWAddress = Marketing;
        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,) =Marketing.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":"Development","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevelopment","type":"address"}],"name":"TeamChangeDevelopment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketing","type":"address"}],"name":"TeamChangeMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"TeamChangeMaxBuy","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":"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"}]

6080604052620000126009600a62000549565b62000021906201117062000608565b600855600980546001600160a01b031990811673b68a1a3ab92fe82adf7a4d01c307c328d16f7b3d178255600a805482167397a520b634ea785373658e97d1aaa6c6ee7d5fc1178155600b8054909216737a250d5630b4cf539739df2c5dacb4c659f2488d1790915562000096919062000549565b620000a5906298968062000608565b600c819055600d819055600e55620000c06009600a62000549565b620000cf90620186a062000608565b600f55603c6011556000601255348015620000e957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600b54601480546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001ca57600080fd5b505afa158015620001df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002059190620004ab565b6001600160a01b031663c9c6539630601460009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026357600080fd5b505afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e9190620004ab565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e757600080fd5b505af1158015620002fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003229190620004ab565b601380546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003606009600a62000549565b6200036f906298968062000608565b6200037b9190620004dd565b600d5560646200038e6009600a62000549565b6200039d906298968062000608565b620003a99190620004dd565b600e5560006018556013805465ffffffffffff1916654b19000a0a0a179055600954620003ee906004906001600160a01b031662000439602090811b620022f917901c565b50600a5462000415906004906001600160a01b031662000439602090811b620022f917901c565b50620004313360046200043960201b620022f91790919060201c565b505062000640565b600062000450836001600160a01b03841662000459565b90505b92915050565b6000818152600183016020526040812054620004a25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000453565b50600062000453565b600060208284031215620004be57600080fd5b81516001600160a01b0381168114620004d657600080fd5b9392505050565b600082620004fb57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115620005415781600019048211156200052557620005256200062a565b808516156200053357918102915b93841c939080029062000505565b509250929050565b60006200045060ff841683600082620005655750600162000453565b81620005745750600062000453565b81600181146200058d57600281146200059857620005b8565b600191505062000453565b60ff841115620005ac57620005ac6200062a565b50506001821b62000453565b5060208310610133831016604e8410600b8410161715620005dd575081810a62000453565b620005e9838362000500565b80600019048211156200060057620006006200062a565b029392505050565b60008160001904831182151516156200062557620006256200062a565b500290565b634e487b7160e01b600052601160045260246000fd5b61396680620006506000396000f3fe6080604052600436106103605760003560e01c80636eb8c7f1116101c4578063a457c2d7116100f6578063db886f231161009a578063e803050c1161006c578063e803050c14610a88578063f2c816ae14610aa8578063f2fde38b14610ac8578063f9ab736614610ae857005b8063db886f23146109e2578063dd62ed3e14610a02578063e2fd002a14610a48578063e68f136a14610a6857005b8063b766a386116100d3578063b766a38614610978578063c3a3c03214610998578063c3f4f54f146109ad578063d11edf74146109c257005b8063a457c2d714610918578063a9059cbb14610938578063b58a56cd1461095857005b806386d0ada81161016857806394e8075d1161013a57806394e8075d1461088957806395d89b41146108a95780639bf65770146108d85780639fa62d5f146108f857005b806386d0ada8146107ff578063893d20e8146108195780638da5cb5b1461084b578063929dffda1461086957005b8063715018a6116101a1578063715018a6146107aa578063762bb282146107bf5780637b9e987a146107d5578063828e8b7e146107ea57005b80636eb8c7f11461072a5780636f89e4091461074a57806370a082311461077457005b8063395093511161029d5780634cdaf0ae1161024157806358e553651161021357806358e55365146106bf5780635c69f690146106d557806361cb2748146106ea5780636ea4caab1461070a57005b80634cdaf0ae146106545780634f91e48c1461067457806357ad67d11461068a57806358e1df92146106aa57005b80634476f35a1161027a5780634476f35a146105ea57806344f3c83a1461060a5780634ada218b146106205780634cbf8e241461063f57005b806339509351146105805780633c7a309b146105a05780633cc39b7a146105d457005b806323b872dd116103045780633054f8a3116102e15780633054f8a314610506578063311a869714610525578063313ce5671461054c57806335e82f3a1461056057005b806323b872dd14610466578063243b529a146104865780632973ef2d1461049b57005b80630fd99e161161033d5780630fd99e16146103ff57806314ddc0951461042757806318160ddd1461043c5780631eb25d131461045157005b806306fdde0314610369578063095ea7b3146103ac5780630fa5b215146103dc57005b3661036757005b005b34801561037557600080fd5b506040805180820190915260088152674361744769726c7360c01b60208201525b6040516103a3919061358c565b60405180910390f35b3480156103b857600080fd5b506103cc6103c73660046133f5565b610b08565b60405190151581526020016103a3565b3480156103e857600080fd5b506103f1610b1f565b6040519081526020016103a3565b34801561040b57600080fd5b50610414606481565b60405161ffff90911681526020016103a3565b34801561043357600080fd5b506018546103f1565b34801561044857600080fd5b50600c546103f1565b34801561045d57600080fd5b506103f1610d7a565b34801561047257600080fd5b506103cc6104813660046133b4565b610d96565b34801561049257600080fd5b50610367610e2d565b3480156104a757600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a3565b34801561051257600080fd5b506017546103cc90610100900460ff1681565b34801561053157600080fd5b5061053a603281565b60405160ff90911681526020016103a3565b34801561055857600080fd5b50600961053a565b34801561056c57600080fd5b5061036761057b366004613341565b610e70565b34801561058c57600080fd5b506103cc61059b3660046133f5565b610eda565b3480156105ac57600080fd5b506105b5610f11565b604080516001600160a01b0390931683526020830191909152016103a3565b3480156105e057600080fd5b506103f160165481565b3480156105f657600080fd5b5061036761060536600461345b565b6110c4565b34801561061657600080fd5b506103f160185481565b34801561062c57600080fd5b506019546103cc90610100900460ff1681565b34801561064b57600080fd5b506103676112b9565b34801561066057600080fd5b5061036761066f366004613341565b6113ad565b34801561068057600080fd5b506103f1600e5481565b34801561069657600080fd5b506103676106a53660046134dd565b611436565b3480156106b657600080fd5b506103676117cb565b3480156106cb57600080fd5b506103f160155481565b3480156106e157600080fd5b50610414600081565b3480156106f657600080fd5b50610367610705366004613341565b611829565b34801561071657600080fd5b5061036761072536600461345b565b61186d565b34801561073657600080fd5b5061036761074536600461345b565b6118db565b34801561075657600080fd5b5061075f61194a565b604080519283526020830191909152016103a3565b34801561078057600080fd5b506103f161078f366004613341565b6001600160a01b031660009081526001602052604090205490565b3480156107b657600080fd5b50610367611987565b3480156107cb57600080fd5b506103f1600d5481565b3480156107e157600080fd5b50610367611a0a565b3480156107f657600080fd5b50610367611a58565b34801561080b57600080fd5b506019546103cc9060ff1681565b34801561082557600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103a3565b34801561085757600080fd5b506000546001600160a01b0316610833565b34801561087557600080fd5b50610367610884366004613341565b611a7c565b34801561089557600080fd5b50600a54610833906001600160a01b031681565b3480156108b557600080fd5b50604080518082019091526006815265244347524c5360d01b6020820152610396565b3480156108e457600080fd5b506103676108f3366004613421565b611b13565b34801561090457600080fd5b5061036761091336600461348d565b611b91565b34801561092457600080fd5b506103cc6109333660046133f5565b611daa565b34801561094457600080fd5b506103cc6109533660046133f5565b611e26565b34801561096457600080fd5b50610367610973366004613341565b611e33565b34801561098457600080fd5b50610367610993366004613421565b611eca565b3480156109a457600080fd5b506103f1611f52565b3480156109b957600080fd5b506103f1611f72565b3480156109ce57600080fd5b506103676109dd36600461345b565b611fb0565b3480156109ee57600080fd5b50600954610833906001600160a01b031681565b348015610a0e57600080fd5b506103f1610a1d36600461337b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a5457600080fd5b50610367610a6336600461345b565b61200a565b348015610a7457600080fd5b50610367610a83366004613341565b6120ab565b348015610a9457600080fd5b506103f1610aa3366004613341565b612142565b348015610ab457600080fd5b50610367610ac3366004613341565b61217c565b348015610ad457600080fd5b50610367610ae3366004613341565b6121c0565b348015610af457600080fd5b50610367610b03366004613341565b6122b9565b6000610b1533848461230e565b5060015b92915050565b600033610b346000546001600160a01b031690565b6001600160a01b031614610b635760405162461bcd60e51b8152600401610b5a9061360b565b60405180910390fd5b601a54421015610b855760405162461bcd60e51b8152600401610b5a906135e1565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190613474565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c5a57600080fd5b505af1158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c92919061343e565b5060145447906001600160a01b031663af2979eb30846064610cb582604b613835565b610cbf9190613725565b6064610ccc88604b613835565b610cd69190613725565b30426040518763ffffffff1660e01b8152600401610cf996959493929190613551565b602060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b9190613474565b506000610d588247613854565b90508060156000828254610d6c91906136e8565b909155509094505050505090565b610d866009600a61378a565b610d939062989680613835565b81565b6000610da3848484612401565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e0e5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b5a565b610e228533610e1d8685613854565b61230e565b506001949350505050565b33610e406000546001600160a01b031690565b6001600160a01b031614610e665760405162461bcd60e51b8152600401610b5a9061360b565b610e6e61265e565b565b33610e836000546001600160a01b031690565b6001600160a01b031614610ea95760405162461bcd60e51b8152600401610b5a9061360b565b610eb46006826127b1565b506040516001600160a01b0382169060008051602061391183398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b15918590610e1d9086906136e8565b60008033610f276000546001600160a01b031690565b6001600160a01b031614610f4d5760405162461bcd60e51b8152600401610b5a9061360b565b601a54421015610f6f5760405162461bcd60e51b8152600401610b5a906135e1565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fbc57600080fd5b505afa158015610fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff49190613474565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c919061343e565b506009546040518281526001600160a01b039091169030906000805160206138f18339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110d76000546001600160a01b031690565b6001600160a01b0316146110fd5760405162461bcd60e51b8152600401610b5a9061360b565b6015548111156111655760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b5a565b80601560008282546111779190613854565b90915550506009546001600160a01b03166108fc606461119884604b613835565b6111a29190613725565b6040518115909202916000818181858888f193505050501580156111ca573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111e7846019613835565b6111f19190613725565b6111fb9084613854565b6040518115909202916000818181858888f19350505050158015611223573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138f1833981519152606461124d85604b613835565b6112579190613725565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138f18339815191526064611291856019613835565b61129b9190613725565b6112a59085613854565b60405190815260200160405180910390a350565b336112cc6000546001600160a01b031690565b6001600160a01b0316146112f25760405162461bcd60e51b8152600401610b5a9061360b565b601a544210156113145760405162461bcd60e51b8152600401610b5a906135e1565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611361576040519150601f19603f3d011682016040523d82523d6000602084013e611366565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b5a565b50565b336113c06000546001600160a01b031690565b6001600160a01b0316146113e65760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b03811661140c5760405162461bcd60e51b8152600401610b5a90613640565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114496000546001600160a01b031690565b6001600160a01b03161461146f5760405162461bcd60e51b8152600401610b5a9061360b565b60008461147c8789613700565b6114869190613700565b90508060ff166064146114ea5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b5a565b60148460ff1611156115645760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b5a565b60148360ff1611156115de5760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b5a565b60148260ff1611156116635760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b5a565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138d183398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138d183398151915290600090a260135460405160ff909116906000805160206138d183398151915290600090a260135460405161010090910460ff16906000805160206138d183398151915290600090a26013546040516201000090910460ff16906000805160206138d183398151915290600090a250505050505050565b336117de6000546001600160a01b031690565b6001600160a01b0316146118045760405162461bcd60e51b8152600401610b5a9061360b565b6015805460009091556009546001600160a01b03166108fc606461119884604b613835565b3361183c6000546001600160a01b031690565b6001600160a01b0316146118625760405162461bcd60e51b8152600401610b5a9061360b565b610eb46004826127b1565b336118806000546001600160a01b031690565b6001600160a01b0316146118a65760405162461bcd60e51b8152600401610b5a9061360b565b6118b26009600a61378a565b6118bc9082613835565b600f8190556040516000805160206138d183398151915290600090a250565b336118ee6000546001600160a01b031690565b6001600160a01b0316146119145760405162461bcd60e51b8152600401610b5a9061360b565b61192661192142836136e8565b6127c6565b61193042826136e8565b6040516000805160206138d183398151915290600090a250565b6000806119596009600a61378a565b600d546119669190613725565b6119726009600a61378a565b600e5461197f9190613725565b915091509091565b3361199a6000546001600160a01b031690565b6001600160a01b0316146119c05760405162461bcd60e51b8152600401610b5a9061360b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b33611a1d6000546001600160a01b031690565b6001600160a01b031614611a435760405162461bcd60e51b8152600401610b5a9061360b565b6019805461ff00191661010017905542601055565b601854611a6590426136e8565b33600090815260036020526040902055565b905090565b33611a8f6000546001600160a01b031690565b6001600160a01b031614611ab55760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b038116611adb5760405162461bcd60e51b8152600401610b5a90613640565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061391183398151915290600090a250565b33611b266000546001600160a01b031690565b6001600160a01b031614611b4c5760405162461bcd60e51b8152600401610b5a9061360b565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611ba46000546001600160a01b031690565b6001600160a01b031614611bca5760405162461bcd60e51b8152600401610b5a9061360b565b6064600c54611bd99190613725565b8110611c455760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b5a565b611c516009600a61378a565b611c5b9083613835565b9150611c696009600a61378a565b611c739082613835565b90506000603260ff16600c54611c899190613725565b90506000606461ffff16600c54611ca09190613725565b905081841015611d065760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b5a565b80831015611d675760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b5a565b600d849055600e83905560405184906000805160206138d183398151915290600090a2600e546040516000805160206138d183398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611e0d5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b5a565b611e1c3385610e1d8685613854565b5060019392505050565b6000610b15338484612401565b33611e466000546001600160a01b031690565b6001600160a01b031614611e6c5760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b038116611e925760405162461bcd60e51b8152600401610b5a90613640565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061391183398151915290600090a250565b33611edd6000546001600160a01b031690565b6001600160a01b031614611f035760405162461bcd60e51b8152600401610b5a9061360b565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f6c5742601a54611a779190613854565b50600090565b6000611f806009600a61378a565b600c54611f8f6009600a61378a565b611f9c9062989680613835565b611fa69190613854565b611a779190613725565b33611fc36000546001600160a01b031690565b6001600160a01b031614611fe95760405162461bcd60e51b8152600401610b5a9061360b565b600881905560405181906000805160206138d183398151915290600090a250565b3361201d6000546001600160a01b031690565b6001600160a01b0316146120435760405162461bcd60e51b8152600401610b5a9061360b565b801561208a5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b5a565b601881905560405181906000805160206138d183398151915290600090a250565b336120be6000546001600160a01b031690565b6001600160a01b0316146120e45760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b03811661210a5760405162461bcd60e51b8152600401610b5a90613640565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061391183398151915290600090a250565b6001600160a01b03811660009081526003602052604081205442811161216b5750600092915050565b6121754282613854565b9392505050565b3361218f6000546001600160a01b031690565b6001600160a01b0316146121b55760405162461bcd60e51b8152600401610b5a9061360b565b610eb46006826122f9565b336121d36000546001600160a01b031690565b6001600160a01b0316146121f95760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b03811661225e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b5a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122cc6000546001600160a01b031690565b6001600160a01b0316146122f25760405162461bcd60e51b8152600401610b5a9061360b565b610eb46004825b6000612175836001600160a01b038416612850565b6001600160a01b0383166123585760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b5a565b6001600160a01b0382166123a05760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b5a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661244c5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b5a565b6001600160a01b0382166124955760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b5a565b60006124a260048561289f565b806124b357506124b360048461289f565b905060006001600160a01b0385163014806124d657506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125185750816001600160a01b0316866001600160a01b0316145b8061255357506013546001600160a01b03878116600160301b909204161480156125535750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b90920416148061258d5750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125c75750836001600160a01b0316886001600160a01b0316145b905084806125d25750825b806125da5750855b156125ef576125ea8989896128c1565b612653565b601954610100900460ff166126465760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b5a565b612653898989858561297a565b505050505050505050565b6017805460ff1916600190811790915530600090815260209190915260408120546013549091906126a690640100000000810460ff9081169165010000000000900416613700565b60ff16905060006008549050808310806126c2575061ffff8216155b156126cf575050506127a5565b60135460009061ffff8416906126f090640100000000900460ff1684613835565b6126fa9190613725565b905060006127088284613854565b90506000612717600284613725565b905060006127258285613854565b9050600061273384836136e8565b90504761273f82612f34565b600061274b8247613854565b905060008361275a8684613835565b6127649190613725565b9050612770868261309c565b506000905061277f8447613854565b9050806015600082825461279391906136e8565b90915550505050505050505050505050505b6017805460ff19169055565b6000612175836001600160a01b0384166131a1565b601a54811161282f5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b5a565b601a81905560405181906000805160206138d183398151915290600090a250565b600081815260018301602052604081205461289757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b19565b506000610b19565b6001600160a01b03811660009081526001830160205260408120541515612175565b6001600160a01b038316600090815260016020526040902054818110156129255760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b5a565b61292f848361328e565b61293983836132d3565b826001600160a01b0316846001600160a01b03166000805160206138f18339815191528460405161296c91815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129e85760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b5a565b60008315612afb57600e54861115612a345760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b5a565b612a3f60068961289f565b15612a835760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b5a565b601154601054612a9391906136e8565b4211158015612aa457506012546001145b15612aea57612ab46006896122f9565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612de1565b8415612c6e57600d54612b0e87856136e8565b1115612b4f5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b5a565b600f54861115612bac5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b5a565b612bb760068861289f565b15612bfb5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b5a565b601154601054612c0b91906136e8565b4211158015612c1c57506012546001145b15612c6257612c2c6006886122f9565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612de1565b612c7960068961289f565b15612cc65760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b5a565b612cd160068861289f565b15612d1e5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b5a565b600d54612d2b87856136e8565b1115612d6c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b5a565b601154601054612d7c91906136e8565b4211158015612d8d57506012546001145b15612dd357612d9d6006896122f9565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612e09575060195460ff16155b8015612e18575060175460ff16155b8015612e215750835b15612e2e57612e2e61265e565b6000612e4a8783601360039054906101000a900460ff166132f7565b601354909150600090612e809089908590612e7b9060ff640100000000820481169165010000000000900416613700565b6132f7565b90506000612e8e82846136e8565b612e98908a613854565b9050612ea48b8a61328e565b3060009081526001602052604081208054849290612ec39084906136e8565b9250508190555082600c6000828254612edc9190613854565b90915550612eec90508a826132d3565b896001600160a01b03168b6001600160a01b03166000805160206138f183398151915283604051612f1f91815260200190565b60405180910390a35050505050505050505050565b601454612f4c9030906001600160a01b03168361230e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8157612f81613897565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fd557600080fd5b505afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d919061335e565b8160018151811061302057613020613897565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac94790613066908590600090869030904290600401613677565b600060405180830381600087803b15801561308057600080fd5b505af1158015613094573d6000803e3d6000fd5b505050505050565b60008082601660008282546130b191906136e8565b909155506000905060646130c685604b613835565b6130d09190613725565b9050600060646130e187604b613835565b6130eb9190613725565b6014549091506131069030906001600160a01b03168861230e565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906131429030908b908790899084904290600401613551565b6060604051808303818588803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061319491906134af565b5096979596505050505050565b600081815260018301602052604081205480156132845760006131c5600183613854565b85549091506000906131d990600190613854565b905060008660000182815481106131f2576131f2613897565b906000526020600020015490508087600001848154811061321557613215613897565b60009182526020808320909101929092558281526001890190915260409020849055865487908061324857613248613881565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b19565b6000915050610b19565b6001600160a01b0382166000908152600160205260408120546132b2908390613854565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132b29083906136e8565b60006127108260ff168460ff168661330f9190613835565b6133199190613835565b6133239190613725565b949350505050565b803560ff8116811461333c57600080fd5b919050565b60006020828403121561335357600080fd5b8135612175816138ad565b60006020828403121561337057600080fd5b8151612175816138ad565b6000806040838503121561338e57600080fd5b8235613399816138ad565b915060208301356133a9816138ad565b809150509250929050565b6000806000606084860312156133c957600080fd5b83356133d4816138ad565b925060208401356133e4816138ad565b929592945050506040919091013590565b6000806040838503121561340857600080fd5b8235613413816138ad565b946020939093013593505050565b60006020828403121561343357600080fd5b8135612175816138c2565b60006020828403121561345057600080fd5b8151612175816138c2565b60006020828403121561346d57600080fd5b5035919050565b60006020828403121561348657600080fd5b5051919050565b600080604083850312156134a057600080fd5b50508035926020909101359150565b6000806000606084860312156134c457600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156134f657600080fd5b6134ff8761332b565b955061350d6020880161332b565b945061351b6040880161332b565b93506135296060880161332b565b92506135376080880161332b565b915061354560a0880161332b565b90509295509295509295565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208083528351808285015260005b818110156135b95785810183015185820160400152820161359d565b818111156135cb576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136c75784516001600160a01b0316835293830193918301916001016136a2565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156136fb576136fb61386b565b500190565b600060ff821660ff84168060ff0382111561371d5761371d61386b565b019392505050565b60008261374257634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156137825781600019048211156137685761376861386b565b8085161561377557918102915b93841c939080029061374c565b509250929050565b600061217560ff8416836000826137a357506001610b19565b816137b057506000610b19565b81600181146137c657600281146137d0576137ec565b6001915050610b19565b60ff8411156137e1576137e161386b565b50506001821b610b19565b5060208310610133831016604e8410600b841016171561380f575081810a610b19565b6138198383613747565b806000190482111561382d5761382d61386b565b029392505050565b600081600019048311821515161561384f5761384f61386b565b500290565b6000828210156138665761386661386b565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146113aa57600080fd5b80151581146113aa57600080fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212207c0efec115a651872a73b3310800796434b657df11635360fb4eadd3191275a564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103605760003560e01c80636eb8c7f1116101c4578063a457c2d7116100f6578063db886f231161009a578063e803050c1161006c578063e803050c14610a88578063f2c816ae14610aa8578063f2fde38b14610ac8578063f9ab736614610ae857005b8063db886f23146109e2578063dd62ed3e14610a02578063e2fd002a14610a48578063e68f136a14610a6857005b8063b766a386116100d3578063b766a38614610978578063c3a3c03214610998578063c3f4f54f146109ad578063d11edf74146109c257005b8063a457c2d714610918578063a9059cbb14610938578063b58a56cd1461095857005b806386d0ada81161016857806394e8075d1161013a57806394e8075d1461088957806395d89b41146108a95780639bf65770146108d85780639fa62d5f146108f857005b806386d0ada8146107ff578063893d20e8146108195780638da5cb5b1461084b578063929dffda1461086957005b8063715018a6116101a1578063715018a6146107aa578063762bb282146107bf5780637b9e987a146107d5578063828e8b7e146107ea57005b80636eb8c7f11461072a5780636f89e4091461074a57806370a082311461077457005b8063395093511161029d5780634cdaf0ae1161024157806358e553651161021357806358e55365146106bf5780635c69f690146106d557806361cb2748146106ea5780636ea4caab1461070a57005b80634cdaf0ae146106545780634f91e48c1461067457806357ad67d11461068a57806358e1df92146106aa57005b80634476f35a1161027a5780634476f35a146105ea57806344f3c83a1461060a5780634ada218b146106205780634cbf8e241461063f57005b806339509351146105805780633c7a309b146105a05780633cc39b7a146105d457005b806323b872dd116103045780633054f8a3116102e15780633054f8a314610506578063311a869714610525578063313ce5671461054c57806335e82f3a1461056057005b806323b872dd14610466578063243b529a146104865780632973ef2d1461049b57005b80630fd99e161161033d5780630fd99e16146103ff57806314ddc0951461042757806318160ddd1461043c5780631eb25d131461045157005b806306fdde0314610369578063095ea7b3146103ac5780630fa5b215146103dc57005b3661036757005b005b34801561037557600080fd5b506040805180820190915260088152674361744769726c7360c01b60208201525b6040516103a3919061358c565b60405180910390f35b3480156103b857600080fd5b506103cc6103c73660046133f5565b610b08565b60405190151581526020016103a3565b3480156103e857600080fd5b506103f1610b1f565b6040519081526020016103a3565b34801561040b57600080fd5b50610414606481565b60405161ffff90911681526020016103a3565b34801561043357600080fd5b506018546103f1565b34801561044857600080fd5b50600c546103f1565b34801561045d57600080fd5b506103f1610d7a565b34801561047257600080fd5b506103cc6104813660046133b4565b610d96565b34801561049257600080fd5b50610367610e2d565b3480156104a757600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a3565b34801561051257600080fd5b506017546103cc90610100900460ff1681565b34801561053157600080fd5b5061053a603281565b60405160ff90911681526020016103a3565b34801561055857600080fd5b50600961053a565b34801561056c57600080fd5b5061036761057b366004613341565b610e70565b34801561058c57600080fd5b506103cc61059b3660046133f5565b610eda565b3480156105ac57600080fd5b506105b5610f11565b604080516001600160a01b0390931683526020830191909152016103a3565b3480156105e057600080fd5b506103f160165481565b3480156105f657600080fd5b5061036761060536600461345b565b6110c4565b34801561061657600080fd5b506103f160185481565b34801561062c57600080fd5b506019546103cc90610100900460ff1681565b34801561064b57600080fd5b506103676112b9565b34801561066057600080fd5b5061036761066f366004613341565b6113ad565b34801561068057600080fd5b506103f1600e5481565b34801561069657600080fd5b506103676106a53660046134dd565b611436565b3480156106b657600080fd5b506103676117cb565b3480156106cb57600080fd5b506103f160155481565b3480156106e157600080fd5b50610414600081565b3480156106f657600080fd5b50610367610705366004613341565b611829565b34801561071657600080fd5b5061036761072536600461345b565b61186d565b34801561073657600080fd5b5061036761074536600461345b565b6118db565b34801561075657600080fd5b5061075f61194a565b604080519283526020830191909152016103a3565b34801561078057600080fd5b506103f161078f366004613341565b6001600160a01b031660009081526001602052604090205490565b3480156107b657600080fd5b50610367611987565b3480156107cb57600080fd5b506103f1600d5481565b3480156107e157600080fd5b50610367611a0a565b3480156107f657600080fd5b50610367611a58565b34801561080b57600080fd5b506019546103cc9060ff1681565b34801561082557600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103a3565b34801561085757600080fd5b506000546001600160a01b0316610833565b34801561087557600080fd5b50610367610884366004613341565b611a7c565b34801561089557600080fd5b50600a54610833906001600160a01b031681565b3480156108b557600080fd5b50604080518082019091526006815265244347524c5360d01b6020820152610396565b3480156108e457600080fd5b506103676108f3366004613421565b611b13565b34801561090457600080fd5b5061036761091336600461348d565b611b91565b34801561092457600080fd5b506103cc6109333660046133f5565b611daa565b34801561094457600080fd5b506103cc6109533660046133f5565b611e26565b34801561096457600080fd5b50610367610973366004613341565b611e33565b34801561098457600080fd5b50610367610993366004613421565b611eca565b3480156109a457600080fd5b506103f1611f52565b3480156109b957600080fd5b506103f1611f72565b3480156109ce57600080fd5b506103676109dd36600461345b565b611fb0565b3480156109ee57600080fd5b50600954610833906001600160a01b031681565b348015610a0e57600080fd5b506103f1610a1d36600461337b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a5457600080fd5b50610367610a6336600461345b565b61200a565b348015610a7457600080fd5b50610367610a83366004613341565b6120ab565b348015610a9457600080fd5b506103f1610aa3366004613341565b612142565b348015610ab457600080fd5b50610367610ac3366004613341565b61217c565b348015610ad457600080fd5b50610367610ae3366004613341565b6121c0565b348015610af457600080fd5b50610367610b03366004613341565b6122b9565b6000610b1533848461230e565b5060015b92915050565b600033610b346000546001600160a01b031690565b6001600160a01b031614610b635760405162461bcd60e51b8152600401610b5a9061360b565b60405180910390fd5b601a54421015610b855760405162461bcd60e51b8152600401610b5a906135e1565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bd257600080fd5b505afa158015610be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0a9190613474565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c5a57600080fd5b505af1158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c92919061343e565b5060145447906001600160a01b031663af2979eb30846064610cb582604b613835565b610cbf9190613725565b6064610ccc88604b613835565b610cd69190613725565b30426040518763ffffffff1660e01b8152600401610cf996959493929190613551565b602060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b9190613474565b506000610d588247613854565b90508060156000828254610d6c91906136e8565b909155509094505050505090565b610d866009600a61378a565b610d939062989680613835565b81565b6000610da3848484612401565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e0e5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b5a565b610e228533610e1d8685613854565b61230e565b506001949350505050565b33610e406000546001600160a01b031690565b6001600160a01b031614610e665760405162461bcd60e51b8152600401610b5a9061360b565b610e6e61265e565b565b33610e836000546001600160a01b031690565b6001600160a01b031614610ea95760405162461bcd60e51b8152600401610b5a9061360b565b610eb46006826127b1565b506040516001600160a01b0382169060008051602061391183398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b15918590610e1d9086906136e8565b60008033610f276000546001600160a01b031690565b6001600160a01b031614610f4d5760405162461bcd60e51b8152600401610b5a9061360b565b601a54421015610f6f5760405162461bcd60e51b8152600401610b5a906135e1565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fbc57600080fd5b505afa158015610fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff49190613474565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c919061343e565b506009546040518281526001600160a01b039091169030906000805160206138f18339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110d76000546001600160a01b031690565b6001600160a01b0316146110fd5760405162461bcd60e51b8152600401610b5a9061360b565b6015548111156111655760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b5a565b80601560008282546111779190613854565b90915550506009546001600160a01b03166108fc606461119884604b613835565b6111a29190613725565b6040518115909202916000818181858888f193505050501580156111ca573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111e7846019613835565b6111f19190613725565b6111fb9084613854565b6040518115909202916000818181858888f19350505050158015611223573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138f1833981519152606461124d85604b613835565b6112579190613725565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138f18339815191526064611291856019613835565b61129b9190613725565b6112a59085613854565b60405190815260200160405180910390a350565b336112cc6000546001600160a01b031690565b6001600160a01b0316146112f25760405162461bcd60e51b8152600401610b5a9061360b565b601a544210156113145760405162461bcd60e51b8152600401610b5a906135e1565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611361576040519150601f19603f3d011682016040523d82523d6000602084013e611366565b606091505b50509050806113aa5760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b5a565b50565b336113c06000546001600160a01b031690565b6001600160a01b0316146113e65760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b03811661140c5760405162461bcd60e51b8152600401610b5a90613640565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114496000546001600160a01b031690565b6001600160a01b03161461146f5760405162461bcd60e51b8152600401610b5a9061360b565b60008461147c8789613700565b6114869190613700565b90508060ff166064146114ea5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b5a565b60148460ff1611156115645760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b5a565b60148360ff1611156115de5760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b5a565b60148260ff1611156116635760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b5a565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138d183398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138d183398151915290600090a260135460405160ff909116906000805160206138d183398151915290600090a260135460405161010090910460ff16906000805160206138d183398151915290600090a26013546040516201000090910460ff16906000805160206138d183398151915290600090a250505050505050565b336117de6000546001600160a01b031690565b6001600160a01b0316146118045760405162461bcd60e51b8152600401610b5a9061360b565b6015805460009091556009546001600160a01b03166108fc606461119884604b613835565b3361183c6000546001600160a01b031690565b6001600160a01b0316146118625760405162461bcd60e51b8152600401610b5a9061360b565b610eb46004826127b1565b336118806000546001600160a01b031690565b6001600160a01b0316146118a65760405162461bcd60e51b8152600401610b5a9061360b565b6118b26009600a61378a565b6118bc9082613835565b600f8190556040516000805160206138d183398151915290600090a250565b336118ee6000546001600160a01b031690565b6001600160a01b0316146119145760405162461bcd60e51b8152600401610b5a9061360b565b61192661192142836136e8565b6127c6565b61193042826136e8565b6040516000805160206138d183398151915290600090a250565b6000806119596009600a61378a565b600d546119669190613725565b6119726009600a61378a565b600e5461197f9190613725565b915091509091565b3361199a6000546001600160a01b031690565b6001600160a01b0316146119c05760405162461bcd60e51b8152600401610b5a9061360b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b33611a1d6000546001600160a01b031690565b6001600160a01b031614611a435760405162461bcd60e51b8152600401610b5a9061360b565b6019805461ff00191661010017905542601055565b601854611a6590426136e8565b33600090815260036020526040902055565b905090565b33611a8f6000546001600160a01b031690565b6001600160a01b031614611ab55760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b038116611adb5760405162461bcd60e51b8152600401610b5a90613640565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061391183398151915290600090a250565b33611b266000546001600160a01b031690565b6001600160a01b031614611b4c5760405162461bcd60e51b8152600401610b5a9061360b565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611ba46000546001600160a01b031690565b6001600160a01b031614611bca5760405162461bcd60e51b8152600401610b5a9061360b565b6064600c54611bd99190613725565b8110611c455760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b5a565b611c516009600a61378a565b611c5b9083613835565b9150611c696009600a61378a565b611c739082613835565b90506000603260ff16600c54611c899190613725565b90506000606461ffff16600c54611ca09190613725565b905081841015611d065760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b5a565b80831015611d675760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b5a565b600d849055600e83905560405184906000805160206138d183398151915290600090a2600e546040516000805160206138d183398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611e0d5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b5a565b611e1c3385610e1d8685613854565b5060019392505050565b6000610b15338484612401565b33611e466000546001600160a01b031690565b6001600160a01b031614611e6c5760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b038116611e925760405162461bcd60e51b8152600401610b5a90613640565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061391183398151915290600090a250565b33611edd6000546001600160a01b031690565b6001600160a01b031614611f035760405162461bcd60e51b8152600401610b5a9061360b565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f6c5742601a54611a779190613854565b50600090565b6000611f806009600a61378a565b600c54611f8f6009600a61378a565b611f9c9062989680613835565b611fa69190613854565b611a779190613725565b33611fc36000546001600160a01b031690565b6001600160a01b031614611fe95760405162461bcd60e51b8152600401610b5a9061360b565b600881905560405181906000805160206138d183398151915290600090a250565b3361201d6000546001600160a01b031690565b6001600160a01b0316146120435760405162461bcd60e51b8152600401610b5a9061360b565b801561208a5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b5a565b601881905560405181906000805160206138d183398151915290600090a250565b336120be6000546001600160a01b031690565b6001600160a01b0316146120e45760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b03811661210a5760405162461bcd60e51b8152600401610b5a90613640565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061391183398151915290600090a250565b6001600160a01b03811660009081526003602052604081205442811161216b5750600092915050565b6121754282613854565b9392505050565b3361218f6000546001600160a01b031690565b6001600160a01b0316146121b55760405162461bcd60e51b8152600401610b5a9061360b565b610eb46006826122f9565b336121d36000546001600160a01b031690565b6001600160a01b0316146121f95760405162461bcd60e51b8152600401610b5a9061360b565b6001600160a01b03811661225e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b5a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122cc6000546001600160a01b031690565b6001600160a01b0316146122f25760405162461bcd60e51b8152600401610b5a9061360b565b610eb46004825b6000612175836001600160a01b038416612850565b6001600160a01b0383166123585760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b5a565b6001600160a01b0382166123a05760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b5a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661244c5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b5a565b6001600160a01b0382166124955760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b5a565b60006124a260048561289f565b806124b357506124b360048461289f565b905060006001600160a01b0385163014806124d657506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125185750816001600160a01b0316866001600160a01b0316145b8061255357506013546001600160a01b03878116600160301b909204161480156125535750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b90920416148061258d5750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125c75750836001600160a01b0316886001600160a01b0316145b905084806125d25750825b806125da5750855b156125ef576125ea8989896128c1565b612653565b601954610100900460ff166126465760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b5a565b612653898989858561297a565b505050505050505050565b6017805460ff1916600190811790915530600090815260209190915260408120546013549091906126a690640100000000810460ff9081169165010000000000900416613700565b60ff16905060006008549050808310806126c2575061ffff8216155b156126cf575050506127a5565b60135460009061ffff8416906126f090640100000000900460ff1684613835565b6126fa9190613725565b905060006127088284613854565b90506000612717600284613725565b905060006127258285613854565b9050600061273384836136e8565b90504761273f82612f34565b600061274b8247613854565b905060008361275a8684613835565b6127649190613725565b9050612770868261309c565b506000905061277f8447613854565b9050806015600082825461279391906136e8565b90915550505050505050505050505050505b6017805460ff19169055565b6000612175836001600160a01b0384166131a1565b601a54811161282f5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b5a565b601a81905560405181906000805160206138d183398151915290600090a250565b600081815260018301602052604081205461289757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b19565b506000610b19565b6001600160a01b03811660009081526001830160205260408120541515612175565b6001600160a01b038316600090815260016020526040902054818110156129255760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b5a565b61292f848361328e565b61293983836132d3565b826001600160a01b0316846001600160a01b03166000805160206138f18339815191528460405161296c91815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129e85760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b5a565b60008315612afb57600e54861115612a345760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b5a565b612a3f60068961289f565b15612a835760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b5a565b601154601054612a9391906136e8565b4211158015612aa457506012546001145b15612aea57612ab46006896122f9565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612de1565b8415612c6e57600d54612b0e87856136e8565b1115612b4f5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b5a565b600f54861115612bac5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b5a565b612bb760068861289f565b15612bfb5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b5a565b601154601054612c0b91906136e8565b4211158015612c1c57506012546001145b15612c6257612c2c6006886122f9565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612de1565b612c7960068961289f565b15612cc65760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b5a565b612cd160068861289f565b15612d1e5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b5a565b600d54612d2b87856136e8565b1115612d6c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b5a565b601154601054612d7c91906136e8565b4211158015612d8d57506012546001145b15612dd357612d9d6006896122f9565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612e09575060195460ff16155b8015612e18575060175460ff16155b8015612e215750835b15612e2e57612e2e61265e565b6000612e4a8783601360039054906101000a900460ff166132f7565b601354909150600090612e809089908590612e7b9060ff640100000000820481169165010000000000900416613700565b6132f7565b90506000612e8e82846136e8565b612e98908a613854565b9050612ea48b8a61328e565b3060009081526001602052604081208054849290612ec39084906136e8565b9250508190555082600c6000828254612edc9190613854565b90915550612eec90508a826132d3565b896001600160a01b03168b6001600160a01b03166000805160206138f183398151915283604051612f1f91815260200190565b60405180910390a35050505050505050505050565b601454612f4c9030906001600160a01b03168361230e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8157612f81613897565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fd557600080fd5b505afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d919061335e565b8160018151811061302057613020613897565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac94790613066908590600090869030904290600401613677565b600060405180830381600087803b15801561308057600080fd5b505af1158015613094573d6000803e3d6000fd5b505050505050565b60008082601660008282546130b191906136e8565b909155506000905060646130c685604b613835565b6130d09190613725565b9050600060646130e187604b613835565b6130eb9190613725565b6014549091506131069030906001600160a01b03168861230e565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d7199087906131429030908b908790899084904290600401613551565b6060604051808303818588803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061319491906134af565b5096979596505050505050565b600081815260018301602052604081205480156132845760006131c5600183613854565b85549091506000906131d990600190613854565b905060008660000182815481106131f2576131f2613897565b906000526020600020015490508087600001848154811061321557613215613897565b60009182526020808320909101929092558281526001890190915260409020849055865487908061324857613248613881565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b19565b6000915050610b19565b6001600160a01b0382166000908152600160205260408120546132b2908390613854565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546132b29083906136e8565b60006127108260ff168460ff168661330f9190613835565b6133199190613835565b6133239190613725565b949350505050565b803560ff8116811461333c57600080fd5b919050565b60006020828403121561335357600080fd5b8135612175816138ad565b60006020828403121561337057600080fd5b8151612175816138ad565b6000806040838503121561338e57600080fd5b8235613399816138ad565b915060208301356133a9816138ad565b809150509250929050565b6000806000606084860312156133c957600080fd5b83356133d4816138ad565b925060208401356133e4816138ad565b929592945050506040919091013590565b6000806040838503121561340857600080fd5b8235613413816138ad565b946020939093013593505050565b60006020828403121561343357600080fd5b8135612175816138c2565b60006020828403121561345057600080fd5b8151612175816138c2565b60006020828403121561346d57600080fd5b5035919050565b60006020828403121561348657600080fd5b5051919050565b600080604083850312156134a057600080fd5b50508035926020909101359150565b6000806000606084860312156134c457600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156134f657600080fd5b6134ff8761332b565b955061350d6020880161332b565b945061351b6040880161332b565b93506135296060880161332b565b92506135376080880161332b565b915061354560a0880161332b565b90509295509295509295565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208083528351808285015260005b818110156135b95785810183015185820160400152820161359d565b818111156135cb576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136c75784516001600160a01b0316835293830193918301916001016136a2565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156136fb576136fb61386b565b500190565b600060ff821660ff84168060ff0382111561371d5761371d61386b565b019392505050565b60008261374257634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156137825781600019048211156137685761376861386b565b8085161561377557918102915b93841c939080029061374c565b509250929050565b600061217560ff8416836000826137a357506001610b19565b816137b057506000610b19565b81600181146137c657600281146137d0576137ec565b6001915050610b19565b60ff8411156137e1576137e161386b565b50506001821b610b19565b5060208310610133831016604e8410600b841016171561380f575081810a610b19565b6138198383613747565b806000190482111561382d5761382d61386b565b029392505050565b600081600019048311821515161561384f5761384f61386b565b500290565b6000828210156138665761386661386b565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146113aa57600080fd5b80151581146113aa57600080fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda26469706673582212207c0efec115a651872a73b3310800796434b657df11635360fb4eadd3191275a564736f6c63430008070033

Deployed Bytecode Sourcemap

27685:28582:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53921:94;;;;;;;;;;-1:-1:-1;54002:5:0;;;;;;;;;;;;-1:-1:-1;;;54002:5:0;;;;53921:94;;;;;;;:::i;:::-;;;;;;;;54806:161;;;;;;;;;;-1:-1:-1;54806:161:0;;;;;:::i;:::-;;:::i;:::-;;;5289:14:1;;5282:22;5264:41;;5252:2;5237:18;54806:161:0;5124:187:1;52023:1015:0;;;;;;;;;;;;;:::i;:::-;;;17171:25:1;;;17159:2;17144:18;52023:1015:0;17025:177:1;28826:43:0;;;;;;;;;;;;28866:3;28826:43;;;;;17006:6:1;16994:19;;;16976:38;;16964:2;16949:18;28826:43:0;16832:188:1;42675:102:0;;;;;;;;;;-1:-1:-1;42758:11:0;;42675:102;;54231:108;;;;;;;;;;-1:-1:-1;54313:18:0;;54231:108;;28485:63;;;;;;;;;;;;;:::i;55280:392::-;;;;;;;;;;-1:-1:-1;55280:392:0;;;;;:::i;:::-;;:::i;48161:83::-;;;;;;;;;;;;;:::i;42079:249::-;;;;;;;;;;-1:-1:-1;42253:8:0;;42079:249;;;42253:8;;;;;;18732:25:1;;42262:13:0;;;;;18788:2:1;18773:18;;18766:34;42276:13:0;;;;;18816:18:1;;;18809:34;;;;42290:7:0;;;18874:2:1;18859:18;;18852:34;42253:8:0;42298;;;;18917:3:1;18902:19;;18895:35;42307:12:0;;;;;18961:3:1;18946:19;;18939:35;18719:3;18704:19;42079:249:0;18445:535:1;43146:27:0;;;;;;;;;;-1:-1:-1;43146:27:0;;;;;;;;;;;28713:44;;;;;;;;;;;;28755:2;28713:44;;;;;19157:4:1;19145:17;;;19127:36;;19115:2;19100:18;28713:44:0;18985:184:1;54129:94:0;;;;;;;;;;-1:-1:-1;28477:1:0;54129:94;;46760:201;;;;;;;;;;-1:-1:-1;46760:201:0;;;;;:::i;:::-;;:::i;55707:205::-;;;;;;;;;;-1:-1:-1;55707:205:0;;;;;:::i;:::-;;:::i;51273:692::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4441:32:1;;;4423:51;;4505:2;4490:18;;4483:34;;;;4396:18;51273:692:0;4249:274:1;38120:25:0;;;;;;;;;;;;;;;;43668:488;;;;;;;;;;-1:-1:-1;43668:488:0;;;;;:::i;:::-;;:::i;43180:26::-;;;;;;;;;;;;;;;;49781;;;;;;;;;;-1:-1:-1;49781:26:0;;;;;;;;;;;53124:267;;;;;;;;;;;;;:::i;50090:243::-;;;;;;;;;;-1:-1:-1;50090:243:0;;;;;:::i;:::-;;:::i;29769:46::-;;;;;;;;;;;;;;;;47059:1048;;;;;;;;;;-1:-1:-1;47059:1048:0;;;;;:::i;:::-;;:::i;43251:410::-;;;;;;;;;;;;;:::i;37382:31::-;;;;;;;;;;;;;;;;29006:48;;;;;;;;;;;;29045:9;29006:48;;46225:181;;;;;;;;;;-1:-1:-1;46225:181:0;;;;;:::i;:::-;;:::i;44412:149::-;;;;;;;;;;-1:-1:-1;44412:149:0;;;;;:::i;:::-;;:::i;50580:232::-;;;;;;;;;;-1:-1:-1;50580:232:0;;;;;:::i;:::-;;:::i;41920:151::-;;;;;;;;;;;;;:::i;:::-;;;;18366:25:1;;;18422:2;18407:18;;18400:34;;;;18339:18;41920:151:0;18192:248:1;54347:121:0;;;;;;;;;;-1:-1:-1;54347:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;54442:18:0;54415:7;54442:18;;;:9;:18;;;;;;;54347:121;9539:142;;;;;;;;;;;;;:::i;29713:49::-;;;;;;;;;;;;;;;;49895:129;;;;;;;;;;;;;:::i;42919:109::-;;;;;;;;;;;;;:::i;43213:28::-;;;;;;;;;;-1:-1:-1;43213:28:0;;;;;;;;53819:94;;;;;;;;;;-1:-1:-1;53871:7:0;8963:6;-1:-1:-1;;;;;8963:6:0;53819:94;;;-1:-1:-1;;;;;4205:32:1;;;4187:51;;4175:2;4160:18;53819:94:0;4041:203:1;8898:79:0;;;;;;;;;;-1:-1:-1;8936:7:0;8963:6;-1:-1:-1;;;;;8963:6:0;8898:79;;48256:247;;;;;;;;;;-1:-1:-1;48256:247:0;;;;;:::i;:::-;;:::i;29307:78::-;;;;;;;;;;-1:-1:-1;29307:78:0;;;;-1:-1:-1;;;;;29307:78:0;;;54023:98;;;;;;;;;;-1:-1:-1;54106:7:0;;;;;;;;;;;;-1:-1:-1;;;54106:7:0;;;;54023:98;;44241:165;;;;;;;;;;-1:-1:-1;44241:165:0;;;;;:::i;:::-;;:::i;48606:1045::-;;;;;;;;;;-1:-1:-1;48606:1045:0;;;;;:::i;:::-;;:::i;55920:342::-;;;;;;;;;;-1:-1:-1;55920:342:0;;;;;:::i;:::-;;:::i;54476:167::-;;;;;;;;;;-1:-1:-1;54476:167:0;;;;;:::i;:::-;;:::i;44573:246::-;;;;;;;;;;-1:-1:-1;44573:246:0;;;;;:::i;:::-;;:::i;45150:156::-;;;;;;;;;;-1:-1:-1;45150:156:0;;;;;:::i;:::-;;:::i;41551:222::-;;;;;;;;;;;;;:::i;41781:131::-;;;;;;;;;;;;;:::i;45745:179::-;;;;;;;;;;-1:-1:-1;45745:179:0;;;;;:::i;:::-;;:::i;29224:76::-;;;;;;;;;;-1:-1:-1;29224:76:0;;;;-1:-1:-1;;;;;29224:76:0;;;54651:147;;;;;;;;;;-1:-1:-1;54651:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;54762:19:0;;;54735:7;54762:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;54651:147;45375:246;;;;;;;;;;-1:-1:-1;45375:246:0;;;;;:::i;:::-;;:::i;44831:258::-;;;;;;;;;;-1:-1:-1;44831:258:0;;;;;:::i;:::-;;:::i;42394:275::-;;;;;;;;;;-1:-1:-1;42394:275:0;;;;;:::i;:::-;;:::i;46486:193::-;;;;;;;;;;-1:-1:-1;46486:193:0;;;;;:::i;:::-;;:::i;9836:238::-;;;;;;;;;;-1:-1:-1;9836:238:0;;;;;:::i;:::-;;:::i;45992:166::-;;;;;;;;;;-1:-1:-1;45992:166:0;;;;;:::i;:::-;;:::i;54806:161::-;54883:4;54900:37;54909:10;54921:7;54930:6;54900:8;:37::i;:::-;-1:-1:-1;54955:4:0;54806:161;;;;;:::o;52023:1015::-;52082:18;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;;;;;;;;;52198:20:::1;;52179:15;:39;;52171:68;;;;-1:-1:-1::0;;;52171:68:0::1;;;;;;;:::i;:::-;52299:22;::::0;52350:39:::1;::::0;-1:-1:-1;;;52350:39:0;;52383:4:::1;52350:39;::::0;::::1;4187:51:1::0;52299:22:0;;;::::1;-1:-1:-1::0;;;;;52299:22:0::1;::::0;52250:30:::1;::::0;52299:22;;52350:24:::1;::::0;4160:18:1;;52350:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52433:16;::::0;52402:56:::1;::::0;-1:-1:-1;;;52402:56:0;;-1:-1:-1;;;;;52433:16:0;;::::1;52402:56;::::0;::::1;4423:51:1::0;4490:18;;;4483:34;;;52333:56:0;;-1:-1:-1;52402:22:0;::::1;::::0;::::1;::::0;4396:18:1;;52402:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52601:16:0::1;::::0;52559:21:::1;::::0;-1:-1:-1;;;;;52601:16:0::1;:64;52688:4;52708:6:::0;52743:3:::1;52730:9;52708:6:::0;52737:2:::1;52730:9;:::i;:::-;52729:17;;;;:::i;:::-;52775:3;52762:9;:6:::0;52769:2:::1;52762:9;:::i;:::-;52761:17;;;;:::i;:::-;52801:4;52821:15;52601:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52862:21:0::1;52886:39;52908:17:::0;52886:21:::1;:39;:::i;:::-;52862:63;;52954:13;52936:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;52989:13:0;;-1:-1:-1;;;;;52023:1015:0;:::o;28485:63::-;28535:13;28477:1;28535:2;:13;:::i;:::-;28524:24;;:8;:24;:::i;:::-;28485:63;:::o;55280:392::-;55380:4;55397:36;55407:6;55415:9;55426:6;55397:9;:36::i;:::-;-1:-1:-1;;;;;55473:19:0;;55446:24;55473:19;;;:11;:19;;;;;;;;55493:10;55473:31;;;;;;;;55523:26;;;;55515:59;;;;-1:-1:-1;;;55515:59:0;;9870:2:1;55515:59:0;;;9852:21:1;9909:2;9889:18;;;9882:30;-1:-1:-1;;;9928:18:1;;;9921:50;9988:18;;55515:59:0;9668:344:1;55515:59:0;55587:55;55596:6;55604:10;55616:25;55635:6;55616:16;:25;:::i;:::-;55587:8;:55::i;:::-;-1:-1:-1;55660:4:0;;55280:392;-1:-1:-1;;;;55280:392:0:o;48161:83::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;48216:20:::1;:18;:20::i;:::-;48161:83::o:0;46760:201::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;46854:41:::1;:14;46876:18:::0;46854:21:::1;:41::i;:::-;-1:-1:-1::0;46911:42:0::1;::::0;-1:-1:-1;;;;;46911:42:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46911:42:0;;;::::1;46760:201:::0;:::o;55707:205::-;55815:10;55789:4;55836:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55836:32:0;;;;;;;;;;55789:4;;55806:76;;55827:7;;55836:45;;55871:10;;55836:45;:::i;51273:692::-;51333:17;;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;51468:20:::1;;51449:15;:39;;51441:68;;;;-1:-1:-1::0;;;51441:68:0::1;;;;;;;:::i;:::-;51579:22;::::0;51630:39:::1;::::0;-1:-1:-1;;;51630:39:0;;51663:4:::1;51630:39;::::0;::::1;4187:51:1::0;51579:22:0;;;::::1;-1:-1:-1::0;;;;;51579:22:0::1;::::0;51530:30:::1;::::0;51579:22;;51630:24:::1;::::0;4160:18:1;;51630:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51768:9;::::0;51744:42:::1;::::0;-1:-1:-1;;;51744:42:0;;-1:-1:-1;;;;;51768:9:0;;::::1;51744:42;::::0;::::1;4423:51:1::0;4490:18;;;4483:34;;;51613:56:0;;-1:-1:-1;51744:23:0;::::1;::::0;::::1;::::0;4396:18:1;;51744:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51826:9:0::1;::::0;51802:42:::1;::::0;17171:25:1;;;-1:-1:-1;;;;;51826:9:0;;::::1;::::0;51819:4:::1;::::0;-1:-1:-1;;;;;;;;;;;51802:42:0;17159:2:1;17144:18;51802:42:0::1;;;;;;;51867:9;::::0;-1:-1:-1;;;;;51867:9:0::1;::::0;-1:-1:-1;51900:6:0;-1:-1:-1;;51273:692:0;;:::o;43668:488::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;43764:16:::1;;43756:6;:24;;43748:91;;;::::0;-1:-1:-1;;;43748:91:0;;7165:2:1;43748:91:0::1;::::0;::::1;7147:21:1::0;7204:2;7184:18;;;7177:30;7243:34;7223:18;;;7216:62;-1:-1:-1;;;7294:18:1;;;7287:43;7347:19;;43748:91:0::1;6963:409:1::0;43748:91:0::1;43868:6;43850:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43893:9:0::1;::::0;-1:-1:-1;;;;;43893:9:0::1;43885:46;43927:3;43914:9;:6:::0;43921:2:::1;43914:9;:::i;:::-;43913:17;;;;:::i;:::-;43885:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43950:11:0::1;::::0;-1:-1:-1;;;;;43950:11:0::1;43942:57;43994:3;43981:9;:6:::0;43988:2:::1;43981:9;:::i;:::-;43980:17;;;;:::i;:::-;43973:24;::::0;:6;:24:::1;:::i;:::-;43942:57;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44039:9:0::1;::::0;-1:-1:-1;;;;;44039:9:0::1;44032:4;-1:-1:-1::0;;;;;;;;;;;44064:3:0::1;44051:9;:6:::0;44058:2:::1;44051:9;:::i;:::-;44050:17;;;;:::i;:::-;44015:53;::::0;17171:25:1;;;17159:2;17144:18;44015:53:0::1;;;;;;;44108:11;::::0;-1:-1:-1;;;;;44108:11:0::1;44101:4;-1:-1:-1::0;;;;;;;;;;;44143:3:0::1;44130:9;:6:::0;44137:2:::1;44130:9;:::i;:::-;44129:17;;;;:::i;:::-;44122:24;::::0;:6;:24:::1;:::i;:::-;44084:64;::::0;17171:25:1;;;17159:2;17144:18;44084:64:0::1;;;;;;;43668:488:::0;:::o;53124:267::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;53214:20:::1;;53195:15;:39;;53187:68;;;;-1:-1:-1::0;;;53187:68:0::1;;;;;;;:::i;:::-;53280:9;::::0;:50:::1;::::0;53267:9:::1;::::0;-1:-1:-1;;;;;53280:9:0::1;::::0;53303:21:::1;::::0;53267:9;53280:50;53267:9;53280:50;53303:21;53280:9;:50:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53266:64;;;53349:4;53341:42;;;::::0;-1:-1:-1;;;53341:42:0;;13217:2:1;53341:42:0::1;::::0;::::1;13199:21:1::0;13256:2;13236:18;;;13229:30;-1:-1:-1;;;13275:18:1;;;13268:46;13331:18;;53341:42:0::1;13015:340:1::0;53341:42:0::1;53176:215;53124:267::o:0;50090:243::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50194:35:0;::::1;50186:84;;;;-1:-1:-1::0;;;50186:84:0::1;;;;;;;:::i;:::-;50281:22;:44:::0;;-1:-1:-1;;;;;50281:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;50281:44:0;;::::1;::::0;;;::::1;::::0;;50090:243::o;47059:1048::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;47219:14:::1;47259::::0;47234:24:::1;47244:14:::0;47234:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;47219:54;;47292:8;:13;;47302:3;47292:13;47284:64;;;::::0;-1:-1:-1;;;47284:64:0;;10563:2:1;47284:64:0::1;::::0;::::1;10545:21:1::0;10602:2;10582:18;;;10575:30;10641:34;10621:18;;;10614:62;-1:-1:-1;;;10692:18:1;;;10685:36;10738:19;;47284:64:0::1;10361:402:1::0;47284:64:0::1;47377:2;47367:6;:12;;;;47359:95;;;::::0;-1:-1:-1;;;47359:95:0;;8398:2:1;47359:95:0::1;::::0;::::1;8380:21:1::0;8437:2;8417:18;;;8410:30;8476:34;8456:18;;;8449:62;8547:31;8527:18;;;8520:59;8596:19;;47359:95:0::1;8196:425:1::0;47359:95:0::1;47484:2;47473:7;:13;;;;47465:97;;;::::0;-1:-1:-1;;;47465:97:0;;13907:2:1;47465:97:0::1;::::0;::::1;13889:21:1::0;13946:2;13926:18;;;13919:30;13985:34;13965:18;;;13958:62;14056:32;14036:18;;;14029:60;14106:19;;47465:97:0::1;13705:426:1::0;47465:97:0::1;47596:2;47581:11;:17;;;;47573:105;;;::::0;-1:-1:-1;;;47573:105:0;;14338:2:1;47573:105:0::1;::::0;::::1;14320:21:1::0;14377:2;14357:18;;;14350:30;14416:34;14396:18;;;14389:62;14487:34;14467:18;;;14460:62;-1:-1:-1;;;14538:19:1;;;14531:33;14581:19;;47573:105:0::1;14136:470:1::0;47573:105:0::1;47700:9;47691:8;;:18;;;;;;;;;;;;;;;;;;47734:14;47720:13;;:28;;;;;;;;;;;;;;;;;;47773:14;47759:13;;:28;;;;;;;;;;;;;;;;;;47816:6;47808:7;;:14;;;;;;;;;;;;;;;;;;47842:7;47833:8;;:16;;;;;;;;;;;;;;;;;;47873:11;47860:12;;:24;;;;;;;;;;;;;;;;;;47918:8;;;;;;;;;;;47902:25;;-1:-1:-1::0;;;;;;;;;;;47902:25:0::1;;;;;;;;;47959:13;::::0;47943:30:::1;::::0;47959:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;47943:30:0;;;::::1;48005:7;::::0;47989:24:::1;::::0;48005:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;47989:24:0;48005:7:::1;::::0;47989:24:::1;48045:8;::::0;48029:25:::1;::::0;48045:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48029:25:0;;;::::1;48086:12;::::0;48070:29:::1;::::0;48086:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48070:29:0;;;::::1;47208:899;47059:1048:::0;;;;;;:::o;43251:410::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;43334:16:::1;::::0;;43319:14:::1;43361:18:::0;;;43398:9:::1;::::0;-1:-1:-1;;;;;43398:9:0::1;43390:46;43432:3;43419:9;43334:16:::0;43426:2:::1;43419:9;:::i;46225:181::-:0;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;46310:33:::1;:9;46327:15:::0;46310:16:::1;:33::i;44412:149::-:0;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;44503:13:::1;28477:1;44503:2;:13;:::i;:::-;44491:25;::::0;:9;:25:::1;:::i;:::-;44484:6;:32:::0;;;44530:23:::1;::::0;-1:-1:-1;;;;;;;;;;;44530:23:0;;;::::1;44412:149:::0;:::o;50580:232::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;50680:57:::1;50702:34;50721:15;50702:18:::0;:34:::1;:::i;:::-;50680:21;:57::i;:::-;50769:34;50788:15;50769:18:::0;:34:::1;:::i;:::-;50753:51;::::0;-1:-1:-1;;;;;;;;;;;50753:51:0;;;::::1;50580:232:::0;:::o;41920:151::-;41963:15;;42024:13;28477:1;42024:2;:13;:::i;:::-;42011:12;;:26;;;;:::i;:::-;42049:13;28477:1;42049:2;:13;:::i;:::-;42039:9;;:23;;;;:::i;:::-;42004:59;;;;41920:151;;:::o;9539:142::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;9640:1:::1;9624:6:::0;;9603:40:::1;::::0;-1:-1:-1;;;;;9624:6:0;;::::1;::::0;9603:40:::1;::::0;9640:1;;9603:40:::1;9671:1;9654:19:::0;;-1:-1:-1;;;;;;9654:19:0::1;::::0;;9539:142::o;49895:129::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;49954:14:::1;:19:::0;;-1:-1:-1;;49954:19:0::1;;;::::0;;50001:15:::1;49984:16;:32:::0;49895:129::o;42919:109::-;43006:11;;42990:27;;:15;:27;:::i;:::-;42978:10;42969:20;;;;:8;:20;;;;;:48;42919:109::o;53898:7::-;53891:14;;53819:94;:::o;48256:247::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48346:23:0;::::1;48338:72;;;;-1:-1:-1::0;;;48338:72:0::1;;;;;;;:::i;:::-;48421:15;:25:::0;;-1:-1:-1;;;;;;48421:25:0::1;-1:-1:-1::0;;;;;48421:25:0;::::1;::::0;;::::1;::::0;;;48462:33:::1;::::0;-1:-1:-1;;;;;;;;;;;48462:33:0;-1:-1:-1;;48462:33:0::1;48256:247:::0;:::o;44241:165::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;44322:16:::1;:23:::0;;-1:-1:-1;;44322:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44361:37:::1;::::0;44322:23:::1;44381:16:::0;;;44361:37:::1;;::::0;::::1;::::0;-1:-1:-1;;44361:37:0::1;44241:165:::0;:::o;48606:1045::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;48844:3:::1;48825:18;;:22;;;;:::i;:::-;48812:12;:35;48804:110;;;::::0;-1:-1:-1;;;48804:110:0;;12436:2:1;48804:110:0::1;::::0;::::1;12418:21:1::0;12475:2;12455:18;;;12448:30;12514:34;12494:18;;;12487:62;-1:-1:-1;;;12565:18:1;;;12558:51;12626:19;;48804:110:0::1;12234:417:1::0;48804:110:0::1;48992:13;28477:1;48992:2;:13;:::i;:::-;48976:29;::::0;:15;:29:::1;:::i;:::-;48960:45:::0;-1:-1:-1;49042:13:0::1;28477:1;49042:2;:13;:::i;:::-;49029:26;::::0;:12;:26:::1;:::i;:::-;49016:39;;49122:26;28755:2;49149:38;;:18;;:38;;;;:::i;:::-;49122:65;;49198:23;28866:3;49222:35;;:18;;:35;;;;:::i;:::-;49198:59;;49296:18;49279:15;:35;;49270:103;;;::::0;-1:-1:-1;;;49270:103:0;;7986:2:1;49270:103:0::1;::::0;::::1;7968:21:1::0;8025:2;8005:18;;;7998:30;8064:34;8044:18;;;8037:62;-1:-1:-1;;;8115:18:1;;;8108:41;8166:19;;49270:103:0::1;7784:407:1::0;49270:103:0::1;49407:15;49393:12;:29;;49384:94;;;::::0;-1:-1:-1;;;49384:94:0;;11314:2:1;49384:94:0::1;::::0;::::1;11296:21:1::0;11353:2;11333:18;;;11326:30;11392:34;11372:18;;;11365:62;-1:-1:-1;;;11443:18:1;;;11436:38;11491:19;;49384:94:0::1;11112:404:1::0;49384:94:0::1;49491:12;:30:::0;;;49532:9:::1;:24:::0;;;49572:29:::1;::::0;49506:15;;-1:-1:-1;;;;;;;;;;;49572:29:0;-1:-1:-1;;49572:29:0::1;49633:9;::::0;49617:26:::1;::::0;-1:-1:-1;;;;;;;;;;;49617:26:0;;;::::1;48697:954;;48606:1045:::0;;:::o;55920:342::-;56063:10;56007:4;56051:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56051:32:0;;;;;;;;;;56102:35;;;;56094:60;;;;-1:-1:-1;;;56094:60:0;;16693:2:1;56094:60:0;;;16675:21:1;16732:2;16712:18;;;16705:30;-1:-1:-1;;;16751:18:1;;;16744:42;16803:18;;56094:60:0;16491:336:1;56094:60:0;56167:65;56176:10;56188:7;56197:34;56216:15;56197:16;:34;:::i;56167:65::-;-1:-1:-1;56250:4:0;;55920:342;-1:-1:-1;;;55920:342:0:o;54476:167::-;54556:4;54573:40;54583:10;54595:9;54606:6;54573:9;:40::i;44573:246::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44659:26:0;::::1;44651:73;;;;-1:-1:-1::0;;;44651:73:0::1;;;;;;;:::i;:::-;44733:9;:31:::0;;-1:-1:-1;;;;;;44733:31:0::1;-1:-1:-1::0;;;;;44733:31:0;::::1;::::0;;::::1;::::0;;;44778:33:::1;::::0;-1:-1:-1;;;;;;;;;;;44778:33:0;-1:-1:-1;;44778:33:0::1;44573:246:::0;:::o;45150:156::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;45222:15:::1;:24:::0;;-1:-1:-1;;45222:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45262:36:::1;::::0;45222:24:::1;45282:15:::0;;;::::1;;45262:36;;::::0;::::1;::::0;-1:-1:-1;;45262:36:0::1;45150:156:::0;:::o;41551:222::-;41618:7;41656:20;;41640:15;:36;41637:110;;;41720:15;41699:20;;:36;;;;:::i;41637:110::-;-1:-1:-1;41764:1:0;;41551:222::o;41781:131::-;41830:7;41891:13;28477:1;41891:2;:13;:::i;:::-;41871:18;;28535:13;28477:1;28535:2;:13;:::i;:::-;28524:24;;:8;:24;:::i;:::-;41857:32;;;;:::i;:::-;41856:48;;;;:::i;45745:179::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;45829:19:::1;:35:::0;;;45880:36:::1;::::0;45851:13;;-1:-1:-1;;;;;;;;;;;45880:36:0;;;::::1;45745:179:::0;:::o;45375:246::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;45468:30;;45460:64:::1;;;::::0;-1:-1:-1;;;45460:64:0;;9519:2:1;45460:64:0::1;::::0;::::1;9501:21:1::0;9558:2;9538:18;;;9531:30;-1:-1:-1;;;9577:18:1;;;9570:52;9639:18;;45460:64:0::1;9317:346:1::0;45460:64:0::1;45539:11;:26:::0;;;45585:28:::1;::::0;45551:14;;-1:-1:-1;;;;;;;;;;;45585:28:0;;;::::1;45375:246:::0;:::o;44831:258::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44921:28:0;::::1;44913:75;;;;-1:-1:-1::0;;;44913:75:0::1;;;;;;;:::i;:::-;44997:11;:35:::0;;-1:-1:-1;;;;;;44997:35:0::1;-1:-1:-1::0;;;;;44997:35:0;::::1;::::0;;::::1;::::0;;;45046::::1;::::0;-1:-1:-1;;;;;;;;;;;45046:35:0;-1:-1:-1;;45046:35:0::1;44831:258:::0;:::o;42394:275::-;-1:-1:-1;;;;;42516:24:0;;42481:7;42516:24;;;:8;:24;;;;;;42563:15;42553:25;;42550:71;;-1:-1:-1;42609:1:0;;42394:275;-1:-1:-1;;42394:275:0:o;42550:71::-;42637:24;42646:15;42637:8;:24;:::i;:::-;42630:31;42394:275;-1:-1:-1;;;42394:275:0:o;46486:193::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;46575:38:::1;:14;46594:18:::0;46575::::1;:38::i;9836:238::-:0;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9919:22:0;::::1;9911:73;;;::::0;-1:-1:-1;;;9911:73:0;;7579:2:1;9911:73:0::1;::::0;::::1;7561:21:1::0;7618:2;7598:18;;;7591:30;7657:34;7637:18;;;7630:62;-1:-1:-1;;;7708:18:1;;;7701:36;7754:19;;9911:73:0::1;7377:402:1::0;9911:73:0::1;10021:6;::::0;;10000:38:::1;::::0;-1:-1:-1;;;;;10000:38:0;;::::1;::::0;10021:6;::::1;::::0;10000:38:::1;::::0;::::1;10049:6;:17:::0;;-1:-1:-1;;;;;;10049:17:0::1;-1:-1:-1::0;;;;;10049:17:0;;;::::1;::::0;;;::::1;::::0;;9836:238::o;45992:166::-;9121:10;9110:7;8936;8963:6;-1:-1:-1;;;;;8963:6:0;;8898:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:66;;;;-1:-1:-1;;;9102:66:0;;;;;;;:::i;:::-;46071:27:::1;:9;46085:12:::0;24589:152;24659:4;24683:50;24688:3;-1:-1:-1;;;;;24708:23:0;;24683:4;:50::i;54973:299::-;-1:-1:-1;;;;;55066:19:0;;55058:49;;;;-1:-1:-1;;;55058:49:0;;8828:2:1;55058:49:0;;;8810:21:1;8867:2;8847:18;;;8840:30;-1:-1:-1;;;8886:18:1;;;8879:47;8943:18;;55058:49:0;8626:341:1;55058:49:0;-1:-1:-1;;;;;55126:21:0;;55118:49;;;;-1:-1:-1;;;55118:49:0;;10970:2:1;55118:49:0;;;10952:21:1;11009:2;10989:18;;;10982:30;-1:-1:-1;;;11028:18:1;;;11021:45;11083:18;;55118:49:0;10768:339:1;55118:49:0;-1:-1:-1;;;;;55180:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;55232:32;;17171:25:1;;;55232:32:0;;17144:18:1;55232:32:0;;;;;;;54973:299;;;:::o;31879:1540::-;-1:-1:-1;;;;;31975:20:0;;31967:51;;;;-1:-1:-1;;;31967:51:0;;6120:2:1;31967:51:0;;;6102:21:1;6159:2;6139:18;;;6132:30;-1:-1:-1;;;6178:18:1;;;6171:48;6236:18;;31967:51:0;5918:342:1;31967:51:0;-1:-1:-1;;;;;32037:23:0;;32029:52;;;;-1:-1:-1;;;32029:52:0;;9174:2:1;32029:52:0;;;9156:21:1;9213:2;9193:18;;;9186:30;-1:-1:-1;;;9232:18:1;;;9225:46;9288:18;;32029:52:0;8972:340:1;32029:52:0;32174:15;32193:26;:9;32212:6;32193:18;:26::i;:::-;:59;;;-1:-1:-1;32223:29:0;:9;32242;32223:18;:29::i;:::-;32174:79;-1:-1:-1;32352:23:0;-1:-1:-1;;;;;32377:21:0;;32393:4;32377:21;;:49;;-1:-1:-1;;;;;;32402:24:0;;32421:4;32402:24;32377:49;32561:16;;32628:21;;32352:75;;-1:-1:-1;;;;;;32561:16:0;;;;32529:23;;32618:31;;;-1:-1:-1;;;32628:21:0;;;;32618:31;:63;;;;;32666:15;-1:-1:-1;;;;;32653:28:0;:9;-1:-1:-1;;;;;32653:28:0;;32618:63;32617:144;;;-1:-1:-1;32710:21:0;;-1:-1:-1;;;;;32697:34:0;;;-1:-1:-1;;;32710:21:0;;;;32697:34;:63;;;;;32745:15;-1:-1:-1;;;;;32735:25:0;:6;-1:-1:-1;;;;;32735:25:0;;32697:63;32883:21;;32589:173;;-1:-1:-1;32864:10:0;;-1:-1:-1;;;;;32875:29:0;;;-1:-1:-1;;;32883:21:0;;;;32875:29;;:57;;;32917:15;-1:-1:-1;;;;;32907:25:0;:6;-1:-1:-1;;;;;32907:25:0;;32875:57;32966:21;;32864:68;;-1:-1:-1;32943:11:0;;-1:-1:-1;;;;;32955:32:0;;;-1:-1:-1;;;32966:21:0;;;;32955:32;;:63;;;33003:15;-1:-1:-1;;;;;32990:28:0;:9;-1:-1:-1;;;;;32990:28:0;;32955:63;32943:75;;33059:18;:41;;;;33081:19;33059:41;:55;;;;33104:10;33059:55;33056:356;;;33130:43;33147:6;33155:9;33166:6;33130:16;:43::i;:::-;33056:356;;;33292:14;;;;;;;33284:49;;;;-1:-1:-1;;;33284:49:0;;12084:2:1;33284:49:0;;;12066:21:1;12123:2;12103:18;;;12096:30;12162:25;12142:18;;;12135:53;12205:18;;33284:49:0;11882:347:1;33284:49:0;33348:52;33363:6;33370:9;33380:6;33387:5;33393:6;33348:14;:52::i;:::-;31956:1463;;;;;;31879:1540;;;:::o;38525:1582::-;38273:27;:34;;-1:-1:-1;;38273:34:0;38303:4;38273:34;;;;;;38627:4:::1;38273:27:::0;38609:24;;;::::1;::::0;;;;;;;;38674:13:::1;::::0;38609:24;;38273:27;38660::::1;::::0;38674:13;;::::1;38273:34:::0;38674:13;;::::1;::::0;38660;;::::1;;:27;:::i;:::-;38644:43;;;;38698:19;38720;;38698:41;;38866:11;38850:15;:27;:40;;;-1:-1:-1::0;38879:11:0::1;::::0;::::1;::::0;38850:40:::1;38847:77;;;38906:7;;;;;38847:77;39044:13;::::0;39005:25:::1;::::0;39031:36:::1;::::0;::::1;::::0;39032:25:::1;::::0;39044:13;;::::1;;;39032:11:::0;:25:::1;:::i;:::-;39031:36;;;;:::i;:::-;39005:62:::0;-1:-1:-1;39078:25:0::1;39105:29;39005:62:::0;39105:11;:29:::1;:::i;:::-;39078:56:::0;-1:-1:-1;39195:16:0::1;39212:19;39230:1;39212:17:::0;:19:::1;:::i;:::-;39195:36:::0;-1:-1:-1;39242:19:0::1;39262:26;39195:36:::0;39262:17;:26:::1;:::i;:::-;39242:46:::0;-1:-1:-1;39371:17:0::1;39389:29;39401:17:::0;39242:46;39389:29:::1;:::i;:::-;39371:47:::0;-1:-1:-1;39497:21:0::1;39529:27;39371:47:::0;39529:16:::1;:27::i;:::-;39567:14;39583:41;39607:17:::0;39583:21:::1;:41;:::i;:::-;39567:58:::0;-1:-1:-1;39725:14:0::1;39763:9:::0;39743:18:::1;39750:11:::0;39567:58;39743:18:::1;:::i;:::-;39742:30;;;;:::i;:::-;39725:47;;39783:31;39797:8;39807:6;39783:13;:31::i;:::-;-1:-1:-1::0;39939:21:0::1;::::0;-1:-1:-1;39962:41:0::1;39986:17:::0;39962:21:::1;:41;:::i;:::-;39939:65;;40086:13;40068:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38318:1:0::1;38330:27:::0;:35;;-1:-1:-1;;38330:35:0;;;38525:1582::o;24917:158::-;24990:4;25014:53;25022:3;-1:-1:-1;;;;;25042:23:0;;25014:7;:53::i;50865:343::-;51021:20;;51007:13;:34;50999:103;;;;-1:-1:-1;;;50999:103:0;;15169:2:1;50999:103:0;;;15151:21:1;15208:2;15188:18;;;15181:30;15247:34;15227:18;;;15220:62;-1:-1:-1;;;15298:18:1;;;15291:45;15353:19;;50999:103:0;14967:411:1;50999:103:0;51113:20;:34;;;51163:37;;51134:13;;-1:-1:-1;;;;;;;;;;;51163:37:0;;;;50865:343;:::o;19644:414::-;19707:4;21970:19;;;:12;;;:19;;;;;;19724:327;;-1:-1:-1;19767:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19950:18;;19928:19;;;:12;;;:19;;;;;;:40;;;;19983:11;;19724:327;-1:-1:-1;20034:5:0;20027:12;;25161:167;-1:-1:-1;;;;;25295:23:0;;25241:4;21970:19;;;:12;;;:19;;;;;;:24;;25265:55;21873:129;36716:400;-1:-1:-1;;;;;36835:17:0;;36811:21;36835:17;;;:9;:17;;;;;;36871:23;;;;36863:60;;;;-1:-1:-1;;;36863:60:0;;6812:2:1;36863:60:0;;;6794:21:1;6851:2;6831:18;;;6824:30;-1:-1:-1;;;6870:18:1;;;6863:54;6934:18;;36863:60:0;6610:348:1;36863:60:0;36959:27;36972:6;36979;36959:12;:27::i;:::-;37019:28;37029:9;37040:6;37019:9;:28::i;:::-;37089:9;-1:-1:-1;;;;;37073:33:0;37082:6;-1:-1:-1;;;;;37073:33:0;-1:-1:-1;;;;;;;;;;;37099:6:0;37073:33;;;;17171:25:1;;17159:2;17144:18;;17025:177;37073:33:0;;;;;;;;36800:316;36716:400;;;:::o;33489:3180::-;-1:-1:-1;;;;;33632:20:0;;;33605:24;33632:20;;;:9;:20;;;;;;;33687:17;;;;;;;;33723:23;;;;33715:60;;;;-1:-1:-1;;;33715:60:0;;6812:2:1;33715:60:0;;;6794:21:1;6851:2;6831:18;;;6824:30;-1:-1:-1;;;6870:18:1;;;6863:54;6934:18;;33715:60:0;6610:348:1;33715:60:0;33788:9;33811:6;33808:1670;;;33898:9;;33890:6;:17;;33882:44;;;;-1:-1:-1;;;33882:44:0;;10219:2:1;33882:44:0;;;10201:21:1;10258:2;10238:18;;;10231:30;-1:-1:-1;;;10277:18:1;;;10270:45;10332:18;;33882:44:0;10017:339:1;33882:44:0;33949:31;:14;33973:6;33949:23;:31::i;:::-;:40;33941:73;;;;-1:-1:-1;;;33941:73:0;;15585:2:1;33941:73:0;;;15567:21:1;15624:2;15604:18;;;15597:30;-1:-1:-1;;;15643:18:1;;;15636:50;15703:18;;33941:73:0;15383:344:1;33941:73:0;34071:11;;34052:16;;:30;;;;:::i;:::-;34033:15;:49;;:77;;;;;34086:19;;34109:1;34086:24;34033:77;34029:186;;;34131:26;:14;34150:6;34131:18;:26::i;:::-;-1:-1:-1;34181:18:0;;-1:-1:-1;;;;;34181:18:0;;;;;;;;34029:186;-1:-1:-1;34233:8:0;;;;;;;33808:1670;;;34266:5;34263:1215;;;34411:12;;34386:23;34403:6;34386:16;:23;:::i;:::-;:37;;34378:65;;;;-1:-1:-1;;;34378:65:0;;13562:2:1;34378:65:0;;;13544:21:1;13601:2;13581:18;;;13574:30;-1:-1:-1;;;13620:18:1;;;13613:46;13676:18;;34378:65:0;13360:340:1;34378:65:0;34467:6;;34457;:16;;34449:62;;;;-1:-1:-1;;;34449:62:0;;15934:2:1;34449:62:0;;;15916:21:1;15973:2;15953:18;;;15946:30;16012:34;15992:18;;;15985:62;-1:-1:-1;;;16063:18:1;;;16056:32;16105:19;;34449:62:0;15732:398:1;34449:62:0;34534:34;:14;34558:9;34534:23;:34::i;:::-;:43;34526:76;;;;-1:-1:-1;;;34526:76:0;;15585:2:1;34526:76:0;;;15567:21:1;15624:2;15604:18;;;15597:30;-1:-1:-1;;;15643:18:1;;;15636:50;15703:18;;34526:76:0;15383:344:1;34526:76:0;34659:11;;34640:16;;:30;;;;:::i;:::-;34621:15;:49;;:77;;;;;34674:19;;34697:1;34674:24;34621:77;34617:192;;;34719:29;:14;34738:9;34719:18;:29::i;:::-;-1:-1:-1;34772:21:0;;-1:-1:-1;;;;;34772:21:0;;;;;;;;34617:192;-1:-1:-1;34827:7:0;;;;34263:1215;;;34978:31;:14;35002:6;34978:23;:31::i;:::-;:40;34970:80;;;;-1:-1:-1;;;34970:80:0;;16337:2:1;34970:80:0;;;16319:21:1;16376:2;16356:18;;;16349:30;16415:29;16395:18;;;16388:57;16462:18;;34970:80:0;16135:351:1;34970:80:0;35073:34;:14;35097:9;35073:23;:34::i;:::-;:43;35065:86;;;;-1:-1:-1;;;35065:86:0;;12858:2:1;35065:86:0;;;12840:21:1;12897:2;12877:18;;;12870:30;12936:32;12916:18;;;12909:60;12986:18;;35065:86:0;12656:354:1;35065:86:0;35199:12;;35174:23;35191:6;35174:16;:23;:::i;:::-;:37;;35166:65;;;;-1:-1:-1;;;35166:65:0;;13562:2:1;35166:65:0;;;13544:21:1;13601:2;13581:18;;;13574:30;-1:-1:-1;;;13620:18:1;;;13613:46;13676:18;;35166:65:0;13360:340:1;35166:65:0;35288:11;;35269:16;;:30;;;;:::i;:::-;35250:15;:49;;:77;;;;;35303:19;;35326:1;35303:24;35250:77;35246:186;;;35348:26;:14;35367:6;35348:18;:26::i;:::-;-1:-1:-1;35398:18:0;;-1:-1:-1;;;;;35398:18:0;;;;;;;;35246:186;-1:-1:-1;35450:12:0;;;;;;;34263:1215;35815:21;;-1:-1:-1;;;;;35807:29:0;;;-1:-1:-1;;;35815:21:0;;;;35807:29;;;;35806:52;;-1:-1:-1;35841:16:0;;;;35840:17;35806:52;:84;;;;-1:-1:-1;35862:27:0;;;;35861:28;35806:84;:92;;;;;35892:6;35806:92;35803:130;;;35913:20;:18;:20::i;:::-;36002:23;36026:36;36040:6;36048:3;36053:8;;;;;;;;;;;36026:13;:36::i;:::-;36136:13;;36002:60;;-1:-1:-1;36073:21:0;;36095:55;;36109:6;;36117:3;;36122:27;;36136:13;;;;;;;36122;;;;:27;:::i;:::-;36095:13;:55::i;:::-;36073:77;-1:-1:-1;36214:19:0;36242:31;36073:77;36242:15;:31;:::i;:::-;36234:40;;:6;:40;:::i;:::-;36214:60;;36312:27;36325:6;36332;36312:12;:27::i;:::-;36434:4;36416:24;;;;:9;:24;;;;;:41;;36444:13;;36416:24;:41;;36444:13;;36416:41;:::i;:::-;;;;;;;;36512:15;36492:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36562:33:0;;-1:-1:-1;36572:9:0;36583:11;36562:9;:33::i;:::-;36637:9;-1:-1:-1;;;;;36621:38:0;36630:6;-1:-1:-1;;;;;36621:38:0;-1:-1:-1;;;;;;;;;;;36647:11:0;36621:38;;;;17171:25:1;;17159:2;17144:18;;17025:177;36621:38:0;;;;;;;;33594:3075;;;;;;33489:3180;;;;;:::o;40157:461::-;40250:16;;40218:58;;40235:4;;-1:-1:-1;;;;;40250:16:0;40269:6;40218:8;:58::i;:::-;40311:16;;;40325:1;40311:16;;;;;;;;40287:21;;40311:16;;;;;;;;;;-1:-1:-1;40311:16:0;40287:40;;40356:4;40338;40343:1;40338:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40338:23:0;;;:7;;;;;;;;;;:23;;;;40382:16;;:23;;;-1:-1:-1;;;40382:23:0;;;;:16;;;;;:21;;:23;;;;;40338:7;;40382:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40372:4;40377:1;40372:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40372:33:0;;;:7;;;;;;;;;:33;40418:16;;:192;;-1:-1:-1;;;40418:192:0;;:16;;;:67;;:192;;40500:6;;40418:16;;40537:4;;40564;;40584:15;;40418:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40207:411;40157:461;:::o;40745:686::-;40825:19;40846:21;40892:9;40880:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40912:14:0;;-1:-1:-1;40946:3:0;40930:12;:9;40940:2;40930:12;:::i;:::-;40929:20;;;;:::i;:::-;40912:37;-1:-1:-1;40960:17:0;40999:3;40981:14;:11;40993:2;40981:14;:::i;:::-;40980:22;;;;:::i;:::-;41045:16;;40960:42;;-1:-1:-1;41013:63:0;;41030:4;;-1:-1:-1;;;;;41045:16:0;41064:11;41013:8;:63::i;:::-;41087:16;;:218;;-1:-1:-1;;;41087:218:0;;-1:-1:-1;;;;;41087:16:0;;;;:32;;41127:9;;41087:218;;41160:4;;41180:11;;41206:9;;41230:6;;41160:4;;41279:15;;41087:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41330:11:0;;41368:9;;-1:-1:-1;;;;;;40745:686:0:o;20234:1553::-;20300:4;20439:19;;;:12;;;:19;;;;;;20475:15;;20471:1309;;20837:21;20861:14;20874:1;20861:10;:14;:::i;:::-;20910:18;;20837:38;;-1:-1:-1;20890:17:0;;20910:22;;20931:1;;20910:22;:::i;:::-;20890:42;;21177:17;21197:3;:11;;21209:9;21197:22;;;;;;;;:::i;:::-;;;;;;;;;21177:42;;21343:9;21314:3;:11;;21326:13;21314:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21420:23;;;:12;;;:23;;;;;;:36;;;21581:17;;21420:3;;21581:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21676:3;:12;;:19;21689:5;21676:19;;;;;;;;;;;21669:26;;;21719:4;21712:11;;;;;;;;20471:1309;21763:5;21756:12;;;;;37716:228;-1:-1:-1;;;;;37851:15:0;;37833:17;37851:15;;;:9;:15;;;;;;:22;;37867:6;;37851:22;:::i;:::-;-1:-1:-1;;;;;37911:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37716:228:0:o;37452:225::-;-1:-1:-1;;;;;37584:15:0;;37566:17;37584:15;;;:9;:15;;;;;;:22;;37600:6;;37584:22;:::i;37171:156::-;37261:7;37314:5;37300:10;37289:21;;37296:3;37289:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37288:31;;;;:::i;:::-;37281:38;37171:156;-1:-1:-1;;;;37171:156:0:o;14::1:-;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:247::-;234:6;287:2;275:9;266:7;262:23;258:32;255:52;;;303:1;300;293:12;255:52;342:9;329:23;361:31;386:5;361:31;:::i;427:251::-;497:6;550:2;538:9;529:7;525:23;521:32;518:52;;;566:1;563;556:12;518:52;598:9;592:16;617:31;642:5;617:31;:::i;683:388::-;751:6;759;812:2;800:9;791:7;787:23;783:32;780:52;;;828:1;825;818:12;780:52;867:9;854:23;886:31;911:5;886:31;:::i;:::-;936:5;-1:-1:-1;993:2:1;978:18;;965:32;1006:33;965:32;1006:33;:::i;:::-;1058:7;1048:17;;;683:388;;;;;:::o;1076:456::-;1153:6;1161;1169;1222:2;1210:9;1201:7;1197:23;1193:32;1190:52;;;1238:1;1235;1228:12;1190:52;1277:9;1264:23;1296:31;1321:5;1296:31;:::i;:::-;1346:5;-1:-1:-1;1403:2:1;1388:18;;1375:32;1416:33;1375:32;1416:33;:::i;:::-;1076:456;;1468:7;;-1:-1:-1;;;1522:2:1;1507:18;;;;1494:32;;1076:456::o;1537:315::-;1605:6;1613;1666:2;1654:9;1645:7;1641:23;1637:32;1634:52;;;1682:1;1679;1672:12;1634:52;1721:9;1708:23;1740:31;1765:5;1740:31;:::i;:::-;1790:5;1842:2;1827:18;;;;1814:32;;-1:-1:-1;;;1537:315:1:o;1857:241::-;1913:6;1966:2;1954:9;1945:7;1941:23;1937:32;1934:52;;;1982:1;1979;1972:12;1934:52;2021:9;2008:23;2040:28;2062:5;2040:28;:::i;2103:245::-;2170:6;2223:2;2211:9;2202:7;2198:23;2194:32;2191:52;;;2239:1;2236;2229:12;2191:52;2271:9;2265:16;2290:28;2312:5;2290:28;:::i;2353:180::-;2412:6;2465:2;2453:9;2444:7;2440:23;2436:32;2433:52;;;2481:1;2478;2471:12;2433:52;-1:-1:-1;2504:23:1;;2353:180;-1:-1:-1;2353:180:1:o;2538:184::-;2608:6;2661:2;2649:9;2640:7;2636:23;2632:32;2629:52;;;2677:1;2674;2667:12;2629:52;-1:-1:-1;2700:16:1;;2538:184;-1:-1:-1;2538:184:1:o;2727:248::-;2795:6;2803;2856:2;2844:9;2835:7;2831:23;2827:32;2824:52;;;2872:1;2869;2862:12;2824:52;-1:-1:-1;;2895:23:1;;;2965:2;2950:18;;;2937:32;;-1:-1:-1;2727:248:1:o;2980:306::-;3068:6;3076;3084;3137:2;3125:9;3116:7;3112:23;3108:32;3105:52;;;3153:1;3150;3143:12;3105:52;3182:9;3176:16;3166:26;;3232:2;3221:9;3217:18;3211:25;3201:35;;3276:2;3265:9;3261:18;3255:25;3245:35;;2980:306;;;;;:::o;3291:535::-;3383:6;3391;3399;3407;3415;3423;3476:3;3464:9;3455:7;3451:23;3447:33;3444:53;;;3493:1;3490;3483:12;3444:53;3516:27;3533:9;3516:27;:::i;:::-;3506:37;;3562:36;3594:2;3583:9;3579:18;3562:36;:::i;:::-;3552:46;;3617:36;3649:2;3638:9;3634:18;3617:36;:::i;:::-;3607:46;;3672:36;3704:2;3693:9;3689:18;3672:36;:::i;:::-;3662:46;;3727:37;3759:3;3748:9;3744:19;3727:37;:::i;:::-;3717:47;;3783:37;3815:3;3804:9;3800:19;3783:37;:::i;:::-;3773:47;;3291:535;;;;;;;;:::o;4528:591::-;-1:-1:-1;;;;;4871:15:1;;;4853:34;;4918:2;4903:18;;4896:34;;;;4961:2;4946:18;;4939:34;;;;5004:2;4989:18;;4982:34;;;;5053:15;;;5047:3;5032:19;;5025:44;4833:3;5085:19;;5078:35;;;;4802:3;4787:19;;4528:591::o;5316:597::-;5428:4;5457:2;5486;5475:9;5468:21;5518:6;5512:13;5561:6;5556:2;5545:9;5541:18;5534:34;5586:1;5596:140;5610:6;5607:1;5604:13;5596:140;;;5705:14;;;5701:23;;5695:30;5671:17;;;5690:2;5667:26;5660:66;5625:10;;5596:140;;;5754:6;5751:1;5748:13;5745:91;;;5824:1;5819:2;5810:6;5799:9;5795:22;5791:31;5784:42;5745:91;-1:-1:-1;5897:2:1;5876:15;-1:-1:-1;;5872:29:1;5857:45;;;;5904:2;5853:54;;5316:597;-1:-1:-1;;;5316:597:1:o;6265:340::-;6467:2;6449:21;;;6506:2;6486:18;;;6479:30;-1:-1:-1;;;6540:2:1;6525:18;;6518:46;6596:2;6581:18;;6265:340::o;11521:356::-;11723:2;11705:21;;;11742:18;;;11735:30;11801:34;11796:2;11781:18;;11774:62;11868:2;11853:18;;11521:356::o;14611:351::-;14813:2;14795:21;;;14852:2;14832:18;;;14825:30;14891:29;14886:2;14871:18;;14864:57;14953:2;14938:18;;14611:351::o;17207:980::-;17469:4;17517:3;17506:9;17502:19;17548:6;17537:9;17530:25;17574:2;17612:6;17607:2;17596:9;17592:18;17585:34;17655:3;17650:2;17639:9;17635:18;17628:31;17679:6;17714;17708:13;17745:6;17737;17730:22;17783:3;17772:9;17768:19;17761:26;;17822:2;17814:6;17810:15;17796:29;;17843:1;17853:195;17867:6;17864:1;17861:13;17853:195;;;17932:13;;-1:-1:-1;;;;;17928:39:1;17916:52;;18023:15;;;;17988:12;;;;17964:1;17882:9;17853:195;;;-1:-1:-1;;;;;;;18104:32:1;;;;18099:2;18084:18;;18077:60;-1:-1:-1;;;18168:3:1;18153:19;18146:35;18065:3;17207:980;-1:-1:-1;;;17207:980:1:o;19174:128::-;19214:3;19245:1;19241:6;19238:1;19235:13;19232:39;;;19251:18;;:::i;:::-;-1:-1:-1;19287:9:1;;19174:128::o;19307:204::-;19345:3;19381:4;19378:1;19374:12;19413:4;19410:1;19406:12;19448:3;19442:4;19438:14;19433:3;19430:23;19427:49;;;19456:18;;:::i;:::-;19492:13;;19307:204;-1:-1:-1;;;19307:204:1:o;19516:217::-;19556:1;19582;19572:132;;19626:10;19621:3;19617:20;19614:1;19607:31;19661:4;19658:1;19651:15;19689:4;19686:1;19679:15;19572:132;-1:-1:-1;19718:9:1;;19516:217::o;19738:422::-;19827:1;19870:5;19827:1;19884:270;19905:7;19895:8;19892:21;19884:270;;;19964:4;19960:1;19956:6;19952:17;19946:4;19943:27;19940:53;;;19973:18;;:::i;:::-;20023:7;20013:8;20009:22;20006:55;;;20043:16;;;;20006:55;20122:22;;;;20082:15;;;;19884:270;;;19888:3;19738:422;;;;;:::o;20165:140::-;20223:5;20252:47;20293:4;20283:8;20279:19;20273:4;20359:5;20389:8;20379:80;;-1:-1:-1;20430:1:1;20444:5;;20379:80;20478:4;20468:76;;-1:-1:-1;20515:1:1;20529:5;;20468:76;20560:4;20578:1;20573:59;;;;20646:1;20641:130;;;;20553:218;;20573:59;20603:1;20594:10;;20617:5;;;20641:130;20678:3;20668:8;20665:17;20662:43;;;20685:18;;:::i;:::-;-1:-1:-1;;20741:1:1;20727:16;;20756:5;;20553:218;;20855:2;20845:8;20842:16;20836:3;20830:4;20827:13;20823:36;20817:2;20807:8;20804:16;20799:2;20793:4;20790:12;20786:35;20783:77;20780:159;;;-1:-1:-1;20892:19:1;;;20924:5;;20780:159;20971:34;20996:8;20990:4;20971:34;:::i;:::-;21041:6;21037:1;21033:6;21029:19;21020:7;21017:32;21014:58;;;21052:18;;:::i;:::-;21090:20;;20310:806;-1:-1:-1;;;20310:806:1:o;21121:168::-;21161:7;21227:1;21223;21219:6;21215:14;21212:1;21209:21;21204:1;21197:9;21190:17;21186:45;21183:71;;;21234:18;;:::i;:::-;-1:-1:-1;21274:9:1;;21121:168::o;21294:125::-;21334:4;21362:1;21359;21356:8;21353:34;;;21367:18;;:::i;:::-;-1:-1:-1;21404:9:1;;21294:125::o;21424:127::-;21485:10;21480:3;21476:20;21473:1;21466:31;21516:4;21513:1;21506:15;21540:4;21537:1;21530:15;21556:127;21617:10;21612:3;21608:20;21605:1;21598:31;21648:4;21645:1;21638:15;21672:4;21669:1;21662:15;21688:127;21749:10;21744:3;21740:20;21737:1;21730:31;21780:4;21777:1;21770:15;21804:4;21801:1;21794:15;21952:131;-1:-1:-1;;;;;22027:31:1;;22017:42;;22007:70;;22073:1;22070;22063:12;22088:118;22174:5;22167:13;22160:21;22153:5;22150:32;22140:60;;22196:1;22193;22186:12

Swarm Source

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