ETH Price: $2,645.69 (+0.12%)

Token

DogeCoffee (BEANS)
 

Overview

Max Total Supply

1,000,000,000 BEANS

Holders

100

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000000008 BEANS

Value
$0.00
0xf35d1e3d72f52b57ac616efbce60cc95e47f3188
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:
DogeCoffee

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *
 
:::::::-.      ...       .,-:::::/ .,::::::        .,-:::::     ...     .-:::::'.-:::::'.,:::::: .,::::::  
 ;;,   `';, .;;;;;;;.  ,;;-'````'  ;;;;''''      ,;;;'````'  .;;;;;;;.  ;;;'''' ;;;'''' ;;;;'''' ;;;;''''  
 `[[     [[,[[     \[[,[[[   [[[[[[/[[cccc       [[[        ,[[     \[[,[[[,,== [[[,,==  [[cccc   [[cccc   
  $$,    $$$$$,     $$$"$$c.    "$$ $$""""       $$$        $$$,     $$$`$$$"`` `$$$"``  $$""""   $$""""   
  888_,o8P'"888,_ _,88P `Y8bo,,,o88o888oo,__     `88bo,__,o,"888,_ _,88P 888     888     888oo,__ 888oo,__ 
  MMMMP"`    "YMMMMMP"    `'YMUP"YMM""""YUMMM      "YUMMMMMP" "YMMMMMP"  "MM,    "MM,    """"YUMMM""""YUMMM


 
/**
*/
pragma solidity ^0.8.13;

// SPDX-License-Identifier: MIT

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


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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

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

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

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

    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}



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

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

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

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

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

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

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

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

            bytes32 lastvalue = set._values[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

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

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

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

    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string private constant _name = 'DogeCoffee';
    string private constant _symbol = 'BEANS';
    uint8 private constant _decimals = 18;
    uint256 public constant InitialSupply= 1000000000 * 10**_decimals;//equals 1 000 000 000 tokens

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

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

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

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

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

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

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

        //Set Starting Tax 
        
        _buyTax=4;
        _sellTax=4;
        _transferTax=2;

        _burnTax=0;
        _liquidityTax=25;
        _stakingTax=75;

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

    //Transfer functionality///

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

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

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

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

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

            tax=_sellTax;


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

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

            tax=_buyTax;

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

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

            tax=_transferTax;

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

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

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

    }

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

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

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

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

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

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

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

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

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

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

        _uniswapv2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawETH(amount, addr);
        _isWithdrawing=false;
    }

    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////



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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function CollectMarketingETH() public onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(Marketing2).transfer((amount*33) / 100);
        payable(Marketing).transfer((amount*67) / 100);
    } 
    function CollectXMarketingETH(uint256 amount) public onlyOwner{
        require(amount<=marketingBalance);
        marketingBalance-=amount;
        payable(Marketing2).transfer((amount*33) / 100);
        payable(Marketing).transfer((amount*67) / 100);
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) public onlyOwner{
        manualConversion=manual;
    }
    
    function TeamChangeMaxBuy(uint256 newMaxBuy) public onlyOwner{
      MaxBuy=newMaxBuy * 10**_decimals;
    }
    
    function TeamChangeMarketing2(address newMarketing2) public onlyOwner{
      Marketing2=payable(newMarketing2);
    }
    
    function TeamChangeMarketing(address newMarketing) public onlyOwner{
      Marketing=payable(newMarketing);
    }

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

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

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

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

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

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

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }

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

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

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

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

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

    //Release Liquidity Tokens once unlock time is over
    function REL() public onlyOwner {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IUniswapV2ERC20 liquidityToken = IUniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

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

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

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

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

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

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

    // IERC20 - Helpers

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

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

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

}

Contract Security Audit

Contract ABI

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

608060405261012c6010556001601155601280546001600160a01b031990811673bd0337a4ae47fc010559c5ca531f0caed1475bc117825560138054909116732d6a856994dabeca7903d78ed094c861515df6cf1790556200006390600a62000622565b6200007390633b9aca0062000633565b601481905560158190556016556200008e6012600a62000622565b6200009e906301312d0062000633565b601755601d805460ff19166064179055620000bc6012600a62000622565b620000cc906302160ec062000633565b602355348015620000dc57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601454336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f0919062000655565b6001600160a01b031663c9c6539630601960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000253573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000279919062000655565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ed919062000655565b601880546001600160a01b0392909216660100000000000002600160301b600160d01b031990921691909117905560326200032b6012600a62000622565b6200033b90633b9aca0062000633565b62000347919062000687565b60155560646200035a6012600a62000622565b6200036a90633b9aca0062000633565b62000376919062000687565b601655600060258190556027556018805465ffffffffffff1916654b1900020404179055601254620003c0906005906001600160a01b03166200049d602090811b6200208517901c565b50601354620003e7906005906001600160a01b03166200049d602090811b6200208517901c565b50620004033360056200049d60201b620020851790919060201c565b506019546200042a90600b906001600160a01b03166200049d602090811b6200208517901c565b506200045b601860069054906101000a90046001600160a01b0316600b6200049d60201b620020851790919060201c565b506200047730600b6200049d60201b620020851790919060201c565b506200049561dead600b6200049d60201b620020851790919060201c565b5050620006aa565b6000620004b4836001600160a01b038416620004bd565b90505b92915050565b60008181526001830160205260408120546200050657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004b7565b506000620004b7565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005665781600019048211156200054a576200054a6200050f565b808516156200055857918102915b93841c93908002906200052a565b509250929050565b6000826200057f57506001620004b7565b816200058e57506000620004b7565b8160018114620005a75760028114620005b257620005d2565b6001915050620004b7565b60ff841115620005c657620005c66200050f565b50506001821b620004b7565b5060208310610133831016604e8410600b8410161715620005f7575081810a620004b7565b62000603838362000525565b80600019048211156200061a576200061a6200050f565b029392505050565b6000620004b460ff8416836200056e565b60008160001904831182151516156200065057620006506200050f565b500290565b6000602082840312156200066857600080fd5b81516001600160a01b03811681146200068057600080fd5b9392505050565b600082620006a557634e487b7160e01b600052601260045260246000fd5b500490565b613daa80620006ba6000396000f3fe6080604052600436106104315760003560e01c8063715018a611610227578063b58a56cd1161012d578063e2fd002a116100b0578063f2c816ae11610077578063f2c816ae14610cd7578063f2fde38b14610cf7578063f88b0e4614610d17578063fe002ec214610d2d578063fe575a8714610d4257005b8063e2fd002a14610c4c578063e69e03ee14610c6c578063e803050c14610c81578063ebddcc1d14610ca1578063f00df36514610cc157005b8063cd979a7e116100f4578063cd979a7e14610b86578063d11edf7414610ba6578063d51f383b14610bc6578063db886f2314610be6578063dd62ed3e14610c0657005b8063b58a56cd14610b07578063b766a38614610b27578063c280895414610b47578063c3a3c03214610b5c578063c3f4f54f14610b7157005b80638728ecd1116101b5578063998a86681161017c578063998a866814610a725780639bf6577014610a875780639fa62d5f14610aa7578063a457c2d714610ac7578063a9059cbb14610ae757005b80638728ecd1146109ec578063887c60fb14610a0c578063893d20e814610a265780638da5cb5b14610a2657806395d89b4114610a4457005b8063762bb282116101f9578063762bb2821461097c5780637b9e987a14610992578063828e8b7e146109a75780638650e92a146109bc57806386d0ada8146109d257005b8063715018a6146108ef5780637335307b1461090457806373ddf08e1461092457806375a1017c1461094457005b806335e82f3a116103375780634f91e48c116102ba5780635ebbc3ca116102815780635ebbc3ca1461083a578063643daaea1461084f5780636ea4caab1461086f5780636f89e4091461088f57806370a08231146108b957005b80634f91e48c146107d957806357ad67d1146107ef57806358e553651461080f5780635b80f625146108255780635c69f690146106b857005b80634089b170116102fe5780634089b1701461075957806344f3c83a1461076f57806348e53164146107855780634ada218b1461079a5780634cdaf0ae146107b957005b806335e82f3a146106cd57806339509351146106ed5780633ab0e29d1461070d5780633cc39b7a1461072d5780633da56f181461074357005b806323b872dd116103bf5780633054f8a3116103865780633054f8a314610655578063311a86971461066f578063313ce5671461068457806332ac487f146106985780633478154b146106b857005b806323b872dd14610581578063243b529a146105a1578063269a6aae146105b65780632973ef2d146105cc5780632daf87ca1461063557005b80631285073c116104035780631285073c1461050357806314ddc0951461052257806314e913771461053757806318160ddd146105575780631eb25d131461056c57005b806306fdde031461043a57806309218ee71461047f578063095ea7b3146104ab5780630fd99e16146104db57005b3661043857005b005b34801561044657600080fd5b5060408051808201909152600a815269446f6765436f6666656560b01b60208201525b6040516104769190613789565b60405180910390f35b34801561048b57600080fd5b50601d546104999060ff1681565b60405160ff9091168152602001610476565b3480156104b757600080fd5b506104cb6104c63660046137f3565b610d62565b6040519015158152602001610476565b3480156104e757600080fd5b506104f0606481565b60405161ffff9091168152602001610476565b34801561050f57600080fd5b506025545b604051908152602001610476565b34801561052e57600080fd5b50602754610514565b34801561054357600080fd5b5061043861055236600461382d565b610d79565b34801561056357600080fd5b50601454610514565b34801561057857600080fd5b50610514610dce565b34801561058d57600080fd5b506104cb61059c36600461384a565b610deb565b3480156105ad57600080fd5b50610438610e82565b3480156105c257600080fd5b5061051460105481565b3480156105d857600080fd5b506018546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610476565b34801561064157600080fd5b5061043861065036600461388b565b610ec5565b34801561066157600080fd5b506026546104cb9060ff1681565b34801561067b57600080fd5b50610499603281565b34801561069057600080fd5b506012610499565b3480156106a457600080fd5b506105146106b33660046138a4565b610fc5565b3480156106c457600080fd5b506104f0600081565b3480156106d957600080fd5b506104386106e83660046138a4565b61101b565b3480156106f957600080fd5b506104cb6107083660046137f3565b61105f565b34801561071957600080fd5b506104386107283660046138a4565b611096565b34801561073957600080fd5b5061051460215481565b34801561074f57600080fd5b5061051460115481565b34801561076557600080fd5b50610514601c5481565b34801561077b57600080fd5b5061051460275481565b34801561079157600080fd5b506104386110f1565b3480156107a657600080fd5b506028546104cb90610100900460ff1681565b3480156107c557600080fd5b506104386107d43660046138a4565b611110565b3480156107e557600080fd5b5061051460165481565b3480156107fb57600080fd5b5061043861080a3660046138d7565b611173565b34801561081b57600080fd5b50610514601e5481565b34801561083157600080fd5b50602354610514565b34801561084657600080fd5b506104386112a6565b34801561085b57600080fd5b5061043861086a36600461388b565b611373565b34801561087b57600080fd5b5061043861088a36600461388b565b6113be565b34801561089b57600080fd5b506108a4611413565b60408051928352602083019190915201610476565b3480156108c557600080fd5b506105146108d43660046138a4565b6001600160a01b031660009081526001602052604090205490565b3480156108fb57600080fd5b50610438611450565b34801561091057600080fd5b506104cb61091f3660046138a4565b6114d3565b34801561093057600080fd5b5061043861093f36600461394b565b6114e0565b34801561095057600080fd5b50601254610964906001600160a01b031681565b6040516001600160a01b039091168152602001610476565b34801561098857600080fd5b5061051460155481565b34801561099e57600080fd5b50610438611540565b3480156109b357600080fd5b5061043861158e565b3480156109c857600080fd5b50610514601a5481565b3480156109de57600080fd5b506028546104cb9060ff1681565b3480156109f857600080fd5b50610514610a073660046138a4565b6115ad565b348015610a1857600080fd5b506024546104cb9060ff1681565b348015610a3257600080fd5b506000546001600160a01b0316610964565b348015610a5057600080fd5b506040805180820190915260058152644245414e5360d81b6020820152610469565b348015610a7e57600080fd5b506104386115ec565b348015610a9357600080fd5b50610438610aa236600461382d565b61173b565b348015610ab357600080fd5b50610438610ac2366004613966565b611787565b348015610ad357600080fd5b506104cb610ae23660046137f3565b611909565b348015610af357600080fd5b506104cb610b023660046137f3565b611985565b348015610b1357600080fd5b50610438610b223660046138a4565b611992565b348015610b3357600080fd5b50610438610b4236600461382d565b6119ed565b348015610b5357600080fd5b50610438611a39565b348015610b6857600080fd5b50610514611a42565b348015610b7d57600080fd5b50610514611a62565b348015610b9257600080fd5b50610438610ba13660046138a4565b611aa1565b348015610bb257600080fd5b50610438610bc136600461388b565b611ae5565b348015610bd257600080fd5b50610438610be136600461388b565b611b23565b348015610bf257600080fd5b50601354610964906001600160a01b031681565b348015610c1257600080fd5b50610514610c21366004613988565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c5857600080fd5b50610438610c6736600461388b565b611baf565b348015610c7857600080fd5b50610514611c34565b348015610c8d57600080fd5b50610514610c9c3660046138a4565b611c9a565b348015610cad57600080fd5b50610438610cbc36600461382d565b611cc3565b348015610ccd57600080fd5b50610514601b5481565b348015610ce357600080fd5b50610438610cf23660046138a4565b611edd565b348015610d0357600080fd5b50610438610d123660046138a4565b611f21565b348015610d2357600080fd5b5061051460255481565b348015610d3957600080fd5b5061043861201a565b348015610d4e57600080fd5b506104cb610d5d3660046138a4565b612078565b6000610d6f33848461209a565b5060015b92915050565b33610d8c6000546001600160a01b031690565b6001600160a01b031614610dbb5760405162461bcd60e51b8152600401610db2906139c1565b60405180910390fd5b6024805460ff1916911515919091179055565b610dda6012600a613af0565b610de890633b9aca00613aff565b81565b6000610df884848461218d565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e635760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610db2565b610e778533610e728685613b1e565b61209a565b506001949350505050565b33610e956000546001600160a01b031690565b6001600160a01b031614610ebb5760405162461bcd60e51b8152600401610db2906139c1565b610ec36123ea565b565b33610ed86000546001600160a01b031690565b6001600160a01b031614610efe5760405162461bcd60e51b8152600401610db2906139c1565b601e54811115610f0d57600080fd5b80601e6000828254610f1f9190613b1e565b90915550506012546001600160a01b03166108fc6064610f40846021613aff565b610f4a9190613b35565b6040518115909202916000818181858888f19350505050158015610f72573d6000803e3d6000fd5b506013546001600160a01b03166108fc6064610f8f846043613aff565b610f999190613b35565b6040518115909202916000818181858888f19350505050158015610fc1573d6000803e3d6000fd5b5050565b6000610fd0826114d3565b15610ff057506001600160a01b0316600090815260208052604090205490565b6001600160a01b03821660009081526020805260409020546110118361252a565b610d739190613b57565b3361102e6000546001600160a01b031690565b6001600160a01b0316146110545760405162461bcd60e51b8152600401610db2906139c1565b610fc1600d826125b0565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610d6f918590610e72908690613b57565b336110a96000546001600160a01b031690565b6001600160a01b0316146110cf5760405162461bcd60e51b8152600401610db2906139c1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6025546110fe9042613b57565b33600090815260036020526040902055565b336111236000546001600160a01b031690565b6001600160a01b0316146111495760405162461bcd60e51b8152600401610db2906139c1565b602880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111866000546001600160a01b031690565b6001600160a01b0316146111ac5760405162461bcd60e51b8152600401610db2906139c1565b6000846111b98789613b6f565b6111c39190613b6f565b90508060ff166064146112275760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610db2565b506018805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112b96000546001600160a01b031690565b6001600160a01b0316146112df5760405162461bcd60e51b8152600401610db2906139c1565b6029544210156113015760405162461bcd60e51b8152600401610db290613b94565b61130d61070842613b57565b6029556012546040516000916001600160a01b03169047908381818185875af1925050503d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b505090508061137057600080fd5b50565b336113866000546001600160a01b031690565b6001600160a01b0316146113ac5760405162461bcd60e51b8152600401610db2906139c1565b6113706113b94283613b57565b6125c5565b336113d16000546001600160a01b031690565b6001600160a01b0316146113f75760405162461bcd60e51b8152600401610db2906139c1565b6114036012600a613af0565b61140d9082613aff565b60175550565b6000806114226012600a613af0565b60155461142f9190613b35565b61143b6012600a613af0565b6016546114489190613b35565b915091509091565b336114636000546001600160a01b031690565b6001600160a01b0316146114895760405162461bcd60e51b8152600401610db2906139c1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610d73600b836125d8565b336114f36000546001600160a01b031690565b6001600160a01b0316146115195760405162461bcd60e51b8152600401610db2906139c1565b60648160ff16111561152a57600080fd5b601d805460ff191660ff92909216919091179055565b336115536000546001600160a01b031690565b6001600160a01b0316146115795760405162461bcd60e51b8152600401610db2906139c1565b6028805461ff00191661010017905542600f55565b60275461159b9042613b57565b33600090815260046020526040902055565b6001600160a01b0381166000908152600360205260408120544281116115d65750600092915050565b6115e04282613b1e565b9392505050565b905090565b336115ff6000546001600160a01b031690565b6001600160a01b0316146116255760405162461bcd60e51b8152600401610db2906139c1565b6029544210156116475760405162461bcd60e51b8152600401610db290613b94565b6028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd9190613bbe565b60125460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015611712573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117369190613bd7565b505050565b3361174e6000546001600160a01b031690565b6001600160a01b0316146117745760405162461bcd60e51b8152600401610db2906139c1565b6028805460ff1916911515919091179055565b3361179a6000546001600160a01b031690565b6001600160a01b0316146117c05760405162461bcd60e51b8152600401610db2906139c1565b60646014546117cf9190613b35565b81106117da57600080fd5b6117e66012600a613af0565b6117f09083613aff565b91506117fe6012600a613af0565b6118089082613aff565b90506000603260ff1660145461181e9190613b35565b90506000606461ffff166014546118359190613b35565b90508184101561189b5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610db2565b808310156118fc5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610db2565b5050601591909155601655565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561196c5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610db2565b61197b3385610e728685613b1e565b5060019392505050565b6000610d6f33848461218d565b336119a56000546001600160a01b031690565b6001600160a01b0316146119cb5760405162461bcd60e51b8152600401610db2906139c1565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b33611a006000546001600160a01b031690565b6001600160a01b031614611a265760405162461bcd60e51b8152600401610db2906139c1565b6026805460ff1916911515919091179055565b610ec3336125fa565b6000602954421015611a5c57426029546115e79190613b1e565b50600090565b6000611a706012600a613af0565b601454611a7f6012600a613af0565b611a8d90633b9aca00613aff565b611a979190613b1e565b6115e79190613b35565b33611ab46000546001600160a01b031690565b6001600160a01b031614611ada5760405162461bcd60e51b8152600401610db2906139c1565b610fc1600582612085565b33611af86000546001600160a01b031690565b6001600160a01b031614611b1e5760405162461bcd60e51b8152600401610db2906139c1565b602355565b33611b366000546001600160a01b031690565b6001600160a01b031614611b5c5760405162461bcd60e51b8152600401610db2906139c1565b8015611baa5760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610db2565b602555565b33611bc26000546001600160a01b031690565b6001600160a01b031614611be85760405162461bcd60e51b8152600401610db2906139c1565b8015611c2f5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610db2565b602755565b601454600090815b611c46600b6128be565b811015611c945760016000611c5c600b846128c8565b6001600160a01b03168152602081019190915260400160002054611c809083613b1e565b915080611c8c81613bf4565b915050611c3c565b50919050565b6001600160a01b0381166000908152600460205260408120544281116115d65750600092915050565b33611cd66000546001600160a01b031690565b6001600160a01b031614611cfc5760405162461bcd60e51b8152600401610db2906139c1565b602954421015611d1e5760405162461bcd60e51b8152600401610db290613b94565b611d2a61070842613b57565b6029556028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613bbe565b60195460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1c9190613bd7565b5060195460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611e589030908690600090819084904290600401613c0d565b6020604051808303816000875af1158015611e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9b9190613bbe565b506000611ea88247613b1e565b90508415611ebe57611eb9816128d4565b611ed6565b80601e6000828254611ed09190613b57565b90915550505b5050505050565b33611ef06000546001600160a01b031690565b6001600160a01b031614611f165760405162461bcd60e51b8152600401610db2906139c1565b610fc1600d82612085565b33611f346000546001600160a01b031690565b6001600160a01b031614611f5a5760405162461bcd60e51b8152600401610db2906139c1565b6001600160a01b038116611fbf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db2565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361202d6000546001600160a01b031690565b6001600160a01b0316146120535760405162461bcd60e51b8152600401610db2906139c1565b601e805460009091556012546001600160a01b03166108fc6064610f40846021613aff565b6000610d73600d836125d8565b60006115e0836001600160a01b0384166129a0565b6001600160a01b0383166120e45760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610db2565b6001600160a01b03821661212c5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610db2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121d85760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610db2565b6001600160a01b0382166122215760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610db2565b600061222e6005856125d8565b8061223f575061223f6005846125d8565b905060006001600160a01b03851630148061226257506001600160a01b03841630145b6019546018549192506001600160a01b0390811691600091888116600160301b909204161480156122a45750816001600160a01b0316866001600160a01b0316145b806122df57506018546001600160a01b03878116600160301b909204161480156122df5750816001600160a01b0316876001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b9092041614806123195750826001600160a01b0316886001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b9092041614806123535750836001600160a01b0316886001600160a01b0316145b9050848061235e5750825b806123665750855b1561237b576123768989896129ef565b6123df565b602854610100900460ff166123d25760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610db2565b6123df8989898585612aba565b505050505050505050565b6022805460ff19166001908117909155306000908152602091909152604081205460185490919061243090600160281b810460ff90811691640100000000900416613b6f565b60ff169050600060235490508083108061244c575061ffff8216155b156124595750505061251e565b60185460009061ffff84169061247a90640100000000900460ff1684613aff565b6124849190613b35565b905060006124928284613b1e565b905060006124a1600284613b35565b905060006124af8285613b1e565b905060006124bd8483613b57565b9050476124c982613252565b60006124d58247613b1e565b90506000836124e48684613aff565b6124ee9190613b35565b90506124fa86826133ab565b60006125068447613b1e565b9050612511816128d4565b5050505050505050505050505b6022805460ff19169055565b6001600160a01b038116600090815260016020526040812054601a54829161255191613aff565b6001600160a01b0384166000908152601f602052604090205490915081101561257d5750600092915050565b6001600160a01b0383166000908152601f6020526040902054600160401b906125a69083613b1e565b6115e09190613b35565b60006115e0836001600160a01b03841661345a565b60295481116125d357600080fd5b602955565b6001600160a01b038116600090815260018301602052604081205415156115e0565b601954600160a01b900460ff161561261157600080fd5b6019805460ff60a01b1916600160a01b179055600061262f826114d3565b1561265657506001600160a01b0381166000908152602080526040812080549190556126d3565b60006126618361252a565b6001600160a01b038416600090815260016020526040902054601a5491925061268991613aff565b6001600160a01b0384166000908152601f6020908152604080832093909355805220546126b7908290613b57565b6001600160a01b03841660009081526020805260408120559150505b806000036126ec5750506019805460ff60a01b19169055565b80601c60008282546126fe9190613b57565b90915550506040805160028082526060820183526000926020830190803683375050601954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561276d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127919190613c48565b816000815181106127a4576127a4613c65565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48816001815181106127ec576127ec613c65565b6001600160a01b03928316602091820292909201015260195460405163b6f9de9560e01b815291169063b6f9de9590849061283290600090869089904290600401613cbf565b6000604051808303818588803b15801561284b57600080fd5b505af115801561285f573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506128a49050565b60405180910390a150506019805460ff60a01b1916905550565b6000610d73825490565b60006115e08383613547565b601d546000906064906128ea9060ff1684613aff565b6128f49190613b35565b905060006129028284613b1e565b905081601e60008282546129169190613b57565b909155505080156117365780601b60008282546129339190613b57565b9091555060009050612943611c34565b90508060000361296a5781601e600082825461295f9190613b57565b9091555061299a9050565b80612979600160401b84613aff565b6129839190613b35565b601a60008282546129949190613b57565b90915550505b50505050565b60008181526001830160205260408120546129e757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d73565b506000610d73565b6001600160a01b03831660009081526001602052604090205481811015612a535760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610db2565b612a5d84836135cd565b612a67838361368c565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612aac91815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b285760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610db2565b60008315612cdb57612b3b6007896125d8565b612bd0576001600160a01b03881660009081526003602052604090205442101580612b68575060245460ff165b612ba95760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610db2565b602554612bb69042613b57565b6001600160a01b0389166000908152600360205260409020555b601654861115612c145760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610db2565b612c1f600d896125d8565b15612c635760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610db2565b601054600f54612c739190613b57565b4211158015612c8457506011546001145b15612cca57612c94600d89612085565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601854610100900460ff166130ef565b8415612eec57612cec6009886125d8565b612d7f576001600160a01b03871660009081526004602052604090205442101580612d19575060265460ff165b612d585760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610db2565b602754612d659042613b57565b6001600160a01b0388166000908152600460205260409020555b601554612d8c8785613b57565b1115612dcd5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610db2565b601754861115612e2a5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610db2565b612e35600d886125d8565b15612e795760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610db2565b601054600f54612e899190613b57565b4211158015612e9a57506011546001145b15612ee057612eaa600d88612085565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185460ff166130ef565b612ef86012600a613af0565b8611612f0757612f07886125fa565b601554612f148785613b57565b1115612f555760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610db2565b612f606007896125d8565b612fca576001600160a01b03881660009081526003602052604090205442101580612f8d575060245460ff165b612fca5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610db2565b612fd5600d896125d8565b156130225760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610db2565b61302d600d886125d8565b1561307a5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610db2565b601054600f5461308a9190613b57565b421115801561309b57506011546001145b156130e1576130ab600d89612085565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185462010000900460ff165b6018546001600160a01b03898116600160301b9092041614801590613117575060285460ff16155b8015613126575060225460ff16155b801561312f5750835b1561313c5761313c6123ea565b60006131588783601860039054906101000a900460ff16613755565b60185490915060009061318c90899085906131879060ff6401000000008204811691600160281b900416613b6f565b613755565b9050600061319a8284613b57565b6131a4908a613b1e565b90506131b08b8a6135cd565b30600090815260016020526040812080548492906131cf908490613b57565b9250508190555082601460008282546131e89190613b1e565b909155506131f890508a8261368c565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161323d91815260200190565b60405180910390a35050505050505050505050565b60195461326a9030906001600160a01b03168361209a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061329f5761329f613c65565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156132f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331c9190613c48565b8160018151811061332f5761332f613c65565b6001600160a01b03928316602091820292909201015260195460405163791ac94760e01b815291169063791ac94790613375908590600090869030904290600401613cf4565b600060405180830381600087803b15801561338f57600080fd5b505af11580156133a3573d6000803e3d6000fd5b505050505050565b80602160008282546133bd9190613b57565b90915550506019546133da9030906001600160a01b03168461209a565b60195460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906134179030908790600090819084904290600401613c0d565b60606040518083038185885af1158015613435573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ed69190613d30565b6000818152600183016020526040812054801561353d57600061347e600183613b1e565b855490915060009061349290600190613b1e565b905060008660000182815481106134ab576134ab613c65565b90600052602060002001549050808760000184815481106134ce576134ce613c65565b60009182526020808320909101929092558281526001890190915260409020849055865487908061350157613501613d5e565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610d73565b6000915050610d73565b815460009082106135a55760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610db2565b8260000182815481106135ba576135ba613c65565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600160205260408120546135f1908390613b1e565b90506135fc836114d3565b15613621576001600160a01b0390921660009081526001602052604090209190915550565b600061362c8461252a565b6001600160a01b0385166000908152600160205260409020839055601a54909150613658908390613aff565b6001600160a01b0385166000908152601f602090815260408083209390935580529081208054839290612994908490613b57565b6001600160a01b0382166000908152600160205260408120546136b0908390613b57565b90506136bb836114d3565b156136e0576001600160a01b0390921660009081526001602052604090209190915550565b60006136eb8461252a565b905081601a546136fb9190613aff565b6001600160a01b0385166000908152601f60209081526040808320939093558052908120805483929061372f908490613b57565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff168661376d9190613aff565b6137779190613aff565b6137819190613b35565b949350505050565b600060208083528351808285015260005b818110156137b65785810183015185820160400152820161379a565b818111156137c8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461137057600080fd5b6000806040838503121561380657600080fd5b8235613811816137de565b946020939093013593505050565b801515811461137057600080fd5b60006020828403121561383f57600080fd5b81356115e08161381f565b60008060006060848603121561385f57600080fd5b833561386a816137de565b9250602084013561387a816137de565b929592945050506040919091013590565b60006020828403121561389d57600080fd5b5035919050565b6000602082840312156138b657600080fd5b81356115e0816137de565b803560ff811681146138d257600080fd5b919050565b60008060008060008060c087890312156138f057600080fd5b6138f9876138c1565b9550613907602088016138c1565b9450613915604088016138c1565b9350613923606088016138c1565b9250613931608088016138c1565b915061393f60a088016138c1565b90509295509295509295565b60006020828403121561395d57600080fd5b6115e0826138c1565b6000806040838503121561397957600080fd5b50508035926020909101359150565b6000806040838503121561399b57600080fd5b82356139a6816137de565b915060208301356139b6816137de565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613a47578160001904821115613a2d57613a2d6139f6565b80851615613a3a57918102915b93841c9390800290613a11565b509250929050565b600082613a5e57506001610d73565b81613a6b57506000610d73565b8160018114613a815760028114613a8b57613aa7565b6001915050610d73565b60ff841115613a9c57613a9c6139f6565b50506001821b610d73565b5060208310610133831016604e8410600b8410161715613aca575081810a610d73565b613ad48383613a0c565b8060001904821115613ae857613ae86139f6565b029392505050565b60006115e060ff841683613a4f565b6000816000190483118215151615613b1957613b196139f6565b500290565b600082821015613b3057613b306139f6565b500390565b600082613b5257634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613b6a57613b6a6139f6565b500190565b600060ff821660ff84168060ff03821115613b8c57613b8c6139f6565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613bd057600080fd5b5051919050565b600060208284031215613be957600080fd5b81516115e08161381f565b600060018201613c0657613c066139f6565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613c5a57600080fd5b81516115e0816137de565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613cb45781516001600160a01b031687529582019590820190600101613c8f565b509495945050505050565b848152608060208201526000613cd86080830186613c7b565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000613d1360a0830186613c7b565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613d4557600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea26469706673582212200fb4918f1a41bef84ed262c02dad81482b75763df85f83a87f7b7332b64d6ebc64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106104315760003560e01c8063715018a611610227578063b58a56cd1161012d578063e2fd002a116100b0578063f2c816ae11610077578063f2c816ae14610cd7578063f2fde38b14610cf7578063f88b0e4614610d17578063fe002ec214610d2d578063fe575a8714610d4257005b8063e2fd002a14610c4c578063e69e03ee14610c6c578063e803050c14610c81578063ebddcc1d14610ca1578063f00df36514610cc157005b8063cd979a7e116100f4578063cd979a7e14610b86578063d11edf7414610ba6578063d51f383b14610bc6578063db886f2314610be6578063dd62ed3e14610c0657005b8063b58a56cd14610b07578063b766a38614610b27578063c280895414610b47578063c3a3c03214610b5c578063c3f4f54f14610b7157005b80638728ecd1116101b5578063998a86681161017c578063998a866814610a725780639bf6577014610a875780639fa62d5f14610aa7578063a457c2d714610ac7578063a9059cbb14610ae757005b80638728ecd1146109ec578063887c60fb14610a0c578063893d20e814610a265780638da5cb5b14610a2657806395d89b4114610a4457005b8063762bb282116101f9578063762bb2821461097c5780637b9e987a14610992578063828e8b7e146109a75780638650e92a146109bc57806386d0ada8146109d257005b8063715018a6146108ef5780637335307b1461090457806373ddf08e1461092457806375a1017c1461094457005b806335e82f3a116103375780634f91e48c116102ba5780635ebbc3ca116102815780635ebbc3ca1461083a578063643daaea1461084f5780636ea4caab1461086f5780636f89e4091461088f57806370a08231146108b957005b80634f91e48c146107d957806357ad67d1146107ef57806358e553651461080f5780635b80f625146108255780635c69f690146106b857005b80634089b170116102fe5780634089b1701461075957806344f3c83a1461076f57806348e53164146107855780634ada218b1461079a5780634cdaf0ae146107b957005b806335e82f3a146106cd57806339509351146106ed5780633ab0e29d1461070d5780633cc39b7a1461072d5780633da56f181461074357005b806323b872dd116103bf5780633054f8a3116103865780633054f8a314610655578063311a86971461066f578063313ce5671461068457806332ac487f146106985780633478154b146106b857005b806323b872dd14610581578063243b529a146105a1578063269a6aae146105b65780632973ef2d146105cc5780632daf87ca1461063557005b80631285073c116104035780631285073c1461050357806314ddc0951461052257806314e913771461053757806318160ddd146105575780631eb25d131461056c57005b806306fdde031461043a57806309218ee71461047f578063095ea7b3146104ab5780630fd99e16146104db57005b3661043857005b005b34801561044657600080fd5b5060408051808201909152600a815269446f6765436f6666656560b01b60208201525b6040516104769190613789565b60405180910390f35b34801561048b57600080fd5b50601d546104999060ff1681565b60405160ff9091168152602001610476565b3480156104b757600080fd5b506104cb6104c63660046137f3565b610d62565b6040519015158152602001610476565b3480156104e757600080fd5b506104f0606481565b60405161ffff9091168152602001610476565b34801561050f57600080fd5b506025545b604051908152602001610476565b34801561052e57600080fd5b50602754610514565b34801561054357600080fd5b5061043861055236600461382d565b610d79565b34801561056357600080fd5b50601454610514565b34801561057857600080fd5b50610514610dce565b34801561058d57600080fd5b506104cb61059c36600461384a565b610deb565b3480156105ad57600080fd5b50610438610e82565b3480156105c257600080fd5b5061051460105481565b3480156105d857600080fd5b506018546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610476565b34801561064157600080fd5b5061043861065036600461388b565b610ec5565b34801561066157600080fd5b506026546104cb9060ff1681565b34801561067b57600080fd5b50610499603281565b34801561069057600080fd5b506012610499565b3480156106a457600080fd5b506105146106b33660046138a4565b610fc5565b3480156106c457600080fd5b506104f0600081565b3480156106d957600080fd5b506104386106e83660046138a4565b61101b565b3480156106f957600080fd5b506104cb6107083660046137f3565b61105f565b34801561071957600080fd5b506104386107283660046138a4565b611096565b34801561073957600080fd5b5061051460215481565b34801561074f57600080fd5b5061051460115481565b34801561076557600080fd5b50610514601c5481565b34801561077b57600080fd5b5061051460275481565b34801561079157600080fd5b506104386110f1565b3480156107a657600080fd5b506028546104cb90610100900460ff1681565b3480156107c557600080fd5b506104386107d43660046138a4565b611110565b3480156107e557600080fd5b5061051460165481565b3480156107fb57600080fd5b5061043861080a3660046138d7565b611173565b34801561081b57600080fd5b50610514601e5481565b34801561083157600080fd5b50602354610514565b34801561084657600080fd5b506104386112a6565b34801561085b57600080fd5b5061043861086a36600461388b565b611373565b34801561087b57600080fd5b5061043861088a36600461388b565b6113be565b34801561089b57600080fd5b506108a4611413565b60408051928352602083019190915201610476565b3480156108c557600080fd5b506105146108d43660046138a4565b6001600160a01b031660009081526001602052604090205490565b3480156108fb57600080fd5b50610438611450565b34801561091057600080fd5b506104cb61091f3660046138a4565b6114d3565b34801561093057600080fd5b5061043861093f36600461394b565b6114e0565b34801561095057600080fd5b50601254610964906001600160a01b031681565b6040516001600160a01b039091168152602001610476565b34801561098857600080fd5b5061051460155481565b34801561099e57600080fd5b50610438611540565b3480156109b357600080fd5b5061043861158e565b3480156109c857600080fd5b50610514601a5481565b3480156109de57600080fd5b506028546104cb9060ff1681565b3480156109f857600080fd5b50610514610a073660046138a4565b6115ad565b348015610a1857600080fd5b506024546104cb9060ff1681565b348015610a3257600080fd5b506000546001600160a01b0316610964565b348015610a5057600080fd5b506040805180820190915260058152644245414e5360d81b6020820152610469565b348015610a7e57600080fd5b506104386115ec565b348015610a9357600080fd5b50610438610aa236600461382d565b61173b565b348015610ab357600080fd5b50610438610ac2366004613966565b611787565b348015610ad357600080fd5b506104cb610ae23660046137f3565b611909565b348015610af357600080fd5b506104cb610b023660046137f3565b611985565b348015610b1357600080fd5b50610438610b223660046138a4565b611992565b348015610b3357600080fd5b50610438610b4236600461382d565b6119ed565b348015610b5357600080fd5b50610438611a39565b348015610b6857600080fd5b50610514611a42565b348015610b7d57600080fd5b50610514611a62565b348015610b9257600080fd5b50610438610ba13660046138a4565b611aa1565b348015610bb257600080fd5b50610438610bc136600461388b565b611ae5565b348015610bd257600080fd5b50610438610be136600461388b565b611b23565b348015610bf257600080fd5b50601354610964906001600160a01b031681565b348015610c1257600080fd5b50610514610c21366004613988565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c5857600080fd5b50610438610c6736600461388b565b611baf565b348015610c7857600080fd5b50610514611c34565b348015610c8d57600080fd5b50610514610c9c3660046138a4565b611c9a565b348015610cad57600080fd5b50610438610cbc36600461382d565b611cc3565b348015610ccd57600080fd5b50610514601b5481565b348015610ce357600080fd5b50610438610cf23660046138a4565b611edd565b348015610d0357600080fd5b50610438610d123660046138a4565b611f21565b348015610d2357600080fd5b5061051460255481565b348015610d3957600080fd5b5061043861201a565b348015610d4e57600080fd5b506104cb610d5d3660046138a4565b612078565b6000610d6f33848461209a565b5060015b92915050565b33610d8c6000546001600160a01b031690565b6001600160a01b031614610dbb5760405162461bcd60e51b8152600401610db2906139c1565b60405180910390fd5b6024805460ff1916911515919091179055565b610dda6012600a613af0565b610de890633b9aca00613aff565b81565b6000610df884848461218d565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e635760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610db2565b610e778533610e728685613b1e565b61209a565b506001949350505050565b33610e956000546001600160a01b031690565b6001600160a01b031614610ebb5760405162461bcd60e51b8152600401610db2906139c1565b610ec36123ea565b565b33610ed86000546001600160a01b031690565b6001600160a01b031614610efe5760405162461bcd60e51b8152600401610db2906139c1565b601e54811115610f0d57600080fd5b80601e6000828254610f1f9190613b1e565b90915550506012546001600160a01b03166108fc6064610f40846021613aff565b610f4a9190613b35565b6040518115909202916000818181858888f19350505050158015610f72573d6000803e3d6000fd5b506013546001600160a01b03166108fc6064610f8f846043613aff565b610f999190613b35565b6040518115909202916000818181858888f19350505050158015610fc1573d6000803e3d6000fd5b5050565b6000610fd0826114d3565b15610ff057506001600160a01b0316600090815260208052604090205490565b6001600160a01b03821660009081526020805260409020546110118361252a565b610d739190613b57565b3361102e6000546001600160a01b031690565b6001600160a01b0316146110545760405162461bcd60e51b8152600401610db2906139c1565b610fc1600d826125b0565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610d6f918590610e72908690613b57565b336110a96000546001600160a01b031690565b6001600160a01b0316146110cf5760405162461bcd60e51b8152600401610db2906139c1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6025546110fe9042613b57565b33600090815260036020526040902055565b336111236000546001600160a01b031690565b6001600160a01b0316146111495760405162461bcd60e51b8152600401610db2906139c1565b602880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111866000546001600160a01b031690565b6001600160a01b0316146111ac5760405162461bcd60e51b8152600401610db2906139c1565b6000846111b98789613b6f565b6111c39190613b6f565b90508060ff166064146112275760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610db2565b506018805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112b96000546001600160a01b031690565b6001600160a01b0316146112df5760405162461bcd60e51b8152600401610db2906139c1565b6029544210156113015760405162461bcd60e51b8152600401610db290613b94565b61130d61070842613b57565b6029556012546040516000916001600160a01b03169047908381818185875af1925050503d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b505090508061137057600080fd5b50565b336113866000546001600160a01b031690565b6001600160a01b0316146113ac5760405162461bcd60e51b8152600401610db2906139c1565b6113706113b94283613b57565b6125c5565b336113d16000546001600160a01b031690565b6001600160a01b0316146113f75760405162461bcd60e51b8152600401610db2906139c1565b6114036012600a613af0565b61140d9082613aff565b60175550565b6000806114226012600a613af0565b60155461142f9190613b35565b61143b6012600a613af0565b6016546114489190613b35565b915091509091565b336114636000546001600160a01b031690565b6001600160a01b0316146114895760405162461bcd60e51b8152600401610db2906139c1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610d73600b836125d8565b336114f36000546001600160a01b031690565b6001600160a01b0316146115195760405162461bcd60e51b8152600401610db2906139c1565b60648160ff16111561152a57600080fd5b601d805460ff191660ff92909216919091179055565b336115536000546001600160a01b031690565b6001600160a01b0316146115795760405162461bcd60e51b8152600401610db2906139c1565b6028805461ff00191661010017905542600f55565b60275461159b9042613b57565b33600090815260046020526040902055565b6001600160a01b0381166000908152600360205260408120544281116115d65750600092915050565b6115e04282613b1e565b9392505050565b905090565b336115ff6000546001600160a01b031690565b6001600160a01b0316146116255760405162461bcd60e51b8152600401610db2906139c1565b6029544210156116475760405162461bcd60e51b8152600401610db290613b94565b6028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd9190613bbe565b60125460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015611712573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117369190613bd7565b505050565b3361174e6000546001600160a01b031690565b6001600160a01b0316146117745760405162461bcd60e51b8152600401610db2906139c1565b6028805460ff1916911515919091179055565b3361179a6000546001600160a01b031690565b6001600160a01b0316146117c05760405162461bcd60e51b8152600401610db2906139c1565b60646014546117cf9190613b35565b81106117da57600080fd5b6117e66012600a613af0565b6117f09083613aff565b91506117fe6012600a613af0565b6118089082613aff565b90506000603260ff1660145461181e9190613b35565b90506000606461ffff166014546118359190613b35565b90508184101561189b5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610db2565b808310156118fc5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610db2565b5050601591909155601655565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561196c5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610db2565b61197b3385610e728685613b1e565b5060019392505050565b6000610d6f33848461218d565b336119a56000546001600160a01b031690565b6001600160a01b0316146119cb5760405162461bcd60e51b8152600401610db2906139c1565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b33611a006000546001600160a01b031690565b6001600160a01b031614611a265760405162461bcd60e51b8152600401610db2906139c1565b6026805460ff1916911515919091179055565b610ec3336125fa565b6000602954421015611a5c57426029546115e79190613b1e565b50600090565b6000611a706012600a613af0565b601454611a7f6012600a613af0565b611a8d90633b9aca00613aff565b611a979190613b1e565b6115e79190613b35565b33611ab46000546001600160a01b031690565b6001600160a01b031614611ada5760405162461bcd60e51b8152600401610db2906139c1565b610fc1600582612085565b33611af86000546001600160a01b031690565b6001600160a01b031614611b1e5760405162461bcd60e51b8152600401610db2906139c1565b602355565b33611b366000546001600160a01b031690565b6001600160a01b031614611b5c5760405162461bcd60e51b8152600401610db2906139c1565b8015611baa5760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610db2565b602555565b33611bc26000546001600160a01b031690565b6001600160a01b031614611be85760405162461bcd60e51b8152600401610db2906139c1565b8015611c2f5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610db2565b602755565b601454600090815b611c46600b6128be565b811015611c945760016000611c5c600b846128c8565b6001600160a01b03168152602081019190915260400160002054611c809083613b1e565b915080611c8c81613bf4565b915050611c3c565b50919050565b6001600160a01b0381166000908152600460205260408120544281116115d65750600092915050565b33611cd66000546001600160a01b031690565b6001600160a01b031614611cfc5760405162461bcd60e51b8152600401610db2906139c1565b602954421015611d1e5760405162461bcd60e51b8152600401610db290613b94565b611d2a61070842613b57565b6029556028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613bbe565b60195460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1c9190613bd7565b5060195460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611e589030908690600090819084904290600401613c0d565b6020604051808303816000875af1158015611e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9b9190613bbe565b506000611ea88247613b1e565b90508415611ebe57611eb9816128d4565b611ed6565b80601e6000828254611ed09190613b57565b90915550505b5050505050565b33611ef06000546001600160a01b031690565b6001600160a01b031614611f165760405162461bcd60e51b8152600401610db2906139c1565b610fc1600d82612085565b33611f346000546001600160a01b031690565b6001600160a01b031614611f5a5760405162461bcd60e51b8152600401610db2906139c1565b6001600160a01b038116611fbf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db2565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361202d6000546001600160a01b031690565b6001600160a01b0316146120535760405162461bcd60e51b8152600401610db2906139c1565b601e805460009091556012546001600160a01b03166108fc6064610f40846021613aff565b6000610d73600d836125d8565b60006115e0836001600160a01b0384166129a0565b6001600160a01b0383166120e45760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610db2565b6001600160a01b03821661212c5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610db2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121d85760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610db2565b6001600160a01b0382166122215760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610db2565b600061222e6005856125d8565b8061223f575061223f6005846125d8565b905060006001600160a01b03851630148061226257506001600160a01b03841630145b6019546018549192506001600160a01b0390811691600091888116600160301b909204161480156122a45750816001600160a01b0316866001600160a01b0316145b806122df57506018546001600160a01b03878116600160301b909204161480156122df5750816001600160a01b0316876001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b9092041614806123195750826001600160a01b0316886001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b9092041614806123535750836001600160a01b0316886001600160a01b0316145b9050848061235e5750825b806123665750855b1561237b576123768989896129ef565b6123df565b602854610100900460ff166123d25760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610db2565b6123df8989898585612aba565b505050505050505050565b6022805460ff19166001908117909155306000908152602091909152604081205460185490919061243090600160281b810460ff90811691640100000000900416613b6f565b60ff169050600060235490508083108061244c575061ffff8216155b156124595750505061251e565b60185460009061ffff84169061247a90640100000000900460ff1684613aff565b6124849190613b35565b905060006124928284613b1e565b905060006124a1600284613b35565b905060006124af8285613b1e565b905060006124bd8483613b57565b9050476124c982613252565b60006124d58247613b1e565b90506000836124e48684613aff565b6124ee9190613b35565b90506124fa86826133ab565b60006125068447613b1e565b9050612511816128d4565b5050505050505050505050505b6022805460ff19169055565b6001600160a01b038116600090815260016020526040812054601a54829161255191613aff565b6001600160a01b0384166000908152601f602052604090205490915081101561257d5750600092915050565b6001600160a01b0383166000908152601f6020526040902054600160401b906125a69083613b1e565b6115e09190613b35565b60006115e0836001600160a01b03841661345a565b60295481116125d357600080fd5b602955565b6001600160a01b038116600090815260018301602052604081205415156115e0565b601954600160a01b900460ff161561261157600080fd5b6019805460ff60a01b1916600160a01b179055600061262f826114d3565b1561265657506001600160a01b0381166000908152602080526040812080549190556126d3565b60006126618361252a565b6001600160a01b038416600090815260016020526040902054601a5491925061268991613aff565b6001600160a01b0384166000908152601f6020908152604080832093909355805220546126b7908290613b57565b6001600160a01b03841660009081526020805260408120559150505b806000036126ec5750506019805460ff60a01b19169055565b80601c60008282546126fe9190613b57565b90915550506040805160028082526060820183526000926020830190803683375050601954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561276d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127919190613c48565b816000815181106127a4576127a4613c65565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48816001815181106127ec576127ec613c65565b6001600160a01b03928316602091820292909201015260195460405163b6f9de9560e01b815291169063b6f9de9590849061283290600090869089904290600401613cbf565b6000604051808303818588803b15801561284b57600080fd5b505af115801561285f573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506128a49050565b60405180910390a150506019805460ff60a01b1916905550565b6000610d73825490565b60006115e08383613547565b601d546000906064906128ea9060ff1684613aff565b6128f49190613b35565b905060006129028284613b1e565b905081601e60008282546129169190613b57565b909155505080156117365780601b60008282546129339190613b57565b9091555060009050612943611c34565b90508060000361296a5781601e600082825461295f9190613b57565b9091555061299a9050565b80612979600160401b84613aff565b6129839190613b35565b601a60008282546129949190613b57565b90915550505b50505050565b60008181526001830160205260408120546129e757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d73565b506000610d73565b6001600160a01b03831660009081526001602052604090205481811015612a535760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610db2565b612a5d84836135cd565b612a67838361368c565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612aac91815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b285760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610db2565b60008315612cdb57612b3b6007896125d8565b612bd0576001600160a01b03881660009081526003602052604090205442101580612b68575060245460ff165b612ba95760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610db2565b602554612bb69042613b57565b6001600160a01b0389166000908152600360205260409020555b601654861115612c145760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610db2565b612c1f600d896125d8565b15612c635760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610db2565b601054600f54612c739190613b57565b4211158015612c8457506011546001145b15612cca57612c94600d89612085565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601854610100900460ff166130ef565b8415612eec57612cec6009886125d8565b612d7f576001600160a01b03871660009081526004602052604090205442101580612d19575060265460ff165b612d585760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610db2565b602754612d659042613b57565b6001600160a01b0388166000908152600460205260409020555b601554612d8c8785613b57565b1115612dcd5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610db2565b601754861115612e2a5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610db2565b612e35600d886125d8565b15612e795760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610db2565b601054600f54612e899190613b57565b4211158015612e9a57506011546001145b15612ee057612eaa600d88612085565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185460ff166130ef565b612ef86012600a613af0565b8611612f0757612f07886125fa565b601554612f148785613b57565b1115612f555760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610db2565b612f606007896125d8565b612fca576001600160a01b03881660009081526003602052604090205442101580612f8d575060245460ff165b612fca5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610db2565b612fd5600d896125d8565b156130225760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610db2565b61302d600d886125d8565b1561307a5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610db2565b601054600f5461308a9190613b57565b421115801561309b57506011546001145b156130e1576130ab600d89612085565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185462010000900460ff165b6018546001600160a01b03898116600160301b9092041614801590613117575060285460ff16155b8015613126575060225460ff16155b801561312f5750835b1561313c5761313c6123ea565b60006131588783601860039054906101000a900460ff16613755565b60185490915060009061318c90899085906131879060ff6401000000008204811691600160281b900416613b6f565b613755565b9050600061319a8284613b57565b6131a4908a613b1e565b90506131b08b8a6135cd565b30600090815260016020526040812080548492906131cf908490613b57565b9250508190555082601460008282546131e89190613b1e565b909155506131f890508a8261368c565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161323d91815260200190565b60405180910390a35050505050505050505050565b60195461326a9030906001600160a01b03168361209a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061329f5761329f613c65565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156132f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331c9190613c48565b8160018151811061332f5761332f613c65565b6001600160a01b03928316602091820292909201015260195460405163791ac94760e01b815291169063791ac94790613375908590600090869030904290600401613cf4565b600060405180830381600087803b15801561338f57600080fd5b505af11580156133a3573d6000803e3d6000fd5b505050505050565b80602160008282546133bd9190613b57565b90915550506019546133da9030906001600160a01b03168461209a565b60195460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906134179030908790600090819084904290600401613c0d565b60606040518083038185885af1158015613435573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ed69190613d30565b6000818152600183016020526040812054801561353d57600061347e600183613b1e565b855490915060009061349290600190613b1e565b905060008660000182815481106134ab576134ab613c65565b90600052602060002001549050808760000184815481106134ce576134ce613c65565b60009182526020808320909101929092558281526001890190915260409020849055865487908061350157613501613d5e565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610d73565b6000915050610d73565b815460009082106135a55760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610db2565b8260000182815481106135ba576135ba613c65565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600160205260408120546135f1908390613b1e565b90506135fc836114d3565b15613621576001600160a01b0390921660009081526001602052604090209190915550565b600061362c8461252a565b6001600160a01b0385166000908152600160205260409020839055601a54909150613658908390613aff565b6001600160a01b0385166000908152601f602090815260408083209390935580529081208054839290612994908490613b57565b6001600160a01b0382166000908152600160205260408120546136b0908390613b57565b90506136bb836114d3565b156136e0576001600160a01b0390921660009081526001602052604090209190915550565b60006136eb8461252a565b905081601a546136fb9190613aff565b6001600160a01b0385166000908152601f60209081526040808320939093558052908120805483929061372f908490613b57565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff168661376d9190613aff565b6137779190613aff565b6137819190613b35565b949350505050565b600060208083528351808285015260005b818110156137b65785810183015185820160400152820161379a565b818111156137c8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461137057600080fd5b6000806040838503121561380657600080fd5b8235613811816137de565b946020939093013593505050565b801515811461137057600080fd5b60006020828403121561383f57600080fd5b81356115e08161381f565b60008060006060848603121561385f57600080fd5b833561386a816137de565b9250602084013561387a816137de565b929592945050506040919091013590565b60006020828403121561389d57600080fd5b5035919050565b6000602082840312156138b657600080fd5b81356115e0816137de565b803560ff811681146138d257600080fd5b919050565b60008060008060008060c087890312156138f057600080fd5b6138f9876138c1565b9550613907602088016138c1565b9450613915604088016138c1565b9350613923606088016138c1565b9250613931608088016138c1565b915061393f60a088016138c1565b90509295509295509295565b60006020828403121561395d57600080fd5b6115e0826138c1565b6000806040838503121561397957600080fd5b50508035926020909101359150565b6000806040838503121561399b57600080fd5b82356139a6816137de565b915060208301356139b6816137de565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613a47578160001904821115613a2d57613a2d6139f6565b80851615613a3a57918102915b93841c9390800290613a11565b509250929050565b600082613a5e57506001610d73565b81613a6b57506000610d73565b8160018114613a815760028114613a8b57613aa7565b6001915050610d73565b60ff841115613a9c57613a9c6139f6565b50506001821b610d73565b5060208310610133831016604e8410600b8410161715613aca575081810a610d73565b613ad48383613a0c565b8060001904821115613ae857613ae86139f6565b029392505050565b60006115e060ff841683613a4f565b6000816000190483118215151615613b1957613b196139f6565b500290565b600082821015613b3057613b306139f6565b500390565b600082613b5257634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613b6a57613b6a6139f6565b500190565b600060ff821660ff84168060ff03821115613b8c57613b8c6139f6565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613bd057600080fd5b5051919050565b600060208284031215613be957600080fd5b81516115e08161381f565b600060018201613c0657613c066139f6565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613c5a57600080fd5b81516115e0816137de565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613cb45781516001600160a01b031687529582019590820190600101613c8f565b509495945050505050565b848152608060208201526000613cd86080830186613c7b565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000613d1360a0830186613c7b565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613d4557600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea26469706673582212200fb4918f1a41bef84ed262c02dad81482b75763df85f83a87f7b7332b64d6ebc64736f6c634300080d0033

Deployed Bytecode Sourcemap

28058:36303:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62015:94;;;;;;;;;;-1:-1:-1;62096:5:0;;;;;;;;;;;;-1:-1:-1;;;62096:5:0;;;;62015:94;;;;;;;:::i;:::-;;;;;;;;41483:31;;;;;;;;;;-1:-1:-1;41483:31:0;;;;;;;;;;;788:4:1;776:17;;;758:36;;746:2;731:18;41483:31:0;616:184:1;62900:161:0;;;;;;;;;;-1:-1:-1;62900:161:0;;;;;:::i;:::-;;:::i;:::-;;;1426:14:1;;1419:22;1401:41;;1389:2;1374:18;62900:161:0;1261:187:1;29616:43:0;;;;;;;;;;;;29656:3;29616:43;;;;;1627:6:1;1615:19;;;1597:38;;1585:2;1570:18;29616:43:0;1453:188:1;51639:102:0;;;;;;;;;;-1:-1:-1;51721:12:0;;51639:102;;;1792:25:1;;;1780:2;1765:18;51639:102:0;1646:177:1;52210:100:0;;;;;;;;;;-1:-1:-1;52291:11:0;;52210:100;;54532:104;;;;;;;;;;-1:-1:-1;54532:104:0;;;;;:::i;:::-;;:::i;62325:108::-;;;;;;;;;;-1:-1:-1;62407:18:0;;62325:108;;28931:65;;;;;;;;;;;;;:::i;63374:392::-;;;;;;;;;;-1:-1:-1;63374:392:0;;;;;:::i;:::-;;:::i;56589:81::-;;;;;;;;;;;;;:::i;29161:32::-;;;;;;;;;;;;;;;;51045:244;;;;;;;;;;-1:-1:-1;51216:8:0;;51045:244;;;51216:8;;;;;;2945:25:1;;51225:13:0;;;;;3001:2:1;2986:18;;2979:34;-1:-1:-1;;;51239:11:0;;;;3029:18:1;;;3022:34;;;;51251:7:0;;;3087:2:1;3072:18;;3065:34;51216:8:0;51259;;;;3130:3:1;3115:19;;3108:35;51268:12:0;;;;;3174:3:1;3159:19;;3152:35;2932:3;2917:19;51045:244:0;2658:535:1;53629:264:0;;;;;;;;;;-1:-1:-1;53629:264:0;;;;;:::i;:::-;;:::i;53276:27::-;;;;;;;;;;-1:-1:-1;53276:27:0;;;;;;;;29500:44;;;;;;;;;;;;29542:2;29500:44;;62223:94;;;;;;;;;;-1:-1:-1;28922:2:0;62223:94;;52895:191;;;;;;;;;;-1:-1:-1;52895:191:0;;;;;:::i;:::-;;:::i;29802:49::-;;;;;;;;;;;;29842:9;29802:49;;57970:143;;;;;;;;;;-1:-1:-1;57970:143:0;;;;;:::i;:::-;;:::i;63801:205::-;;;;;;;;;;-1:-1:-1;63801:205:0;;;;;:::i;:::-;;:::i;54222:119::-;;;;;;;;;;-1:-1:-1;54222:119:0;;;;;:::i;:::-;;:::i;47246:25::-;;;;;;;;;;;;;;;;29343:38;;;;;;;;;;;;;;;;41439:27;;;;;;;;;;;;;;;;53310:26;;;;;;;;;;;;;;;;52454:107;;;;;;;;;;;;;:::i;58241:26::-;;;;;;;;;;-1:-1:-1;58241:26:0;;;;;;;;;;;58550:146;;;;;;;;;;-1:-1:-1;58550:146:0;;;;;:::i;:::-;;:::i;30736:46::-;;;;;;;;;;;;;;;;55810:492;;;;;;;;;;-1:-1:-1;55810:492:0;;;;;:::i;:::-;;:::i;41566:31::-;;;;;;;;;;;;;;;;51753:110;;;;;;;;;;-1:-1:-1;51836:19:0;;51753:110;;61177:310;;;;;;;;;;;;;:::i;58903:153::-;;;;;;;;;;-1:-1:-1;58903:153:0;;;;;:::i;:::-;;:::i;54100:110::-;;;;;;;;;;-1:-1:-1;54100:110:0;;;;;:::i;:::-;;:::i;50888:149::-;;;;;;;;;;;;;:::i;:::-;;;;4510:25:1;;;4566:2;4551:18;;4544:34;;;;4483:18;50888:149:0;4336:248:1;62441:121:0;;;;;;;;;;-1:-1:-1;62441:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;62536:18:0;62509:7;62536:18;;;:9;:18;;;;;;;62441:121;9919:140;;;;;;;;;;;;;:::i;42050:132::-;;;;;;;;;;-1:-1:-1;42050:132:0;;;;;:::i;:::-;;:::i;56379:142::-;;;;;;;;;;-1:-1:-1;56379:142:0;;;;;:::i;:::-;;:::i;30209:77::-;;;;;;;;;;-1:-1:-1;30209:77:0;;;;-1:-1:-1;;;;;30209:77:0;;;;;;-1:-1:-1;;;;;4940:32:1;;;4922:51;;4910:2;4895:18;30209:77:0;4776:203:1;30680:49:0;;;;;;;;;;;;;;;;58355:127;;;;;;;;;;;;;:::i;52664:110::-;;;;;;;;;;;;;:::i;41225:29::-;;;;;;;;;;;;;;;;53343:28;;;;;;;;;;-1:-1:-1;53343:28:0;;;;;;;;51358:275;;;;;;;;;;-1:-1:-1;51358:275:0;;;;;:::i;:::-;;:::i;53207:28::-;;;;;;;;;;-1:-1:-1;53207:28:0;;;;;;;;61913:94;;;;;;;;;;-1:-1:-1;61965:7:0;9343:6;-1:-1:-1;;;;;9343:6:0;61913:94;;62117:98;;;;;;;;;;-1:-1:-1;62200:7:0;;;;;;;;;;;;-1:-1:-1;;;62200:7:0;;;;62117:98;;59357:465;;;;;;;;;;;;;:::i;53978:110::-;;;;;;;;;;-1:-1:-1;53978:110:0;;;;;:::i;:::-;;:::i;56779:895::-;;;;;;;;;;-1:-1:-1;56779:895:0;;;;;:::i;:::-;;:::i;64014:342::-;;;;;;;;;;-1:-1:-1;64014:342:0;;;;;:::i;:::-;;:::i;62570:167::-;;;;;;;;;;-1:-1:-1;62570:167:0;;;;;:::i;:::-;;:::i;54353:115::-;;;;;;;;;;-1:-1:-1;54353:115:0;;;;;:::i;:::-;;:::i;54703:102::-;;;;;;;;;;-1:-1:-1;54703:102:0;;;;;:::i;:::-;;:::i;52823:64::-;;;;;;;;;;;;;:::i;50523:220::-;;;;;;;;;;;;;:::i;50751:129::-;;;;;;;;;;;;;:::i;55668:112::-;;;;;;;;;;-1:-1:-1;55668:112:0;;;;;:::i;:::-;;:::i;55475:125::-;;;;;;;;;;-1:-1:-1;55475:125:0;;;;;:::i;:::-;;:::i;54878:202::-;;;;;;;;;;-1:-1:-1;54878:202:0;;;;;:::i;:::-;;:::i;30293:76::-;;;;;;;;;;-1:-1:-1;30293:76:0;;;;-1:-1:-1;;;;;30293:76:0;;;62745:147;;;;;;;;;;-1:-1:-1;62745:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;62856:19:0;;;62829:7;62856:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;62745:147;55156:195;;;;;;;;;;-1:-1:-1;55156:195:0;;;;;:::i;:::-;;:::i;42423:411::-;;;;;;;;;;;;;:::i;51931:273::-;;;;;;;;;;-1:-1:-1;51931:273:0;;;;;:::i;:::-;;:::i;59880:1211::-;;;;;;;;;;-1:-1:-1;59880:1211:0;;;;;:::i;:::-;;:::i;41336:33::-;;;;;;;;;;;;;;;;57754:135;;;;;;;;;;-1:-1:-1;57754:135:0;;;;;:::i;:::-;;:::i;10214:236::-;;;;;;;;;;-1:-1:-1;10214:236:0;;;;;:::i;:::-;;:::i;53242:27::-;;;;;;;;;;;;;;;;53381:241;;;;;;;;;;;;;:::i;42229:118::-;;;;;;;;;;-1:-1:-1;42229:118:0;;;;;:::i;:::-;;:::i;62900:161::-;62977:4;62994:37;63003:10;63015:7;63024:6;62994:8;:37::i;:::-;-1:-1:-1;63049:4:0;62900:161;;;;;:::o;54532:104::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;;;;;;;;;54603:16:::1;:25:::0;;-1:-1:-1;;54603:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54532:104::o;28931:65::-;28983:13;28922:2;28983;:13;:::i;:::-;28970:26;;:10;:26;:::i;:::-;28931:65;:::o;63374:392::-;63474:4;63491:36;63501:6;63509:9;63520:6;63491:9;:36::i;:::-;-1:-1:-1;;;;;63567:19:0;;63540:24;63567:19;;;:11;:19;;;;;;;;63587:10;63567:31;;;;;;;;63617:26;;;;63609:59;;;;-1:-1:-1;;;63609:59:0;;7881:2:1;63609:59:0;;;7863:21:1;7920:2;7900:18;;;7893:30;-1:-1:-1;;;7939:18:1;;;7932:50;7999:18;;63609:59:0;7679:344:1;63609:59:0;63681:55;63690:6;63698:10;63710:25;63729:6;63710:16;:25;:::i;:::-;63681:8;:55::i;:::-;-1:-1:-1;63754:4:0;;63374:392;-1:-1:-1;;;;63374:392:0:o;56589:81::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;56642:20:::1;:18;:20::i;:::-;56589:81::o:0;53629:264::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;53718:16:::1;;53710:6;:24;;53702:33;;;::::0;::::1;;53764:6;53746:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53789:10:0::1;::::0;-1:-1:-1;;;;;53789:10:0::1;53781:47;53824:3;53811:9;:6:::0;53818:2:::1;53811:9;:::i;:::-;53810:17;;;;:::i;:::-;53781:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;53847:9:0::1;::::0;-1:-1:-1;;;;;53847:9:0::1;53839:46;53881:3;53868:9;:6:::0;53875:2:::1;53868:9;:::i;:::-;53867:17;;;;:::i;:::-;53839:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53629:264:::0;:::o;52895:191::-;52952:7;52974:27;52996:4;52974:21;:27::i;:::-;52971:53;;;-1:-1:-1;;;;;;53010:14:0;;;;;:8;:14;;;;;;;52895:191::o;52971:53::-;-1:-1:-1;;;;;53064:14:0;;;;;;:8;:14;;;;;;53042:21;53073:4;53042:15;:21::i;:::-;:36;;;;:::i;57970:143::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;58064:41:::1;:14;58086:18:::0;58064:21:::1;:41::i;63801:205::-:0;63909:10;63883:4;63930:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;63930:32:0;;;;;;;;;;63883:4;;63900:76;;63921:7;;63930:45;;63965:10;;63930:45;:::i;54222:119::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;54300:10:::1;:33:::0;;-1:-1:-1;;;;;;54300:33:0::1;-1:-1:-1::0;;;;;54300:33:0;;;::::1;::::0;;;::::1;::::0;;54222:119::o;52454:107::-;52541:12;;52525:28;;:15;:28;:::i;:::-;52513:10;52503:21;;;;:9;:21;;;;;:50;52454:107::o;58550:146::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;58644:22:::1;:44:::0;;-1:-1:-1;;;;;58644:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;58644:44:0;;::::1;::::0;;;::::1;::::0;;58550:146::o;55810:492::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;55965:14:::1;56005:12:::0;55980:24:::1;55990:14:::0;55980:9;:24:::1;:::i;:::-;:37;;;;:::i;:::-;55965:52;;56036:8;:13;;56046:3;56036:13;56028:64;;;::::0;-1:-1:-1;;;56028:64:0;;8924:2:1;56028:64:0::1;::::0;::::1;8906:21:1::0;8963:2;8943:18;;;8936:30;9002:34;8982:18;;;8975:62;-1:-1:-1;;;9053:18:1;;;9046:36;9099:19;;56028:64:0::1;8722:402:1::0;56028:64:0::1;-1:-1:-1::0;56105:8:0::1;:18:::0;;::::1;56270:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;56243:16:0;;::::1;56105:18;56243:16;-1:-1:-1::0;;56173:24:0;;::::1;-1:-1:-1::0;;;56173:24:0::1;56243:16:::0;;;;-1:-1:-1;;56134:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;56105:18:0;;::::1;::::0;::::1;56134:28:::0;;;;-1:-1:-1;;56134:28:0;;;;;;;;;;::::1;56243:16:::0;;;;;;;;56218:14;::::1;56243:16:::0;;;;;;;::::1;56270:24;::::0;;;::::1;::::0;;55810:492::o;61177:310::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;61266:20:::1;;61247:15;:39;;61239:68;;;;-1:-1:-1::0;;;61239:68:0::1;;;;;;;:::i;:::-;61339:40;30180:4;61339:15;:40;:::i;:::-;61318:20;:61:::0;61404:10:::1;::::0;:51:::1;::::0;61391:9:::1;::::0;-1:-1:-1;;;;;61404:10:0::1;::::0;61428:21:::1;::::0;61391:9;61404:51;61391:9;61404:51;61428:21;61404:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61390:65;;;61474:4;61466:13;;;::::0;::::1;;61228:259;61177:310::o:0;58903:153::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;58991:57:::1;59013:34;59032:15;59013:18:::0;:34:::1;:::i;:::-;58991:21;:57::i;54100:110::-:0;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;54189:13:::1;28922:2;54189;:13;:::i;:::-;54177:25;::::0;:9;:25:::1;:::i;:::-;54170:6;:32:::0;-1:-1:-1;54100:110:0:o;50888:149::-;50929:15;;50990:13;28922:2;50990;:13;:::i;:::-;50977:12;;:26;;;;:::i;:::-;51015:13;28922:2;51015;:13;:::i;:::-;51005:9;;:23;;;;:::i;:::-;50970:59;;;;50888:149;;:::o;9919:140::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;10018:1:::1;10002:6:::0;;9981:40:::1;::::0;-1:-1:-1;;;;;10002:6:0;;::::1;::::0;9981:40:::1;::::0;10018:1;;9981:40:::1;10049:1;10032:19:::0;;-1:-1:-1;;;;;;10032:19:0::1;::::0;;9919:140::o;42050:132::-;42116:4;42139:35;:20;42169:4;42139:29;:35::i;56379:142::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;56474:3:::1;56464:8;:13;;;;56456:22;;;::::0;::::1;;56490:14;:23:::0;;-1:-1:-1;;56490:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;56379:142::o;58355:127::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;58412:14:::1;:19:::0;;-1:-1:-1;;58412:19:0::1;;;::::0;;58459:15:::1;58442:16;:32:::0;58355:127::o;52664:110::-;52749:11;;52733:27;;:15;:27;:::i;:::-;52721:10;52712:20;;;;:8;:20;;;;;:48;52664:110::o;51358:275::-;-1:-1:-1;;;;;51479:25:0;;51444:7;51479:25;;;:9;:25;;;;;;51527:15;51517:25;;51514:71;;-1:-1:-1;51573:1:0;;51358:275;-1:-1:-1;;51358:275:0:o;51514:71::-;51601:24;51610:15;51601:8;:24;:::i;:::-;51594:31;51358:275;-1:-1:-1;;;51358:275:0:o;61992:7::-;61985:14;;61913:94;:::o;59357:465::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;59485:20:::1;;59466:15;:39;;59458:68;;;;-1:-1:-1::0;;;59458:68:0::1;;;;;;;:::i;:::-;59596:22;::::0;59647:39:::1;::::0;-1:-1:-1;;;59647:39:0;;59680:4:::1;59647:39;::::0;::::1;4922:51:1::0;59596:22:0;;;::::1;-1:-1:-1::0;;;;;59596:22:0::1;::::0;59547:30:::1;::::0;59596:22;;59647:24:::1;::::0;4895:18:1;;59647:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59785:10;::::0;59761:43:::1;::::0;-1:-1:-1;;;59761:43:0;;-1:-1:-1;;;;;59785:10:0;;::::1;59761:43;::::0;::::1;10047:51:1::0;10114:18;;;10107:34;;;59630:56:0;;-1:-1:-1;59761:23:0;::::1;::::0;::::1;::::0;10020:18:1;;59761:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59389:433;;59357:465::o:0;53978:110::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;54057:16:::1;:23:::0;;-1:-1:-1;;54057:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53978:110::o;56779:895::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;57015:3:::1;56996:18;;:22;;;;:::i;:::-;56983:12;:35;56975:44;;;::::0;::::1;;57097:13;28922:2;57097;:13;:::i;:::-;57081:29;::::0;:15;:29:::1;:::i;:::-;57065:45:::0;-1:-1:-1;57147:13:0::1;28922:2;57147;:13;:::i;:::-;57134:26;::::0;:12;:26:::1;:::i;:::-;57121:39;;57227:26;29542:2;57254:38;;:18;;:38;;;;:::i;:::-;57227:65;;57303:23;29656:3;57327:35;;:18;;:35;;;;:::i;:::-;57303:59;;57401:18;57384:15;:35;;57375:103;;;::::0;-1:-1:-1;;;57375:103:0;;10604:2:1;57375:103:0::1;::::0;::::1;10586:21:1::0;10643:2;10623:18;;;10616:30;10682:34;10662:18;;;10655:62;-1:-1:-1;;;10733:18:1;;;10726:41;10784:19;;57375:103:0::1;10402:407:1::0;57375:103:0::1;57512:15;57498:12;:29;;57489:94;;;::::0;-1:-1:-1;;;57489:94:0;;11016:2:1;57489:94:0::1;::::0;::::1;10998:21:1::0;11055:2;11035:18;;;11028:30;11094:34;11074:18;;;11067:62;-1:-1:-1;;;11145:18:1;;;11138:38;11193:19;;57489:94:0::1;10814:404:1::0;57489:94:0::1;-1:-1:-1::0;;57596:12:0::1;:30:::0;;;;57637:9:::1;:24:::0;56779:895::o;64014:342::-;64157:10;64101:4;64145:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;64145:32:0;;;;;;;;;;64196:35;;;;64188:60;;;;-1:-1:-1;;;64188:60:0;;11425:2:1;64188:60:0;;;11407:21:1;11464:2;11444:18;;;11437:30;-1:-1:-1;;;11483:18:1;;;11476:42;11535:18;;64188:60:0;11223:336:1;64188:60:0;64261:65;64270:10;64282:7;64291:34;64310:15;64291:16;:34;:::i;64261:65::-;-1:-1:-1;64344:4:0;;64014:342;-1:-1:-1;;;64014:342:0:o;62570:167::-;62650:4;62667:40;62677:10;62689:9;62700:6;62667:9;:40::i;54353:115::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;54429:9:::1;:31:::0;;-1:-1:-1;;;;;;54429:31:0::1;-1:-1:-1::0;;;;;54429:31:0;;;::::1;::::0;;;::::1;::::0;;54353:115::o;54703:102::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;54773:15:::1;:24:::0;;-1:-1:-1;;54773:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54703:102::o;52823:64::-;52859:20;52868:10;52859:8;:20::i;50523:220::-;50588:7;50626:20;;50610:15;:36;50607:110;;;50690:15;50669:20;;:36;;;;:::i;50607:110::-;-1:-1:-1;50734:1:0;;50523:220::o;50751:129::-;50798:7;50859:13;28922:2;50859;:13;:::i;:::-;50839:18;;28983:13;28922:2;28983;:13;:::i;:::-;28970:26;;:10;:26;:::i;:::-;50825:32;;;;:::i;:::-;50824:48;;;;:::i;55668:112::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;55745:27:::1;:9;55759:12:::0;55745:13:::1;:27::i;55475:125::-:0;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;55557:19:::1;:35:::0;55475:125::o;54878:202::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;54970:32;;54962:67:::1;;;::::0;-1:-1:-1;;;54962:67:0;;11766:2:1;54962:67:0::1;::::0;::::1;11748:21:1::0;11805:2;11785:18;;;11778:30;11844:25;11824:18;;;11817:53;11887:18;;54962:67:0::1;11564:347:1::0;54962:67:0::1;55044:12;:28:::0;54878:202::o;55156:195::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;55246:30;;55238:64:::1;;;::::0;-1:-1:-1;;;55238:64:0;;12118:2:1;55238:64:0::1;::::0;::::1;12100:21:1::0;12157:2;12137:18;;;12130:30;-1:-1:-1;;;12176:18:1;;;12169:52;12238:18;;55238:64:0::1;11916:346:1::0;55238:64:0::1;55317:11;:26:::0;55156:195::o;42423:411::-;42505:18;;42471:7;;;42680:123;42696:29;:20;:27;:29::i;:::-;42694:1;:31;42680:123;;;42754:9;:37;42764:26;:20;42788:1;42764:23;:26::i;:::-;-1:-1:-1;;;;;42754:37:0;;;;;;;;;;;;-1:-1:-1;42754:37:0;;42746:45;;;;:::i;:::-;;-1:-1:-1;42727:3:0;;;;:::i;:::-;;;;42680:123;;;-1:-1:-1;42820:6:0;42423:411;-1:-1:-1;42423:411:0:o;51931:273::-;-1:-1:-1;;;;;52051:24:0;;52016:7;52051:24;;;:8;:24;;;;;;52098:15;52088:25;;52085:71;;-1:-1:-1;52144:1:0;;51931:273;-1:-1:-1;;51931:273:0:o;59880:1211::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;60024:20:::1;;60005:15;:39;;59997:68;;;;-1:-1:-1::0;;;59997:68:0::1;;;;;;;:::i;:::-;60097:40;30180:4;60097:15;:40;:::i;:::-;60076:20;:61:::0;60197:22:::1;::::0;60248:39:::1;::::0;-1:-1:-1;;;60248:39:0;;60281:4:::1;60248:39;::::0;::::1;4922:51:1::0;60197:22:0;;;::::1;-1:-1:-1::0;;;;;60197:22:0::1;::::0;60148:30:::1;::::0;60197:22;;60248:24:::1;::::0;4895:18:1;;60248:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60331:16;::::0;60300:56:::1;::::0;-1:-1:-1;;;60300:56:0;;-1:-1:-1;;;;;60331:16:0;;::::1;60300:56;::::0;::::1;10047:51:1::0;10114:18;;;10107:34;;;60231:56:0;;-1:-1:-1;60300:22:0;::::1;::::0;::::1;::::0;10020:18:1;;60300:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60633:16:0::1;::::0;:218:::1;::::0;-1:-1:-1;;;60633:218:0;;60601:21:::1;::::0;-1:-1:-1;;;;;60633:16:0::1;::::0;:64:::1;::::0;:218:::1;::::0;60720:4:::1;::::0;60740:6;;60573:25:::1;::::0;;;60720:4;;60821:15:::1;::::0;60633:218:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60862:21:0::1;60886:39;60908:17:::0;60886:21:::1;:39;:::i;:::-;60862:63;;60939:12;60936:146;;;60967:31;60984:13;60967:16;:31::i;:::-;60936:146;;;61057:13;61039:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60936:146:0::1;59928:1163;;;;59880:1211:::0;:::o;57754:135::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;57843:38:::1;:14;57862:18:::0;57843::::1;:38::i;10214:236::-:0;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10295:22:0;::::1;10287:73;;;::::0;-1:-1:-1;;;10287:73:0;;13221:2:1;10287:73:0::1;::::0;::::1;13203:21:1::0;13260:2;13240:18;;;13233:30;13299:34;13279:18;;;13272:62;-1:-1:-1;;;13350:18:1;;;13343:36;13396:19;;10287:73:0::1;13019:402:1::0;10287:73:0::1;10397:6;::::0;;10376:38:::1;::::0;-1:-1:-1;;;;;10376:38:0;;::::1;::::0;10397:6;::::1;::::0;10376:38:::1;::::0;::::1;10425:6;:17:::0;;-1:-1:-1;;;;;;10425:17:0::1;-1:-1:-1::0;;;;;10425:17:0;;;::::1;::::0;;;::::1;::::0;;10214:236::o;53381:241::-;9501:10;9490:7;9316;9343:6;-1:-1:-1;;;;;9343:6:0;;9278:79;9490:7;-1:-1:-1;;;;;9490:21:0;;9482:66;;;;-1:-1:-1;;;9482:66:0;;;;;;;:::i;:::-;53454:16:::1;::::0;;53439:14:::1;53481:18:::0;;;53518:10:::1;::::0;-1:-1:-1;;;;;53518:10:0::1;53510:47;53553:3;53540:9;53454:16:::0;53547:2:::1;53540:9;:::i;42229:118::-:0;42287:4;42310:29;:14;42334:4;42310:23;:29::i;24965:152::-;25035:4;25059:50;25064:3;-1:-1:-1;;;;;25084:23:0;;25059:4;:50::i;63067:299::-;-1:-1:-1;;;;;63160:19:0;;63152:49;;;;-1:-1:-1;;;63152:49:0;;13628:2:1;63152:49:0;;;13610:21:1;13667:2;13647:18;;;13640:30;-1:-1:-1;;;13686:18:1;;;13679:47;13743:18;;63152:49:0;13426:341:1;63152:49:0;-1:-1:-1;;;;;63220:21:0;;63212:49;;;;-1:-1:-1;;;63212:49:0;;13974:2:1;63212:49:0;;;13956:21:1;14013:2;13993:18;;;13986:30;-1:-1:-1;;;14032:18:1;;;14025:45;14087:18;;63212:49:0;13772:339:1;63212:49:0;-1:-1:-1;;;;;63274:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;63326:32;;1792:25:1;;;63326:32:0;;1765:18:1;63326:32:0;;;;;;;63067:299;;;:::o;33231:1544::-;-1:-1:-1;;;;;33327:20:0;;33319:51;;;;-1:-1:-1;;;33319:51:0;;14318:2:1;33319:51:0;;;14300:21:1;14357:2;14337:18;;;14330:30;-1:-1:-1;;;14376:18:1;;;14369:48;14434:18;;33319:51:0;14116:342:1;33319:51:0;-1:-1:-1;;;;;33389:23:0;;33381:52;;;;-1:-1:-1;;;33381:52:0;;14665:2:1;33381:52:0;;;14647:21:1;14704:2;14684:18;;;14677:30;-1:-1:-1;;;14723:18:1;;;14716:46;14779:18;;33381:52:0;14463:340:1;33381:52:0;33526:15;33545:26;:9;33564:6;33545:18;:26::i;:::-;:59;;;-1:-1:-1;33575:29:0;:9;33594;33575:18;:29::i;:::-;33526:79;-1:-1:-1;33704:23:0;-1:-1:-1;;;;;33729:21:0;;33745:4;33729:21;;:49;;-1:-1:-1;;;;;;33754:24:0;;33773:4;33754:24;33729:49;33917:16;;33984:21;;33704:75;;-1:-1:-1;;;;;;33917:16:0;;;;33885:23;;33974:31;;;-1:-1:-1;;;33984:21:0;;;;33974:31;:63;;;;;34022:15;-1:-1:-1;;;;;34009:28:0;:9;-1:-1:-1;;;;;34009:28:0;;33974:63;33973:144;;;-1:-1:-1;34066:21:0;;-1:-1:-1;;;;;34053:34:0;;;-1:-1:-1;;;34066:21:0;;;;34053:34;:63;;;;;34101:15;-1:-1:-1;;;;;34091:25:0;:6;-1:-1:-1;;;;;34091:25:0;;34053:63;34239:21;;33945:173;;-1:-1:-1;34220:10:0;;-1:-1:-1;;;;;34231:29:0;;;-1:-1:-1;;;34239:21:0;;;;34231:29;;:57;;;34273:15;-1:-1:-1;;;;;34263:25:0;:6;-1:-1:-1;;;;;34263:25:0;;34231:57;34322:21;;34220:68;;-1:-1:-1;34299:11:0;;-1:-1:-1;;;;;34311:32:0;;;-1:-1:-1;;;34322:21:0;;;;34311:32;;:63;;;34359:15;-1:-1:-1;;;;;34346:28:0;:9;-1:-1:-1;;;;;34346:28:0;;34311:63;34299:75;;34415:18;:41;;;;34437:19;34415:41;:55;;;;34460:10;34415:55;34412:356;;;34486:43;34503:6;34511:9;34522:6;34486:16;:43::i;:::-;34412:356;;;34648:14;;;;;;;34640:49;;;;-1:-1:-1;;;34640:49:0;;15010:2:1;34640:49:0;;;14992:21:1;15049:2;15029:18;;;15022:30;15088:25;15068:18;;;15061:53;15131:18;;34640:49:0;14808:347:1;34640:49:0;34704:52;34719:6;34726:9;34736:6;34743:5;34749:6;34704:14;:52::i;:::-;33308:1467;;;;;;33231:1544;;;:::o;47736:1628::-;47399:27;:34;;-1:-1:-1;;47399:34:0;47429:4;47399:34;;;;;;47838:4:::1;47399:27:::0;47820:24;;;::::1;::::0;;;;;;;;47885:11:::1;::::0;47820:24;;47399:27;47871:25:::1;::::0;-1:-1:-1;;;47885:11:0;::::1;47399:34:::0;47885:11;;::::1;::::0;47871:13;;::::1;;:25;:::i;:::-;47855:41;;;;47907:19;47929;;47907:41;;48075:11;48059:15;:27;:40;;;-1:-1:-1::0;48088:11:0::1;::::0;::::1;::::0;48059:40:::1;48056:77;;;48115:7;;;;;48056:77;48253:13;::::0;48214:25:::1;::::0;48240:36:::1;::::0;::::1;::::0;48241:25:::1;::::0;48253:13;;::::1;;;48241:11:::0;:25:::1;:::i;:::-;48240:36;;;;:::i;:::-;48214:62:::0;-1:-1:-1;48287:25:0::1;48314:29;48214:62:::0;48314:11;:29:::1;:::i;:::-;48287:56:::0;-1:-1:-1;48404:16:0::1;48421:19;48439:1;48421:17:::0;:19:::1;:::i;:::-;48404:36:::0;-1:-1:-1;48451:19:0::1;48471:26;48404:36:::0;48471:17;:26:::1;:::i;:::-;48451:46:::0;-1:-1:-1;48580:17:0::1;48598:29;48610:17:::0;48451:46;48598:29:::1;:::i;:::-;48580:47:::0;-1:-1:-1;48742:21:0::1;48774:27;48580:47:::0;48774:16:::1;:27::i;:::-;48812:14;48828:41;48852:17:::0;48828:21:::1;:41;:::i;:::-;48812:58:::0;-1:-1:-1;48970:14:0::1;49008:9:::0;48988:18:::1;48995:11:::0;48812:58;48988:18:::1;:::i;:::-;48987:30;;;;:::i;:::-;48970:47;;49028:31;49042:8;49052:6;49028:13;:31::i;:::-;49182:21;49205:41;49229:17:::0;49205:21:::1;:41;:::i;:::-;49182:65;;49325:31;49342:13;49325:16;:31::i;:::-;47785:1579;;;;;;;;;;;;47444:1;47456:27:::0;:35;;-1:-1:-1;;47456:35:0;;;47736:1628::o;44460:427::-;-1:-1:-1;;;;;44581:17:0;;44523:7;44581:17;;;:9;:17;;;;;;44564:14;;44523:7;;44564:34;;;:::i;:::-;-1:-1:-1;;;;;44761:25:0;;;;;;:17;:25;;;;;;44543:55;;-1:-1:-1;44750:36:0;;44747:49;;;-1:-1:-1;44795:1:0;;44460:427;-1:-1:-1;;44460:427:0:o;44747:49::-;-1:-1:-1;;;;;44828:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;41144:5:0;44815:38;;:10;:38;:::i;:::-;44814:65;;;;:::i;25293:158::-;25366:4;25390:53;25398:3;-1:-1:-1;;;;;25418:23:0;;25390:7;:53::i;59062:230::-;59218:20;;59204:13;:34;59196:43;;;;;;59250:20;:34;59062:230::o;25537:167::-;-1:-1:-1;;;;;25671:23:0;;25617:4;22346:19;;;:12;;;:19;;;;;;:24;;25641:55;22249:129;45830:1236;45889:14;;-1:-1:-1;;;45889:14:0;;;;45888:15;45880:24;;;;;;45915:14;:19;;-1:-1:-1;;;;45915:19:0;-1:-1:-1;;;45915:19:0;;;;45973:27;45995:4;45973:21;:27::i;:::-;45970:495;;;-1:-1:-1;;;;;;46087:14:0;;;;;;:8;:14;;;;;;;46116:16;;;45970:495;;;46173:17;46191:21;46207:4;46191:15;:21::i;:::-;-1:-1:-1;;;;;46323:15:0;;;;;;:9;:15;;;;;;46306:14;;46173:39;;-1:-1:-1;46306:32:0;;;:::i;:::-;-1:-1:-1;;;;;46280:23:0;;;;;;:17;:23;;;;;;;;:58;;;;46398:14;;;;:24;;46413:9;;46398:24;:::i;:::-;-1:-1:-1;;;;;46437:14:0;;46452:1;46437:14;;;:8;:14;;;;;:16;46391:31;-1:-1:-1;;45970:495:0;46478:6;46486:1;46478:9;46475:106;;-1:-1:-1;;46528:14:0;:20;;-1:-1:-1;;;;46528:20:0;;;45830:1236::o;46475:106::-;46605:6;46591:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;46646:16:0;;;46660:1;46646:16;;;;;;;;46622:21;;46646:16;;;;;;;;-1:-1:-1;;46683:16:0;;:23;;;-1:-1:-1;;;46683:23:0;;;;46622:40;;-1:-1:-1;;;;;;46683:16:0;;;;:21;;-1:-1:-1;46683:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46673:4;46678:1;46673:7;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;46673:33:0;;;-1:-1:-1;;;;;46673:33:0;;;;;46733:42;46723:4;46728:1;46723:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46723:52:0;;;:7;;;;;;;;;:52;46823:16;;:151;;-1:-1:-1;;;46823:151:0;;:16;;;:67;;46898:6;;46823:151;;:16;;46928:4;;46943;;46958:15;;46823:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47000:27:0;;;16835:25:1;;;-1:-1:-1;;;;;16896:32:1;;16891:2;16876:18;;16869:60;47000:27:0;;-1:-1:-1;16808:18:1;;-1:-1:-1;47000:27:0;;-1:-1:-1;16661:274:1;47000:27:0;;;;;;;;-1:-1:-1;;47038:14:0;:20;;-1:-1:-1;;;;47038:20:0;;;-1:-1:-1;45830:1236:0:o;25790:117::-;25853:7;25880:19;25888:3;22547:18;;22464:109;26251:158;26325:7;26376:22;26380:3;26392:5;26376:3;:22::i;44957:758::-;45092:14;;45054:22;;45110:3;;45080:26;;45092:14;;45080:9;:26;:::i;:::-;45079:34;;;;:::i;:::-;45054:59;-1:-1:-1;45124:14:0;45141:26;45054:59;45141:9;:26;:::i;:::-;45124:43;;45197:14;45179:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;45235:10:0;;45231:477;;45284:6;45262:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;45305:19:0;;-1:-1:-1;45325:17:0;:15;:17::i;:::-;45305:37;;45436:11;45451:1;45436:16;45432:265;;45493:6;45473:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;45432:265:0;;-1:-1:-1;45432:265:0;;45669:11;45634:31;-1:-1:-1;;;45634:6:0;:31;:::i;:::-;45633:47;;;;:::i;:::-;45614:14;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;45432:265:0;45247:461;45010:705;;44957:758;:::o;20020:414::-;20083:4;22346:19;;;:12;;;:19;;;;;;20100:327;;-1:-1:-1;20143:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;20326:18;;20304:19;;;:12;;;:19;;;;;;:40;;;;20359:11;;20100:327;-1:-1:-1;20410:5:0;20403:12;;39840:440;-1:-1:-1;;;;;39959:17:0;;39935:21;39959:17;;;:9;:17;;;;;;39995:23;;;;39987:60;;;;-1:-1:-1;;;39987:60:0;;17142:2:1;39987:60:0;;;17124:21:1;17181:2;17161:18;;;17154:30;-1:-1:-1;;;17200:18:1;;;17193:54;17264:18;;39987:60:0;16940:348:1;39987:60:0;40103:27;40116:6;40123;40103:12;:27::i;:::-;40183:28;40193:9;40204:6;40183:9;:28::i;:::-;40253:9;-1:-1:-1;;;;;40237:33:0;40246:6;-1:-1:-1;;;;;40237:33:0;;40263:6;40237:33;;;;1792:25:1;;1780:2;1765:18;;1646:177;40237:33:0;;;;;;;;39924:356;39840:440;;;:::o;34876:4902::-;-1:-1:-1;;;;;35019:20:0;;;34992:24;35019:20;;;:9;:20;;;;;;;35074:17;;;;;;;;35110:23;;;;35102:60;;;;-1:-1:-1;;;35102:60:0;;17142:2:1;35102:60:0;;;17124:21:1;17181:2;17161:18;;;17154:30;-1:-1:-1;;;17200:18:1;;;17193:54;17264:18;;35102:60:0;16940:348:1;35102:60:0;35175:9;35198:6;35195:3257;;;35224:38;:21;35255:6;35224:30;:38::i;:::-;35220:427;;-1:-1:-1;;;;;35412:17:0;;;;;;:9;:17;;;;;;35431:15;-1:-1:-1;35412:34:0;;:52;;-1:-1:-1;35448:16:0;;;;35412:52;35404:82;;;;-1:-1:-1;;;35404:82:0;;17495:2:1;35404:82:0;;;17477:21:1;17534:2;17514:18;;;17507:30;-1:-1:-1;;;17553:18:1;;;17546:48;17611:18;;35404:82:0;17293:342:1;35404:82:0;35619:12;;35603:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;35585:17:0;;;;;;:9;:17;;;;;:46;35220:427;35788:9;;35780:6;:17;;35772:44;;;;-1:-1:-1;;;35772:44:0;;17842:2:1;35772:44:0;;;17824:21:1;17881:2;17861:18;;;17854:30;-1:-1:-1;;;17900:18:1;;;17893:45;17955:18;;35772:44:0;17640:339:1;35772:44:0;35839:31;:14;35863:6;35839:23;:31::i;:::-;:40;35831:73;;;;-1:-1:-1;;;35831:73:0;;18186:2:1;35831:73:0;;;18168:21:1;18225:2;18205:18;;;18198:30;-1:-1:-1;;;18244:18:1;;;18237:50;18304:18;;35831:73:0;17984:344:1;35831:73:0;35963:11;;35944:16;;:30;;;;:::i;:::-;35925:15;:49;;:77;;;;;35978:19;;36001:1;35978:24;35925:77;35921:186;;;36023:26;:14;36042:6;36023:18;:26::i;:::-;-1:-1:-1;36073:18:0;;-1:-1:-1;;;;;36073:18:0;;;;;;;;35921:186;-1:-1:-1;36127:8:0;;;;;;;35195:3257;;;36160:5;36157:2295;;;36185:40;:20;36215:9;36185:29;:40::i;:::-;36181:427;;-1:-1:-1;;;;;36374:19:0;;;;;;:8;:19;;;;;;36395:15;-1:-1:-1;36374:36:0;;:53;;-1:-1:-1;36412:15:0;;;;36374:53;36366:81;;;;-1:-1:-1;;;36366:81:0;;18535:2:1;36366:81:0;;;18517:21:1;18574:2;18554:18;;;18547:30;-1:-1:-1;;;18593:18:1;;;18586:46;18649:18;;36366:81:0;18333:340:1;36366:81:0;36581:11;;36565:27;;:15;:27;:::i;:::-;-1:-1:-1;;;;;36545:19:0;;;;;;:8;:19;;;;;:47;36181:427;36746:12;;36721:23;36738:6;36721:16;:23;:::i;:::-;:37;;36713:65;;;;-1:-1:-1;;;36713:65:0;;18880:2:1;36713:65:0;;;18862:21:1;18919:2;18899:18;;;18892:30;-1:-1:-1;;;18938:18:1;;;18931:46;18994:18;;36713:65:0;18678:340:1;36713:65:0;36811:6;;36801;:16;;36793:62;;;;-1:-1:-1;;;36793:62:0;;19225:2:1;36793:62:0;;;19207:21:1;19264:2;19244:18;;;19237:30;19303:34;19283:18;;;19276:62;-1:-1:-1;;;19354:18:1;;;19347:32;19396:19;;36793:62:0;19023:398:1;36793:62:0;36878:34;:14;36902:9;36878:23;:34::i;:::-;:43;36870:76;;;;-1:-1:-1;;;36870:76:0;;18186:2:1;36870:76:0;;;18168:21:1;18225:2;18205:18;;;18198:30;-1:-1:-1;;;18244:18:1;;;18237:50;18304:18;;36870:76:0;17984:344:1;36870:76:0;37005:11;;36986:16;;:30;;;;:::i;:::-;36967:15;:49;;:77;;;;;37020:19;;37043:1;37020:24;36967:77;36963:192;;;37065:29;:14;37084:9;37065:18;:29::i;:::-;-1:-1:-1;37118:21:0;;-1:-1:-1;;;;;37118:21:0;;;;;;;;36963:192;-1:-1:-1;37175:7:0;;;;36157:2295;;;37422:15;28922:2;37422;:15;:::i;:::-;37414:6;:23;37411:44;;37439:16;37448:6;37439:8;:16::i;:::-;37594:12;;37569:23;37586:6;37569:16;:23;:::i;:::-;:37;;37561:65;;;;-1:-1:-1;;;37561:65:0;;18880:2:1;37561:65:0;;;18862:21:1;18919:2;18899:18;;;18892:30;-1:-1:-1;;;18938:18:1;;;18931:46;18994:18;;37561:65:0;18678:340:1;37561:65:0;37858:38;:21;37889:6;37858:30;:38::i;:::-;37854:139;;-1:-1:-1;;;;;37923:17:0;;;;;;:9;:17;;;;;;37942:15;-1:-1:-1;37923:34:0;;:52;;-1:-1:-1;37959:16:0;;;;37923:52;37915:78;;;;-1:-1:-1;;;37915:78:0;;19628:2:1;37915:78:0;;;19610:21:1;19667:2;19647:18;;;19640:30;-1:-1:-1;;;19686:18:1;;;19679:44;19740:18;;37915:78:0;19426:338:1;37915:78:0;38030:31;:14;38054:6;38030:23;:31::i;:::-;:40;38022:80;;;;-1:-1:-1;;;38022:80:0;;19971:2:1;38022:80:0;;;19953:21:1;20010:2;19990:18;;;19983:30;20049:29;20029:18;;;20022:57;20096:18;;38022:80:0;19769:351:1;38022:80:0;38125:34;:14;38149:9;38125:23;:34::i;:::-;:43;38117:86;;;;-1:-1:-1;;;38117:86:0;;20327:2:1;38117:86:0;;;20309:21:1;20366:2;20346:18;;;20339:30;20405:32;20385:18;;;20378:60;20455:18;;38117:86:0;20125:354:1;38117:86:0;38262:11;;38243:16;;:30;;;;:::i;:::-;38224:15;:49;;:77;;;;;38277:19;;38300:1;38277:24;38224:77;38220:186;;;38322:26;:14;38341:6;38322:18;:26::i;:::-;-1:-1:-1;38372:18:0;;-1:-1:-1;;;;;38372:18:0;;;;;;;;38220:186;-1:-1:-1;38426:12:0;;;;;;;36157:2295;38789:21;;-1:-1:-1;;;;;38781:29:0;;;-1:-1:-1;;;38789:21:0;;;;38781:29;;;;38780:52;;-1:-1:-1;38815:16:0;;;;38814:17;38780:52;:84;;;;-1:-1:-1;38836:27:0;;;;38835:28;38780:84;:92;;;;;38866:6;38780:92;38777:130;;;38887:20;:18;:20::i;:::-;38976:23;39000:36;39014:6;39022:3;39027:8;;;;;;;;;;;39000:13;:36::i;:::-;39205:13;;38976:60;;-1:-1:-1;39144:21:0;;39166:53;;39180:6;;39188:3;;39193:25;;39205:13;;;;;;;-1:-1:-1;;;39193:11:0;;;:25;:::i;:::-;39166:13;:53::i;:::-;39144:75;-1:-1:-1;39283:19:0;39311:31;39144:75;39311:15;:31;:::i;:::-;39303:40;;:6;:40;:::i;:::-;39283:60;;39401:27;39414:6;39421;39401:12;:27::i;:::-;39523:4;39505:24;;;;:9;:24;;;;;:41;;39533:13;;39505:24;:41;;39533:13;;39505:41;:::i;:::-;;;;;;;;39601:15;39581:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;39671:33:0;;-1:-1:-1;39681:9:0;39692:11;39671:9;:33::i;:::-;39746:9;-1:-1:-1;;;;;39730:38:0;39739:6;-1:-1:-1;;;;;39730:38:0;;39756:11;39730:38;;;;1792:25:1;;1780:2;1765:18;;1646:177;39730:38:0;;;;;;;;34981:4797;;;;;;34876:4902;;;;;:::o;49414:461::-;49507:16;;49475:58;;49492:4;;-1:-1:-1;;;;;49507:16:0;49526:6;49475:8;:58::i;:::-;49568:16;;;49582:1;49568:16;;;;;;;;49544:21;;49568:16;;;;;;;;;;-1:-1:-1;49568:16:0;49544:40;;49613:4;49595;49600:1;49595:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49595:23:0;;;:7;;;;;;;;;;:23;;;;49639:16;;:23;;;-1:-1:-1;;;49639:23:0;;;;:16;;;;;:21;;:23;;;;;49595:7;;49639:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49629:4;49634:1;49629:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49629:33:0;;;:7;;;;;;;;;:33;49675:16;;:192;;-1:-1:-1;;;49675:192:0;;:16;;;:67;;:192;;49757:6;;49675:16;;49794:4;;49821;;49841:15;;49675:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49464:411;49414:461;:::o;50002:401::-;50096:9;50084:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;50148:16:0;;50116:63;;50133:4;;-1:-1:-1;;;;;50148:16:0;50167:11;50116:8;:63::i;:::-;50190:16;;:205;;-1:-1:-1;;;50190:205:0;;-1:-1:-1;;;;;50190:16:0;;;;:32;;50230:9;;50190:205;;50263:4;;50283:11;;50190:16;;;;50263:4;;50369:15;;50190:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20610:1553::-;20676:4;20815:19;;;:12;;;:19;;;;;;20851:15;;20847:1309;;21213:21;21237:14;21250:1;21237:10;:14;:::i;:::-;21286:18;;21213:38;;-1:-1:-1;21266:17:0;;21286:22;;21307:1;;21286:22;:::i;:::-;21266:42;;21553:17;21573:3;:11;;21585:9;21573:22;;;;;;;;:::i;:::-;;;;;;;;;21553:42;;21719:9;21690:3;:11;;21702:13;21690:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21796:23;;;:12;;;:23;;;;;;:36;;;21957:17;;21796:3;;21957:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;22052:3;:12;;:19;22065:5;22052:19;;;;;;;;;;;22045:26;;;22095:4;22088:11;;;;;;;;20847:1309;22139:5;22132:12;;;;;22917:204;23012:18;;22984:7;;23012:26;-1:-1:-1;23004:73:0;;;;-1:-1:-1;;;23004:73:0;;21716:2:1;23004:73:0;;;21698:21:1;21755:2;21735:18;;;21728:30;21794:34;21774:18;;;21767:62;-1:-1:-1;;;21845:18:1;;;21838:32;21887:19;;23004:73:0;21514:398:1;23004:73:0;23095:3;:11;;23107:5;23095:18;;;;;;;;:::i;:::-;;;;;;;;;23088:25;;22917:204;;;;:::o;43666:648::-;-1:-1:-1;;;;;43801:15:0;;43783:17;43801:15;;;:9;:15;;;;;;:22;;43817:6;;43801:22;:::i;:::-;43783:40;;43847:27;43869:4;43847:21;:27::i;:::-;43844:102;;;-1:-1:-1;;;;;43889:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;43666:648:0:o;43844:102::-;44011:15;44027:21;44043:4;44027:15;:21::i;:::-;-1:-1:-1;;;;;44086:15:0;;;;;;:9;:15;;;;;:25;;;44195:14;;44011:37;;-1:-1:-1;44195:26:0;;44102:9;;44195:26;:::i;:::-;-1:-1:-1;;;;;44169:23:0;;;;;;:17;:23;;;;;;;;:52;;;;44282:14;;;;;:23;;44298:7;;44169:23;44282;;44298:7;;44282:23;:::i;42929:645::-;-1:-1:-1;;;;;43061:15:0;;43043:17;43061:15;;;:9;:15;;;;;;:22;;43077:6;;43061:22;:::i;:::-;43043:40;;43107:27;43129:4;43107:21;:27::i;:::-;43104:102;;;-1:-1:-1;;;;;43149:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42929:645:0:o;43104:102::-;43271:15;43287:21;43303:4;43287:15;:21::i;:::-;43271:37;;43409:9;43392:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;43366:23:0;;;;;;:17;:23;;;;;;;;:52;;;;43479:14;;;;;:23;;43495:7;;43366:23;43479;;43495:7;;43479:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;43541:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42929:645:0:o;40335:156::-;40425:7;40478:5;40464:10;40453:21;;40460:3;40453:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;40452:31;;;;:::i;:::-;40445:38;40335:156;-1:-1:-1;;;;40335:156:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;805:131::-;-1:-1:-1;;;;;880:31:1;;870:42;;860:70;;926:1;923;916:12;941:315;1009:6;1017;1070:2;1058:9;1049:7;1045:23;1041:32;1038:52;;;1086:1;1083;1076:12;1038:52;1125:9;1112:23;1144:31;1169:5;1144:31;:::i;:::-;1194:5;1246:2;1231:18;;;;1218:32;;-1:-1:-1;;;941:315:1:o;1828:118::-;1914:5;1907:13;1900:21;1893:5;1890:32;1880:60;;1936:1;1933;1926:12;1951:241;2007:6;2060:2;2048:9;2039:7;2035:23;2031:32;2028:52;;;2076:1;2073;2066:12;2028:52;2115:9;2102:23;2134:28;2156:5;2134:28;:::i;2197:456::-;2274:6;2282;2290;2343:2;2331:9;2322:7;2318:23;2314:32;2311:52;;;2359:1;2356;2349:12;2311:52;2398:9;2385:23;2417:31;2442:5;2417:31;:::i;:::-;2467:5;-1:-1:-1;2524:2:1;2509:18;;2496:32;2537:33;2496:32;2537:33;:::i;:::-;2197:456;;2589:7;;-1:-1:-1;;;2643:2:1;2628:18;;;;2615:32;;2197:456::o;3198:180::-;3257:6;3310:2;3298:9;3289:7;3285:23;3281:32;3278:52;;;3326:1;3323;3316:12;3278:52;-1:-1:-1;3349:23:1;;3198:180;-1:-1:-1;3198:180:1:o;3383:247::-;3442:6;3495:2;3483:9;3474:7;3470:23;3466:32;3463:52;;;3511:1;3508;3501:12;3463:52;3550:9;3537:23;3569:31;3594:5;3569:31;:::i;3635:156::-;3701:20;;3761:4;3750:16;;3740:27;;3730:55;;3781:1;3778;3771:12;3730:55;3635:156;;;:::o;3796:535::-;3888:6;3896;3904;3912;3920;3928;3981:3;3969:9;3960:7;3956:23;3952:33;3949:53;;;3998:1;3995;3988:12;3949:53;4021:27;4038:9;4021:27;:::i;:::-;4011:37;;4067:36;4099:2;4088:9;4084:18;4067:36;:::i;:::-;4057:46;;4122:36;4154:2;4143:9;4139:18;4122:36;:::i;:::-;4112:46;;4177:36;4209:2;4198:9;4194:18;4177:36;:::i;:::-;4167:46;;4232:37;4264:3;4253:9;4249:19;4232:37;:::i;:::-;4222:47;;4288:37;4320:3;4309:9;4305:19;4288:37;:::i;:::-;4278:47;;3796:535;;;;;;;;:::o;4589:182::-;4646:6;4699:2;4687:9;4678:7;4674:23;4670:32;4667:52;;;4715:1;4712;4705:12;4667:52;4738:27;4755:9;4738:27;:::i;4984:248::-;5052:6;5060;5113:2;5101:9;5092:7;5088:23;5084:32;5081:52;;;5129:1;5126;5119:12;5081:52;-1:-1:-1;;5152:23:1;;;5222:2;5207:18;;;5194:32;;-1:-1:-1;4984:248:1:o;5237:388::-;5305:6;5313;5366:2;5354:9;5345:7;5341:23;5337:32;5334:52;;;5382:1;5379;5372:12;5334:52;5421:9;5408:23;5440:31;5465:5;5440:31;:::i;:::-;5490:5;-1:-1:-1;5547:2:1;5532:18;;5519:32;5560:33;5519:32;5560:33;:::i;:::-;5612:7;5602:17;;;5237:388;;;;;:::o;5630:356::-;5832:2;5814:21;;;5851:18;;;5844:30;5910:34;5905:2;5890:18;;5883:62;5977:2;5962:18;;5630:356::o;5991:127::-;6052:10;6047:3;6043:20;6040:1;6033:31;6083:4;6080:1;6073:15;6107:4;6104:1;6097:15;6123:422;6212:1;6255:5;6212:1;6269:270;6290:7;6280:8;6277:21;6269:270;;;6349:4;6345:1;6341:6;6337:17;6331:4;6328:27;6325:53;;;6358:18;;:::i;:::-;6408:7;6398:8;6394:22;6391:55;;;6428:16;;;;6391:55;6507:22;;;;6467:15;;;;6269:270;;;6273:3;6123:422;;;;;:::o;6550:806::-;6599:5;6629:8;6619:80;;-1:-1:-1;6670:1:1;6684:5;;6619:80;6718:4;6708:76;;-1:-1:-1;6755:1:1;6769:5;;6708:76;6800:4;6818:1;6813:59;;;;6886:1;6881:130;;;;6793:218;;6813:59;6843:1;6834:10;;6857:5;;;6881:130;6918:3;6908:8;6905:17;6902:43;;;6925:18;;:::i;:::-;-1:-1:-1;;6981:1:1;6967:16;;6996:5;;6793:218;;7095:2;7085:8;7082:16;7076:3;7070:4;7067:13;7063:36;7057:2;7047:8;7044:16;7039:2;7033:4;7030:12;7026:35;7023:77;7020:159;;;-1:-1:-1;7132:19:1;;;7164:5;;7020:159;7211:34;7236:8;7230:4;7211:34;:::i;:::-;7281:6;7277:1;7273:6;7269:19;7260:7;7257:32;7254:58;;;7292:18;;:::i;:::-;7330:20;;6550:806;-1:-1:-1;;;6550:806:1:o;7361:140::-;7419:5;7448:47;7489:4;7479:8;7475:19;7469:4;7448:47;:::i;7506:168::-;7546:7;7612:1;7608;7604:6;7600:14;7597:1;7594:21;7589:1;7582:9;7575:17;7571:45;7568:71;;;7619:18;;:::i;:::-;-1:-1:-1;7659:9:1;;7506:168::o;8028:125::-;8068:4;8096:1;8093;8090:8;8087:34;;;8101:18;;:::i;:::-;-1:-1:-1;8138:9:1;;8028:125::o;8158:217::-;8198:1;8224;8214:132;;8268:10;8263:3;8259:20;8256:1;8249:31;8303:4;8300:1;8293:15;8331:4;8328:1;8321:15;8214:132;-1:-1:-1;8360:9:1;;8158:217::o;8380:128::-;8420:3;8451:1;8447:6;8444:1;8441:13;8438:39;;;8457:18;;:::i;:::-;-1:-1:-1;8493:9:1;;8380:128::o;8513:204::-;8551:3;8587:4;8584:1;8580:12;8619:4;8616:1;8612:12;8654:3;8648:4;8644:14;8639:3;8636:23;8633:49;;;8662:18;;:::i;:::-;8698:13;;8513:204;-1:-1:-1;;;8513:204:1:o;9129:340::-;9331:2;9313:21;;;9370:2;9350:18;;;9343:30;-1:-1:-1;;;9404:2:1;9389:18;;9382:46;9460:2;9445:18;;9129:340::o;9684:184::-;9754:6;9807:2;9795:9;9786:7;9782:23;9778:32;9775:52;;;9823:1;9820;9813:12;9775:52;-1:-1:-1;9846:16:1;;9684:184;-1:-1:-1;9684:184:1:o;10152:245::-;10219:6;10272:2;10260:9;10251:7;10247:23;10243:32;10240:52;;;10288:1;10285;10278:12;10240:52;10320:9;10314:16;10339:28;10361:5;10339:28;:::i;12267:135::-;12306:3;12327:17;;;12324:43;;12347:18;;:::i;:::-;-1:-1:-1;12394:1:1;12383:13;;12267:135::o;12407:607::-;-1:-1:-1;;;;;12766:15:1;;;12748:34;;12813:2;12798:18;;12791:34;;;;12856:2;12841:18;;12834:34;;;;12899:2;12884:18;;12877:34;;;;12948:15;;;12942:3;12927:19;;12920:44;12728:3;12980:19;;12973:35;;;;12697:3;12682:19;;12407:607::o;15292:251::-;15362:6;15415:2;15403:9;15394:7;15390:23;15386:32;15383:52;;;15431:1;15428;15421:12;15383:52;15463:9;15457:16;15482:31;15507:5;15482:31;:::i;15548:127::-;15609:10;15604:3;15600:20;15597:1;15590:31;15640:4;15637:1;15630:15;15664:4;15661:1;15654:15;15680:461;15733:3;15771:5;15765:12;15798:6;15793:3;15786:19;15824:4;15853:2;15848:3;15844:12;15837:19;;15890:2;15883:5;15879:14;15911:1;15921:195;15935:6;15932:1;15929:13;15921:195;;;16000:13;;-1:-1:-1;;;;;15996:39:1;15984:52;;16056:12;;;;16091:15;;;;16032:1;15950:9;15921:195;;;-1:-1:-1;16132:3:1;;15680:461;-1:-1:-1;;;;;15680:461:1:o;16146:510::-;16417:6;16406:9;16399:25;16460:3;16455:2;16444:9;16440:18;16433:31;16380:4;16481:57;16533:3;16522:9;16518:19;16510:6;16481:57;:::i;:::-;-1:-1:-1;;;;;16574:32:1;;;;16569:2;16554:18;;16547:60;-1:-1:-1;16638:2:1;16623:18;16616:34;16473:65;16146:510;-1:-1:-1;;16146:510:1:o;20484:582::-;20783:6;20772:9;20765:25;20826:6;20821:2;20810:9;20806:18;20799:34;20869:3;20864:2;20853:9;20849:18;20842:31;20746:4;20890:57;20942:3;20931:9;20927:19;20919:6;20890:57;:::i;:::-;-1:-1:-1;;;;;20983:32:1;;;;20978:2;20963:18;;20956:60;-1:-1:-1;21047:3:1;21032:19;21025:35;20882:65;20484:582;-1:-1:-1;;;20484:582:1:o;21071:306::-;21159:6;21167;21175;21228:2;21216:9;21207:7;21203:23;21199:32;21196:52;;;21244:1;21241;21234:12;21196:52;21273:9;21267:16;21257:26;;21323:2;21312:9;21308:18;21302:25;21292:35;;21367:2;21356:9;21352:18;21346:25;21336:35;;21071:306;;;;;:::o;21382:127::-;21443:10;21438:3;21434:20;21431:1;21424:31;21474:4;21471:1;21464:15;21498:4;21495:1;21488:15

Swarm Source

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