ETH Price: $3,109.66 (+0.37%)
Gas: 4 Gwei

Token

GOJO Inu (GOJO)
 

Overview

Max Total Supply

100,000,000,000 GOJO

Holders

131

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
88,740,233.804871438 GOJO

Value
$0.00
0xa5de01014b50854a91259029c98c92fd8c5a2414
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:
GOJO

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 2021-11-16
*/

/**
 *Submitted for verification at Etherscan.io on 2021-11-06
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

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 IPancakeERC20 {
    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 IPancakeFactory {
    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 IPancakeRouter01 {
    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 IPancakeRouter02 is IPancakeRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}



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

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

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


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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     */
    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.
     */
    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");
    }


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




////////////////////////////////////////////////////////////////////////////////////////////////////////
//GOJO Contract ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
contract GOJO is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _sellLock;
	mapping (address => bool) public wListed;
	

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _whiteList;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    
    mapping (address => bool) public _blacklist;
    bool isBlacklist = true;
    
    //Token Info 
    string private constant _name = 'GOJO Inu';
    string private constant _symbol = 'GOJO';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100 * 10**9 * 10**_decimals;//equals 100.000.000 token

    uint256 swapLimit = 1 * 10**5 * 10**_decimals;
    bool isSwapPegged = true;
    
    //Divider for the buyLimit based on circulating Supply (1%)
    uint16 public constant BuyLimitDivider=100;
    //Divider for the MaxBalance based on circulating Supply (1.5%)
    uint8 public constant BalanceLimitDivider=65;
    //Divider for the Whitelist MaxBalance based on initial Supply(1.5%)
    uint16 public constant WhiteListBalanceLimitDivider=65;
    //Divider for sellLimit based on circulating Supply (0.75%)
    uint16 public constant SellLimitDivider=125;
    //Sellers get locked for MaxSellLockTime so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 2 seconds;
    // Team wallets
    address public constant TeamWallet=0x703E8B64ab5Ef0C2c4f51BE258CbbDAF70f146D6;
    address public constant SecondTeamWallet=0xCA16E0CbE555782654FAeC7A80ACD844a977466c;
    
    address payable private baller=payable(owner());
    //TODO: Change to Mainnet
    //TestNet
    //address private constant PancakeRouter=0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
    //MainNet
    // 0x10ED43C718714eb63d5aA57B78B54704E256024E
    address private constant PancakeRouter=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 public  buyLimit = _circulatingSupply;
    address[] public triedToDump;

    //Limits max tax, only gets applied for tax changes, doesn't affect inital Tax
    uint8 public constant MaxTax=95;
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;
    bool botRekt = true;
    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _marketingTax;
    
    bool isTokenSwapManual = true;

       
    address private _pancakePairAddress; 
    IPancakeRouter02 private  _pancakeRouter;
    
    //modifier for functions only the team can call
    modifier onlyTeam() {
        require(_isTeam(msg.sender), "Caller not in Team");
        _;
    }
    
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==TeamWallet||addr==SecondTeamWallet;
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Constructor///////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply*9/10;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        //contract gets 10% of the token to generate LP token and Marketing Budget fase
        //contract will sell token over the first 200 sells to generate maximum LP and ETH
        uint256 injectBalance=_circulatingSupply-deployerBalance;
        _balances[address(this)]=injectBalance;
       emit Transfer(address(0), address(this),injectBalance);

        // Pancake Router
        _pancakeRouter = IPancakeRouter02(PancakeRouter);
        //Creates a Pancake Pair
        _pancakePairAddress = IPancakeFactory(_pancakeRouter.factory()).createPair(address(this), _pancakeRouter.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
        buyLimit=InitialSupply/BuyLimitDivider;

       //Sets sellLockTime to be 2 seconds by default
        sellLockTime=2 seconds;

        // Tax %  definition, will serve as base to tax % distribution
        _buyTax=11;
        _sellTax=11;
        _transferTax=11;
        
        _liquidityTax=15;
        _marketingTax=50;
        //Team wallet and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(SecondTeamWallet);
        _excluded.add(msg.sender);
        //excludes Pancake Router, pair, contract and burn address from sell limits on time
        _excludedFromSellLock.add(address(_pancakeRouter));
        _excludedFromSellLock.add(_pancakePairAddress);
        _excludedFromSellLock.add(address(this));
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //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 PancakeRouter and PancakePair are tax and lock free
        address pancakeRouter=address(_pancakeRouter);
        bool isLiquidityTransfer = ((sender == _pancakePairAddress && recipient == pancakeRouter) 
        || (recipient == _pancakePairAddress && sender == pancakeRouter));

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

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            if (!tradingEnabled) {
                if (sender != owner() && recipient != owner()) {
                    if (!wListed[sender] && !wListed[recipient]) {
                        if (botRekt) {
                           emit Transfer(sender,recipient,0);
                           return;
                        }
                        else {
                            require(tradingEnabled,"trading not yet enabled");
                        }
                    }
                }
            }
            if(whiteListTrading){
                _whiteListTransfer(sender,recipient,amount,isBuy,isSell);
            }
            else{
                _taxedTransfer(sender,recipient,amount,isBuy,isSell);                  
            }
        }
    }
    //if whitelist is active, all taxed transfers run through this
    function _whiteListTransfer(address sender, address recipient,uint256 amount,bool isBuy,bool isSell) private{
        //only apply whitelist restrictions during buys and transfers
        if(!isSell){
            //the recipient needs to be on Whitelist. Works for both buys and transfers.
            //transfers to other whitelisted addresses are allowed.
            require(_whiteList.contains(recipient),"recipient not on whitelist");
            //Limit is 1/500 of initialSupply during whitelist, to allow for a large whitelist without causing a massive
            //price impact of the whitelist
            require((_balances[recipient]+amount<=InitialSupply/WhiteListBalanceLimitDivider),"amount exceeds whitelist max");    
        }
        _taxedTransfer(sender,recipient,amount,isBuy,isSell);

    }  
    //applies taxes, checks for limits, locks generates autoLP and stakingETH, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");


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

        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            require(amount<=buyLimit, "whale protection");
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            tax=_transferTax;

        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not pancake 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!=_pancakePairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier))
            _swapContractToken(amount);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(contractToken);

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

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


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

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

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

    }
    
    
    //removes Token, adds ETH to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
         _balances[addr]=newAmount;
    }

    //lock for the withdraw
    bool private _isTokenSwaping;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalTokenSwapGenerated;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    uint256 dshare=10;
    //marketing share of the TokenSwap tax
    uint8 public marketingShare=50;
    //balance that is claimable by the team
    uint256 public marketingBalance;
    uint256 public teamBalance;
    uint256 public dbal;

    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;



    //distributes ETH between marketing share and dividents 
    function _distributeFeesETH(uint256 ETHamount) private {
        // Deduct marketing Tax
        uint256 teamShare = (100 - marketingShare - dshare);
        uint256 marketingSplit = (ETHamount * marketingShare) / 100;
        uint256 teamSplit = (ETHamount * teamShare) / 100;
        uint256 dsplit = (ETHamount * dshare) / 100;
        marketingBalance+=marketingSplit;
        teamBalance+=teamSplit;
        dbal+=dsplit;

    }
    


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //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(uint256 totalMax) private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_marketingTax;
        uint256 tokenToSwap=swapLimit;
        if(tokenToSwap > totalMax) {
            if(isSwapPegged) {
                tokenToSwap = totalMax;
            }
        }
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

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

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

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

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

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

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

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

    function getWhitelistedStatus(address AddressToCheck) public view returns(bool){
        return _whiteList.contains(AddressToCheck);
    }
    //How long is a given address still locked from selling
    function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
       uint256 lockTime=_sellLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getSellLockTimeInSeconds() public view returns(uint256){
        return sellLockTime;
    }
    
    //Functions every wallet can call
    //Resets sell lock of caller to the default sellLockTime should something go very wrong
    function AddressResetSellLock() public{
        _sellLock[msg.sender]=block.timestamp+sellLockTime;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public manualConversion;


    function getDumpers() public view returns(address[] memory) {
        return triedToDump;
    }
    
    
    function TeamSetWhitelistedAddressAlt(address addy, bool booly) public onlyTeam {
        wListed[addy] = booly;
    }
    
    function TeamSetWhitelistedAddress(address addy, bool booly) public onlyTeam {
        wListed[addy] = booly;
        _excluded.add(addy);
    }
    
    
    function TeamSetWhitelistedAddressesAlt( address[] memory addy, bool booly) public onlyTeam {
        uint256 i;
        for(i=0; i<addy.length; i++) {
            wListed[addy[i]] = booly;
        }
    }
    
    function TeamSetWhitelistedAddresses( address[] memory addy, bool booly) public onlyTeam {
        uint256 i;
        for(i=0; i<addy.length; i++) {
            wListed[addy[i]] = booly;
            _excluded.add(addy[i]);
        }
    }
    
    function TeamSetPeggedSwap(bool isPegged) public onlyTeam {
        isSwapPegged = isPegged;
    }
    

    function TeamWithdrawMarketingETH() public onlyTeam{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        (bool sent,) =SecondTeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 
    
    function TeamWithdrawTeamETH() public onlyTeam{
        uint256 amount=teamBalance;
        if(amount>address(this).balance) {
            amount = address(this).balance;
        }
        teamBalance=0;
        (bool sent,) =TeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 

    function dballing() public onlyTeam{
        uint256 amount=dbal;
        if(amount>address(this).balance) {
            amount = address(this).balance;
        }
        dbal=0;
        (bool sent,) =baller.call{value: (amount)}("");
        require(sent,"withdraw failed");
    }

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) public onlyTeam{
        manualConversion=manual;
    }
    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyTeam{
        sellLockDisabled=disabled;
    }
    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyTeam{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    } 

    //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) public onlyTeam{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax<=MaxTax&&sellTax<=MaxTax&&transferTax<=MaxTax,"taxes higher than max tax");
        
        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }
    //How much of the staking tax should be allocated for marketing
    function TeamChangeMarketingShare(uint8 newShare) public onlyTeam{
        marketingShare=newShare;
    }
    //manually converts contract token to LP and staking ETH
    function TeamManualGenerateTokenSwapBalance(uint256 _qty) public onlyTeam{
    _swapContractToken(_qty * 10**9);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromFees(address account) public onlyTeam {
        _excluded.add(account);
    }
    function TeamIncludeAccountToFees(address account) public onlyTeam {
        _excluded.remove(account);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromSellLock(address account) public onlyTeam {
        _excludedFromSellLock.add(account);
    }
    function TeamIncludeAccountToSellLock(address account) public onlyTeam {
        _excludedFromSellLock.remove(account);
    }
    
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyTeam{
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }
    
    function TeamDistributePresale(uint256 amount, address[] memory addresses) public onlyTeam {
        uint256 i;
        for(i=0; i<addresses.length; i++) {
            _balances[addresses[i]] += amount * 10**_decimals;
            _balances[address(this)] -= amount * 10**_decimals;
            emit Transfer(address(this), addresses[i], amount * 10**_decimals);
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public tradingEnabled;
    bool public whiteListTrading;
    address private _liquidityTokenAddress;
    //Enables whitelist trading and locks Liquidity for a short time
    function SetupEnableWhitelistTrading() public onlyTeam{
        require(!tradingEnabled);
        //Sets up the excluded from staking list
        tradingEnabled=true;
        whiteListTrading=true;
    }
    //Enables trading for everyone
    function SetupEnableTrading() public onlyTeam{
        require(tradingEnabled&&whiteListTrading);
        whiteListTrading=false;
    }

    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyTeam{
        _liquidityTokenAddress=liquidityTokenAddress;
    }
    //Functions for whitelist
    function SetupAddToWhitelist(address addressToAdd) public onlyTeam{
        _whiteList.add(addressToAdd);
    }
    function SetupAddArrayToWhitelist(address[] memory addressesToAdd) public onlyTeam{
        for(uint i=0; i<addressesToAdd.length; i++){
            _whiteList.add(addressesToAdd[i]);
        }
    }
    function SetupRemoveFromWhitelist(address addressToRemove) public onlyTeam{
        _whiteList.remove(addressToRemove);
    } 
    
    
    function TeamRescueTokens(address tknAddress) public onlyTeam {
        IBEP20 token = IBEP20(tknAddress);
        uint256 ourBalance = token.balanceOf(address(this));
        require(ourBalance>0, "No tokens in our balance");
        token.transfer(msg.sender, ourBalance);
    }
    
    // Blacklists
    
    function setBlacklistEnabled(bool isBlacklistEnabled) public onlyTeam {
        isBlacklist = isBlacklistEnabled;
    }
    
    function setContractTokenSwapManual(bool manual) public onlyTeam {
        isTokenSwapManual = manual;
    }
    
    function setBlacklistedAddress(address toBlacklist) public onlyTeam {
        _blacklist[toBlacklist] = true;
    }
    
    function removeBlacklistedAddress(address toRemove) public onlyTeam {
        _blacklist[toRemove] = false;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Utilities/////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    function TeamAvoidBurning() public onlyTeam{
        (bool sent,) =msg.sender.call{value: (address(this).balance)}("");
        require(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":"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddressResetSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SecondTeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressesToAdd","type":"address[]"}],"name":"SetupAddArrayToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAdd","type":"address"}],"name":"SetupAddToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableWhitelistTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToRemove","type":"address"}],"name":"SetupRemoveFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamAvoidBurning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"TeamDistributePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"TeamManualGenerateTokenSwapBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tknAddress","type":"address"}],"name":"TeamRescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPegged","type":"bool"}],"name":"TeamSetPeggedSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"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":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddressAlt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addy","type":"address[]"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addy","type":"address[]"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamSetWhitelistedAddressesAlt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWithdrawTeamETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhiteListBalanceLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dbal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dballing","outputs":[],"stateMutability":"nonpayable","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":"getAddressSellLockTimeInSeconds","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":"getDumpers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"AddressToCheck","type":"address"}],"name":"getWhitelistedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"toRemove","type":"address"}],"name":"removeBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isBlacklistEnabled","type":"bool"}],"name":"setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toBlacklist","type":"address"}],"name":"setBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"setContractTokenSwapManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"teamBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenSwapGenerated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"triedToDump","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600c805460ff191660011790556200001f6009600a62000678565b6200002e90620186a062000737565b600d55600e805460ff19166001179055620000516000546001600160a01b031690565b600e80546001600160a01b039290921661010002610100600160a81b0319909216919091179055620000866009600a62000678565b620000979064174876e80062000737565b600f819055601081905560118190556012556014805467010000000100000067ff000000ff00000019909116179055600a6018556019805460ff19166032179055348015620000e557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000600a600f5460096200013c919062000737565b6200014891906200060c565b33600081815260016020526040808220849055519293509091600080516020620041c883398151915290620001809085815260200190565b60405180910390a3600081600f546200019a919062000759565b30600081815260016020526040808220849055519293509091600080516020620041c883398151915290620001d29085815260200190565b60405180910390a3601580546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200023a57600080fd5b505afa1580156200024f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002759190620005da565b6001600160a01b031663c9c6539630601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002d357600080fd5b505afa158015620002e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030e9190620005da565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200035757600080fd5b505af11580156200036c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003929190620005da565b601480546001600160a01b03929092166801000000000000000002600160401b600160e01b03199092169190911790556041620003d26009600a62000678565b620003e39064174876e80062000737565b620003ef91906200060c565b601055607d620004026009600a62000678565b620004139064174876e80062000737565b6200041f91906200060c565b6011556064620004326009600a62000678565b620004439064174876e80062000737565b6200044f91906200060c565b601255600260209081556014805466ffff0000ffffff191666320f00000b0b0b1790556200049f9060059073703e8b64ab5ef0c2c4f51be258cbbdaf70f146d69062000568811b6200216117901c565b50620004cf73ca16e0cbe555782654faec7a80acd844a977466c60056200056860201b620021611790919060201c565b50620004eb3360056200056860201b620021611790919060201c565b5060155462000512906009906001600160a01b031662000568602090811b6200216117901c565b5062000543601460089054906101000a90046001600160a01b031660096200056860201b620021611790919060201c565b506200055f3060096200056860201b620021611790919060201c565b50505062000789565b60006200057f836001600160a01b03841662000588565b90505b92915050565b6000818152600183016020526040812054620005d15750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000582565b50600062000582565b600060208284031215620005ed57600080fd5b81516001600160a01b03811681146200060557600080fd5b9392505050565b6000826200062a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156200067057816000190482111562000654576200065462000773565b808516156200066257918102915b93841c939080029062000634565b509250929050565b60006200057f60ff841683600082620006945750600162000582565b81620006a35750600062000582565b8160018114620006bc5760028114620006c757620006e7565b600191505062000582565b60ff841115620006db57620006db62000773565b50506001821b62000582565b5060208310610133831016604e8410600b84101617156200070c575081810a62000582565b6200071883836200062f565b80600019048211156200072f576200072f62000773565b029392505050565b600081600019048311821515161562000754576200075462000773565b500290565b6000828210156200076e576200076e62000773565b500390565b634e487b7160e01b600052601160045260246000fd5b613a2f80620007996000396000f3fe60806040526004361061045d5760003560e01c806363b263b31161023d5780639bf6577011610138578063d51f383b116100bb578063e3aa94b011610082578063e3aa94b014610ddd578063e77bf5f814610dfd578063eb8e886314610e1d578063f2fde38b14610e32578063f88b0e4614610e52578063f9963ca114610e6857005b8063d51f383b14610d17578063d8e8de3414610d37578063da1144d614610d57578063dd62ed3e14610d77578063dff6bcbf14610dbd57005b8063a9059cbb116100ff578063a9059cbb14610c97578063b76289b814610cb7578063b85111db14610cd7578063c3f4f54f14610cec578063d3d6f49114610d0157005b80639bf6577014610be75780639fa62d5f14610c07578063a20623ce14610c27578063a457c2d714610c57578063a6fc178a14610c7757005b80638724cc72116101c05780638da5cb5b116101875780638da5cb5b14610b24578063914e208a14610b5857806393ab98f214610b7a57806395d89b4114610b9a5780639728c01914610bc757005b80638724cc7214610ad05780638728ecd114610ae5578063887c60fb14610b05578063893d20e814610b2457806389e8521714610b4257005b806371ab1f091161020457806371ab1f0914610a4b57806373ddf08e14610a6b578063762bb28214610a8b5780637b9e987a14610aa157806386d0ada814610ab657005b806363b263b31461097e578063677a8870146109ae5780636f89e409146109d657806370a0823114610a00578063715018a614610a3657005b8063311a8697116103585780634607e692116102db5780634f91e48c116102a25780634f91e48c146108e757806351b3cf62146108fd57806357ad67d114610912578063588aeaf214610932578063589210d91461095257806358e553651461096857005b80634607e6921461085d57806348e531641461087d57806348e907b7146108925780634ada218b146108a85780634cdaf0ae146108c757005b8063395093511161031f57806339509351146107d15780633cc39b7a146107f15780633d8dbf5d146108075780633e9be909146108275780634089b1701461084757005b8063311a86971461075e578063313ce567146107735780633328b721146107875780633478154b146107a7578063363977c5146107bc57005b806314e91377116103e05780631eb25d13116103a75780631eb25d131461066b5780631f8b845e14610680578063230ffc421461069557806323b872dd146106d55780632973ef2d146106f557005b806314e91377146105d6578063155ee020146105f65780631732ed7c1461061657806318160ddd1461063657806319e880841461064b57005b80630fd99e16116104245780630fd99e161461054557806311622a471461056d5780631193c691146105825780631201cbd0146105975780631285073c146105b757005b806302a89e021461046657806306fdde031461048657806309218ee7146104c9578063095ea7b3146104f55780630b1daa3e1461052557005b3661046457005b005b34801561047257600080fd5b506104646104813660046134cd565b610e88565b34801561049257600080fd5b50604080518082019091526008815267474f4a4f20496e7560c01b60208201525b6040516104c091906136b6565b60405180910390f35b3480156104d557600080fd5b506019546104e39060ff1681565b60405160ff90911681526020016104c0565b34801561050157600080fd5b50610515610510366004613425565b610edc565b60405190151581526020016104c0565b34801561053157600080fd5b50610464610540366004613343565b610ef3565b34801561055157600080fd5b5061055a607d81565b60405161ffff90911681526020016104c0565b34801561057957600080fd5b50610464610f27565b34801561058e57600080fd5b50610464611002565b3480156105a357600080fd5b506104646105b23660046134cd565b61104f565b3480156105c357600080fd5b506020545b6040519081526020016104c0565b3480156105e257600080fd5b506104646105f13660046134cd565b611087565b34801561060257600080fd5b50610464610611366004613539565b6110c6565b34801561062257600080fd5b506104646106313660046133f7565b611218565b34801561064257600080fd5b50600f546105c8565b34801561065757600080fd5b506104646106663660046133f7565b61126c565b34801561067757600080fd5b506105c86112bc565b34801561068c57600080fd5b5061055a606481565b3480156106a157600080fd5b506106bd73ca16e0cbe555782654faec7a80acd844a977466c81565b6040516001600160a01b0390911681526020016104c0565b3480156106e157600080fd5b506105156106f03660046133b6565b6112da565b34801561070157600080fd5b506014546040805160ff640100000000840481168252600160281b840481166020830152600160301b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016104c0565b34801561076a57600080fd5b506104e3604181565b34801561077f57600080fd5b5060096104e3565b34801561079357600080fd5b506104646107a2366004613343565b611371565b3480156107b357600080fd5b5061055a600281565b3480156107c857600080fd5b506104646113b7565b3480156107dd57600080fd5b506105156107ec366004613425565b611409565b3480156107fd57600080fd5b506105c8601e5481565b34801561081357600080fd5b50610464610822366004613343565b611440565b34801561083357600080fd5b50610464610842366004613486565b611489565b34801561085357600080fd5b506105c860175481565b34801561086957600080fd5b50610464610878366004613507565b611515565b34801561088957600080fd5b50610464611553565b34801561089e57600080fd5b506105c860165481565b3480156108b457600080fd5b5060215461051590610100900460ff1681565b3480156108d357600080fd5b506104646108e2366004613343565b611572565b3480156108f357600080fd5b506105c860115481565b34801561090957600080fd5b506104646115c3565b34801561091e57600080fd5b5061046461092d3660046135eb565b61161a565b34801561093e57600080fd5b5061046461094d366004613343565b6117b0565b34801561095e57600080fd5b506105c860125481565b34801561097457600080fd5b506105c8601a5481565b34801561098a57600080fd5b50610515610999366004613343565b60046020526000908152604090205460ff1681565b3480156109ba57600080fd5b506106bd73703e8b64ab5ef0c2c4f51be258cbbdaf70f146d681565b3480156109e257600080fd5b506109eb6117e0565b604080519283526020830191909152016104c0565b348015610a0c57600080fd5b506105c8610a1b366004613343565b6001600160a01b031660009081526001602052604090205490565b348015610a4257600080fd5b5061046461181d565b348015610a5757600080fd5b506021546105159062010000900460ff1681565b348015610a7757600080fd5b50610464610a863660046135d0565b6118d0565b348015610a9757600080fd5b506105c860105481565b348015610aad57600080fd5b5061046461190b565b348015610ac257600080fd5b506021546105159060ff1681565b348015610adc57600080fd5b5061055a604181565b348015610af157600080fd5b506105c8610b00366004613343565b611966565b348015610b1157600080fd5b50601f5461051590610100900460ff1681565b348015610b3057600080fd5b506000546001600160a01b03166106bd565b348015610b4e57600080fd5b506105c8601b5481565b348015610b6457600080fd5b50610b6d6119a5565b6040516104c091906136a3565b348015610b8657600080fd5b506106bd610b95366004613507565b611a07565b348015610ba657600080fd5b50604080518082019091526004815263474f4a4f60e01b60208201526104b3565b348015610bd357600080fd5b50610464610be2366004613486565b611a31565b348015610bf357600080fd5b50610464610c023660046134cd565b611af8565b348015610c1357600080fd5b50610464610c22366004613580565b611b30565b348015610c3357600080fd5b50610515610c42366004613343565b600b6020526000908152604090205460ff1681565b348015610c6357600080fd5b50610515610c72366004613425565b611b8f565b348015610c8357600080fd5b50610464610c923660046134cd565b611c0b565b348015610ca357600080fd5b50610515610cb2366004613425565b611c43565b348015610cc357600080fd5b50610464610cd2366004613343565b611c50565b348015610ce357600080fd5b50610464611c80565b348015610cf857600080fd5b506105c8611cfa565b348015610d0d57600080fd5b506105c8601c5481565b348015610d2357600080fd5b50610464610d32366004613507565b611d3a565b348015610d4357600080fd5b50610515610d52366004613343565b611db5565b348015610d6357600080fd5b50610464610d72366004613451565b611dc2565b348015610d8357600080fd5b506105c8610d9236600461337d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610dc957600080fd5b50610464610dd8366004613343565b611e33565b348015610de957600080fd5b50610464610df8366004613343565b611e63565b348015610e0957600080fd5b50610464610e18366004613343565b611fdc565b348015610e2957600080fd5b506104e3605f81565b348015610e3e57600080fd5b50610464610e4d366004613343565b61200c565b348015610e5e57600080fd5b506105c860205481565b348015610e7457600080fd5b50610464610e83366004613343565b612135565b610e9133612176565b610eb65760405162461bcd60e51b8152600401610ead9061370b565b60405180910390fd5b601480549115156701000000000000000267ff0000000000000019909216919091179055565b6000610ee93384846121db565b5060015b92915050565b610efc33612176565b610f185760405162461bcd60e51b8152600401610ead9061370b565b610f236009826122ce565b5050565b610f3033612176565b610f4c5760405162461bcd60e51b8152600401610ead9061370b565b601b5447811115610f5a5750475b6000601b81905560405173703e8b64ab5ef0c2c4f51be258cbbdaf70f146d69083905b60006040518083038185875af1925050503d8060008114610fba576040519150601f19603f3d011682016040523d82523d6000602084013e610fbf565b606091505b5050905080610f235760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ead565b61100b33612176565b6110275760405162461bcd60e51b8152600401610ead9061370b565b602154610100900460ff161561103c57600080fd5b6021805462ffff00191662010100179055565b61105833612176565b6110745760405162461bcd60e51b8152600401610ead9061370b565b600c805460ff1916911515919091179055565b61109033612176565b6110ac5760405162461bcd60e51b8152600401610ead9061370b565b601f80549115156101000261ff0019909216919091179055565b6110cf33612176565b6110eb5760405162461bcd60e51b8152600401610ead9061370b565b60005b8151811015611213576111036009600a61383f565b61110d90846138ea565b600160008484815181106111235761112361398a565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461115a919061379d565b9091555061116c90506009600a61383f565b61117690846138ea565b3060009081526001602052604081208054909190611195908490613909565b925050819055508181815181106111ae576111ae61398a565b60200260200101516001600160a01b0316306001600160a01b03166000805160206139da8339815191526009600a6111e6919061383f565b6111f090876138ea565b60405190815260200160405180910390a38061120b81613943565b9150506110ee565b505050565b61122133612176565b61123d5760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b0382166000908152600460205260409020805460ff1916821515179055611213600583612161565b61127533612176565b6112915760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6112c86009600a61383f565b6112d79064174876e8006138ea565b81565b60006112e78484846122e3565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156113525760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610ead565b61136685336113618685613909565b6121db565b506001949350505050565b61137a33612176565b6113965760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6113c033612176565b6113dc5760405162461bcd60e51b8152600401610ead9061370b565b601a805460009182905560405190919073ca16e0cbe555782654faec7a80acd844a977466c908390610f7d565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ee991859061136190869061379d565b61144933612176565b6114655760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b61149233612176565b6114ae5760405162461bcd60e51b8152600401610ead9061370b565b60005b82518110156112135781600460008584815181106114d1576114d161398a565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061150d81613943565b9150506114b1565b61151e33612176565b61153a5760405162461bcd60e51b8152600401610ead9061370b565b61155061154b82633b9aca006138ea565b61263e565b50565b602054611560904261379d565b33600090815260036020526040902055565b61157b33612176565b6115975760405162461bcd60e51b8152600401610ead9061370b565b602180546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6115cc33612176565b6115e85760405162461bcd60e51b8152600401610ead9061370b565b601c54478111156115f65750475b6000601c819055600e546040516101009091046001600160a01b0316908390610f7d565b61162333612176565b61163f5760405162461bcd60e51b8152600401610ead9061370b565b60008461164c87896137b5565b61165691906137b5565b90508060ff166064146116ba5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610ead565b605f60ff8516118015906116d25750605f60ff841611155b80156116e25750605f60ff831611155b61172e5760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610ead565b506014805460ff928316620100000262ff0000199484166101000261ffff19978516600160301b029790971666ff00000000ffff19988516600160281b0265ff0000000000199a8616640100000000029a909a1665ffff0000000019909316929092179890981796909616959095179216919091179190911716919091179055565b6117b933612176565b6117d55760405162461bcd60e51b8152600401610ead9061370b565b610f23600582612161565b6000806117ef6009600a61383f565b6010546117fc91906137da565b6118086009600a61383f565b60115461181591906137da565b915091509091565b336118306000546001600160a01b031690565b6001600160a01b0316146118865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ead565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6118d933612176565b6118f55760405162461bcd60e51b8152600401610ead9061370b565b6019805460ff191660ff92909216919091179055565b61191433612176565b6119305760405162461bcd60e51b8152600401610ead9061370b565b602154610100900460ff16801561194f575060215462010000900460ff165b61195857600080fd5b6021805462ff000019169055565b6001600160a01b03811660009081526003602052604081205442811161198f5750600092915050565b6119994282613909565b9392505050565b905090565b606060138054806020026020016040519081016040528092919081815260200182805480156119fd57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119df575b5050505050905090565b60138181548110611a1757600080fd5b6000918252602090912001546001600160a01b0316905081565b611a3a33612176565b611a565760405162461bcd60e51b8152600401610ead9061370b565b60005b8251811015611213578160046000858481518110611a7957611a7961398a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550611ae5838281518110611acd57611acd61398a565b6020026020010151600561216190919063ffffffff16565b5080611af081613943565b915050611a59565b611b0133612176565b611b1d5760405162461bcd60e51b8152600401610ead9061370b565b6021805460ff1916911515919091179055565b611b3933612176565b611b555760405162461bcd60e51b8152600401610ead9061370b565b611b616009600a61383f565b611b6b90836138ea565b9150611b796009600a61383f565b611b8390826138ea565b60109290925550601155565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611bf25760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610ead565b611c0133856113618685613909565b5060019392505050565b611c1433612176565b611c305760405162461bcd60e51b8152600401610ead9061370b565b600e805460ff1916911515919091179055565b6000610ee93384846122e3565b611c5933612176565b611c755760405162461bcd60e51b8152600401610ead9061370b565b610f23600782612161565b611c8933612176565b611ca55760405162461bcd60e51b8152600401610ead9061370b565b604051600090339047908381818185875af1925050503d8060008114611ce7576040519150601f19603f3d011682016040523d82523d6000602084013e611cec565b606091505b505090508061155057600080fd5b6000611d086009600a61383f565b600f54611d176009600a61383f565b611d269064174876e8006138ea565b611d309190613909565b6119a091906137da565b611d4333612176565b611d5f5760405162461bcd60e51b8152600401610ead9061370b565b6002811115611db05760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610ead565b602055565b6000610eed600783612793565b611dcb33612176565b611de75760405162461bcd60e51b8152600401610ead9061370b565b60005b8151811015610f2357611e20828281518110611e0857611e0861398a565b6020026020010151600761216190919063ffffffff16565b5080611e2b81613943565b915050611dea565b611e3c33612176565b611e585760405162461bcd60e51b8152600401610ead9061370b565b610f236005826122ce565b611e6c33612176565b611e885760405162461bcd60e51b8152600401610ead9061370b565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f049190613520565b905060008111611f565760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401610ead565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd691906134ea565b50505050565b611fe533612176565b6120015760405162461bcd60e51b8152600401610ead9061370b565b610f236007826122ce565b3361201f6000546001600160a01b031690565b6001600160a01b0316146120755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ead565b6001600160a01b0381166120da5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ead565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61213e33612176565b61215a5760405162461bcd60e51b8152600401610ead9061370b565b610f236009825b6000611999836001600160a01b0384166127b5565b600080546001600160a01b03838116911614806121af57506001600160a01b03821673703e8b64ab5ef0c2c4f51be258cbbdaf70f146d6145b80610eed57506001600160a01b03821673ca16e0cbe555782654faec7a80acd844a977466c1492915050565b6001600160a01b0383166122255760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610ead565b6001600160a01b03821661226d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610ead565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611999836001600160a01b038416612804565b6001600160a01b03831661232e5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610ead565b6001600160a01b0382166123775760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610ead565b6000612384600585612793565b806123955750612395600584612793565b905060006001600160a01b0385163014806123b857506001600160a01b03841630145b6015546014549192506001600160a01b0390811691600091888116600160401b909204161480156123fa5750816001600160a01b0316866001600160a01b0316145b8061243557506014546001600160a01b03878116600160401b909204161480156124355750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03898116600160401b90920416148061246f5750826001600160a01b0316886001600160a01b0316145b6014549091506000906001600160a01b03898116600160401b9092041614806124a95750836001600160a01b0316886001600160a01b0316145b905084806124b45750825b806124bc5750855b156124d1576124cc8989896128f1565b612633565b602154610100900460ff16612608576000546001600160a01b038a811691161480159061250c57506000546001600160a01b03898116911614155b15612608576001600160a01b03891660009081526004602052604090205460ff1615801561255357506001600160a01b03881660009081526004602052604090205460ff16155b15612608576014546301000000900460ff16156125b157876001600160a01b0316896001600160a01b03166000805160206139da833981519152600060405161259e91815260200190565b60405180910390a3505050505050505050565b602154610100900460ff166126085760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610ead565b60215462010000900460ff1615612626576124cc89898985856129aa565b6126338989898585612ab3565b505050505050505050565b601f805460ff19166001908117909155306000908152602091909152604081205460145490919061268390600160301b810460ff90811691600160281b9004166137b5565b60ff1690506000600d549050838111156126a557600e5460ff16156126a55750825b808310806126b5575061ffff8216155b156126c257505050612786565b60145460009061ffff8416906126e290600160281b900460ff16846138ea565b6126ec91906137da565b905060006126fa8284613909565b905060006127096002846137da565b905060006127178285613909565b90506000612725848361379d565b90504761273182612ed3565b600061273d8247613909565b905060008361274c86846138ea565b61275691906137da565b9050612762868261303b565b600061276e8447613909565b90506127798161310b565b5050505050505050505050505b50601f805460ff19169055565b6001600160a01b03811660009081526001830160205260408120541515611999565b60008181526001830160205260408120546127fc57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eed565b506000610eed565b600081815260018301602052604081205480156128e7576000612828600183613909565b855490915060009061283c90600190613909565b905060008660000182815481106128555761285561398a565b90600052602060002001549050808760000184815481106128785761287861398a565b6000918252602080832090910192909255828152600189019091526040902084905586548790806128ab576128ab613974565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610eed565b6000915050610eed565b6001600160a01b038316600090815260016020526040902054818110156129555760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ead565b61295f84836131dd565b6129698383613222565b826001600160a01b0316846001600160a01b03166000805160206139da8339815191528460405161299c91815260200190565b60405180910390a350505050565b80612a9f576129ba600785612793565b612a065760405162461bcd60e51b815260206004820152601a60248201527f726563697069656e74206e6f74206f6e2077686974656c6973740000000000006044820152606401610ead565b6041612a146009600a61383f565b612a239064174876e8006138ea565b612a2d91906137da565b6001600160a01b038516600090815260016020526040902054612a5190859061379d565b1115612a9f5760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e7420657863656564732077686974656c697374206d6178000000006044820152606401610ead565b612aac8585858585612ab3565b5050505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b215760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ead565b6002601154612b3091906137da565b600d5560008315612cbc57600c5460ff1615612b6c576001600160a01b0388166000908152600b602052604090205460ff1615612b6c57600080fd5b612b77600989612793565b612c11576001600160a01b03881660009081526003602052604090205442101580612ba95750601f54610100900460ff165b612bea5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610ead565b602054612bf7904261379d565b6001600160a01b0389166000908152600360205260409020555b601154861115612c6757601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b038a161790555b601154861115612cab5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610ead565b50601454610100900460ff16612dce565b8415612d1b57601054612ccf878561379d565b1115612ced5760405162461bcd60e51b8152600401610ead90613737565b601254861115612d0f5760405162461bcd60e51b8152600401610ead90613737565b5060145460ff16612dce565b601054612d28878561379d565b1115612d465760405162461bcd60e51b8152600401610ead90613737565b612d51600989612793565b612dc0576001600160a01b03881660009081526003602052604090205442101580612d835750601f54610100900460ff165b612dc05760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610ead565b5060145462010000900460ff165b6014546001600160a01b03898116600160401b9092041614801590612df6575060215460ff16155b8015612e055750601f5460ff16155b15612e1357612e138661263e565b601454600090612e439088908490612e3e9060ff600160281b8204811691600160301b9004166137b5565b613246565b90506000612e518289613909565b9050612e5d8a896131dd565b3060009081526001602052604081208054849290612e7c90849061379d565b90915550612e8c90508982613222565b886001600160a01b03168a6001600160a01b03166000805160206139da83398151915283604051612ebf91815260200190565b60405180910390a350505050505050505050565b601554612eeb9030906001600160a01b0316836121db565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f2057612f2061398a565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612f7457600080fd5b505afa158015612f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fac9190613360565b81600181518110612fbf57612fbf61398a565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613005908590600090869030904290600401613761565b600060405180830381600087803b15801561301f57600080fd5b505af1158015613033573d6000803e3d6000fd5b505050505050565b80601e600082825461304d919061379d565b909155505060155461306a9030906001600160a01b0316846121db565b60155460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b1580156130d257600080fd5b505af11580156130e6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612aac91906135a2565b601854601954600091906131239060ff166064613920565b60ff166131309190613909565b6019549091506000906064906131499060ff16856138ea565b61315391906137da565b90506000606461316384866138ea565b61316d91906137da565b9050600060646018548661318191906138ea565b61318b91906137da565b905082601a600082825461319f919061379d565b9250508190555081601b60008282546131b8919061379d565b9250508190555080601c60008282546131d1919061379d565b90915550505050505050565b6001600160a01b038216600090815260016020526040812054613201908390613909565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461320190839061379d565b60006127108260ff168460ff168661325e91906138ea565b61326891906138ea565b61327291906137da565b949350505050565b8035613285816139b6565b919050565b600082601f83011261329b57600080fd5b8135602067ffffffffffffffff808311156132b8576132b86139a0565b8260051b604051601f19603f830116810181811084821117156132dd576132dd6139a0565b604052848152838101925086840182880185018910156132fc57600080fd5b600092505b85831015613326576133128161327a565b845292840192600192909201918401613301565b50979650505050505050565b803560ff8116811461328557600080fd5b60006020828403121561335557600080fd5b8135611999816139b6565b60006020828403121561337257600080fd5b8151611999816139b6565b6000806040838503121561339057600080fd5b823561339b816139b6565b915060208301356133ab816139b6565b809150509250929050565b6000806000606084860312156133cb57600080fd5b83356133d6816139b6565b925060208401356133e6816139b6565b929592945050506040919091013590565b6000806040838503121561340a57600080fd5b8235613415816139b6565b915060208301356133ab816139cb565b6000806040838503121561343857600080fd5b8235613443816139b6565b946020939093013593505050565b60006020828403121561346357600080fd5b813567ffffffffffffffff81111561347a57600080fd5b6132728482850161328a565b6000806040838503121561349957600080fd5b823567ffffffffffffffff8111156134b057600080fd5b6134bc8582860161328a565b92505060208301356133ab816139cb565b6000602082840312156134df57600080fd5b8135611999816139cb565b6000602082840312156134fc57600080fd5b8151611999816139cb565b60006020828403121561351957600080fd5b5035919050565b60006020828403121561353257600080fd5b5051919050565b6000806040838503121561354c57600080fd5b82359150602083013567ffffffffffffffff81111561356a57600080fd5b6135768582860161328a565b9150509250929050565b6000806040838503121561359357600080fd5b50508035926020909101359150565b6000806000606084860312156135b757600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156135e257600080fd5b61199982613332565b60008060008060008060c0878903121561360457600080fd5b61360d87613332565b955061361b60208801613332565b945061362960408801613332565b935061363760608801613332565b925061364560808801613332565b915061365360a08801613332565b90509295509295509295565b600081518084526020808501945080840160005b838110156136985781516001600160a01b031687529582019590820190600101613673565b509495945050505050565b602081526000611999602083018461365f565b600060208083528351808285015260005b818110156136e3578581018301518582016040015282016136c7565b818111156136f5576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b85815284602082015260a06040820152600061378060a083018661365f565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156137b0576137b061395e565b500190565b600060ff821660ff84168060ff038211156137d2576137d261395e565b019392505050565b6000826137f757634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561383757816000190482111561381d5761381d61395e565b8085161561382a57918102915b93841c9390800290613801565b509250929050565b600061199960ff84168360008261385857506001610eed565b8161386557506000610eed565b816001811461387b5760028114613885576138a1565b6001915050610eed565b60ff8411156138965761389661395e565b50506001821b610eed565b5060208310610133831016604e8410600b84101617156138c4575081810a610eed565b6138ce83836137fc565b80600019048211156138e2576138e261395e565b029392505050565b60008160001904831182151516156139045761390461395e565b500290565b60008282101561391b5761391b61395e565b500390565b600060ff821660ff84168082101561393a5761393a61395e565b90039392505050565b60006000198214156139575761395761395e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461155057600080fd5b801515811461155057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122075675ce83745529bd79fdf6cfeff631442df969f9a389e4d39604a7d08ebc3f164736f6c63430008070033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x60806040526004361061045d5760003560e01c806363b263b31161023d5780639bf6577011610138578063d51f383b116100bb578063e3aa94b011610082578063e3aa94b014610ddd578063e77bf5f814610dfd578063eb8e886314610e1d578063f2fde38b14610e32578063f88b0e4614610e52578063f9963ca114610e6857005b8063d51f383b14610d17578063d8e8de3414610d37578063da1144d614610d57578063dd62ed3e14610d77578063dff6bcbf14610dbd57005b8063a9059cbb116100ff578063a9059cbb14610c97578063b76289b814610cb7578063b85111db14610cd7578063c3f4f54f14610cec578063d3d6f49114610d0157005b80639bf6577014610be75780639fa62d5f14610c07578063a20623ce14610c27578063a457c2d714610c57578063a6fc178a14610c7757005b80638724cc72116101c05780638da5cb5b116101875780638da5cb5b14610b24578063914e208a14610b5857806393ab98f214610b7a57806395d89b4114610b9a5780639728c01914610bc757005b80638724cc7214610ad05780638728ecd114610ae5578063887c60fb14610b05578063893d20e814610b2457806389e8521714610b4257005b806371ab1f091161020457806371ab1f0914610a4b57806373ddf08e14610a6b578063762bb28214610a8b5780637b9e987a14610aa157806386d0ada814610ab657005b806363b263b31461097e578063677a8870146109ae5780636f89e409146109d657806370a0823114610a00578063715018a614610a3657005b8063311a8697116103585780634607e692116102db5780634f91e48c116102a25780634f91e48c146108e757806351b3cf62146108fd57806357ad67d114610912578063588aeaf214610932578063589210d91461095257806358e553651461096857005b80634607e6921461085d57806348e531641461087d57806348e907b7146108925780634ada218b146108a85780634cdaf0ae146108c757005b8063395093511161031f57806339509351146107d15780633cc39b7a146107f15780633d8dbf5d146108075780633e9be909146108275780634089b1701461084757005b8063311a86971461075e578063313ce567146107735780633328b721146107875780633478154b146107a7578063363977c5146107bc57005b806314e91377116103e05780631eb25d13116103a75780631eb25d131461066b5780631f8b845e14610680578063230ffc421461069557806323b872dd146106d55780632973ef2d146106f557005b806314e91377146105d6578063155ee020146105f65780631732ed7c1461061657806318160ddd1461063657806319e880841461064b57005b80630fd99e16116104245780630fd99e161461054557806311622a471461056d5780631193c691146105825780631201cbd0146105975780631285073c146105b757005b806302a89e021461046657806306fdde031461048657806309218ee7146104c9578063095ea7b3146104f55780630b1daa3e1461052557005b3661046457005b005b34801561047257600080fd5b506104646104813660046134cd565b610e88565b34801561049257600080fd5b50604080518082019091526008815267474f4a4f20496e7560c01b60208201525b6040516104c091906136b6565b60405180910390f35b3480156104d557600080fd5b506019546104e39060ff1681565b60405160ff90911681526020016104c0565b34801561050157600080fd5b50610515610510366004613425565b610edc565b60405190151581526020016104c0565b34801561053157600080fd5b50610464610540366004613343565b610ef3565b34801561055157600080fd5b5061055a607d81565b60405161ffff90911681526020016104c0565b34801561057957600080fd5b50610464610f27565b34801561058e57600080fd5b50610464611002565b3480156105a357600080fd5b506104646105b23660046134cd565b61104f565b3480156105c357600080fd5b506020545b6040519081526020016104c0565b3480156105e257600080fd5b506104646105f13660046134cd565b611087565b34801561060257600080fd5b50610464610611366004613539565b6110c6565b34801561062257600080fd5b506104646106313660046133f7565b611218565b34801561064257600080fd5b50600f546105c8565b34801561065757600080fd5b506104646106663660046133f7565b61126c565b34801561067757600080fd5b506105c86112bc565b34801561068c57600080fd5b5061055a606481565b3480156106a157600080fd5b506106bd73ca16e0cbe555782654faec7a80acd844a977466c81565b6040516001600160a01b0390911681526020016104c0565b3480156106e157600080fd5b506105156106f03660046133b6565b6112da565b34801561070157600080fd5b506014546040805160ff640100000000840481168252600160281b840481166020830152600160301b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016104c0565b34801561076a57600080fd5b506104e3604181565b34801561077f57600080fd5b5060096104e3565b34801561079357600080fd5b506104646107a2366004613343565b611371565b3480156107b357600080fd5b5061055a600281565b3480156107c857600080fd5b506104646113b7565b3480156107dd57600080fd5b506105156107ec366004613425565b611409565b3480156107fd57600080fd5b506105c8601e5481565b34801561081357600080fd5b50610464610822366004613343565b611440565b34801561083357600080fd5b50610464610842366004613486565b611489565b34801561085357600080fd5b506105c860175481565b34801561086957600080fd5b50610464610878366004613507565b611515565b34801561088957600080fd5b50610464611553565b34801561089e57600080fd5b506105c860165481565b3480156108b457600080fd5b5060215461051590610100900460ff1681565b3480156108d357600080fd5b506104646108e2366004613343565b611572565b3480156108f357600080fd5b506105c860115481565b34801561090957600080fd5b506104646115c3565b34801561091e57600080fd5b5061046461092d3660046135eb565b61161a565b34801561093e57600080fd5b5061046461094d366004613343565b6117b0565b34801561095e57600080fd5b506105c860125481565b34801561097457600080fd5b506105c8601a5481565b34801561098a57600080fd5b50610515610999366004613343565b60046020526000908152604090205460ff1681565b3480156109ba57600080fd5b506106bd73703e8b64ab5ef0c2c4f51be258cbbdaf70f146d681565b3480156109e257600080fd5b506109eb6117e0565b604080519283526020830191909152016104c0565b348015610a0c57600080fd5b506105c8610a1b366004613343565b6001600160a01b031660009081526001602052604090205490565b348015610a4257600080fd5b5061046461181d565b348015610a5757600080fd5b506021546105159062010000900460ff1681565b348015610a7757600080fd5b50610464610a863660046135d0565b6118d0565b348015610a9757600080fd5b506105c860105481565b348015610aad57600080fd5b5061046461190b565b348015610ac257600080fd5b506021546105159060ff1681565b348015610adc57600080fd5b5061055a604181565b348015610af157600080fd5b506105c8610b00366004613343565b611966565b348015610b1157600080fd5b50601f5461051590610100900460ff1681565b348015610b3057600080fd5b506000546001600160a01b03166106bd565b348015610b4e57600080fd5b506105c8601b5481565b348015610b6457600080fd5b50610b6d6119a5565b6040516104c091906136a3565b348015610b8657600080fd5b506106bd610b95366004613507565b611a07565b348015610ba657600080fd5b50604080518082019091526004815263474f4a4f60e01b60208201526104b3565b348015610bd357600080fd5b50610464610be2366004613486565b611a31565b348015610bf357600080fd5b50610464610c023660046134cd565b611af8565b348015610c1357600080fd5b50610464610c22366004613580565b611b30565b348015610c3357600080fd5b50610515610c42366004613343565b600b6020526000908152604090205460ff1681565b348015610c6357600080fd5b50610515610c72366004613425565b611b8f565b348015610c8357600080fd5b50610464610c923660046134cd565b611c0b565b348015610ca357600080fd5b50610515610cb2366004613425565b611c43565b348015610cc357600080fd5b50610464610cd2366004613343565b611c50565b348015610ce357600080fd5b50610464611c80565b348015610cf857600080fd5b506105c8611cfa565b348015610d0d57600080fd5b506105c8601c5481565b348015610d2357600080fd5b50610464610d32366004613507565b611d3a565b348015610d4357600080fd5b50610515610d52366004613343565b611db5565b348015610d6357600080fd5b50610464610d72366004613451565b611dc2565b348015610d8357600080fd5b506105c8610d9236600461337d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610dc957600080fd5b50610464610dd8366004613343565b611e33565b348015610de957600080fd5b50610464610df8366004613343565b611e63565b348015610e0957600080fd5b50610464610e18366004613343565b611fdc565b348015610e2957600080fd5b506104e3605f81565b348015610e3e57600080fd5b50610464610e4d366004613343565b61200c565b348015610e5e57600080fd5b506105c860205481565b348015610e7457600080fd5b50610464610e83366004613343565b612135565b610e9133612176565b610eb65760405162461bcd60e51b8152600401610ead9061370b565b60405180910390fd5b601480549115156701000000000000000267ff0000000000000019909216919091179055565b6000610ee93384846121db565b5060015b92915050565b610efc33612176565b610f185760405162461bcd60e51b8152600401610ead9061370b565b610f236009826122ce565b5050565b610f3033612176565b610f4c5760405162461bcd60e51b8152600401610ead9061370b565b601b5447811115610f5a5750475b6000601b81905560405173703e8b64ab5ef0c2c4f51be258cbbdaf70f146d69083905b60006040518083038185875af1925050503d8060008114610fba576040519150601f19603f3d011682016040523d82523d6000602084013e610fbf565b606091505b5050905080610f235760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ead565b61100b33612176565b6110275760405162461bcd60e51b8152600401610ead9061370b565b602154610100900460ff161561103c57600080fd5b6021805462ffff00191662010100179055565b61105833612176565b6110745760405162461bcd60e51b8152600401610ead9061370b565b600c805460ff1916911515919091179055565b61109033612176565b6110ac5760405162461bcd60e51b8152600401610ead9061370b565b601f80549115156101000261ff0019909216919091179055565b6110cf33612176565b6110eb5760405162461bcd60e51b8152600401610ead9061370b565b60005b8151811015611213576111036009600a61383f565b61110d90846138ea565b600160008484815181106111235761112361398a565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461115a919061379d565b9091555061116c90506009600a61383f565b61117690846138ea565b3060009081526001602052604081208054909190611195908490613909565b925050819055508181815181106111ae576111ae61398a565b60200260200101516001600160a01b0316306001600160a01b03166000805160206139da8339815191526009600a6111e6919061383f565b6111f090876138ea565b60405190815260200160405180910390a38061120b81613943565b9150506110ee565b505050565b61122133612176565b61123d5760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b0382166000908152600460205260409020805460ff1916821515179055611213600583612161565b61127533612176565b6112915760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6112c86009600a61383f565b6112d79064174876e8006138ea565b81565b60006112e78484846122e3565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156113525760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610ead565b61136685336113618685613909565b6121db565b506001949350505050565b61137a33612176565b6113965760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6113c033612176565b6113dc5760405162461bcd60e51b8152600401610ead9061370b565b601a805460009182905560405190919073ca16e0cbe555782654faec7a80acd844a977466c908390610f7d565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ee991859061136190869061379d565b61144933612176565b6114655760405162461bcd60e51b8152600401610ead9061370b565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b61149233612176565b6114ae5760405162461bcd60e51b8152600401610ead9061370b565b60005b82518110156112135781600460008584815181106114d1576114d161398a565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061150d81613943565b9150506114b1565b61151e33612176565b61153a5760405162461bcd60e51b8152600401610ead9061370b565b61155061154b82633b9aca006138ea565b61263e565b50565b602054611560904261379d565b33600090815260036020526040902055565b61157b33612176565b6115975760405162461bcd60e51b8152600401610ead9061370b565b602180546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6115cc33612176565b6115e85760405162461bcd60e51b8152600401610ead9061370b565b601c54478111156115f65750475b6000601c819055600e546040516101009091046001600160a01b0316908390610f7d565b61162333612176565b61163f5760405162461bcd60e51b8152600401610ead9061370b565b60008461164c87896137b5565b61165691906137b5565b90508060ff166064146116ba5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610ead565b605f60ff8516118015906116d25750605f60ff841611155b80156116e25750605f60ff831611155b61172e5760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610ead565b506014805460ff928316620100000262ff0000199484166101000261ffff19978516600160301b029790971666ff00000000ffff19988516600160281b0265ff0000000000199a8616640100000000029a909a1665ffff0000000019909316929092179890981796909616959095179216919091179190911716919091179055565b6117b933612176565b6117d55760405162461bcd60e51b8152600401610ead9061370b565b610f23600582612161565b6000806117ef6009600a61383f565b6010546117fc91906137da565b6118086009600a61383f565b60115461181591906137da565b915091509091565b336118306000546001600160a01b031690565b6001600160a01b0316146118865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ead565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6118d933612176565b6118f55760405162461bcd60e51b8152600401610ead9061370b565b6019805460ff191660ff92909216919091179055565b61191433612176565b6119305760405162461bcd60e51b8152600401610ead9061370b565b602154610100900460ff16801561194f575060215462010000900460ff165b61195857600080fd5b6021805462ff000019169055565b6001600160a01b03811660009081526003602052604081205442811161198f5750600092915050565b6119994282613909565b9392505050565b905090565b606060138054806020026020016040519081016040528092919081815260200182805480156119fd57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119df575b5050505050905090565b60138181548110611a1757600080fd5b6000918252602090912001546001600160a01b0316905081565b611a3a33612176565b611a565760405162461bcd60e51b8152600401610ead9061370b565b60005b8251811015611213578160046000858481518110611a7957611a7961398a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550611ae5838281518110611acd57611acd61398a565b6020026020010151600561216190919063ffffffff16565b5080611af081613943565b915050611a59565b611b0133612176565b611b1d5760405162461bcd60e51b8152600401610ead9061370b565b6021805460ff1916911515919091179055565b611b3933612176565b611b555760405162461bcd60e51b8152600401610ead9061370b565b611b616009600a61383f565b611b6b90836138ea565b9150611b796009600a61383f565b611b8390826138ea565b60109290925550601155565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611bf25760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610ead565b611c0133856113618685613909565b5060019392505050565b611c1433612176565b611c305760405162461bcd60e51b8152600401610ead9061370b565b600e805460ff1916911515919091179055565b6000610ee93384846122e3565b611c5933612176565b611c755760405162461bcd60e51b8152600401610ead9061370b565b610f23600782612161565b611c8933612176565b611ca55760405162461bcd60e51b8152600401610ead9061370b565b604051600090339047908381818185875af1925050503d8060008114611ce7576040519150601f19603f3d011682016040523d82523d6000602084013e611cec565b606091505b505090508061155057600080fd5b6000611d086009600a61383f565b600f54611d176009600a61383f565b611d269064174876e8006138ea565b611d309190613909565b6119a091906137da565b611d4333612176565b611d5f5760405162461bcd60e51b8152600401610ead9061370b565b6002811115611db05760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610ead565b602055565b6000610eed600783612793565b611dcb33612176565b611de75760405162461bcd60e51b8152600401610ead9061370b565b60005b8151811015610f2357611e20828281518110611e0857611e0861398a565b6020026020010151600761216190919063ffffffff16565b5080611e2b81613943565b915050611dea565b611e3c33612176565b611e585760405162461bcd60e51b8152600401610ead9061370b565b610f236005826122ce565b611e6c33612176565b611e885760405162461bcd60e51b8152600401610ead9061370b565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f049190613520565b905060008111611f565760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401610ead565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015611f9e57600080fd5b505af1158015611fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd691906134ea565b50505050565b611fe533612176565b6120015760405162461bcd60e51b8152600401610ead9061370b565b610f236007826122ce565b3361201f6000546001600160a01b031690565b6001600160a01b0316146120755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ead565b6001600160a01b0381166120da5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ead565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61213e33612176565b61215a5760405162461bcd60e51b8152600401610ead9061370b565b610f236009825b6000611999836001600160a01b0384166127b5565b600080546001600160a01b03838116911614806121af57506001600160a01b03821673703e8b64ab5ef0c2c4f51be258cbbdaf70f146d6145b80610eed57506001600160a01b03821673ca16e0cbe555782654faec7a80acd844a977466c1492915050565b6001600160a01b0383166122255760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610ead565b6001600160a01b03821661226d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610ead565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611999836001600160a01b038416612804565b6001600160a01b03831661232e5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610ead565b6001600160a01b0382166123775760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610ead565b6000612384600585612793565b806123955750612395600584612793565b905060006001600160a01b0385163014806123b857506001600160a01b03841630145b6015546014549192506001600160a01b0390811691600091888116600160401b909204161480156123fa5750816001600160a01b0316866001600160a01b0316145b8061243557506014546001600160a01b03878116600160401b909204161480156124355750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03898116600160401b90920416148061246f5750826001600160a01b0316886001600160a01b0316145b6014549091506000906001600160a01b03898116600160401b9092041614806124a95750836001600160a01b0316886001600160a01b0316145b905084806124b45750825b806124bc5750855b156124d1576124cc8989896128f1565b612633565b602154610100900460ff16612608576000546001600160a01b038a811691161480159061250c57506000546001600160a01b03898116911614155b15612608576001600160a01b03891660009081526004602052604090205460ff1615801561255357506001600160a01b03881660009081526004602052604090205460ff16155b15612608576014546301000000900460ff16156125b157876001600160a01b0316896001600160a01b03166000805160206139da833981519152600060405161259e91815260200190565b60405180910390a3505050505050505050565b602154610100900460ff166126085760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610ead565b60215462010000900460ff1615612626576124cc89898985856129aa565b6126338989898585612ab3565b505050505050505050565b601f805460ff19166001908117909155306000908152602091909152604081205460145490919061268390600160301b810460ff90811691600160281b9004166137b5565b60ff1690506000600d549050838111156126a557600e5460ff16156126a55750825b808310806126b5575061ffff8216155b156126c257505050612786565b60145460009061ffff8416906126e290600160281b900460ff16846138ea565b6126ec91906137da565b905060006126fa8284613909565b905060006127096002846137da565b905060006127178285613909565b90506000612725848361379d565b90504761273182612ed3565b600061273d8247613909565b905060008361274c86846138ea565b61275691906137da565b9050612762868261303b565b600061276e8447613909565b90506127798161310b565b5050505050505050505050505b50601f805460ff19169055565b6001600160a01b03811660009081526001830160205260408120541515611999565b60008181526001830160205260408120546127fc57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eed565b506000610eed565b600081815260018301602052604081205480156128e7576000612828600183613909565b855490915060009061283c90600190613909565b905060008660000182815481106128555761285561398a565b90600052602060002001549050808760000184815481106128785761287861398a565b6000918252602080832090910192909255828152600189019091526040902084905586548790806128ab576128ab613974565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610eed565b6000915050610eed565b6001600160a01b038316600090815260016020526040902054818110156129555760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ead565b61295f84836131dd565b6129698383613222565b826001600160a01b0316846001600160a01b03166000805160206139da8339815191528460405161299c91815260200190565b60405180910390a350505050565b80612a9f576129ba600785612793565b612a065760405162461bcd60e51b815260206004820152601a60248201527f726563697069656e74206e6f74206f6e2077686974656c6973740000000000006044820152606401610ead565b6041612a146009600a61383f565b612a239064174876e8006138ea565b612a2d91906137da565b6001600160a01b038516600090815260016020526040902054612a5190859061379d565b1115612a9f5760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e7420657863656564732077686974656c697374206d6178000000006044820152606401610ead565b612aac8585858585612ab3565b5050505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b215760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610ead565b6002601154612b3091906137da565b600d5560008315612cbc57600c5460ff1615612b6c576001600160a01b0388166000908152600b602052604090205460ff1615612b6c57600080fd5b612b77600989612793565b612c11576001600160a01b03881660009081526003602052604090205442101580612ba95750601f54610100900460ff165b612bea5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610ead565b602054612bf7904261379d565b6001600160a01b0389166000908152600360205260409020555b601154861115612c6757601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b038a161790555b601154861115612cab5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610ead565b50601454610100900460ff16612dce565b8415612d1b57601054612ccf878561379d565b1115612ced5760405162461bcd60e51b8152600401610ead90613737565b601254861115612d0f5760405162461bcd60e51b8152600401610ead90613737565b5060145460ff16612dce565b601054612d28878561379d565b1115612d465760405162461bcd60e51b8152600401610ead90613737565b612d51600989612793565b612dc0576001600160a01b03881660009081526003602052604090205442101580612d835750601f54610100900460ff165b612dc05760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610ead565b5060145462010000900460ff165b6014546001600160a01b03898116600160401b9092041614801590612df6575060215460ff16155b8015612e055750601f5460ff16155b15612e1357612e138661263e565b601454600090612e439088908490612e3e9060ff600160281b8204811691600160301b9004166137b5565b613246565b90506000612e518289613909565b9050612e5d8a896131dd565b3060009081526001602052604081208054849290612e7c90849061379d565b90915550612e8c90508982613222565b886001600160a01b03168a6001600160a01b03166000805160206139da83398151915283604051612ebf91815260200190565b60405180910390a350505050505050505050565b601554612eeb9030906001600160a01b0316836121db565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f2057612f2061398a565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612f7457600080fd5b505afa158015612f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fac9190613360565b81600181518110612fbf57612fbf61398a565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613005908590600090869030904290600401613761565b600060405180830381600087803b15801561301f57600080fd5b505af1158015613033573d6000803e3d6000fd5b505050505050565b80601e600082825461304d919061379d565b909155505060155461306a9030906001600160a01b0316846121db565b60155460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b1580156130d257600080fd5b505af11580156130e6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612aac91906135a2565b601854601954600091906131239060ff166064613920565b60ff166131309190613909565b6019549091506000906064906131499060ff16856138ea565b61315391906137da565b90506000606461316384866138ea565b61316d91906137da565b9050600060646018548661318191906138ea565b61318b91906137da565b905082601a600082825461319f919061379d565b9250508190555081601b60008282546131b8919061379d565b9250508190555080601c60008282546131d1919061379d565b90915550505050505050565b6001600160a01b038216600090815260016020526040812054613201908390613909565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461320190839061379d565b60006127108260ff168460ff168661325e91906138ea565b61326891906138ea565b61327291906137da565b949350505050565b8035613285816139b6565b919050565b600082601f83011261329b57600080fd5b8135602067ffffffffffffffff808311156132b8576132b86139a0565b8260051b604051601f19603f830116810181811084821117156132dd576132dd6139a0565b604052848152838101925086840182880185018910156132fc57600080fd5b600092505b85831015613326576133128161327a565b845292840192600192909201918401613301565b50979650505050505050565b803560ff8116811461328557600080fd5b60006020828403121561335557600080fd5b8135611999816139b6565b60006020828403121561337257600080fd5b8151611999816139b6565b6000806040838503121561339057600080fd5b823561339b816139b6565b915060208301356133ab816139b6565b809150509250929050565b6000806000606084860312156133cb57600080fd5b83356133d6816139b6565b925060208401356133e6816139b6565b929592945050506040919091013590565b6000806040838503121561340a57600080fd5b8235613415816139b6565b915060208301356133ab816139cb565b6000806040838503121561343857600080fd5b8235613443816139b6565b946020939093013593505050565b60006020828403121561346357600080fd5b813567ffffffffffffffff81111561347a57600080fd5b6132728482850161328a565b6000806040838503121561349957600080fd5b823567ffffffffffffffff8111156134b057600080fd5b6134bc8582860161328a565b92505060208301356133ab816139cb565b6000602082840312156134df57600080fd5b8135611999816139cb565b6000602082840312156134fc57600080fd5b8151611999816139cb565b60006020828403121561351957600080fd5b5035919050565b60006020828403121561353257600080fd5b5051919050565b6000806040838503121561354c57600080fd5b82359150602083013567ffffffffffffffff81111561356a57600080fd5b6135768582860161328a565b9150509250929050565b6000806040838503121561359357600080fd5b50508035926020909101359150565b6000806000606084860312156135b757600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156135e257600080fd5b61199982613332565b60008060008060008060c0878903121561360457600080fd5b61360d87613332565b955061361b60208801613332565b945061362960408801613332565b935061363760608801613332565b925061364560808801613332565b915061365360a08801613332565b90509295509295509295565b600081518084526020808501945080840160005b838110156136985781516001600160a01b031687529582019590820190600101613673565b509495945050505050565b602081526000611999602083018461365f565b600060208083528351808285015260005b818110156136e3578581018301518582016040015282016136c7565b818111156136f5576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b85815284602082015260a06040820152600061378060a083018661365f565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156137b0576137b061395e565b500190565b600060ff821660ff84168060ff038211156137d2576137d261395e565b019392505050565b6000826137f757634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561383757816000190482111561381d5761381d61395e565b8085161561382a57918102915b93841c9390800290613801565b509250929050565b600061199960ff84168360008261385857506001610eed565b8161386557506000610eed565b816001811461387b5760028114613885576138a1565b6001915050610eed565b60ff8411156138965761389661395e565b50506001821b610eed565b5060208310610133831016604e8410600b84101617156138c4575081810a610eed565b6138ce83836137fc565b80600019048211156138e2576138e261395e565b029392505050565b60008160001904831182151516156139045761390461395e565b500290565b60008282101561391b5761391b61395e565b500390565b600060ff821660ff84168082101561393a5761393a61395e565b90039392505050565b60006000198214156139575761395761395e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461155057600080fd5b801515811461155057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122075675ce83745529bd79fdf6cfeff631442df969f9a389e4d39604a7d08ebc3f164736f6c63430008070033

Deployed Bytecode Sourcemap

25695:31357:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53311:110;;;;;;;;;;-1:-1:-1;53311:110:0;;;;;:::i;:::-;;:::i;54706:94::-;;;;;;;;;;-1:-1:-1;54787:5:0;;;;;;;;;;;;-1:-1:-1;;;54787:5:0;;;;54706:94;;;;;;;:::i;:::-;;;;;;;;39634:30;;;;;;;;;;-1:-1:-1;39634:30:0;;;;;;;;;;;19469:4:1;19457:17;;;19439:36;;19427:2;19412:18;39634:30:0;19297:184:1;55591:161:0;;;;;;;;;;-1:-1:-1;55591:161:0;;;;;:::i;:::-;;:::i;:::-;;;8930:14:1;;8923:22;8905:41;;8893:2;8878:18;55591:161:0;8765:187:1;50269:127:0;;;;;;;;;;-1:-1:-1;50269:127:0;;;;;:::i;:::-;;:::i;27094:43::-;;;;;;;;;;;;27134:3;27094:43;;;;;17716:6:1;17704:19;;;17686:38;;17674:2;17659:18;27094:43:0;17542:188:1;47478:318:0;;;;;;;;;;;;;:::i;51743:209::-;;;;;;;;;;;;;:::i;53178:121::-;;;;;;;;;;-1:-1:-1;53178:121:0;;;;;:::i;:::-;;:::i;45421:102::-;;;;;;;;;;-1:-1:-1;45503:12:0;;45421:102;;;9111:25:1;;;9099:2;9084:18;45421:102:0;8957:185:1;48349:103:0;;;;;;;;;;-1:-1:-1;48349:103:0;;;;;:::i;:::-;;:::i;50835:385::-;;;;;;;;;;-1:-1:-1;50835:385:0;;;;;:::i;:::-;;:::i;46469:147::-;;;;;;;;;;-1:-1:-1;46469:147:0;;;;;:::i;:::-;;:::i;55016:108::-;;;;;;;;;;-1:-1:-1;55098:18:0;;55016:108;;46337:120;;;;;;;;;;-1:-1:-1;46337:120:0;;;;;:::i;:::-;;:::i;26470:66::-;;;;;;;;;;;;;:::i;26725:42::-;;;;;;;;;;;;26764:3;26725:42;;27381:83;;;;;;;;;;;;27422:42;27381:83;;;;;-1:-1:-1;;;;;7564:32:1;;;7546:51;;7534:2;7519:18;27381:83:0;7400:203:1;56065:392:0;;;;;;;;;;-1:-1:-1;56065:392:0;;;;;:::i;:::-;;:::i;44679:246::-;;;;;;;;;;-1:-1:-1;44850:8:0;;44679:246;;;44850:8;;;;;;19044:25:1;;-1:-1:-1;;;44859:13:0;;;;19100:2:1;19085:18;;19078:34;-1:-1:-1;;;44873:13:0;;;;19128:18:1;;;19121:34;;;;44887:7:0;;;19186:2:1;19171:18;;19164:34;44850:8:0;44895;;;;19229:3:1;19214:19;;19207:35;44904:12:0;;;;;19273:3:1;19258:19;;19251:35;19031:3;19016:19;44679:246:0;18757:535:1;26843:44:0;;;;;;;;;;;;26885:2;26843:44;;54914:94;;;;;;;;;;-1:-1:-1;26462:1:0;54914:94;;53562:115;;;;;;;;;;-1:-1:-1;53562:115:0;;;;;:::i;:::-;;:::i;27220:49::-;;;;;;;;;;;;27260:9;27220:49;;47226:239;;;;;;;;;;;;;:::i;56492:205::-;;;;;;;;;;-1:-1:-1;56492:205:0;;;;;:::i;:::-;;:::i;40839:25::-;;;;;;;;;;;;;;;;53433:117;;;;;;;;;;-1:-1:-1;53433:117:0;;;;;:::i;:::-;;:::i;46634:210::-;;;;;;;;;;-1:-1:-1;46634:210:0;;;;;:::i;:::-;;:::i;39532:27::-;;;;;;;;;;;;;;;;49676:120;;;;;;;;;;-1:-1:-1;49676:120:0;;;;;:::i;:::-;;:::i;45667:107::-;;;;;;;;;;;;;:::i;39424:38::-;;;;;;;;;;;;;;;;51560:26;;;;;;;;;;-1:-1:-1;51560:26:0;;;;;;;;;;;52200:145;;;;;;;;;;-1:-1:-1;52200:145:0;;;;;:::i;:::-;;:::i;28076:46::-;;;;;;;;;;;;;;;;47805:289;;;;;;;;;;;;;:::i;48819:607::-;;;;;;;;;;-1:-1:-1;48819:607:0;;;;;:::i;:::-;;:::i;49853:110::-;;;;;;;;;;-1:-1:-1;49853:110:0;;;;;:::i;:::-;;:::i;28129:45::-;;;;;;;;;;;;;;;;39716:31;;;;;;;;;;;;;;;;26008:40;;;;;;;;;;-1:-1:-1;26008:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27297:77;;;;;;;;;;;;27332:42;27297:77;;44522:149;;;;;;;;;;;;;:::i;:::-;;;;18678:25:1;;;18734:2;18719:18;;18712:34;;;;18651:18;44522:149:0;18504:248:1;55132:121:0;;;;;;;;;;-1:-1:-1;55132:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;55227:18:0;55200:7;55227:18;;;:9;:18;;;;;;;55132:121;9303:140;;;;;;;;;;;;;:::i;51593:28::-;;;;;;;;;;-1:-1:-1;51593:28:0;;;;;;;;;;;49501:107;;;;;;;;;;-1:-1:-1;49501:107:0;;;;;:::i;:::-;;:::i;28020:49::-;;;;;;;;;;;;;;;;51994:138;;;;;;;;;;;;;:::i;46183:28::-;;;;;;;;;;-1:-1:-1;46183:28:0;;;;;;;;26968:54;;;;;;;;;;;;27020:2;26968:54;;45140:275;;;;;;;;;;-1:-1:-1;45140:275:0;;;;;:::i;:::-;;:::i;46114:28::-;;;;;;;;;;-1:-1:-1;46114:28:0;;;;;;;;;;;54598:94;;;;;;;;;;-1:-1:-1;54650:7:0;8719:6;-1:-1:-1;;;;;8719:6:0;54598:94;;39754:26;;;;;;;;;;;;;;;;46222:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28181:28::-;;;;;;;;;;-1:-1:-1;28181:28:0;;;;;:::i;:::-;;:::i;54808:98::-;;;;;;;;;;-1:-1:-1;54891:7:0;;;;;;;;;;;;-1:-1:-1;;;54891:7:0;;;;54808:98;;46856:244;;;;;;;;;;-1:-1:-1;46856:244:0;;;;;:::i;:::-;;:::i;48178:109::-;;;;;;;;;;-1:-1:-1;48178:109:0;;;;;:::i;:::-;;:::i;50505:318::-;;;;;;;;;;-1:-1:-1;50505:318:0;;;;;:::i;:::-;;:::i;26226:43::-;;;;;;;;;;-1:-1:-1;26226:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56705:342;;;;;;;;;;-1:-1:-1;56705:342:0;;;;;:::i;:::-;;:::i;47112:100::-;;;;;;;;;;-1:-1:-1;47112:100:0;;;;;:::i;:::-;;:::i;55261:167::-;;;;;;;;;;-1:-1:-1;55261:167:0;;;;;:::i;:::-;;:::i;52382:113::-;;;;;;;;;;-1:-1:-1;52382:113:0;;;;;:::i;:::-;;:::i;54021:151::-;;;;;;;;;;;;;:::i;44385:129::-;;;;;;;;;;;;;:::i;39787:19::-;;;;;;;;;;;;;;;;48523:201;;;;;;;;;;-1:-1:-1;48523:201:0;;;;;:::i;:::-;;:::i;44933:140::-;;;;;;;;;;-1:-1:-1;44933:140:0;;;;;:::i;:::-;;:::i;52501:203::-;;;;;;;;;;-1:-1:-1;52501:203:0;;;;;:::i;:::-;;:::i;55436:147::-;;;;;;;;;;-1:-1:-1;55436:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;55547:19:0;;;55520:7;55547:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;55436:147;49969:111;;;;;;;;;;-1:-1:-1;49969:111:0;;;;;:::i;:::-;;:::i;52856:285::-;;;;;;;;;;-1:-1:-1;52856:285:0;;;;;:::i;:::-;;:::i;52710:127::-;;;;;;;;;;-1:-1:-1;52710:127:0;;;;;:::i;:::-;;:::i;28302:31::-;;;;;;;;;;;;28331:2;28302:31;;9598:236;;;;;;;;;;-1:-1:-1;9598:236:0;;;;;:::i;:::-;;:::i;46149:27::-;;;;;;;;;;;;;;;;50137:126;;;;;;;;;;-1:-1:-1;50137:126:0;;;;;:::i;:::-;;:::i;53311:110::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;;;;;;;;;53387:17:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;53387:26:0;;::::1;::::0;;;::::1;::::0;;53311:110::o;55591:161::-;55668:4;55685:37;55694:10;55706:7;55715:6;55685:8;:37::i;:::-;-1:-1:-1;55740:4:0;55591:161;;;;;:::o;50269:127::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;50351:37:::1;:21;50380:7:::0;50351:28:::1;:37::i;:::-;;50269:127:::0;:::o;47478:318::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;47550:11:::1;::::0;47582:21:::1;47575:28:::0;::::1;47572:90;;;-1:-1:-1::0;47629:21:0::1;47572:90;47684:1;47672:11;:13:::0;;;47710:36:::1;::::0;27332:42:::1;::::0;47734:6;;47710:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47696:50;;;47765:4;47757:31;;;::::0;-1:-1:-1;;;47757:31:0;;16360:2:1;47757:31:0::1;::::0;::::1;16342:21:1::0;16399:2;16379:18;;;16372:30;-1:-1:-1;;;16418:18:1;;;16411:45;16473:18;;47757:31:0::1;16158:339:1::0;51743:209:0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;51817:14:::1;::::0;::::1;::::0;::::1;;;51816:15;51808:24;;;::::0;::::1;;51893:14;:19:::0;;-1:-1:-1;;51923:21:0;;;;;51743:209::o;53178:121::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;53259:11:::1;:32:::0;;-1:-1:-1;;53259:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53178:121::o;48349:103::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;48419:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;48419:25:0;;::::1;::::0;;;::::1;::::0;;48349:103::o;50835:385::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;50937:9:::1;50957:256;50968:9;:16;50966:1;:18;50957:256;;;51042:13;26462:1;51042:2;:13;:::i;:::-;51033:22;::::0;:6;:22:::1;:::i;:::-;51006:9;:23;51016:9;51026:1;51016:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;51006:23:0::1;-1:-1:-1::0;;;;;51006:23:0::1;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;51107:13:0::1;::::0;-1:-1:-1;26462:1:0::1;51107:2;:13;:::i;:::-;51098:22;::::0;:6;:22:::1;:::i;:::-;51088:4;51070:24;::::0;;;:9:::1;:24;::::0;;;;:50;;:24;;;:50:::1;::::0;;;::::1;:::i;:::-;;;;;;;;51164:9;51174:1;51164:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;51140:61:0::1;51157:4;-1:-1:-1::0;;;;;51140:61:0::1;-1:-1:-1::0;;;;;;;;;;;26462:1:0::1;51187:2;:13;;;;:::i;:::-;51178:22;::::0;:6;:22:::1;:::i;:::-;51140:61;::::0;9111:25:1;;;9099:2;9084:18;51140:61:0::1;;;;;;;50986:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50957:256;;;50926:294;50835:385:::0;;:::o;46469:147::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46557:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;46557:21:0::1;::::0;::::1;;;::::0;;46589:19:::1;:9;46557:13:::0;46589::::1;:19::i;46337:120::-:0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46428:13:0;;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;46428:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46337:120::o;26470:66::-;26523:13;26462:1;26523:2;:13;:::i;:::-;26509:27;;:11;:27;:::i;:::-;26470:66;:::o;56065:392::-;56165:4;56182:36;56192:6;56200:9;56211:6;56182:9;:36::i;:::-;-1:-1:-1;;;;;56258:19:0;;56231:24;56258:19;;;:11;:19;;;;;;;;56278:10;56258:31;;;;;;;;56308:26;;;;56300:59;;;;-1:-1:-1;;;56300:59:0;;11749:2:1;56300:59:0;;;11731:21:1;11788:2;11768:18;;;11761:30;-1:-1:-1;;;11807:18:1;;;11800:50;11867:18;;56300:59:0;11547:344:1;56300:59:0;56372:55;56381:6;56389:10;56401:25;56420:6;56401:16;:25;:::i;:::-;56372:8;:55::i;:::-;-1:-1:-1;56445:4:0;;56065:392;-1:-1:-1;;;;56065:392:0:o;53562:115::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53641:20:0::1;53664:5;53641:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;53641:28:0::1;::::0;;53562:115::o;47226:239::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;47303:16:::1;::::0;;47288:14:::1;47330:18:::0;;;;47373:42:::1;::::0;47303:16;;47288:14;27422:42:::1;::::0;47303:16;;47373:42:::1;7190:205:1::0;56492::0;56600:10;56574:4;56621:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56621:32:0;;;;;;;;;;56574:4;;56591:76;;56612:7;;56621:45;;56656:10;;56621:45;:::i;53433:117::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53512:23:0::1;;::::0;;;:10:::1;:23;::::0;;;;:30;;-1:-1:-1;;53512:30:0::1;53538:4;53512:30;::::0;;53433:117::o;46634:210::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;46737:9:::1;46757:80;46768:4;:11;46766:1;:13;46757:80;;;46820:5;46801:7;:16;46809:4;46814:1;46809:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;46801:16:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;46801:16:0;:24;;-1:-1:-1;;46801:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46781:3;::::1;::::0;::::1;:::i;:::-;;;;46757:80;;49676:120:::0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;49756:32:::1;49775:12;:4:::0;49782:5:::1;49775:12;:::i;:::-;49756:18;:32::i;:::-;49676:120:::0;:::o;45667:107::-;45754:12;;45738:28;;:15;:28;:::i;:::-;45726:10;45716:21;;;;:9;:21;;;;;:50;45667:107::o;52200:145::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;52293:22:::1;:44:::0;;-1:-1:-1;;;;;52293:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;52293:44:0;;::::1;::::0;;;::::1;::::0;;52200:145::o;47805:289::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;47866:4:::1;::::0;47891:21:::1;47884:28:::0;::::1;47881:90;;;-1:-1:-1::0;47938:21:0::1;47881:90;47986:1;47981:4;:6:::0;;;48012::::1;::::0;:32:::1;::::0;:6:::1;::::0;;::::1;-1:-1:-1::0;;;;;48012:6:0::1;::::0;48032;;48012:32:::1;7190:205:1::0;48819:607:0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;48975:14:::1;49015::::0;48990:24:::1;49000:14:::0;48990:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;48975:54;;49048:8;:13;;49058:3;49048:13;49040:64;;;::::0;-1:-1:-1;;;49040:64:0;;13154:2:1;49040:64:0::1;::::0;::::1;13136:21:1::0;13193:2;13173:18;;;13166:30;13232:34;13212:18;;;13205:62;-1:-1:-1;;;13283:18:1;;;13276:36;13329:19;;49040:64:0::1;12952:402:1::0;49040:64:0::1;28331:2;49123:14;::::0;::::1;;::::0;::::1;::::0;:31:::1;;-1:-1:-1::0;28331:2:0::1;49139:15;::::0;::::1;;;49123:31;:52;;;;-1:-1:-1::0;28331:2:0::1;49156:19;::::0;::::1;;;49123:52;49115:89;;;::::0;-1:-1:-1;;;49115:89:0;;15318:2:1;49115:89:0::1;::::0;::::1;15300:21:1::0;15357:2;15337:18;;;15330:30;15396:27;15376:18;;;15369:55;15441:18;;49115:89:0::1;15116:349:1::0;49115:89:0::1;-1:-1:-1::0;49225:8:0::1;:18:::0;;::::1;49394:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;49367:16:0;;::::1;49225:18;49367:16;-1:-1:-1::0;;49293:28:0;;::::1;-1:-1:-1::0;;;49293:28:0::1;49367:16:::0;;;;-1:-1:-1;;49254:28:0;;::::1;-1:-1:-1::0;;;49254:28:0::1;-1:-1:-1::0;;49225:18:0;;::::1;::::0;::::1;49254:28:::0;;;;-1:-1:-1;;49254:28:0;;;;;;;;;;::::1;49367:16:::0;;;;;;;;49342:14;::::1;49367:16:::0;;;;;;;::::1;49394:24;::::0;;;::::1;::::0;;48819:607::o;49853:110::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;49933:22:::1;:9;49947:7:::0;49933:13:::1;:22::i;44522:149::-:0;44563:15;;44624:13;26462:1;44624:2;:13;:::i;:::-;44611:12;;:26;;;;:::i;:::-;44649:13;26462:1;44649:2;:13;:::i;:::-;44639:9;;:23;;;;:::i;:::-;44604:59;;;;44522:149;;:::o;9303:140::-;8885:10;8874:7;8692;8719:6;-1:-1:-1;;;;;8719:6:0;;8654:79;8874:7;-1:-1:-1;;;;;8874:21:0;;8866:66;;;;-1:-1:-1;;;8866:66:0;;13905:2:1;8866:66:0;;;13887:21:1;;;13924:18;;;13917:30;13983:34;13963:18;;;13956:62;14035:18;;8866:66:0;13703:356:1;8866:66:0;9402:1:::1;9386:6:::0;;9365:40:::1;::::0;-1:-1:-1;;;;;9386:6:0;;::::1;::::0;9365:40:::1;::::0;9402:1;;9365:40:::1;9433:1;9416:19:::0;;-1:-1:-1;;;;;;9416:19:0::1;::::0;;9303:140::o;49501:107::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;49577:14:::1;:23:::0;;-1:-1:-1;;49577:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;49501:107::o;51994:138::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;52058:14:::1;::::0;::::1;::::0;::::1;;;:32:::0;::::1;;;-1:-1:-1::0;52074:16:0::1;::::0;;;::::1;;;52058:32;52050:41;;;::::0;::::1;;52102:16;:22:::0;;-1:-1:-1;;52102:22:0::1;::::0;;51994:138::o;45140:275::-;-1:-1:-1;;;;;45261:25:0;;45226:7;45261:25;;;:9;:25;;;;;;45309:15;45299:25;;45296:71;;-1:-1:-1;45355:1:0;;45140:275;-1:-1:-1;;45140:275:0:o;45296:71::-;45383:24;45392:15;45383:8;:24;:::i;:::-;45376:31;45140:275;-1:-1:-1;;;45140:275:0:o;54677:7::-;54670:14;;54598:94;:::o;46222:97::-;46264:16;46300:11;46293:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46293:18:0;;;;;;;;;;;;;;;;;;;;;;;46222:97;:::o;28181:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28181:28:0;;-1:-1:-1;28181:28:0;:::o;46856:244::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;46956:9:::1;46976:117;46987:4;:11;46985:1;:13;46976:117;;;47039:5;47020:7;:16;47028:4;47033:1;47028:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;47020:16:0::1;-1:-1:-1::0;;;;;47020:16:0::1;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;47059:22;47073:4;47078:1;47073:7;;;;;;;;:::i;:::-;;;;;;;47059:9;:13;;:22;;;;:::i;:::-;-1:-1:-1::0;47000:3:0;::::1;::::0;::::1;:::i;:::-;;;;46976:117;;48178:109:::0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;48256:16:::1;:23:::0;;-1:-1:-1;;48256:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48178:109::o;50505:318::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;50671:13:::1;26462:1;50671:2;:13;:::i;:::-;50655:29;::::0;:15;:29:::1;:::i;:::-;50639:45:::0;-1:-1:-1;50721:13:0::1;26462:1;50721:2;:13;:::i;:::-;50708:26;::::0;:12;:26:::1;:::i;:::-;50745:12;:30:::0;;;;-1:-1:-1;50786:9:0::1;:24:::0;50505:318::o;56705:342::-;56848:10;56792:4;56836:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56836:32:0;;;;;;;;;;56887:35;;;;56879:60;;;;-1:-1:-1;;;56879:60:0;;17056:2:1;56879:60:0;;;17038:21:1;17095:2;17075:18;;;17068:30;-1:-1:-1;;;17114:18:1;;;17107:42;17166:18;;56879:60:0;16854:336:1;56879:60:0;56952:65;56961:10;56973:7;56982:34;57001:15;56982:16;:34;:::i;56952:65::-;-1:-1:-1;57035:4:0;;56705:342;-1:-1:-1;;;56705:342:0:o;47112:100::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;47181:12:::1;:23:::0;;-1:-1:-1;;47181:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47112:100::o;55261:167::-;55341:4;55358:40;55368:10;55380:9;55391:6;55358:9;:40::i;52382:113::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;52459:28:::1;:10;52474:12:::0;52459:14:::1;:28::i;54021:151::-:0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;54089:51:::1;::::0;54076:9:::1;::::0;54089:10:::1;::::0;54113:21:::1;::::0;54076:9;54089:51;54076:9;54089:51;54113:21;54089:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54075:65;;;54159:4;54151:13;;;::::0;::::1;44385:129:::0;44432:7;44493:13;26462:1;44493:2;:13;:::i;:::-;44473:18;;26523:13;26462:1;26523:2;:13;:::i;:::-;26509:27;;:11;:27;:::i;:::-;44459:32;;;;:::i;:::-;44458:48;;;;:::i;48523:201::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;27260:9:::1;48614:32:::0;::::1;;48606:67;;;::::0;-1:-1:-1;;;48606:67:0;;16704:2:1;48606:67:0::1;::::0;::::1;16686:21:1::0;16743:2;16723:18;;;16716:30;16782:25;16762:18;;;16755:53;16825:18;;48606:67:0::1;16502:347:1::0;48606:67:0::1;48688:12;:28:::0;48523:201::o;44933:140::-;45007:4;45030:35;:10;45050:14;45030:19;:35::i;52501:203::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;52598:6:::1;52594:103;52610:14;:21;52608:1;:23;52594:103;;;52652:33;52667:14;52682:1;52667:17;;;;;;;;:::i;:::-;;;;;;;52652:10;:14;;:33;;;;:::i;:::-;-1:-1:-1::0;52633:3:0;::::1;::::0;::::1;:::i;:::-;;;;52594:103;;49969:111:::0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;50047:25:::1;:9;50064:7:::0;50047:16:::1;:25::i;52856:285::-:0;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;52994:30:::1;::::0;-1:-1:-1;;;52994:30:0;;53018:4:::1;52994:30;::::0;::::1;7546:51:1::0;52951:10:0;;52929:12:::1;::::0;-1:-1:-1;;;;;52994:15:0;::::1;::::0;::::1;::::0;7519:18:1;;52994:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52973:51;;53054:1;53043:10;:12;53035:49;;;::::0;-1:-1:-1;;;53035:49:0;;14965:2:1;53035:49:0::1;::::0;::::1;14947:21:1::0;15004:2;14984:18;;;14977:30;15043:26;15023:18;;;15016:54;15087:18;;53035:49:0::1;14763:348:1::0;53035:49:0::1;53095:38;::::0;-1:-1:-1;;;53095:38:0;;53110:10:::1;53095:38;::::0;::::1;7782:51:1::0;7849:18;;;7842:34;;;-1:-1:-1;;;;;53095:14:0;::::1;::::0;::::1;::::0;7755:18:1;;53095:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52918:223;;52856:285:::0;:::o;52710:127::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;52795:34:::1;:10;52813:15:::0;52795:17:::1;:34::i;9598:236::-:0;8885:10;8874:7;8692;8719:6;-1:-1:-1;;;;;8719:6:0;;8654:79;8874:7;-1:-1:-1;;;;;8874:21:0;;8866:66;;;;-1:-1:-1;;;8866:66:0;;13905:2:1;8866:66:0;;;13887:21:1;;;13924:18;;;13917:30;13983:34;13963:18;;;13956:62;14035:18;;8866:66:0;13703:356:1;8866:66:0;-1:-1:-1;;;;;9679:22:0;::::1;9671:73;;;::::0;-1:-1:-1;;;9671:73:0;;10651:2:1;9671:73:0::1;::::0;::::1;10633:21:1::0;10690:2;10670:18;;;10663:30;10729:34;10709:18;;;10702:62;-1:-1:-1;;;10780:18:1;;;10773:36;10826:19;;9671:73:0::1;10449:402:1::0;9671:73:0::1;9781:6;::::0;;9760:38:::1;::::0;-1:-1:-1;;;;;9760:38:0;;::::1;::::0;9781:6;::::1;::::0;9760:38:::1;::::0;::::1;9809:6;:17:::0;;-1:-1:-1;;;;;;9809:17:0::1;-1:-1:-1::0;;;;;9809:17:0;;;::::1;::::0;;;::::1;::::0;;9598:236::o;50137:126::-;28886:19;28894:10;28886:7;:19::i;:::-;28878:50;;;;-1:-1:-1;;;28878:50:0;;;;;;;:::i;:::-;50221:34:::1;:21;50247:7:::0;22323:152;22393:4;22417:50;22422:3;-1:-1:-1;;;;;22442:23:0;;22417:4;:50::i;28960:139::-;29013:4;8719:6;;-1:-1:-1;;;;;29036:13:0;;;8719:6;;29036:13;;:31;;-1:-1:-1;;;;;;29051:16:0;;27332:42;29051:16;29036:31;:55;;;-1:-1:-1;;;;;;29069:22:0;;27422:42;29069:22;29029:62;28960:139;-1:-1:-1;;28960:139:0:o;55758:299::-;-1:-1:-1;;;;;55851:19:0;;55843:49;;;;-1:-1:-1;;;55843:49:0;;11058:2:1;55843:49:0;;;11040:21:1;11097:2;11077:18;;;11070:30;-1:-1:-1;;;11116:18:1;;;11109:47;11173:18;;55843:49:0;10856:341:1;55843:49:0;-1:-1:-1;;;;;55911:21:0;;55903:49;;;;-1:-1:-1;;;55903:49:0;;13561:2:1;55903:49:0;;;13543:21:1;13600:2;13580:18;;;13573:30;-1:-1:-1;;;13619:18:1;;;13612:45;13674:18;;55903:49:0;13359:339:1;55903:49:0;-1:-1:-1;;;;;55965:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;56017:32;;9111:25:1;;;56017:32:0;;9084:18:1;56017:32:0;;;;;;;55758:299;;;:::o;22651:158::-;22724:4;22748:53;22756:3;-1:-1:-1;;;;;22776:23:0;;22748:7;:53::i;31649:2179::-;-1:-1:-1;;;;;31745:20:0;;31737:51;;;;-1:-1:-1;;;31737:51:0;;9951:2:1;31737:51:0;;;9933:21:1;9990:2;9970:18;;;9963:30;-1:-1:-1;;;10009:18:1;;;10002:48;10067:18;;31737:51:0;9749:342:1;31737:51:0;-1:-1:-1;;;;;31807:23:0;;31799:52;;;;-1:-1:-1;;;31799:52:0;;11404:2:1;31799:52:0;;;11386:21:1;11443:2;11423:18;;;11416:30;-1:-1:-1;;;11462:18:1;;;11455:46;11518:18;;31799:52:0;11202:340:1;31799:52:0;31954:15;31973:26;:9;31992:6;31973:18;:26::i;:::-;:59;;;-1:-1:-1;32003:29:0;:9;32022;32003:18;:29::i;:::-;31954:79;-1:-1:-1;32132:23:0;-1:-1:-1;;;;;32157:21:0;;32173:4;32157:21;;:49;;-1:-1:-1;;;;;;32182:24:0;;32201:4;32182:24;32157:49;32339:14;;32404:19;;32132:75;;-1:-1:-1;;;;;;32339:14:0;;;;32309:21;;32394:29;;;-1:-1:-1;;;32404:19:0;;;;32394:29;:59;;;;;32440:13;-1:-1:-1;;;;;32427:26:0;:9;-1:-1:-1;;;;;32427:26:0;;32394:59;32393:136;;;-1:-1:-1;32482:19:0;;-1:-1:-1;;;;;32469:32:0;;;-1:-1:-1;;;32482:19:0;;;;32469:32;:59;;;;;32515:13;-1:-1:-1;;;;;32505:23:0;:6;-1:-1:-1;;;;;32505:23:0;;32469:59;32651:19;;32365:165;;-1:-1:-1;32632:10:0;;-1:-1:-1;;;;;32643:27:0;;;-1:-1:-1;;;32651:19:0;;;;32643:27;;:53;;;32683:13;-1:-1:-1;;;;;32673:23:0;:6;-1:-1:-1;;;;;32673:23:0;;32643:53;32730:19;;32632:64;;-1:-1:-1;32707:11:0;;-1:-1:-1;;;;;32719:30:0;;;-1:-1:-1;;;32730:19:0;;;;32719:30;;:59;;;32765:13;-1:-1:-1;;;;;32752:26:0;:9;-1:-1:-1;;;;;32752:26:0;;32719:59;32707:71;;32819:18;:41;;;;32841:19;32819:41;:55;;;;32864:10;32819:55;32816:1005;;;32890:43;32907:6;32915:9;32926:6;32890:16;:43::i;:::-;32816:1005;;;33049:14;;;;;;;33044:518;;8692:7;8719:6;-1:-1:-1;;;;;33088:17:0;;;8719:6;;33088:17;;;;:41;;-1:-1:-1;8692:7:0;8719:6;-1:-1:-1;;;;;33109:20:0;;;8719:6;;33109:20;;33088:41;33084:463;;;-1:-1:-1;;;;;33159:15:0;;;;;;:7;:15;;;;;;;;33158:16;:39;;;;-1:-1:-1;;;;;;33179:18:0;;;;;;:7;:18;;;;;;;;33178:19;33158:39;33154:374;;;33230:7;;;;;;;33226:279;;;33290:9;-1:-1:-1;;;;;33274:28:0;33283:6;-1:-1:-1;;;;;33274:28:0;-1:-1:-1;;;;;;;;;;;33300:1:0;33274:28;;;;9111:25:1;;9099:2;9084:18;;8957:185;33274:28:0;;;;;;;;33332:7;;;;;;31649:2179;;;:::o;33226:279::-;33436:14;;;;;;;33428:49;;;;-1:-1:-1;;;33428:49:0;;14266:2:1;33428:49:0;;;14248:21:1;14305:2;14285:18;;;14278:30;14344:25;14324:18;;;14317:53;14387:18;;33428:49:0;14064:347:1;33428:49:0;33579:16;;;;;;;33576:234;;;33615:56;33634:6;33641:9;33651:6;33658:5;33664:6;33615:18;:56::i;33576:234::-;33724:52;33739:6;33746:9;33756:6;33763:5;33769:6;33724:14;:52::i;:::-;31726:2102;;;;;;31649:2179;;;:::o;41244:1771::-;40992:27;:34;;-1:-1:-1;;40992:34:0;41022:4;40992:34;;;;;;41362:4:::1;40992:27:::0;41344:24;;;::::1;::::0;;;;;;;;41409:13:::1;::::0;41344:24;;40992:27;41395::::1;::::0;-1:-1:-1;;;41409:13:0;::::1;40992:34:::0;41409:13;;::::1;::::0;-1:-1:-1;;;41395:13:0;::::1;;:27;:::i;:::-;41379:43;;;;41433:19;41453:9;;41433:29;;41490:8;41476:11;:22;41473:127;;;41518:12;::::0;::::1;;41515:74;;;-1:-1:-1::0;41565:8:0;41515:74:::1;41726:11;41710:15;:27;:40;;;-1:-1:-1::0;41739:11:0::1;::::0;::::1;::::0;41710:40:::1;41707:77;;;41766:7;;;;;41707:77;41904:13;::::0;41865:25:::1;::::0;41891:36:::1;::::0;::::1;::::0;41892:25:::1;::::0;-1:-1:-1;;;41904:13:0;::::1;;;41892:11:::0;:25:::1;:::i;:::-;41891:36;;;;:::i;:::-;41865:62:::0;-1:-1:-1;41938:25:0::1;41965:29;41865:62:::0;41965:11;:29:::1;:::i;:::-;41938:56:::0;-1:-1:-1;42055:16:0::1;42072:19;42090:1;42072:17:::0;:19:::1;:::i;:::-;42055:36:::0;-1:-1:-1;42102:19:0::1;42122:26;42055:36:::0;42122:17;:26:::1;:::i;:::-;42102:46:::0;-1:-1:-1;42231:17:0::1;42249:29;42261:17:::0;42102:46;42249:29:::1;:::i;:::-;42231:47:::0;-1:-1:-1;42393:21:0::1;42425:27;42231:47:::0;42425:16:::1;:27::i;:::-;42463:14;42479:41;42503:17:::0;42479:21:::1;:41;:::i;:::-;42463:58:::0;-1:-1:-1;42621:14:0::1;42659:9:::0;42639:18:::1;42646:11:::0;42463:58;42639:18:::1;:::i;:::-;42638:30;;;;:::i;:::-;42621:47;;42679:31;42693:8;42703:6;42679:13;:31::i;:::-;42833:20;42855:41;42879:17:::0;42855:21:::1;:41;:::i;:::-;42833:64;;42975:32;42994:12;42975:18;:32::i;:::-;41309:1706;;;;;;;;;;;;41037:1;-1:-1:-1::0;41049:27:0;:35;;-1:-1:-1;;41049:35:0;;;41244:1771::o;22895:167::-;-1:-1:-1;;;;;23029:23:0;;22975:4;19704:19;;;:12;;;:19;;;;;;:24;;22999:55;19607:129;17378:414;17441:4;19704:19;;;:12;;;:19;;;;;;17458:327;;-1:-1:-1;17501:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;17684:18;;17662:19;;;:12;;;:19;;;;;;:40;;;;17717:11;;17458:327;-1:-1:-1;17768:5:0;17761:12;;17968:1553;18034:4;18173:19;;;:12;;;:19;;;;;;18209:15;;18205:1309;;18571:21;18595:14;18608:1;18595:10;:14;:::i;:::-;18644:18;;18571:38;;-1:-1:-1;18624:17:0;;18644:22;;18665:1;;18644:22;:::i;:::-;18624:42;;18911:17;18931:3;:11;;18943:9;18931:22;;;;;;;;:::i;:::-;;;;;;;;;18911:42;;19077:9;19048:3;:11;;19060:13;19048:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;19154:23;;;:12;;;:23;;;;;;:36;;;19315:17;;19154:3;;19315:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19410:3;:12;;:19;19423:5;19410:19;;;;;;;;;;;19403:26;;;19453:4;19446:11;;;;;;;;18205:1309;19497:5;19490:12;;;;;38094:440;-1:-1:-1;;;;;38213:17:0;;38189:21;38213:17;;;:9;:17;;;;;;38249:23;;;;38241:60;;;;-1:-1:-1;;;38241:60:0;;10298:2:1;38241:60:0;;;10280:21:1;10337:2;10317:18;;;10310:30;-1:-1:-1;;;10356:18:1;;;10349:54;10420:18;;38241:60:0;10096:348:1;38241:60:0;38357:27;38370:6;38377;38357:12;:27::i;:::-;38437:28;38447:9;38458:6;38437:9;:28::i;:::-;38507:9;-1:-1:-1;;;;;38491:33:0;38500:6;-1:-1:-1;;;;;38491:33:0;-1:-1:-1;;;;;;;;;;;38517:6:0;38491:33;;;;9111:25:1;;9099:2;9084:18;;8957:185;38491:33:0;;;;;;;;38178:356;38094:440;;;:::o;33902:826::-;34096:6;34092:564;;34285:30;:10;34305:9;34285:19;:30::i;:::-;34277:68;;;;-1:-1:-1;;;34277:68:0;;12799:2:1;34277:68:0;;;12781:21:1;12838:2;12818:18;;;12811:30;12877:28;12857:18;;;12850:56;12923:18;;34277:68:0;12597:350:1;34277:68:0;27020:2;26523:13;26462:1;26523:2;:13;:::i;:::-;26509:27;;:11;:27;:::i;:::-;34565:42;;;;:::i;:::-;-1:-1:-1;;;;;34536:20:0;;;;;;:9;:20;;;;;;:27;;34557:6;;34536:27;:::i;:::-;:71;;34527:113;;;;-1:-1:-1;;;34527:113:0;;12098:2:1;34527:113:0;;;12080:21:1;12137:2;12117:18;;;12110:30;12176;12156:18;;;12149:58;12224:18;;34527:113:0;11896:352:1;34527:113:0;34666:52;34681:6;34688:9;34698:6;34705:5;34711:6;34666:14;:52::i;:::-;33902:826;;;;;:::o;34831:3203::-;-1:-1:-1;;;;;34974:20:0;;;34947:24;34974:20;;;:9;:20;;;;;;;35029:17;;;;;;;;35065:23;;;;35057:60;;;;-1:-1:-1;;;35057:60:0;;10298:2:1;35057:60:0;;;10280:21:1;10337:2;10317:18;;;10310:30;-1:-1:-1;;;10356:18:1;;;10349:54;10420:18;;35057:60:0;10096:348:1;35057:60:0;35154:1;35144:9;;:11;;;;:::i;:::-;35132:9;:23;35176:9;35196:1721;;;;35224:11;;;;35221:79;;;-1:-1:-1;;;;;35265:18:0;;;;;;:10;:18;;;;;;;;35264:19;35256:28;;;;;;35318:38;:21;35349:6;35318:30;:38::i;:::-;35314:414;;-1:-1:-1;;;;;35501:17:0;;;;;;:9;:17;;;;;;35520:15;-1:-1:-1;35501:34:0;;:52;;-1:-1:-1;35537:16:0;;;;;;;35501:52;35493:82;;;;-1:-1:-1;;;35493:82:0;;17397:2:1;35493:82:0;;;17379:21:1;17436:2;17416:18;;;17409:30;-1:-1:-1;;;17455:18:1;;;17448:48;17513:18;;35493:82:0;17195:342:1;35493:82:0;35700:12;;35684:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;35666:17:0;;;;;;:9;:17;;;;;:46;35314:414;35863:9;;35856:6;:16;35853:80;;;35893:11;:24;;;;;;;-1:-1:-1;35893:24:0;;;;;;;;-1:-1:-1;;;;;;35893:24:0;-1:-1:-1;;;;;35893:24:0;;;;;35853:80;35963:9;;35955:6;:17;;35947:44;;;;-1:-1:-1;;;35947:44:0;;12455:2:1;35947:44:0;;;12437:21:1;12494:2;12474:18;;;12467:30;-1:-1:-1;;;12513:18:1;;;12506:45;12568:18;;35947:44:0;12253:339:1;35947:44:0;-1:-1:-1;36010:8:0;;;;;;;35196:1721;;;36041:5;36038:879;;;36186:12;;36161:23;36178:6;36161:16;:23;:::i;:::-;:37;;36153:65;;;;-1:-1:-1;;;36153:65:0;;;;;;;:::i;:::-;36249:8;;36241:6;:16;;36233:45;;;;-1:-1:-1;;;36233:45:0;;;;;;;:::i;:::-;-1:-1:-1;36297:7:0;;;;36038:879;;;36473:12;;36448:23;36465:6;36448:16;:23;:::i;:::-;:37;;36440:65;;;;-1:-1:-1;;;36440:65:0;;;;;;;:::i;:::-;36737:38;:21;36768:6;36737:30;:38::i;:::-;36733:139;;-1:-1:-1;;;;;36802:17:0;;;;;;:9;:17;;;;;;36821:15;-1:-1:-1;36802:34:0;;:52;;-1:-1:-1;36838:16:0;;;;;;;36802:52;36794:78;;;;-1:-1:-1;;;36794:78:0;;16017:2:1;36794:78:0;;;15999:21:1;16056:2;16036:18;;;16029:30;-1:-1:-1;;;16075:18:1;;;16068:44;16129:18;;36794:78:0;15815:338:1;36794:78:0;-1:-1:-1;36891:12:0;;;;;;;36038:879;37252:19;;-1:-1:-1;;;;;37244:27:0;;;-1:-1:-1;;;37252:19:0;;;;37244:27;;;;37243:50;;-1:-1:-1;37276:16:0;;;;37275:17;37243:50;:82;;;;-1:-1:-1;37297:27:0;;;;37296:28;37243:82;37240:126;;;37340:26;37359:6;37340:18;:26::i;:::-;37537:13;;37474:21;;37496:55;;37510:6;;37518:3;;37523:27;;37537:13;-1:-1:-1;;;37537:13:0;;;;;-1:-1:-1;;;37523:13:0;;;:27;:::i;:::-;37496:13;:55::i;:::-;37474:77;-1:-1:-1;37615:19:0;37635:22;37474:77;37635:6;:22;:::i;:::-;37615:42;;37715:27;37728:6;37735;37715:12;:27::i;:::-;37837:4;37819:24;;;;:9;:24;;;;;:41;;37847:13;;37819:24;:41;;37847:13;;37819:41;:::i;:::-;;;;-1:-1:-1;37915:33:0;;-1:-1:-1;37925:9:0;37936:11;37915:9;:33::i;:::-;37990:9;-1:-1:-1;;;;;37974:38:0;37983:6;-1:-1:-1;;;;;37974:38:0;-1:-1:-1;;;;;;;;;;;38000:11:0;37974:38;;;;9111:25:1;;9099:2;9084:18;;8957:185;37974:38:0;;;;;;;;34936:3098;;;;;34831:3203;;;;;:::o;43065:455::-;43158:14;;43126:56;;43143:4;;-1:-1:-1;;;;;43158:14:0;43175:6;43126:8;:56::i;:::-;43217:16;;;43231:1;43217:16;;;;;;;;43193:21;;43217:16;;;;;;;;;;-1:-1:-1;43217:16:0;43193:40;;43262:4;43244;43249:1;43244:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43244:23:0;;;:7;;;;;;;;;;:23;;;;43288:14;;:21;;;-1:-1:-1;;;43288:21:0;;;;:14;;;;;:19;;:21;;;;;43244:7;;43288:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43278:4;43283:1;43278:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43278:31:0;;;:7;;;;;;;;;:31;43322:14;;:190;;-1:-1:-1;;;43322:190:0;;:14;;;:65;;:190;;43402:6;;43322:14;;43439:4;;43466;;43486:15;;43322:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43115:405;43065:455;:::o;43647:397::-;43741:9;43729:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;43793:14:0;;43761:61;;43778:4;;-1:-1:-1;;;;;43793:14:0;43810:11;43761:8;:61::i;:::-;43833:14;;:203;;-1:-1:-1;;;43833:203:0;;43904:4;43833:203;;;8228:34:1;;;8278:18;;;8271:34;;;43833:14:0;8321:18:1;;;8314:34;;;8364:18;;;8357:34;8407:19;;;8400:44;44010:15:0;8460:19:1;;;8453:35;-1:-1:-1;;;;;43833:14:0;;;;:30;;43871:9;;8162:19:1;;43833:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39988:443::-;40131:6;;40114:14;;40087:17;;40131:6;40108:20;;40114:14;;40108:3;:20;:::i;:::-;:29;;;;;;:::i;:::-;40187:14;;40087:51;;-1:-1:-1;40149:22:0;;40205:3;;40175:26;;40187:14;;40175:9;:26;:::i;:::-;40174:34;;;;:::i;:::-;40149:59;-1:-1:-1;40219:17:0;40265:3;40240:21;40252:9;40240;:21;:::i;:::-;40239:29;;;;:::i;:::-;40219:49;;40279:14;40319:3;40309:6;;40297:9;:18;;;;:::i;:::-;40296:26;;;;:::i;:::-;40279:43;;40351:14;40333:16;;:32;;;;;;;:::i;:::-;;;;;;;;40389:9;40376:11;;:22;;;;;;;:::i;:::-;;;;;;;;40415:6;40409:4;;:12;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;39988:443:0:o;39075:202::-;-1:-1:-1;;;;;39210:15:0;;39192:17;39210:15;;;:9;:15;;;;;;:22;;39226:6;;39210:22;:::i;:::-;-1:-1:-1;;;;;39244:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;39075:202:0:o;38783:200::-;-1:-1:-1;;;;;38915:15:0;;38897:17;38915:15;;;:9;:15;;;;;;:22;;38931:6;;38915:22;:::i;38589:156::-;38679:7;38732:5;38718:10;38707:21;;38714:3;38707:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;38706:31;;;;:::i;:::-;38699:38;38589:156;-1:-1:-1;;;;38589:156:0:o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:919::-;207:5;260:3;253:4;245:6;241:17;237:27;227:55;;278:1;275;268:12;227:55;314:6;301:20;340:4;363:18;400:2;396;393:10;390:36;;;406:18;;:::i;:::-;452:2;449:1;445:10;484:2;478:9;547:2;543:7;538:2;534;530:11;526:25;518:6;514:38;602:6;590:10;587:22;582:2;570:10;567:18;564:46;561:72;;;613:18;;:::i;:::-;649:2;642:22;699:18;;;733:15;;;;-1:-1:-1;768:15:1;;;802;;;798:24;;795:33;-1:-1:-1;792:53:1;;;841:1;838;831:12;792:53;863:1;854:10;;873:169;887:2;884:1;881:9;873:169;;;944:23;963:3;944:23;:::i;:::-;932:36;;988:12;;;;905:1;898:9;;;;;1020:12;;873:169;;;-1:-1:-1;1060:6:1;153:919;-1:-1:-1;;;;;;;153:919:1:o;1077:156::-;1143:20;;1203:4;1192:16;;1182:27;;1172:55;;1223:1;1220;1213:12;1238:247;1297:6;1350:2;1338:9;1329:7;1325:23;1321:32;1318:52;;;1366:1;1363;1356:12;1318:52;1405:9;1392:23;1424:31;1449:5;1424:31;:::i;1490:251::-;1560:6;1613:2;1601:9;1592:7;1588:23;1584:32;1581:52;;;1629:1;1626;1619:12;1581:52;1661:9;1655:16;1680:31;1705:5;1680:31;:::i;1746:388::-;1814:6;1822;1875:2;1863:9;1854:7;1850:23;1846:32;1843:52;;;1891:1;1888;1881:12;1843:52;1930:9;1917:23;1949:31;1974:5;1949:31;:::i;:::-;1999:5;-1:-1:-1;2056:2:1;2041:18;;2028:32;2069:33;2028:32;2069:33;:::i;:::-;2121:7;2111:17;;;1746:388;;;;;:::o;2139:456::-;2216:6;2224;2232;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2340:9;2327:23;2359:31;2384:5;2359:31;:::i;:::-;2409:5;-1:-1:-1;2466:2:1;2451:18;;2438:32;2479:33;2438:32;2479:33;:::i;:::-;2139:456;;2531:7;;-1:-1:-1;;;2585:2:1;2570:18;;;;2557:32;;2139:456::o;2600:382::-;2665:6;2673;2726:2;2714:9;2705:7;2701:23;2697:32;2694:52;;;2742:1;2739;2732:12;2694:52;2781:9;2768:23;2800:31;2825:5;2800:31;:::i;:::-;2850:5;-1:-1:-1;2907:2:1;2892:18;;2879:32;2920:30;2879:32;2920:30;:::i;2987:315::-;3055:6;3063;3116:2;3104:9;3095:7;3091:23;3087:32;3084:52;;;3132:1;3129;3122:12;3084:52;3171:9;3158:23;3190:31;3215:5;3190:31;:::i;:::-;3240:5;3292:2;3277:18;;;;3264:32;;-1:-1:-1;;;2987:315:1:o;3307:348::-;3391:6;3444:2;3432:9;3423:7;3419:23;3415:32;3412:52;;;3460:1;3457;3450:12;3412:52;3500:9;3487:23;3533:18;3525:6;3522:30;3519:50;;;3565:1;3562;3555:12;3519:50;3588:61;3641:7;3632:6;3621:9;3617:22;3588:61;:::i;3660:477::-;3750:6;3758;3811:2;3799:9;3790:7;3786:23;3782:32;3779:52;;;3827:1;3824;3817:12;3779:52;3867:9;3854:23;3900:18;3892:6;3889:30;3886:50;;;3932:1;3929;3922:12;3886:50;3955:61;4008:7;3999:6;3988:9;3984:22;3955:61;:::i;:::-;3945:71;;;4066:2;4055:9;4051:18;4038:32;4079:28;4101:5;4079:28;:::i;4142:241::-;4198:6;4251:2;4239:9;4230:7;4226:23;4222:32;4219:52;;;4267:1;4264;4257:12;4219:52;4306:9;4293:23;4325:28;4347:5;4325:28;:::i;4388:245::-;4455:6;4508:2;4496:9;4487:7;4483:23;4479:32;4476:52;;;4524:1;4521;4514:12;4476:52;4556:9;4550:16;4575:28;4597:5;4575:28;:::i;4638:180::-;4697:6;4750:2;4738:9;4729:7;4725:23;4721:32;4718:52;;;4766:1;4763;4756:12;4718:52;-1:-1:-1;4789:23:1;;4638:180;-1:-1:-1;4638:180:1:o;4823:184::-;4893:6;4946:2;4934:9;4925:7;4921:23;4917:32;4914:52;;;4962:1;4959;4952:12;4914:52;-1:-1:-1;4985:16:1;;4823:184;-1:-1:-1;4823:184:1:o;5012:416::-;5105:6;5113;5166:2;5154:9;5145:7;5141:23;5137:32;5134:52;;;5182:1;5179;5172:12;5134:52;5218:9;5205:23;5195:33;;5279:2;5268:9;5264:18;5251:32;5306:18;5298:6;5295:30;5292:50;;;5338:1;5335;5328:12;5292:50;5361:61;5414:7;5405:6;5394:9;5390:22;5361:61;:::i;:::-;5351:71;;;5012:416;;;;;:::o;5433:248::-;5501:6;5509;5562:2;5550:9;5541:7;5537:23;5533:32;5530:52;;;5578:1;5575;5568:12;5530:52;-1:-1:-1;;5601:23:1;;;5671:2;5656:18;;;5643:32;;-1:-1:-1;5433:248:1:o;5686:306::-;5774:6;5782;5790;5843:2;5831:9;5822:7;5818:23;5814:32;5811:52;;;5859:1;5856;5849:12;5811:52;5888:9;5882:16;5872:26;;5938:2;5927:9;5923:18;5917:25;5907:35;;5982:2;5971:9;5967:18;5961:25;5951:35;;5686:306;;;;;:::o;5997:182::-;6054:6;6107:2;6095:9;6086:7;6082:23;6078:32;6075:52;;;6123:1;6120;6113:12;6075:52;6146:27;6163:9;6146:27;:::i;6184:535::-;6276:6;6284;6292;6300;6308;6316;6369:3;6357:9;6348:7;6344:23;6340:33;6337:53;;;6386:1;6383;6376:12;6337:53;6409:27;6426:9;6409:27;:::i;:::-;6399:37;;6455:36;6487:2;6476:9;6472:18;6455:36;:::i;:::-;6445:46;;6510:36;6542:2;6531:9;6527:18;6510:36;:::i;:::-;6500:46;;6565:36;6597:2;6586:9;6582:18;6565:36;:::i;:::-;6555:46;;6620:37;6652:3;6641:9;6637:19;6620:37;:::i;:::-;6610:47;;6676:37;6708:3;6697:9;6693:19;6676:37;:::i;:::-;6666:47;;6184:535;;;;;;;;:::o;6724:461::-;6777:3;6815:5;6809:12;6842:6;6837:3;6830:19;6868:4;6897:2;6892:3;6888:12;6881:19;;6934:2;6927:5;6923:14;6955:1;6965:195;6979:6;6976:1;6973:13;6965:195;;;7044:13;;-1:-1:-1;;;;;7040:39:1;7028:52;;7100:12;;;;7135:15;;;;7076:1;6994:9;6965:195;;;-1:-1:-1;7176:3:1;;6724:461;-1:-1:-1;;;;;6724:461:1:o;8499:261::-;8678:2;8667:9;8660:21;8641:4;8698:56;8750:2;8739:9;8735:18;8727:6;8698:56;:::i;9147:597::-;9259:4;9288:2;9317;9306:9;9299:21;9349:6;9343:13;9392:6;9387:2;9376:9;9372:18;9365:34;9417:1;9427:140;9441:6;9438:1;9435:13;9427:140;;;9536:14;;;9532:23;;9526:30;9502:17;;;9521:2;9498:26;9491:66;9456:10;;9427:140;;;9585:6;9582:1;9579:13;9576:91;;;9655:1;9650:2;9641:6;9630:9;9626:22;9622:31;9615:42;9576:91;-1:-1:-1;9728:2:1;9707:15;-1:-1:-1;;9703:29:1;9688:45;;;;9735:2;9684:54;;9147:597;-1:-1:-1;;;9147:597:1:o;14416:342::-;14618:2;14600:21;;;14657:2;14637:18;;;14630:30;-1:-1:-1;;;14691:2:1;14676:18;;14669:48;14749:2;14734:18;;14416:342::o;15470:340::-;15672:2;15654:21;;;15711:2;15691:18;;;15684:30;-1:-1:-1;;;15745:2:1;15730:18;;15723:46;15801:2;15786:18;;15470:340::o;17917:582::-;18216:6;18205:9;18198:25;18259:6;18254:2;18243:9;18239:18;18232:34;18302:3;18297:2;18286:9;18282:18;18275:31;18179:4;18323:57;18375:3;18364:9;18360:19;18352:6;18323:57;:::i;:::-;-1:-1:-1;;;;;18416:32:1;;;;18411:2;18396:18;;18389:60;-1:-1:-1;18480:3:1;18465:19;18458:35;18315:65;17917:582;-1:-1:-1;;;17917:582:1:o;19486:128::-;19526:3;19557:1;19553:6;19550:1;19547:13;19544:39;;;19563:18;;:::i;:::-;-1:-1:-1;19599:9:1;;19486:128::o;19619:204::-;19657:3;19693:4;19690:1;19686:12;19725:4;19722:1;19718:12;19760:3;19754:4;19750:14;19745:3;19742:23;19739:49;;;19768:18;;:::i;:::-;19804:13;;19619:204;-1:-1:-1;;;19619:204:1:o;19828:217::-;19868:1;19894;19884:132;;19938:10;19933:3;19929:20;19926:1;19919:31;19973:4;19970:1;19963:15;20001:4;19998:1;19991:15;19884:132;-1:-1:-1;20030:9:1;;19828:217::o;20050:422::-;20139:1;20182:5;20139:1;20196:270;20217:7;20207:8;20204:21;20196:270;;;20276:4;20272:1;20268:6;20264:17;20258:4;20255:27;20252:53;;;20285:18;;:::i;:::-;20335:7;20325:8;20321:22;20318:55;;;20355:16;;;;20318:55;20434:22;;;;20394:15;;;;20196:270;;;20200:3;20050:422;;;;;:::o;20477:140::-;20535:5;20564:47;20605:4;20595:8;20591:19;20585:4;20671:5;20701:8;20691:80;;-1:-1:-1;20742:1:1;20756:5;;20691:80;20790:4;20780:76;;-1:-1:-1;20827:1:1;20841:5;;20780:76;20872:4;20890:1;20885:59;;;;20958:1;20953:130;;;;20865:218;;20885:59;20915:1;20906:10;;20929:5;;;20953:130;20990:3;20980:8;20977:17;20974:43;;;20997:18;;:::i;:::-;-1:-1:-1;;21053:1:1;21039:16;;21068:5;;20865:218;;21167:2;21157:8;21154:16;21148:3;21142:4;21139:13;21135:36;21129:2;21119:8;21116:16;21111:2;21105:4;21102:12;21098:35;21095:77;21092:159;;;-1:-1:-1;21204:19:1;;;21236:5;;21092:159;21283:34;21308:8;21302:4;21283:34;:::i;:::-;21353:6;21349:1;21345:6;21341:19;21332:7;21329:32;21326:58;;;21364:18;;:::i;:::-;21402:20;;20622:806;-1:-1:-1;;;20622:806:1:o;21433:168::-;21473:7;21539:1;21535;21531:6;21527:14;21524:1;21521:21;21516:1;21509:9;21502:17;21498:45;21495:71;;;21546:18;;:::i;:::-;-1:-1:-1;21586:9:1;;21433:168::o;21606:125::-;21646:4;21674:1;21671;21668:8;21665:34;;;21679:18;;:::i;:::-;-1:-1:-1;21716:9:1;;21606:125::o;21736:195::-;21774:4;21811;21808:1;21804:12;21843:4;21840:1;21836:12;21868:3;21863;21860:12;21857:38;;;21875:18;;:::i;:::-;21912:13;;;21736:195;-1:-1:-1;;;21736:195:1:o;21936:135::-;21975:3;-1:-1:-1;;21996:17:1;;21993:43;;;22016:18;;:::i;:::-;-1:-1:-1;22063:1:1;22052:13;;21936:135::o;22076:127::-;22137:10;22132:3;22128:20;22125:1;22118:31;22168:4;22165:1;22158:15;22192:4;22189:1;22182:15;22208:127;22269:10;22264:3;22260:20;22257:1;22250:31;22300:4;22297:1;22290:15;22324:4;22321:1;22314:15;22340:127;22401:10;22396:3;22392:20;22389:1;22382:31;22432:4;22429:1;22422:15;22456:4;22453:1;22446:15;22472:127;22533:10;22528:3;22524:20;22521:1;22514:31;22564:4;22561:1;22554:15;22588:4;22585:1;22578:15;22604:131;-1:-1:-1;;;;;22679:31:1;;22669:42;;22659:70;;22725:1;22722;22715:12;22740:118;22826:5;22819:13;22812:21;22805:5;22802:32;22792:60;;22848:1;22845;22838:12

Swarm Source

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