ETH Price: $3,438.57 (-0.50%)
Gas: 3 Gwei

Token

BabyFlokiDoge (BABYFD)
 

Overview

Max Total Supply

8,000,000,000,000,000 BABYFD

Holders

174

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
36,597,196.271391662 BABYFD

Value
$0.00
0xc144e0f6961ec09a482833e41d047b7991e5a4b0
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:
BabyFlokiDoge

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-07
*/

// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.4;

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

interface IERC20 {
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender)
    external
    view
    returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   *
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, 'SafeMath: addition overflow');

    return c;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   *
   * - Subtraction cannot overflow.
   */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return sub(a, b, 'SafeMath: subtraction overflow');
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   *
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   *
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, 'SafeMath: multiplication overflow');

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, 'SafeMath: division by zero');
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return mod(a, b, 'SafeMath: modulo by zero');
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

abstract contract Context {
  function _msgSender() internal view virtual returns (address payable) {
    return payable(msg.sender);
  }

  function _msgData() internal view virtual returns (bytes memory) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

//NOTE: DEPERECATED IN THIS CONTEXT. We load the library straight from OpenZeppelin.
/**
 * @dev Collection of functions related to the address type
 */
/* library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash =
            0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }
    

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

    
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

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

    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"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
            target.call{value: weiValue}(data);
        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 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 is Context {
  address private _owner;
  address private _multiSig;
  address private _previousOwner;
  uint256 private _lockTime;

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

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    address msgSender = _msgSender();
    _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 == _msgSender() || _multiSig == _msgSender(),
      '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 virtual 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 virtual onlyOwner {
    require(newOwner != address(0), 'Ownable: new owner is the zero address');
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }

  function setMultisigOwnership(address newMultisig) public virtual onlyOwner {
    require(
      newMultisig != address(0),
      "Ownable: can't add the 0 address as a multisig component!"
    );
    _multiSig = newMultisig;
  }

  function geUnlockTime() public view returns (uint256) {
    return _lockTime;
  }

  //Locks the contract for owner for the amount of time provided
  function lock(uint256 time) public virtual onlyOwner {
    _previousOwner = _owner;
    _owner = address(0);
    _lockTime = block.timestamp + time;
    emit OwnershipTransferred(_owner, address(0));
  }

  //Unlocks the contract for owner when _lockTime is exceeds
  function unlock() public virtual {
    require(
      _previousOwner == msg.sender,
      "You don't have permission to unlock"
    );
    require(block.timestamp > _lockTime, 'Contract is locked until 7 days');
    emit OwnershipTransferred(_owner, _previousOwner);
    _owner = _previousOwner;
  }
}

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

  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(uint256) external view returns (address pair);

  function allPairsLength() external view returns (uint256);

  function createPair(address tokenA, address tokenB)
    external
    returns (address pair);

  function setFeeTo(address) external;

  function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

  function balanceOf(address owner) external view returns (uint256);

  function allowance(address owner, address spender)
    external
    view
    returns (uint256);

  function approve(address spender, uint256 value) external returns (bool);

  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint256 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 (uint256);

  function permit(
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  event Mint(address indexed sender, uint256 amount0, uint256 amount1);
  event Burn(
    address indexed sender,
    uint256 amount0,
    uint256 amount1,
    address indexed to
  );
  event Swap(
    address indexed sender,
    uint256 amount0In,
    uint256 amount1In,
    uint256 amount0Out,
    uint256 amount1Out,
    address indexed to
  );
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint256);

  function factory() external view returns (address);

  function token0() external view returns (address);

  function token1() external view returns (address);

  function getReserves()
    external
    view
    returns (
      uint112 reserve0,
      uint112 reserve1,
      uint32 blockTimestampLast
    );

  function price0CumulativeLast() external view returns (uint256);

  function price1CumulativeLast() external view returns (uint256);

  function kLast() external view returns (uint256);

  function mint(address to) external returns (uint256 liquidity);

  function burn(address to) external returns (uint256 amount0, uint256 amount1);

  function swap(
    uint256 amount0Out,
    uint256 amount1Out,
    address to,
    bytes calldata data
  ) external;

  function skim(address to) external;

  function sync() external;

  function initialize(address, address) external;
}

interface IUniswapV2Router01 {
  function factory() external pure returns (address);

  function WETH() external pure returns (address);

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  )
    external
    returns (
      uint256 amountA,
      uint256 amountB,
      uint256 liquidity
    );

  function addLiquidityETH(
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  )
    external
    payable
    returns (
      uint256 amountToken,
      uint256 amountETH,
      uint256 liquidity
    );

  function removeLiquidity(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETH(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETHWithPermit(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountToken, uint256 amountETH);

  function swapExactTokensForTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapTokensForExactTokens(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactETHForTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapTokensForExactETH(
    uint256 amountOut,
    uint256 amountInMax,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactTokensForETH(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapETHForExactTokens(
    uint256 amountOut,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) external pure returns (uint256 amountB);

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure returns (uint256 amountOut);

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure returns (uint256 amountIn);

  function getAmountsOut(uint256 amountIn, address[] calldata path)
    external
    view
    returns (uint256[] memory amounts);

  function getAmountsIn(uint256 amountOut, address[] calldata path)
    external
    view
    returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountETH);

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountETH);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;
}

contract BabyFlokiDoge is Context, IERC20, Ownable {
  using SafeMath for uint256;
  using Address for address;

  mapping(address => uint256) private _rOwned;
  mapping(address => uint256) private _tOwned;
  mapping(address => mapping(address => uint256)) private _allowances;

  mapping(address => bool) private _isExcludedFromFee;
  mapping(address => bool) private _isExcluded; //from reflections
  address[] private _excluded;

  mapping(address => bool) private _isExcludedFromTxLimit; //Adding this for the dxsale/unicrypt presale, the router needs to be exempt from max tx amount limit.

  uint256 private constant MAX = ~uint256(0);
  uint256 private _tTotal = 8000000 * 10**9 * 10**9; //8 quadrillion
  uint256 private _rTotal = (MAX - (MAX % _tTotal));
  uint256 private _tFeeTotal;

  string private _name = 'BabyFlokiDoge';
  string private _symbol = 'BABYFD';
  uint8 private _decimals = 9;

  uint256 public _taxFee = 2;
  uint256 private _previousTaxFee = _taxFee;
  bool private antiSniping_failsafe = true;

  uint256 public _liquidityFee = 2;
  uint256 private _previousLiquidityFee = _liquidityFee;

  uint256 public _marketingFee = 2;
  uint256 private _previousMarketingFee = _marketingFee;

  address private _marketingWalletAddress; //Affixed and created dynamically by the smart contract on construction time.

  uint256 private launchedAt; //Stores the block.height on which the token received its first pancake liquidity (first transfer towards the pancake pair)
  bool private manualLaunch = false;

  IUniswapV2Router02 public immutable uniswapV2Router;
  address public immutable BabyUniswapV2Pair;

  bool inSwapAndLiquify;
  bool public swapAndLiquifyEnabled = true;

  uint256 public _maxTxAmount = 40000 * 10**9 * 10**9; //1% (0.005x) of Total circulating supply, after burn
  uint256 private numTokensSellToAddToLiquidity = 4000 * 10**9 * 10**9; //1 order of magnitude smaller than the max tx amount (so, div by 10, sort of)

  event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
  event SwapAndLiquifyEnabledUpdated(bool enabled);
  event SwapAndLiquify(
    uint256 tokensSwapped,
    uint256 ethReceived,
    uint256 tokensIntoLiqudity
  );
  event AntiSnipingFailsafeSetTo(bool toggle);

  modifier lockTheSwap() {
    inSwapAndLiquify = true;
    _;
    inSwapAndLiquify = false;
  }

  constructor(address param_addr, address opt_multiSig) {
    _rOwned[_msgSender()] = _rTotal;

    IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
      0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
    ); //PancakeSwap's V2 Router.
    //NOTE: You HAVE to use Pancake's V2 Router, otherwise taxOnTransfer don't work.
    //IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Pancakeswap testnet
    //Create a new uniswap pair for this new token and set the local pair pointer
    BabyUniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
      .createPair(address(this), _uniswapV2Router.WETH());

    //Set the local router pointer
    uniswapV2Router = _uniswapV2Router;

    //Exclude owner and this contract from fee
    _isExcludedFromFee[owner()] = true;
    _isExcludedFromFee[address(this)] = true;
    _marketingWalletAddress = param_addr;
    setMultisigOwnership(opt_multiSig);

    emit Transfer(address(0), _msgSender(), _tTotal);
  }

  function name() public view returns (string memory) {
    return _name;
  }

  function symbol() public view returns (string memory) {
    return _symbol;
  }

  function decimals() public view returns (uint8) {
    return _decimals;
  }

  function totalSupply() public view override returns (uint256) {
    return _tTotal;
  }

  function launch() internal {
    launchedAt = block.number;
  }

  function launched() internal view returns (bool) {
    return launchedAt != 0;
  }

  function manualLaunchOverride(bool toggle) public onlyOwner {
    manualLaunch = toggle;
  }

  function setAntiSnipeFailsafe(bool failsafe) public {
    antiSniping_failsafe = failsafe;
    emit AntiSnipingFailsafeSetTo(failsafe);
  }

  function balanceOf(address account) public view override returns (uint256) {
    if (_isExcluded[account]) return _tOwned[account];
    return tokenFromReflection(_rOwned[account]);
  }

  function transfer(address recipient, uint256 amount)
    public
    override
    returns (bool)
  {
    _transfer(_msgSender(), recipient, amount);
    return true;
  }

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

  function approve(address spender, uint256 amount)
    public
    override
    returns (bool)
  {
    _approve(_msgSender(), spender, amount);
    return true;
  }

  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) public override returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(
      sender,
      _msgSender(),
      _allowances[sender][_msgSender()].sub(
        amount,
        'ERC20: transfer amount exceeds allowance'
      )
    );
    return true;
  }

  function increaseAllowance(address spender, uint256 addedValue)
    public
    virtual
    returns (bool)
  {
    _approve(
      _msgSender(),
      spender,
      _allowances[_msgSender()][spender].add(addedValue)
    );
    return true;
  }

  function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
  {
    _approve(
      _msgSender(),
      spender,
      _allowances[_msgSender()][spender].sub(
        subtractedValue,
        'ERC20: decreased allowance below zero'
      )
    );
    return true;
  }

  function isExcludedFromReward(address account) public view returns (bool) {
    return _isExcluded[account];
  }

  function totalFees() public view returns (uint256) {
    return _tFeeTotal;
  }

  function deliver(uint256 tAmount) public {
    address sender = _msgSender();
    require(
      !_isExcluded[sender],
      'Excluded addresses cannot call this function'
    );
    //Deprecated
    (uint256 rAmount, , , , , ) = _getValues(tAmount); //WORKSPACE ZZ
    //New way to do it, avoid a 2deep4u stack.
    /*(, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTVector(tAmount, false, false);
        (uint256 rAmount, , ) = _getRVector(tAmount, tFee, tLiquidity, tMarketing);*/

    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _rTotal = _rTotal.sub(rAmount);
    _tFeeTotal = _tFeeTotal.add(tAmount);
  }

  function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
    public
    view
    returns (uint256)
  {
    require(tAmount <= _tTotal, 'Amount must be less than supply');
    if (!deductTransferFee) {
      //Deprecated
      (uint256 rAmount, , , , , ) = _getValues(tAmount); //WORKPLACE ZX
      //New way to do it, avoid a 2deep4u stack.
      /*(, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTVector(tAmount, false, false);
            (uint256 rAmount, , ) = _getRVector(tAmount, tFee, tLiquidity, tMarketing);*/

      return rAmount;
    } else {
      //Deprecated
      (, uint256 rTransferAmount, , , , ) = _getValues(tAmount); //WORKSPACE YY
      //New way to do it, avoid a 2deep4u stack.
      /*(, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTVector(tAmount, false, false);
            (, uint256 rTransferAmount,) = _getRVector(tAmount, tFee, tLiquidity, tMarketing);*/

      return rTransferAmount;
    }
  }

  function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
    require(rAmount <= _rTotal, 'Amount must be less than total reflections');
    uint256 currentRate = _getRate();
    return rAmount.div(currentRate);
  }

  function excludeFromReward(address account) public onlyOwner {
    require(!_isExcluded[account], 'Account already excluded');
    if (_rOwned[account] > 0) {
      _tOwned[account] = tokenFromReflection(_rOwned[account]);
    }
    _isExcluded[account] = true;
    _excluded.push(account);
  }

  function includeInReward(address account) external onlyOwner {
    require(_isExcluded[account], 'Account is already included');
    for (uint256 i = 0; i < _excluded.length; i++) {
      if (_excluded[i] == account) {
        _excluded[i] = _excluded[_excluded.length - 1];
        _tOwned[account] = 0;
        _isExcluded[account] = false;
        _excluded.pop();
        break;
      }
    }
  }

  function _transferBothExcluded(
    address sender,
    address recipient,
    uint256 tAmount
  ) private {
    //Deprecated
    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount); //WORKSPACE XX

    //New way to do it, avoid a 2deep4u stack.
    /*(uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTVector(tAmount, false, false);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRVector(tAmount, tFee, tLiquidity, tMarketing); */

    _tOwned[sender] = _tOwned[sender].sub(tAmount);
    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }

  function setIsExcludedFromTXLimit(address account, bool isExcluded)
    public
    onlyOwner
  {
    _isExcludedFromTxLimit[account] = isExcluded;
  }

  function isExcludedFromTXLimit(address account) public view returns (bool) {
    return _isExcludedFromTxLimit[account];
  }

  function excludeFromFee(address account) public onlyOwner {
    _isExcludedFromFee[account] = true;
  }

  function includeInFee(address account) public onlyOwner {
    _isExcludedFromFee[account] = false;
  }

  function setTaxFeePercent(uint256 taxFee) external onlyOwner {
    _taxFee = taxFee;
  }

  function setMarketingFeePercent(uint256 marketingFee) external onlyOwner {
    _marketingFee = marketingFee;
  }

  function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner {
    _liquidityFee = liquidityFee;
  }

  function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner {
    _maxTxAmount = _tTotal.mul(maxTxPercent).div(100 * 10**2);
  }

  function setSwapAndLiquifyEnabled(bool toggle) public onlyOwner {
    swapAndLiquifyEnabled = toggle;
    emit SwapAndLiquifyEnabledUpdated(toggle);
  }

  //to recieve ETH from uniswapV2Router when swaping
  receive() external payable {}

  function _reflectFee(uint256 rFee, uint256 tFee) private {
    _rTotal = _rTotal.sub(rFee);
    _tFeeTotal = _tFeeTotal.add(tFee);
  }

  struct tVector {
    uint256 tTransferAmount;
    uint256 tFee;
    uint256 tLiquidity;
    uint256 tMarketing;
  }

  struct rVector {
    uint256 rAmount;
    uint256 rTransferAmount;
    uint256 rFee;
  }

  //Had to use structs as the stack gets too deep if we leave it like it was. Remember, only around ~16 local variables are ever allowed in the stack, params and return types included.
  //The { }s are there for scoping, and killing unneeded vars.
  function _getValues(uint256 tAmount)
    private
    view
    returns (
      uint256,
      uint256,
      uint256,
      uint256,
      uint256,
      uint256
    )
  {
    tVector memory my_tVector;
    rVector memory my_rVector;
    {
      (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(
        tAmount
      );
      my_tVector.tTransferAmount = tTransferAmount;
      my_tVector.tFee = tFee;
      my_tVector.tLiquidity = tLiquidity;
    }
    {
      (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
        tAmount,
        my_tVector.tFee,
        my_tVector.tLiquidity,
        _getRate()
      );
      my_rVector.rAmount = rAmount;
      my_rVector.rTransferAmount = rTransferAmount;
      my_rVector.rFee = rFee;
    }
    return (
      my_rVector.rAmount,
      my_rVector.rTransferAmount,
      my_rVector.rFee,
      my_tVector.tTransferAmount,
      my_tVector.tFee,
      my_tVector.tLiquidity
    );
  }

  /* //WORKSPACE
    function _getTVector(uint256 tAmount, bool isSale, bool isSniper) private view returns (uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTValues(tAmount, isSale, isSniper);
        return (tTransferAmount, tFee, tLiquidity, tMarketing);
    }
    
    function _getRVector(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) private view returns (uint256, uint256, uint256) {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tMarketing, _getRate());
        return (rAmount, rTransferAmount, rFee);
    }
    */

  function _getTValues(uint256 tAmount)
    private
    view
    returns (
      uint256,
      uint256,
      uint256
    )
  {
    uint256 tFee = calculateTaxFee(tAmount);
    uint256 tLiquidity = calculateLiquidityFee(tAmount);
    uint256 tTransferAmount = tAmount.sub(tFee);
    tTransferAmount = tTransferAmount.sub(tLiquidity);
    return (tTransferAmount, tFee, tLiquidity);
  }

  function _getRValues(
    uint256 tAmount,
    uint256 tFee,
    uint256 tLiquidity,
    uint256 currentRate
  )
    private
    pure
    returns (
      uint256,
      uint256,
      uint256
    )
  {
    uint256 rAmount = tAmount.mul(currentRate);
    uint256 rTransferAmount;
    uint256 rFee;
    {
      rFee = tFee.mul(currentRate);
      uint256 rLiquidity = tLiquidity.mul(currentRate);
      rTransferAmount = rAmount.sub(rFee);
      rTransferAmount = rTransferAmount.sub(rLiquidity);
    }
    return (rAmount, rTransferAmount, rFee);
  }

  function _getRate() private view returns (uint256) {
    (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
    return rSupply.div(tSupply);
  }

  function _getCurrentSupply() private view returns (uint256, uint256) {
    uint256 rSupply = _rTotal;
    uint256 tSupply = _tTotal;
    for (uint256 i = 0; i < _excluded.length; i++) {
      if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply)
        return (_rTotal, _tTotal);
      rSupply = rSupply.sub(_rOwned[_excluded[i]]);
      tSupply = tSupply.sub(_tOwned[_excluded[i]]);
    }
    if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
    return (rSupply, tSupply);
  }

  function _takeLiquidity(uint256 tLiquidity) private {
    uint256 currentRate = _getRate();
    uint256 rLiquidity = tLiquidity.mul(currentRate);
    _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
    if (_isExcluded[address(this)])
      _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
  }

  function calculateTaxFee(uint256 _amount) private view returns (uint256) {
    uint256 this_taxFee = _taxFee;
    return _amount.mul(this_taxFee).div(100);
  }

  function calculateLiquidityFee(uint256 _amount)
    private
    view
    returns (uint256)
  {
    return _amount.mul(_liquidityFee.add(_marketingFee)).div(100);
  }

  function setMarketingAddr(address account) external onlyOwner {
    _marketingWalletAddress = account;
  }

  function getMarketingAddr() public view returns (address) {
    return _marketingWalletAddress;
  }

  function removeAllFee() private {
    if (_taxFee == 0 && _liquidityFee == 0) return;

    _previousTaxFee = _taxFee;
    _previousMarketingFee = _marketingFee;
    _previousLiquidityFee = _liquidityFee;

    _taxFee = 0;
    _marketingFee = 0;
    _liquidityFee = 0;
  }

  function restoreAllFee() private {
    _taxFee = _previousTaxFee;
    _marketingFee = _previousMarketingFee;
    _liquidityFee = _previousLiquidityFee;
  }

  function isExcludedFromFee(address account) public view returns (bool) {
    return _isExcludedFromFee[account];
  }

  function _approve(
    address owner,
    address spender,
    uint256 amount
  ) private {
    require(owner != address(0), 'ERC20: approve from the zero address');
    require(spender != address(0), 'ERC20: approve to the zero address');

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

  //MARKER: This is our bread and butter.
  function _transfer(
    address from,
    address to,
    uint256 amount
  ) private {
    require(from != address(0), 'ERC20: transfer from the zero address');
    require(to != address(0), 'ERC20: transfer to the zero address');
    require(amount > 0, 'Transfer amount must be greater than zero');

    if ((!launched() && to == BabyUniswapV2Pair) || manualLaunch) {
      require(
        balanceOf(from) > 0,
        'Are you trying to launch without actually having tokens? WTF?'
      );
      launch();
    }

    if ((from != owner() && to != owner()) || !(_isExcludedFromTxLimit[from])) {
      require(
        amount <= _maxTxAmount,
        'BabyFlokiDoge: Transfer amount exceeds the maxTxAmount.'
      );
    }

    // is the token balance of this contract address over the min number of
    // tokens that we need to initiate a swap + liquidity lock?
    // also, don't get caught in a circular liquidity event.
    // also, don't swap & liquify if sender is uniswap pair.
    uint256 contractTokenBalance = balanceOf(address(this));
    //MARKER: The contract is just putting everything to liquidity once it has it. Gotta intercept it somehow

    if (contractTokenBalance >= _maxTxAmount) {
      contractTokenBalance = _maxTxAmount;
    }

    // Should we add liquidity or not? Are we over the minimum amount?
    bool overMinTokenBalance = (contractTokenBalance >=
      numTokensSellToAddToLiquidity);
    if (
      overMinTokenBalance &&
      !inSwapAndLiquify &&
      from != BabyUniswapV2Pair &&
      swapAndLiquifyEnabled
    ) {
      contractTokenBalance = numTokensSellToAddToLiquidity;
      //add liquidity
      swapAndLiquify(contractTokenBalance);
    }

    //indicates if fee should be deducted from transfer
    bool takeFee = true;
    //if any account belongs to _isExcludedFromFee account then we don't deduct any
    if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
      takeFee = false;
    }

    bool isSniper = false;
    if (antiSniping_failsafe && launchedAt + 3 >= block.number) {
      //Looks like we have a sniper here, boys.
      isSniper = true;
    }

    bool purchaseOrSale = false;
    if (to == BabyUniswapV2Pair) {
      //It's a sell, boys!
      purchaseOrSale = true;
    }

    //transfer amount, it will take tax, marketing, liquidity fee
    _tokenTransfer(from, to, amount, takeFee);
  }

  function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
    uint256 marketingBalance = contractTokenBalance.mul(_marketingFee).div(
      _marketingFee.add(_liquidityFee)
    );
    uint256 liquidityBalance = contractTokenBalance.sub(marketingBalance);

    // split the liquidity balance into halves
    uint256 half = liquidityBalance.div(2);
    uint256 otherHalf = liquidityBalance.sub(half);
    uint256 tokensToSwapForETH = half.add(marketingBalance);

    // capture the contract's current ETH balance.
    // this is so that we can capture exactly the amount of ETH that the
    // swap creates, and not make the liquidity event include any ETH that
    // has been manually sent to the contract
    uint256 initialBalance = address(this).balance;

    // swap tokens for ETH
    swapTokensForEth(tokensToSwapForETH); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

    // how much ETH did we just swap into?
    uint256 newBalance = address(this).balance.sub(initialBalance);

    uint256 marketingETHBalance = newBalance.mul(marketingBalance).div(
      tokensToSwapForETH
    );
    uint256 liquidityETHBalance = newBalance.sub(marketingETHBalance);

    // add liquidity to uniswap
    addLiquidity(otherHalf, liquidityETHBalance);

    // send ETH to marketing wallet
    sendETHToMarketing(marketingETHBalance);

    emit SwapAndLiquify(half, newBalance, otherHalf);
  }

  function swapTokensForEth(uint256 tokenAmount) private {
    // generate the uniswap pair path of token -> weth
    address[] memory path = new address[](2);
    path[0] = address(this);
    path[1] = uniswapV2Router.WETH();

    _approve(address(this), address(uniswapV2Router), tokenAmount);

    // make the swap
    uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
      tokenAmount,
      0, // accept any amount of ETH
      path,
      address(this),
      block.timestamp
    );
  }

  function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
    // approve token transfer to cover all possible scenarios
    _approve(address(this), address(uniswapV2Router), tokenAmount);

    // add the liquidity
    uniswapV2Router.addLiquidityETH{ value: ethAmount }(
      address(this),
      tokenAmount,
      0, // slippage is unavoidable
      0, // slippage is unavoidable
      owner(),
      block.timestamp
    );
  }

  function sendETHToMarketing(uint256 amount) private {
    _marketingWalletAddress.call{ value: amount }('');
  }

  //this method is responsible for taking all fee, if takeFee is true
  function _tokenTransfer(
    address sender,
    address recipient,
    uint256 amount,
    bool takeFee
  ) private {
    if (!takeFee) removeAllFee();

    if (_isExcluded[sender] && !_isExcluded[recipient]) {
      _transferFromExcluded(sender, recipient, amount);
    } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
      _transferToExcluded(sender, recipient, amount);
    } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
      _transferStandard(sender, recipient, amount);
    } else if (_isExcluded[sender] && _isExcluded[recipient]) {
      _transferBothExcluded(sender, recipient, amount);
    } else {
      _transferStandard(sender, recipient, amount);
    }

    if (!takeFee) restoreAllFee();
  }

  function _transferStandard(
    address sender,
    address recipient,
    uint256 tAmount
  ) private {
    //Deprecated
    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount); //WORKPLACE Z

    //New way to do it, avoid a 2deep4u stack.
    /*(uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTVector(tAmount, purchaseOrSale, isSniper);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRVector(tAmount, tFee, tLiquidity, tMarketing);*/

    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }

  function _transferToExcluded(
    address sender,
    address recipient,
    uint256 tAmount
  ) private {
    //Deprecated
    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount); //WORKSPACE Y

    //New way to do it, avoid a 2deep4u stack.
    /*(uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTVector(tAmount, false, false);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRVector(tAmount, tFee, tLiquidity, tMarketing);*/

    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }

  function _transferFromExcluded(
    address sender,
    address recipient,
    uint256 tAmount
  ) private {
    //Deprecated

    (
      uint256 rAmount,
      uint256 rTransferAmount,
      uint256 rFee,
      uint256 tTransferAmount,
      uint256 tFee,
      uint256 tLiquidity
    ) = _getValues(tAmount); //WORKSPACE X

    //New way to do it, avoid a 2deep4u stack.
    /*(uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tMarketing) = _getTVector(tAmount, false, false);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRVector(tAmount, tFee, tLiquidity, tMarketing);*/

    _tOwned[sender] = _tOwned[sender].sub(tAmount);
    _rOwned[sender] = _rOwned[sender].sub(rAmount);
    _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
    _takeLiquidity(tLiquidity);
    _reflectFee(rFee, tFee);
    emit Transfer(sender, recipient, tTransferAmount);
  }

  function emergencyWithdraw() external onlyOwner {
    payable(owner()).send(address(this).balance);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"param_addr","type":"address"},{"internalType":"address","name":"opt_multiSig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"toggle","type":"bool"}],"name":"AntiSnipingFailsafeSetTo","type":"event"},{"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":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"inputs":[],"name":"BabyUniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketingAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromTXLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toggle","type":"bool"}],"name":"manualLaunchOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"failsafe","type":"bool"}],"name":"setAntiSnipeFailsafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"setIsExcludedFromTXLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setMarketingAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"}],"name":"setMarketingFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMultisig","type":"address"}],"name":"setMultisigOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toggle","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526a069e10de76676d08000000600b81905562000023906000196200068e565b62000031906000196200062b565b600c5560408051808201909152600d8082526c42616279466c6f6b69446f676560981b60209092019182526200006a91600e916200050b565b506040805180820190915260068082526510905096519160d21b60209092019182526200009a91600f916200050b565b506010805460ff1990811660091790915560026011819055601281905560138054909216600117909155601481905560158190556016819055601755601a805462ff00ff191662010000179055690878678326eac9000000601b5568d8d726b7177a800000601c553480156200010f57600080fd5b506040516200376f3803806200376f8339810160408190526200013291620005f3565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c543360009081526004602081815260409283902093909355815163c45a015560e01b81529151737a250d5630b4cf539739df2c5dacb4c659f2488d93849363c45a0155938181019391829003018186803b158015620001d357600080fd5b505afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005ce565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025757600080fd5b505afa1580156200026c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002929190620005ce565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002db57600080fd5b505af1158015620002f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003169190620005ce565b6001600160601b0319606091821b811660a0529082901b166080526001600760006200034a6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152600790935291208054909216600117909155601880549185166001600160a01b0319909216919091179055620003b182620003f5565b600b5460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050620006b1565b6000546001600160a01b03163314806200041957506001546001600160a01b031633145b6200046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620004e95760405162461bcd60e51b815260206004820152603960248201527f4f776e61626c653a2063616e277420616464207468652030206164647265737360448201527f2061732061206d756c746973696720636f6d706f6e656e742100000000000000606482015260840162000462565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b828054620005199062000651565b90600052602060002090601f0160209004810192826200053d576000855562000588565b82601f106200055857805160ff191683800117855562000588565b8280016001018555821562000588579182015b82811115620005885782518255916020019190600101906200056b565b50620005969291506200059a565b5090565b5b808211156200059657600081556001016200059b565b80516001600160a01b0381168114620005c957600080fd5b919050565b600060208284031215620005e157600080fd5b620005ec82620005b1565b9392505050565b600080604083850312156200060757600080fd5b6200061283620005b1565b91506200062260208401620005b1565b90509250929050565b6000828210156200064c57634e487b7160e01b600052601160045260246000fd5b500390565b600181811c908216806200066657607f821691505b602082108114156200068857634e487b7160e01b600052602260045260246000fd5b50919050565b600082620006ac57634e487b7160e01b600052601260045260246000fd5b500690565b60805160601c60a05160601c61305a62000715600039600081816102a901528181611aa601528181611c800152611d570152600081816103c60152818161256a015281816126320152818161266e015281816126e8015261270f015261305a6000f3fe60806040526004361061028b5760003560e01c80636bc87c3a1161015a578063a7c1d590116100c1578063d543dbeb1161007a578063d543dbeb146107f9578063db2e21bc14610819578063dd4670641461082e578063dd62ed3e1461084e578063ea2f0b3714610894578063f2fde38b146108b457600080fd5b8063a7c1d59014610746578063a9059cbb14610766578063b6c5232414610786578063b8edab001461079b578063bd9c7f10146107b9578063c49b9a80146107d957600080fd5b80638da5cb5b116101135780638da5cb5b1461069e5780638ee88c53146106bc57806395d89b41146106dc5780639e1ac9f6146106f1578063a457c2d714610711578063a69df4b51461073157600080fd5b80636bc87c3a146105e457806370a08231146105fa578063715018a61461061a5780637d1db4a51461062f578063861e769f1461064557806388f820201461066557600080fd5b80632ff3a70c116101fe578063437823ec116101b7578063437823ec1461050b5780634549b0391461052b578063457c194c1461054b5780634a74bb021461056b57806352390c021461058b5780635342acb4146105ab57600080fd5b80632ff3a70c14610453578063313ce567146104735780633685d4191461049557806339509351146104b55780633b124fe7146104d55780633bd5d173146104eb57600080fd5b806313114a9d1161025057806313114a9d146103955780631694505e146103b457806318160ddd146103e857806322976e0d146103fd57806323b872dd146104135780632d8381191461043357600080fd5b8062ac3c8a14610297578063061c82d0146102e857806306fdde031461030a578063095ea7b31461032c5780631112efb51461035c57600080fd5b3661029257005b600080fd5b3480156102a357600080fd5b506102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f457600080fd5b50610308610303366004612d32565b6108d4565b005b34801561031657600080fd5b5061031f610921565b6040516102df9190612d9c565b34801561033857600080fd5b5061034c610347366004612ceb565b6109b3565b60405190151581526020016102df565b34801561036857600080fd5b5061034c610377366004612c02565b6001600160a01b03166000908152600a602052604090205460ff1690565b3480156103a157600080fd5b50600d545b6040519081526020016102df565b3480156103c057600080fd5b506102cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f457600080fd5b50600b546103a6565b34801561040957600080fd5b506103a660165481565b34801561041f57600080fd5b5061034c61042e366004612c75565b6109ca565b34801561043f57600080fd5b506103a661044e366004612d32565b610a33565b34801561045f57600080fd5b5061030861046e366004612cb6565b610ab7565b34801561047f57600080fd5b5060105460405160ff90911681526020016102df565b3480156104a157600080fd5b506103086104b0366004612c02565b610b21565b3480156104c157600080fd5b5061034c6104d0366004612ceb565b610ced565b3480156104e157600080fd5b506103a660115481565b3480156104f757600080fd5b50610308610506366004612d32565b610d23565b34801561051757600080fd5b50610308610526366004612c02565b610e0d565b34801561053757600080fd5b506103a6610546366004612d4b565b610e70565b34801561055757600080fd5b50610308610566366004612d32565b610efd565b34801561057757600080fd5b50601a5461034c9062010000900460ff1681565b34801561059757600080fd5b506103086105a6366004612c02565b610f41565b3480156105b757600080fd5b5061034c6105c6366004612c02565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156105f057600080fd5b506103a660145481565b34801561060657600080fd5b506103a6610615366004612c02565b6110a9565b34801561062657600080fd5b50610308611108565b34801561063b57600080fd5b506103a6601b5481565b34801561065157600080fd5b50610308610660366004612c02565b61117f565b34801561067157600080fd5b5061034c610680366004612c02565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156106aa57600080fd5b506000546001600160a01b03166102cb565b3480156106c857600080fd5b506103086106d7366004612d32565b61125c565b3480156106e857600080fd5b5061031f6112a0565b3480156106fd57600080fd5b5061030861070c366004612d17565b6112af565b34801561071d57600080fd5b5061034c61072c366004612ceb565b6112f7565b34801561073d57600080fd5b50610308611346565b34801561075257600080fd5b50610308610761366004612c02565b61144c565b34801561077257600080fd5b5061034c610781366004612ceb565b6114ad565b34801561079257600080fd5b506003546103a6565b3480156107a757600080fd5b506018546001600160a01b03166102cb565b3480156107c557600080fd5b506103086107d4366004612d17565b6114ba565b3480156107e557600080fd5b506103086107f4366004612d17565b61150c565b34801561080557600080fd5b50610308610814366004612d32565b611596565b34801561082557600080fd5b506103086115fc565b34801561083a57600080fd5b50610308610849366004612d32565b611666565b34801561085a57600080fd5b506103a6610869366004612c3c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156108a057600080fd5b506103086108af366004612c02565b611700565b3480156108c057600080fd5b506103086108cf366004612c02565b611760565b6000546001600160a01b03163314806108f757506001546001600160a01b031633145b61091c5760405162461bcd60e51b815260040161091390612df1565b60405180910390fd5b601155565b6060600e805461093090612f07565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90612f07565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b60006109c033848461184d565b5060015b92915050565b60006109d7848484611971565b610a298433610a2485604051806060016040528060288152602001612fb8602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190611da9565b61184d565b5060019392505050565b6000600c54821115610a9a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610913565b6000610aa4611de3565b9050610ab08382611e06565b9392505050565b6000546001600160a01b0316331480610ada57506001546001600160a01b031633145b610af65760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331480610b4457506001546001600160a01b031633145b610b605760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03811660009081526008602052604090205460ff16610bc85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610913565b60005b600954811015610ce957816001600160a01b031660098281548110610bf257610bf2612f89565b6000918252602090912001546001600160a01b03161415610cd75760098054610c1d90600190612ef0565b81548110610c2d57610c2d612f89565b600091825260209091200154600980546001600160a01b039092169183908110610c5957610c59612f89565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff191690556009805480610cb157610cb1612f73565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ce181612f42565b915050610bcb565b5050565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916109c0918590610a249086611e48565b3360008181526008602052604090205460ff1615610d985760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610913565b6000610da383611ea7565b505050506001600160a01b038416600090815260046020526040902054919250610dcf91905082611f73565b6001600160a01b038316600090815260046020526040902055600c54610df59082611f73565b600c55600d54610e059084611e48565b600d55505050565b6000546001600160a01b0316331480610e3057506001546001600160a01b031633145b610e4c5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600b54831115610ec45760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610913565b81610ee3576000610ed484611ea7565b509395506109c4945050505050565b6000610eee84611ea7565b509295506109c4945050505050565b6000546001600160a01b0316331480610f2057506001546001600160a01b031633145b610f3c5760405162461bcd60e51b815260040161091390612df1565b601655565b6000546001600160a01b0316331480610f6457506001546001600160a01b031633145b610f805760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03811660009081526008602052604090205460ff1615610fe95760405162461bcd60e51b815260206004820152601860248201527f4163636f756e7420616c7265616479206578636c7564656400000000000000006044820152606401610913565b6001600160a01b03811660009081526004602052604090205415611043576001600160a01b03811660009081526004602052604090205461102990610a33565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6001600160a01b03811660009081526008602052604081205460ff16156110e657506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546109c490610a33565b6000546001600160a01b031633148061112b57506001546001600160a01b031633145b6111475760405162461bcd60e51b815260040161091390612df1565b600080546040516001600160a01b0390911690600080516020612fe0833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314806111a257506001546001600160a01b031633145b6111be5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03811661123a5760405162461bcd60e51b815260206004820152603960248201527f4f776e61626c653a2063616e277420616464207468652030206164647265737360448201527f2061732061206d756c746973696720636f6d706f6e656e7421000000000000006064820152608401610913565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061127f57506001546001600160a01b031633145b61129b5760405162461bcd60e51b815260040161091390612df1565b601455565b6060600f805461093090612f07565b6013805460ff19168215159081179091556040519081527f59fb13f7f8e0e42ab14ddf13ce1aebeb1474c6c26fe816e079e3fe60d51e1e4b906020015b60405180910390a150565b60006109c03384610a2485604051806060016040528060258152602001613000602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190611da9565b6002546001600160a01b031633146113ac5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610913565b60035442116113fd5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610913565b600254600080546040516001600160a01b039384169390911691600080516020612fe083398151915291a3600254600080546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b031633148061146f57506001546001600160a01b031633145b61148b5760405162461bcd60e51b815260040161091390612df1565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b60006109c0338484611971565b6000546001600160a01b03163314806114dd57506001546001600160a01b031633145b6114f95760405162461bcd60e51b815260040161091390612df1565b601a805460ff1916911515919091179055565b6000546001600160a01b031633148061152f57506001546001600160a01b031633145b61154b5760405162461bcd60e51b815260040161091390612df1565b601a8054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906112ec90831515815260200190565b6000546001600160a01b03163314806115b957506001546001600160a01b031633145b6115d55760405162461bcd60e51b815260040161091390612df1565b6115f66127106115f083600b54611fb590919063ffffffff16565b90611e06565b601b5550565b6000546001600160a01b031633148061161f57506001546001600160a01b031633145b61163b5760405162461bcd60e51b815260040161091390612df1565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f15050505050565b6000546001600160a01b031633148061168957506001546001600160a01b031633145b6116a55760405162461bcd60e51b815260040161091390612df1565b60008054600280546001600160a01b03199081166001600160a01b038416179091551690556116d48142612e97565b600355600080546040516001600160a01b0390911690600080516020612fe0833981519152908390a350565b6000546001600160a01b031633148061172357506001546001600160a01b031633145b61173f5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b031633148061178357506001546001600160a01b031633145b61179f5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b0381166118045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610913565b600080546040516001600160a01b0380851693921691600080516020612fe083398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166118af5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610913565b6001600160a01b0382166119105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610913565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610913565b6001600160a01b038216611a375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610913565b60008111611a995760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610913565b601954158015611ada57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b80611ae75750601a5460ff165b15611b73576000611af7846110a9565b11611b6a5760405162461bcd60e51b815260206004820152603d60248201527f41726520796f7520747279696e6720746f206c61756e636820776974686f757460448201527f2061637475616c6c7920686176696e6720746f6b656e733f205754463f0000006064820152608401610913565b611b7343601955565b6000546001600160a01b03848116911614801590611b9f57506000546001600160a01b03838116911614155b80611bc357506001600160a01b0383166000908152600a602052604090205460ff16155b15611c4057601b54811115611c405760405162461bcd60e51b815260206004820152603760248201527f42616279466c6f6b69446f67653a205472616e7366657220616d6f756e74206560448201527f78636565647320746865206d61785478416d6f756e742e0000000000000000006064820152608401610913565b6000611c4b306110a9565b9050601b548110611c5b5750601b545b601c5481108015908190611c775750601a54610100900460ff16155b8015611cb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611cc95750601a5462010000900460ff165b15611cdc57601c549150611cdc82612034565b6001600160a01b03851660009081526007602052604090205460019060ff1680611d1e57506001600160a01b03851660009081526007602052604090205460ff165b15611d27575060005b60135460009060ff168015611d4a5750436019546003611d479190612e97565b10155b15611d53575060015b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b03161415611d93575060015b611d9f88888886612145565b5050505050505050565b60008184841115611dcd5760405162461bcd60e51b81526004016109139190612d9c565b506000611dda8486612ef0565b95945050505050565b6000806000611df06122c8565b9092509050611dff8282611e06565b9250505090565b6000610ab083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061244a565b600080611e558385612e97565b905083811015610ab05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610913565b600080600080600080611edb6040518060800160405280600081526020016000815260200160008152602001600081525090565b611eff60405180606001604052806000815260200160008152602001600081525090565b6000806000611f0d8c612478565b918752602087018190526040870182905260009450849350839250611f3c918e9190611f37611de3565b6124bc565b828752602080880183905260409788018290528851908901519890970151929f919e509c50949a5094985093965091945050505050565b6000610ab083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611da9565b600082611fc4575060006109c4565b6000611fd08385612ed1565b905082611fdd8583612eaf565b14610ab05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610913565b601a805461ff0019166101001790556014546016546000916120679161205991611e48565b6016546115f0908590611fb5565b905060006120758383611f73565b90506000612084826002611e06565b905060006120928383611f73565b905060006120a08386611e48565b9050476120ac82612513565b60006120b84783611f73565b905060006120ca846115f0848b611fb5565b905060006120d88383611f73565b90506120e486826126e2565b6120ed826127f7565b60408051888152602081018590529081018790527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805461ff00191690555050505050505050565b8061215257612152612844565b6001600160a01b03841660009081526008602052604090205460ff16801561219357506001600160a01b03831660009081526008602052604090205460ff16155b156121a8576121a384848461287d565b6122a6565b6001600160a01b03841660009081526008602052604090205460ff161580156121e957506001600160a01b03831660009081526008602052604090205460ff165b156121f9576121a38484846129a3565b6001600160a01b03841660009081526008602052604090205460ff1615801561223b57506001600160a01b03831660009081526008602052604090205460ff16155b1561224b576121a3848484612a4c565b6001600160a01b03841660009081526008602052604090205460ff16801561228b57506001600160a01b03831660009081526008602052604090205460ff165b1561229b576121a3848484612a90565b6122a6848484612a4c565b806122c2576122c2601254601155601754601655601554601455565b50505050565b600c54600b546000918291825b60095481101561241a578260046000600984815481106122f7576122f7612f89565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612362575081600560006009848154811061233b5761233b612f89565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561237857600c54600b54945094505050509091565b6123be600460006009848154811061239257612392612f89565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611f73565b925061240660056000600984815481106123da576123da612f89565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611f73565b91508061241281612f42565b9150506122d5565b50600b54600c5461242a91611e06565b82101561244157600c54600b549350935050509091565b90939092509050565b6000818361246b5760405162461bcd60e51b81526004016109139190612d9c565b506000611dda8486612eaf565b60008060008061248785612b03565b9050600061249486612b18565b905060006124a28784611f73565b90506124ae8183611f73565b979296509094509092505050565b60008080806124cb8886611fb5565b90506000806124da8988611fb5565b905060006124e88989611fb5565b90506124f48483611f73565b92506125008382611f73565b939b939a50909850919650505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061254857612548612f89565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125c157600080fd5b505afa1580156125d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f99190612c1f565b8160018151811061260c5761260c612f89565b60200260200101906001600160a01b031690816001600160a01b031681525050612657307f00000000000000000000000000000000000000000000000000000000000000008461184d565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906126ac908590600090869030904290600401612e26565b600060405180830381600087803b1580156126c657600080fd5b505af11580156126da573d6000803e3d6000fd5b505050505050565b61270d307f00000000000000000000000000000000000000000000000000000000000000008461184d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806127546000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b1580156127b757600080fd5b505af11580156127cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127f09190612d6e565b5050505050565b6018546040516001600160a01b03909116908290600081818185875af1925050503d80600081146122c2576040519150601f19603f3d011682016040523d82523d6000602084013e6122c2565b6011541580156128545750601454155b1561285b57565b6011805460125560168054601755601480546015556000928390559082905555565b60008060008060008061288f87611ea7565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506128c19088611f73565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546128f09087611f73565b6001600160a01b03808b1660009081526004602052604080822093909355908a168152205461291f9086611e48565b6001600160a01b03891660009081526004602052604090205561294181612b40565b61294b8483612bc9565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161299091815260200190565b60405180910390a3505050505050505050565b6000806000806000806129b587611ea7565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506129e79087611f73565b6001600160a01b03808b16600090815260046020908152604080832094909455918b16815260059091522054612a1d9084611e48565b6001600160a01b03891660009081526005602090815260408083209390935560049052205461291f9086611e48565b600080600080600080612a5e87611ea7565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506128f09087611f73565b600080600080600080612aa287611ea7565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612ad49088611f73565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546129e79087611f73565b601154600090610ab060646115f08584611fb5565b60006109c460646115f0612b39601654601454611e4890919063ffffffff16565b8590611fb5565b6000612b4a611de3565b90506000612b588383611fb5565b30600090815260046020526040902054909150612b759082611e48565b3060009081526004602090815260408083209390935560089052205460ff1615612bc45730600090815260056020526040902054612bb39084611e48565b306000908152600560205260409020555b505050565b600c54612bd69083611f73565b600c55600d54612be69082611e48565b600d555050565b80358015158114612bfd57600080fd5b919050565b600060208284031215612c1457600080fd5b8135610ab081612f9f565b600060208284031215612c3157600080fd5b8151610ab081612f9f565b60008060408385031215612c4f57600080fd5b8235612c5a81612f9f565b91506020830135612c6a81612f9f565b809150509250929050565b600080600060608486031215612c8a57600080fd5b8335612c9581612f9f565b92506020840135612ca581612f9f565b929592945050506040919091013590565b60008060408385031215612cc957600080fd5b8235612cd481612f9f565b9150612ce260208401612bed565b90509250929050565b60008060408385031215612cfe57600080fd5b8235612d0981612f9f565b946020939093013593505050565b600060208284031215612d2957600080fd5b610ab082612bed565b600060208284031215612d4457600080fd5b5035919050565b60008060408385031215612d5e57600080fd5b82359150612ce260208401612bed565b600080600060608486031215612d8357600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015612dc957858101830151858201604001528201612dad565b81811115612ddb576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e765784516001600160a01b031683529383019391830191600101612e51565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612eaa57612eaa612f5d565b500190565b600082612ecc57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612eeb57612eeb612f5d565b500290565b600082821015612f0257612f02612f5d565b500390565b600181811c90821680612f1b57607f821691505b60208210811415612f3c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f5657612f56612f5d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114612fb457600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d23307017cef5f2a89c4adfe742fd93b89cfe6fdf31b324bac4dc0db6dec59fd64736f6c634300080700330000000000000000000000000d2382ae7f0cfc5da4c32da85d4e6ecddb57da7d000000000000000000000000bfc462d4075c8aee8508d63dffc6dd0226ff8427

Deployed Bytecode

0x60806040526004361061028b5760003560e01c80636bc87c3a1161015a578063a7c1d590116100c1578063d543dbeb1161007a578063d543dbeb146107f9578063db2e21bc14610819578063dd4670641461082e578063dd62ed3e1461084e578063ea2f0b3714610894578063f2fde38b146108b457600080fd5b8063a7c1d59014610746578063a9059cbb14610766578063b6c5232414610786578063b8edab001461079b578063bd9c7f10146107b9578063c49b9a80146107d957600080fd5b80638da5cb5b116101135780638da5cb5b1461069e5780638ee88c53146106bc57806395d89b41146106dc5780639e1ac9f6146106f1578063a457c2d714610711578063a69df4b51461073157600080fd5b80636bc87c3a146105e457806370a08231146105fa578063715018a61461061a5780637d1db4a51461062f578063861e769f1461064557806388f820201461066557600080fd5b80632ff3a70c116101fe578063437823ec116101b7578063437823ec1461050b5780634549b0391461052b578063457c194c1461054b5780634a74bb021461056b57806352390c021461058b5780635342acb4146105ab57600080fd5b80632ff3a70c14610453578063313ce567146104735780633685d4191461049557806339509351146104b55780633b124fe7146104d55780633bd5d173146104eb57600080fd5b806313114a9d1161025057806313114a9d146103955780631694505e146103b457806318160ddd146103e857806322976e0d146103fd57806323b872dd146104135780632d8381191461043357600080fd5b8062ac3c8a14610297578063061c82d0146102e857806306fdde031461030a578063095ea7b31461032c5780631112efb51461035c57600080fd5b3661029257005b600080fd5b3480156102a357600080fd5b506102cb7f000000000000000000000000212059b8f2af87ff94557fa7fb5e32249fc9bf8a81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f457600080fd5b50610308610303366004612d32565b6108d4565b005b34801561031657600080fd5b5061031f610921565b6040516102df9190612d9c565b34801561033857600080fd5b5061034c610347366004612ceb565b6109b3565b60405190151581526020016102df565b34801561036857600080fd5b5061034c610377366004612c02565b6001600160a01b03166000908152600a602052604090205460ff1690565b3480156103a157600080fd5b50600d545b6040519081526020016102df565b3480156103c057600080fd5b506102cb7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156103f457600080fd5b50600b546103a6565b34801561040957600080fd5b506103a660165481565b34801561041f57600080fd5b5061034c61042e366004612c75565b6109ca565b34801561043f57600080fd5b506103a661044e366004612d32565b610a33565b34801561045f57600080fd5b5061030861046e366004612cb6565b610ab7565b34801561047f57600080fd5b5060105460405160ff90911681526020016102df565b3480156104a157600080fd5b506103086104b0366004612c02565b610b21565b3480156104c157600080fd5b5061034c6104d0366004612ceb565b610ced565b3480156104e157600080fd5b506103a660115481565b3480156104f757600080fd5b50610308610506366004612d32565b610d23565b34801561051757600080fd5b50610308610526366004612c02565b610e0d565b34801561053757600080fd5b506103a6610546366004612d4b565b610e70565b34801561055757600080fd5b50610308610566366004612d32565b610efd565b34801561057757600080fd5b50601a5461034c9062010000900460ff1681565b34801561059757600080fd5b506103086105a6366004612c02565b610f41565b3480156105b757600080fd5b5061034c6105c6366004612c02565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156105f057600080fd5b506103a660145481565b34801561060657600080fd5b506103a6610615366004612c02565b6110a9565b34801561062657600080fd5b50610308611108565b34801561063b57600080fd5b506103a6601b5481565b34801561065157600080fd5b50610308610660366004612c02565b61117f565b34801561067157600080fd5b5061034c610680366004612c02565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156106aa57600080fd5b506000546001600160a01b03166102cb565b3480156106c857600080fd5b506103086106d7366004612d32565b61125c565b3480156106e857600080fd5b5061031f6112a0565b3480156106fd57600080fd5b5061030861070c366004612d17565b6112af565b34801561071d57600080fd5b5061034c61072c366004612ceb565b6112f7565b34801561073d57600080fd5b50610308611346565b34801561075257600080fd5b50610308610761366004612c02565b61144c565b34801561077257600080fd5b5061034c610781366004612ceb565b6114ad565b34801561079257600080fd5b506003546103a6565b3480156107a757600080fd5b506018546001600160a01b03166102cb565b3480156107c557600080fd5b506103086107d4366004612d17565b6114ba565b3480156107e557600080fd5b506103086107f4366004612d17565b61150c565b34801561080557600080fd5b50610308610814366004612d32565b611596565b34801561082557600080fd5b506103086115fc565b34801561083a57600080fd5b50610308610849366004612d32565b611666565b34801561085a57600080fd5b506103a6610869366004612c3c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156108a057600080fd5b506103086108af366004612c02565b611700565b3480156108c057600080fd5b506103086108cf366004612c02565b611760565b6000546001600160a01b03163314806108f757506001546001600160a01b031633145b61091c5760405162461bcd60e51b815260040161091390612df1565b60405180910390fd5b601155565b6060600e805461093090612f07565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90612f07565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b60006109c033848461184d565b5060015b92915050565b60006109d7848484611971565b610a298433610a2485604051806060016040528060288152602001612fb8602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190611da9565b61184d565b5060019392505050565b6000600c54821115610a9a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610913565b6000610aa4611de3565b9050610ab08382611e06565b9392505050565b6000546001600160a01b0316331480610ada57506001546001600160a01b031633145b610af65760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331480610b4457506001546001600160a01b031633145b610b605760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03811660009081526008602052604090205460ff16610bc85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610913565b60005b600954811015610ce957816001600160a01b031660098281548110610bf257610bf2612f89565b6000918252602090912001546001600160a01b03161415610cd75760098054610c1d90600190612ef0565b81548110610c2d57610c2d612f89565b600091825260209091200154600980546001600160a01b039092169183908110610c5957610c59612f89565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff191690556009805480610cb157610cb1612f73565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ce181612f42565b915050610bcb565b5050565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916109c0918590610a249086611e48565b3360008181526008602052604090205460ff1615610d985760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610913565b6000610da383611ea7565b505050506001600160a01b038416600090815260046020526040902054919250610dcf91905082611f73565b6001600160a01b038316600090815260046020526040902055600c54610df59082611f73565b600c55600d54610e059084611e48565b600d55505050565b6000546001600160a01b0316331480610e3057506001546001600160a01b031633145b610e4c5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600b54831115610ec45760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610913565b81610ee3576000610ed484611ea7565b509395506109c4945050505050565b6000610eee84611ea7565b509295506109c4945050505050565b6000546001600160a01b0316331480610f2057506001546001600160a01b031633145b610f3c5760405162461bcd60e51b815260040161091390612df1565b601655565b6000546001600160a01b0316331480610f6457506001546001600160a01b031633145b610f805760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03811660009081526008602052604090205460ff1615610fe95760405162461bcd60e51b815260206004820152601860248201527f4163636f756e7420616c7265616479206578636c7564656400000000000000006044820152606401610913565b6001600160a01b03811660009081526004602052604090205415611043576001600160a01b03811660009081526004602052604090205461102990610a33565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6001600160a01b03811660009081526008602052604081205460ff16156110e657506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546109c490610a33565b6000546001600160a01b031633148061112b57506001546001600160a01b031633145b6111475760405162461bcd60e51b815260040161091390612df1565b600080546040516001600160a01b0390911690600080516020612fe0833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314806111a257506001546001600160a01b031633145b6111be5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03811661123a5760405162461bcd60e51b815260206004820152603960248201527f4f776e61626c653a2063616e277420616464207468652030206164647265737360448201527f2061732061206d756c746973696720636f6d706f6e656e7421000000000000006064820152608401610913565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061127f57506001546001600160a01b031633145b61129b5760405162461bcd60e51b815260040161091390612df1565b601455565b6060600f805461093090612f07565b6013805460ff19168215159081179091556040519081527f59fb13f7f8e0e42ab14ddf13ce1aebeb1474c6c26fe816e079e3fe60d51e1e4b906020015b60405180910390a150565b60006109c03384610a2485604051806060016040528060258152602001613000602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190611da9565b6002546001600160a01b031633146113ac5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610913565b60035442116113fd5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610913565b600254600080546040516001600160a01b039384169390911691600080516020612fe083398151915291a3600254600080546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b031633148061146f57506001546001600160a01b031633145b61148b5760405162461bcd60e51b815260040161091390612df1565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b60006109c0338484611971565b6000546001600160a01b03163314806114dd57506001546001600160a01b031633145b6114f95760405162461bcd60e51b815260040161091390612df1565b601a805460ff1916911515919091179055565b6000546001600160a01b031633148061152f57506001546001600160a01b031633145b61154b5760405162461bcd60e51b815260040161091390612df1565b601a8054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906112ec90831515815260200190565b6000546001600160a01b03163314806115b957506001546001600160a01b031633145b6115d55760405162461bcd60e51b815260040161091390612df1565b6115f66127106115f083600b54611fb590919063ffffffff16565b90611e06565b601b5550565b6000546001600160a01b031633148061161f57506001546001600160a01b031633145b61163b5760405162461bcd60e51b815260040161091390612df1565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f15050505050565b6000546001600160a01b031633148061168957506001546001600160a01b031633145b6116a55760405162461bcd60e51b815260040161091390612df1565b60008054600280546001600160a01b03199081166001600160a01b038416179091551690556116d48142612e97565b600355600080546040516001600160a01b0390911690600080516020612fe0833981519152908390a350565b6000546001600160a01b031633148061172357506001546001600160a01b031633145b61173f5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b031633148061178357506001546001600160a01b031633145b61179f5760405162461bcd60e51b815260040161091390612df1565b6001600160a01b0381166118045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610913565b600080546040516001600160a01b0380851693921691600080516020612fe083398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166118af5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610913565b6001600160a01b0382166119105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610913565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610913565b6001600160a01b038216611a375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610913565b60008111611a995760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610913565b601954158015611ada57507f000000000000000000000000212059b8f2af87ff94557fa7fb5e32249fc9bf8a6001600160a01b0316826001600160a01b0316145b80611ae75750601a5460ff165b15611b73576000611af7846110a9565b11611b6a5760405162461bcd60e51b815260206004820152603d60248201527f41726520796f7520747279696e6720746f206c61756e636820776974686f757460448201527f2061637475616c6c7920686176696e6720746f6b656e733f205754463f0000006064820152608401610913565b611b7343601955565b6000546001600160a01b03848116911614801590611b9f57506000546001600160a01b03838116911614155b80611bc357506001600160a01b0383166000908152600a602052604090205460ff16155b15611c4057601b54811115611c405760405162461bcd60e51b815260206004820152603760248201527f42616279466c6f6b69446f67653a205472616e7366657220616d6f756e74206560448201527f78636565647320746865206d61785478416d6f756e742e0000000000000000006064820152608401610913565b6000611c4b306110a9565b9050601b548110611c5b5750601b545b601c5481108015908190611c775750601a54610100900460ff16155b8015611cb557507f000000000000000000000000212059b8f2af87ff94557fa7fb5e32249fc9bf8a6001600160a01b0316856001600160a01b031614155b8015611cc95750601a5462010000900460ff165b15611cdc57601c549150611cdc82612034565b6001600160a01b03851660009081526007602052604090205460019060ff1680611d1e57506001600160a01b03851660009081526007602052604090205460ff165b15611d27575060005b60135460009060ff168015611d4a5750436019546003611d479190612e97565b10155b15611d53575060015b60007f000000000000000000000000212059b8f2af87ff94557fa7fb5e32249fc9bf8a6001600160a01b0316876001600160a01b03161415611d93575060015b611d9f88888886612145565b5050505050505050565b60008184841115611dcd5760405162461bcd60e51b81526004016109139190612d9c565b506000611dda8486612ef0565b95945050505050565b6000806000611df06122c8565b9092509050611dff8282611e06565b9250505090565b6000610ab083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061244a565b600080611e558385612e97565b905083811015610ab05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610913565b600080600080600080611edb6040518060800160405280600081526020016000815260200160008152602001600081525090565b611eff60405180606001604052806000815260200160008152602001600081525090565b6000806000611f0d8c612478565b918752602087018190526040870182905260009450849350839250611f3c918e9190611f37611de3565b6124bc565b828752602080880183905260409788018290528851908901519890970151929f919e509c50949a5094985093965091945050505050565b6000610ab083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611da9565b600082611fc4575060006109c4565b6000611fd08385612ed1565b905082611fdd8583612eaf565b14610ab05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610913565b601a805461ff0019166101001790556014546016546000916120679161205991611e48565b6016546115f0908590611fb5565b905060006120758383611f73565b90506000612084826002611e06565b905060006120928383611f73565b905060006120a08386611e48565b9050476120ac82612513565b60006120b84783611f73565b905060006120ca846115f0848b611fb5565b905060006120d88383611f73565b90506120e486826126e2565b6120ed826127f7565b60408051888152602081018590529081018790527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805461ff00191690555050505050505050565b8061215257612152612844565b6001600160a01b03841660009081526008602052604090205460ff16801561219357506001600160a01b03831660009081526008602052604090205460ff16155b156121a8576121a384848461287d565b6122a6565b6001600160a01b03841660009081526008602052604090205460ff161580156121e957506001600160a01b03831660009081526008602052604090205460ff165b156121f9576121a38484846129a3565b6001600160a01b03841660009081526008602052604090205460ff1615801561223b57506001600160a01b03831660009081526008602052604090205460ff16155b1561224b576121a3848484612a4c565b6001600160a01b03841660009081526008602052604090205460ff16801561228b57506001600160a01b03831660009081526008602052604090205460ff165b1561229b576121a3848484612a90565b6122a6848484612a4c565b806122c2576122c2601254601155601754601655601554601455565b50505050565b600c54600b546000918291825b60095481101561241a578260046000600984815481106122f7576122f7612f89565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612362575081600560006009848154811061233b5761233b612f89565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561237857600c54600b54945094505050509091565b6123be600460006009848154811061239257612392612f89565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611f73565b925061240660056000600984815481106123da576123da612f89565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611f73565b91508061241281612f42565b9150506122d5565b50600b54600c5461242a91611e06565b82101561244157600c54600b549350935050509091565b90939092509050565b6000818361246b5760405162461bcd60e51b81526004016109139190612d9c565b506000611dda8486612eaf565b60008060008061248785612b03565b9050600061249486612b18565b905060006124a28784611f73565b90506124ae8183611f73565b979296509094509092505050565b60008080806124cb8886611fb5565b90506000806124da8988611fb5565b905060006124e88989611fb5565b90506124f48483611f73565b92506125008382611f73565b939b939a50909850919650505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061254857612548612f89565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125c157600080fd5b505afa1580156125d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f99190612c1f565b8160018151811061260c5761260c612f89565b60200260200101906001600160a01b031690816001600160a01b031681525050612657307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461184d565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906126ac908590600090869030904290600401612e26565b600060405180830381600087803b1580156126c657600080fd5b505af11580156126da573d6000803e3d6000fd5b505050505050565b61270d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461184d565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806127546000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b1580156127b757600080fd5b505af11580156127cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127f09190612d6e565b5050505050565b6018546040516001600160a01b03909116908290600081818185875af1925050503d80600081146122c2576040519150601f19603f3d011682016040523d82523d6000602084013e6122c2565b6011541580156128545750601454155b1561285b57565b6011805460125560168054601755601480546015556000928390559082905555565b60008060008060008061288f87611ea7565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506128c19088611f73565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546128f09087611f73565b6001600160a01b03808b1660009081526004602052604080822093909355908a168152205461291f9086611e48565b6001600160a01b03891660009081526004602052604090205561294181612b40565b61294b8483612bc9565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161299091815260200190565b60405180910390a3505050505050505050565b6000806000806000806129b587611ea7565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506129e79087611f73565b6001600160a01b03808b16600090815260046020908152604080832094909455918b16815260059091522054612a1d9084611e48565b6001600160a01b03891660009081526005602090815260408083209390935560049052205461291f9086611e48565b600080600080600080612a5e87611ea7565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506128f09087611f73565b600080600080600080612aa287611ea7565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612ad49088611f73565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546129e79087611f73565b601154600090610ab060646115f08584611fb5565b60006109c460646115f0612b39601654601454611e4890919063ffffffff16565b8590611fb5565b6000612b4a611de3565b90506000612b588383611fb5565b30600090815260046020526040902054909150612b759082611e48565b3060009081526004602090815260408083209390935560089052205460ff1615612bc45730600090815260056020526040902054612bb39084611e48565b306000908152600560205260409020555b505050565b600c54612bd69083611f73565b600c55600d54612be69082611e48565b600d555050565b80358015158114612bfd57600080fd5b919050565b600060208284031215612c1457600080fd5b8135610ab081612f9f565b600060208284031215612c3157600080fd5b8151610ab081612f9f565b60008060408385031215612c4f57600080fd5b8235612c5a81612f9f565b91506020830135612c6a81612f9f565b809150509250929050565b600080600060608486031215612c8a57600080fd5b8335612c9581612f9f565b92506020840135612ca581612f9f565b929592945050506040919091013590565b60008060408385031215612cc957600080fd5b8235612cd481612f9f565b9150612ce260208401612bed565b90509250929050565b60008060408385031215612cfe57600080fd5b8235612d0981612f9f565b946020939093013593505050565b600060208284031215612d2957600080fd5b610ab082612bed565b600060208284031215612d4457600080fd5b5035919050565b60008060408385031215612d5e57600080fd5b82359150612ce260208401612bed565b600080600060608486031215612d8357600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015612dc957858101830151858201604001528201612dad565b81811115612ddb576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e765784516001600160a01b031683529383019391830191600101612e51565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612eaa57612eaa612f5d565b500190565b600082612ecc57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612eeb57612eeb612f5d565b500290565b600082821015612f0257612f02612f5d565b500390565b600181811c90821680612f1b57607f821691505b60208210811415612f3c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f5657612f56612f5d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114612fb457600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d23307017cef5f2a89c4adfe742fd93b89cfe6fdf31b324bac4dc0db6dec59fd64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000d2382ae7f0cfc5da4c32da85d4e6ecddb57da7d000000000000000000000000bfc462d4075c8aee8508d63dffc6dd0226ff8427

-----Decoded View---------------
Arg [0] : param_addr (address): 0x0D2382ae7f0Cfc5DA4c32dA85d4E6ecdDb57da7D
Arg [1] : opt_multiSig (address): 0xbfc462D4075c8AeE8508D63dfFC6dd0226fF8427

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000d2382ae7f0cfc5da4c32da85d4e6ecddb57da7d
Arg [1] : 000000000000000000000000bfc462d4075c8aee8508d63dffc6dd0226ff8427


Deployed Bytecode Sourcemap

31007:25610:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32631:42;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3489:32:1;;;3471:51;;3459:2;3444:18;32631:42:0;;;;;;;;41254:90;;;;;;;;;;-1:-1:-1;41254:90:0;;;;;:::i;:::-;;:::i;:::-;;34450:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35748:169::-;;;;;;;;;;-1:-1:-1;35748:169:0;;;;;:::i;:::-;;:::i;:::-;;;4310:14:1;;4303:22;4285:41;;4273:2;4258:18;35748:169:0;4145:187:1;40901:126:0;;;;;;;;;;-1:-1:-1;40901:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;40990:31:0;40970:4;40990:31;;;:22;:31;;;;;;;;;40901:126;37021:81;;;;;;;;;;-1:-1:-1;37086:10:0;;37021:81;;;12811:25:1;;;12799:2;12784:18;37021:81:0;12665:177:1;32575:51:0;;;;;;;;;;;;;;;34703:89;;;;;;;;;;-1:-1:-1;34779:7:0;;34703:89;;32159:32;;;;;;;;;;;;;;;;35923:374;;;;;;;;;;-1:-1:-1;35923:374:0;;;;;:::i;:::-;;:::i;38763:239::-;;;;;;;;;;-1:-1:-1;38763:239:0;;;;;:::i;:::-;;:::i;40740:155::-;;;;;;;;;;-1:-1:-1;40740:155:0;;;;;:::i;:::-;;:::i;34620:77::-;;;;;;;;;;-1:-1:-1;34682:9:0;;34620:77;;34682:9;;;;14298:36:1;;14286:2;14271:18;34620:77:0;14156:184:1;39315:411:0;;;;;;;;;;-1:-1:-1;39315:411:0;;;;;:::i;:::-;;:::i;36303:254::-;;;;;;;;;;-1:-1:-1;36303:254:0;;;;;:::i;:::-;;:::i;31938:26::-;;;;;;;;;;;;;;;;37108:649;;;;;;;;;;-1:-1:-1;37108:649:0;;;;;:::i;:::-;;:::i;41033:105::-;;;;;;;;;;-1:-1:-1;41033:105:0;;;;;:::i;:::-;;:::i;37763:994::-;;;;;;;;;;-1:-1:-1;37763:994:0;;;;;:::i;:::-;;:::i;41350:114::-;;;;;;;;;;-1:-1:-1;41350:114:0;;;;;:::i;:::-;;:::i;32706:40::-;;;;;;;;;;-1:-1:-1;32706:40:0;;;;;;;;;;;39008:301;;;;;;;;;;-1:-1:-1;39008:301:0;;;;;:::i;:::-;;:::i;47351:118::-;;;;;;;;;;-1:-1:-1;47351:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;47436:27:0;47416:4;47436:27;;;:18;:27;;;;;;;;;47351:118;32062:32;;;;;;;;;;;;;;;;35207:188;;;;;;;;;;-1:-1:-1;35207:188:0;;;;;:::i;:::-;;:::i;21121:138::-;;;;;;;;;;;;;:::i;32753:51::-;;;;;;;;;;;;;;;;21640:235;;;;;;;;;;-1:-1:-1;21640:235:0;;;;;:::i;:::-;;:::i;36901:114::-;;;;;;;;;;-1:-1:-1;36901:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;36989:20:0;36969:4;36989:20;;;:11;:20;;;;;;;;;36901:114;20469:73;;;;;;;;;;-1:-1:-1;20507:7:0;20530:6;-1:-1:-1;;;;;20530:6:0;20469:73;;41470:114;;;;;;;;;;-1:-1:-1;41470:114:0;;;;;:::i;:::-;;:::i;34533:81::-;;;;;;;;;;;;;:::i;35059:142::-;;;;;;;;;;-1:-1:-1;35059:142:0;;;;;:::i;:::-;;:::i;36563:332::-;;;;;;;;;;-1:-1:-1;36563:332:0;;;;;:::i;:::-;;:::i;22312:307::-;;;;;;;;;;;;;:::i;46678:108::-;;;;;;;;;;-1:-1:-1;46678:108:0;;;;;:::i;:::-;;:::i;35401:175::-;;;;;;;;;;-1:-1:-1;35401:175:0;;;;;:::i;:::-;;:::i;21881:83::-;;;;;;;;;;-1:-1:-1;21949:9:0;;21881:83;;46792:101;;;;;;;;;;-1:-1:-1;46864:23:0;;-1:-1:-1;;;;;46864:23:0;46792:101;;34959:94;;;;;;;;;;-1:-1:-1;34959:94:0;;;;;:::i;:::-;;:::i;41732:155::-;;;;;;;;;;-1:-1:-1;41732:155:0;;;;;:::i;:::-;;:::i;41590:136::-;;;;;;;;;;-1:-1:-1;41590:136:0;;;;;:::i;:::-;;:::i;56509:105::-;;;;;;;;;;;;;:::i;22036:208::-;;;;;;;;;;-1:-1:-1;22036:208:0;;;;;:::i;:::-;;:::i;35582:160::-;;;;;;;;;;-1:-1:-1;35582:160:0;;;;;:::i;:::-;-1:-1:-1;;;;;35709:18:0;;;35683:7;35709:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35582:160;41144:104;;;;;;;;;;-1:-1:-1;41144:104:0;;;;;:::i;:::-;;:::i;21404:230::-;;;;;;;;;;-1:-1:-1;21404:230:0;;;;;:::i;:::-;;:::i;41254:90::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;;;;;;;;;41322:7:::1;:16:::0;41254:90::o;34450:77::-;34487:13;34516:5;34509:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34450:77;:::o;35748:169::-;35838:4;35854:39;15544:10;35877:7;35886:6;35854:8;:39::i;:::-;-1:-1:-1;35907:4:0;35748:169;;;;;:::o;35923:374::-;36041:4;36054:36;36064:6;36072:9;36083:6;36054:9;:36::i;:::-;36097:176;36114:6;15544:10;36150:116;36198:6;36150:116;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36150:19:0;;;;;;:11;:19;;;;;;;;15544:10;36150:33;;;;;;;;;;:37;:116::i;:::-;36097:8;:176::i;:::-;-1:-1:-1;36287:4:0;35923:374;;;;;:::o;38763:239::-;38830:7;38865;;38854;:18;;38846:73;;;;-1:-1:-1;;;38846:73:0;;6563:2:1;38846:73:0;;;6545:21:1;6602:2;6582:18;;;6575:30;6641:34;6621:18;;;6614:62;-1:-1:-1;;;6692:18:1;;;6685:40;6742:19;;38846:73:0;6361:406:1;38846:73:0;38926:19;38948:10;:8;:10::i;:::-;38926:32;-1:-1:-1;38972:24:0;:7;38926:32;38972:11;:24::i;:::-;38965:31;38763:239;-1:-1:-1;;;38763:239:0:o;40740:155::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40845:31:0;;;::::1;;::::0;;;:22:::1;:31;::::0;;;;:44;;-1:-1:-1;;40845:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40740:155::o;39315:411::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39391:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;39383:60;;;::::0;-1:-1:-1;;;39383:60:0;;8564:2:1;39383:60:0::1;::::0;::::1;8546:21:1::0;8603:2;8583:18;;;8576:30;8642:29;8622:18;;;8615:57;8689:18;;39383:60:0::1;8362:351:1::0;39383:60:0::1;39455:9;39450:271;39474:9;:16:::0;39470:20;::::1;39450:271;;;39526:7;-1:-1:-1::0;;;;;39510:23:0::1;:9;39520:1;39510:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;39510:12:0::1;:23;39506:208;;;39561:9;39571:16:::0;;:20:::1;::::0;39590:1:::1;::::0;39571:20:::1;:::i;:::-;39561:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;39546:9:::1;:12:::0;;-1:-1:-1;;;;;39561:31:0;;::::1;::::0;39556:1;;39546:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;39546:46:0::1;-1:-1:-1::0;;;;;39546:46:0;;::::1;;::::0;;39603:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;39634:11:::1;:20:::0;;;;:28;;-1:-1:-1;;39634:28:0::1;::::0;;39673:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;39673:15:0;;;;;-1:-1:-1;;;;;;39673:15:0::1;::::0;;;;;39450:271:::1;39315:411:::0;:::o;39506:208::-:1;39492:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39450:271;;;;39315:411:::0;:::o;36303:254::-;15544:10;36406:4;36476:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36476:34:0;;;;;;;;;;36406:4;;36422:111;;36460:7;;36476:50;;36515:10;36476:38;:50::i;37108:649::-;15544:10;37156:14;37209:19;;;:11;:19;;;;;;;;37208:20;37192:98;;;;-1:-1:-1;;;37192:98:0;;12050:2:1;37192:98:0;;;12032:21:1;12089:2;12069:18;;;12062:30;12128:34;12108:18;;;12101:62;-1:-1:-1;;;12179:18:1;;;12172:42;12231:19;;37192:98:0;11848:408:1;37192:98:0;37316:15;37345:19;37356:7;37345:10;:19::i;:::-;-1:-1:-1;;;;;;;;;37643:15:0;;;;;;:7;:15;;;;;;37315:49;;-1:-1:-1;37643:28:0;;:15;-1:-1:-1;37315:49:0;37643:19;:28::i;:::-;-1:-1:-1;;;;;37625:15:0;;;;;;:7;:15;;;;;:46;37688:7;;:20;;37700:7;37688:11;:20::i;:::-;37678:7;:30;37728:10;;:23;;37743:7;37728:14;:23::i;:::-;37715:10;:36;-1:-1:-1;;;37108:649:0:o;41033:105::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41098:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;41098:34:0::1;41128:4;41098:34;::::0;;41033:105::o;37763:994::-;37869:7;37907;;37896;:18;;37888:62;;;;-1:-1:-1;;;37888:62:0;;8920:2:1;37888:62:0;;;8902:21:1;8959:2;8939:18;;;8932:30;8998:33;8978:18;;;8971:61;9049:18;;37888:62:0;8718:355:1;37888:62:0;37962:17;37957:795;;38011:15;38040:19;38051:7;38040:10;:19::i;:::-;-1:-1:-1;38010:49:0;;-1:-1:-1;38330:14:0;;-1:-1:-1;;;;;38330:14:0;37957:795;38390:23;38425:19;38436:7;38425:10;:19::i;:::-;-1:-1:-1;38387:57:0;;-1:-1:-1;38722:22:0;;-1:-1:-1;;;;;38722:22:0;41350:114;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;41430:13:::1;:28:::0;41350:114::o;39008:301::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39085:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;39084:21;39076:58;;;::::0;-1:-1:-1;;;39076:58:0;;5780:2:1;39076:58:0::1;::::0;::::1;5762:21:1::0;5819:2;5799:18;;;5792:30;5858:26;5838:18;;;5831:54;5902:18;;39076:58:0::1;5578:348:1::0;39076:58:0::1;-1:-1:-1::0;;;;;39145:16:0;::::1;39164:1;39145:16:::0;;;:7:::1;:16;::::0;;;;;:20;39141:99:::1;;-1:-1:-1::0;;;;;39215:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;39195:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;39176:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;39141:99:::1;-1:-1:-1::0;;;;;39246:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;39246:27:0::1;39269:4;39246:27:::0;;::::1;::::0;;;39280:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;39280:23:0::1;::::0;;::::1;::::0;;39008:301::o;35207:188::-;-1:-1:-1;;;;;35293:20:0;;35273:7;35293:20;;;:11;:20;;;;;;;;35289:49;;;-1:-1:-1;;;;;;35322:16:0;;;;;:7;:16;;;;;;;35207:188::o;35289:49::-;-1:-1:-1;;;;;35372:16:0;;;;;;:7;:16;;;;;;35352:37;;:19;:37::i;21121:138::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;21224:1:::1;21208:6:::0;;21187:40:::1;::::0;-1:-1:-1;;;;;21208:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;21187:40:0;21224:1;;21187:40:::1;21251:1;21234:19:::0;;-1:-1:-1;;;;;;21234:19:0::1;::::0;;21121:138::o;21640:235::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21739:25:0;::::1;21723:116;;;::::0;-1:-1:-1;;;21723:116:0;;9280:2:1;21723:116:0::1;::::0;::::1;9262:21:1::0;9319:2;9299:18;;;9292:30;9358:34;9338:18;;;9331:62;9429:27;9409:18;;;9402:55;9474:19;;21723:116:0::1;9078:421:1::0;21723:116:0::1;21846:9;:23:::0;;-1:-1:-1;;;;;;21846:23:0::1;-1:-1:-1::0;;;;;21846:23:0;;;::::1;::::0;;;::::1;::::0;;21640:235::o;41470:114::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;41550:13:::1;:28:::0;41470:114::o;34533:81::-;34572:13;34601:7;34594:14;;;;;:::i;35059:142::-;35118:20;:31;;-1:-1:-1;;35118:31:0;;;;;;;;;;35161:34;;4285:41:1;;;35161:34:0;;4273:2:1;4258:18;35161:34:0;;;;;;;;35059:142;:::o;36563:332::-;36671:4;36687:184;15544:10;36725:7;36741:123;36790:15;36741:123;;;;;;;;;;;;;;;;;15544:10;36741:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36741:34:0;;;;;;;;;;;;:38;:123::i;22312:307::-;22368:14;;-1:-1:-1;;;;;22368:14:0;22386:10;22368:28;22352:97;;;;-1:-1:-1;;;22352:97:0;;12463:2:1;22352:97:0;;;12445:21:1;12502:2;12482:18;;;12475:30;12541:34;12521:18;;;12514:62;-1:-1:-1;;;12592:18:1;;;12585:33;12635:19;;22352:97:0;12261:399:1;22352:97:0;22482:9;;22464:15;:27;22456:71;;;;-1:-1:-1;;;22456:71:0;;11690:2:1;22456:71:0;;;11672:21:1;11729:2;11709:18;;;11702:30;11768:33;11748:18;;;11741:61;11819:18;;22456:71:0;11488:355:1;22456:71:0;22568:14;;;22560:6;;22539:44;;-1:-1:-1;;;;;22568:14:0;;;;22560:6;;;;-1:-1:-1;;;;;;;;;;;22539:44:0;;22599:14;;;22590:23;;-1:-1:-1;;;;;;22590:23:0;-1:-1:-1;;;;;22599:14:0;;;22590:23;;;;;;22312:307::o;46678:108::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;46747:23:::1;:33:::0;;-1:-1:-1;;;;;;46747:33:0::1;-1:-1:-1::0;;;;;46747:33:0;;;::::1;::::0;;;::::1;::::0;;46678:108::o;35401:175::-;35494:4;35510:42;15544:10;35534:9;35545:6;35510:9;:42::i;34959:94::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;35026:12:::1;:21:::0;;-1:-1:-1;;35026:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34959:94::o;41732:155::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;41803:21:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;41803:30:0;;::::1;;::::0;;41845:36:::1;::::0;::::1;::::0;::::1;::::0;41827:6;4310:14:1;4303:22;4285:41;;4273:2;4258:18;;4145:187;41590:136:0;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;41678:42:::1;41708:11;41678:25;41690:12;41678:7;;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:42::i;:::-;41663:12;:57:::0;-1:-1:-1;41590:136:0:o;56509:105::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;20507:7;20530:6;;56564:44:::1;::::0;-1:-1:-1;;;;;20530:6:0;;;;56586:21:::1;56564:44:::0;::::1;;;::::0;56586:21;;56564:44;20507:7;56564:44;56586:21;20530:6;56564:44;::::1;-1:-1:-1::0;;;;;56509:105:0:o;22036:208::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;22113:6:::1;::::0;;22096:14:::1;:23:::0;;-1:-1:-1;;;;;;22096:23:0;;::::1;-1:-1:-1::0;;;;;22113:6:0;::::1;22096:23;::::0;;;22126:19:::1;::::0;;22164:22:::1;22182:4:::0;22164:15:::1;:22;:::i;:::-;22152:9;:34:::0;22235:1:::1;22219:6:::0;;22198:40:::1;::::0;-1:-1:-1;;;;;22219:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;22198:40:0;22235:1;;22198:40:::1;22036:208:::0;:::o;41144:104::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41207:27:0::1;41237:5;41207:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;41207:35:0::1;::::0;;41144:104::o;21404:230::-;20671:6;;-1:-1:-1;;;;;20671:6:0;15544:10;20671:22;;:51;;-1:-1:-1;20697:9:0;;-1:-1:-1;;;;;20697:9:0;15544:10;20697:25;20671:51;20655:117;;;;-1:-1:-1;;;20655:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21489:22:0;::::1;21481:73;;;::::0;-1:-1:-1;;;21481:73:0;;6974:2:1;21481:73:0::1;::::0;::::1;6956:21:1::0;7013:2;6993:18;;;6986:30;7052:34;7032:18;;;7025:62;-1:-1:-1;;;7103:18:1;;;7096:36;7149:19;;21481:73:0::1;6772:402:1::0;21481:73:0::1;21587:6;::::0;;21566:38:::1;::::0;-1:-1:-1;;;;;21566:38:0;;::::1;::::0;21587:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;21566:38:0;::::1;21611:6;:17:::0;;-1:-1:-1;;;;;;21611:17:0::1;-1:-1:-1::0;;;;;21611:17:0;;;::::1;::::0;;;::::1;::::0;;21404:230::o;47475:339::-;-1:-1:-1;;;;;47584:19:0;;47576:68;;;;-1:-1:-1;;;47576:68:0;;11285:2:1;47576:68:0;;;11267:21:1;11324:2;11304:18;;;11297:30;11363:34;11343:18;;;11336:62;-1:-1:-1;;;11414:18:1;;;11407:34;11458:19;;47576:68:0;11083:400:1;47576:68:0;-1:-1:-1;;;;;47659:21:0;;47651:68;;;;-1:-1:-1;;;47651:68:0;;7381:2:1;47651:68:0;;;7363:21:1;7420:2;7400:18;;;7393:30;7459:34;7439:18;;;7432:62;-1:-1:-1;;;7510:18:1;;;7503:32;7552:19;;47651:68:0;7179:398:1;47651:68:0;-1:-1:-1;;;;;47728:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;47776:32;;12811:25:1;;;47776:32:0;;12784:18:1;47776:32:0;;;;;;;47475:339;;;:::o;47863:2439::-;-1:-1:-1;;;;;47967:18:0;;47959:68;;;;-1:-1:-1;;;47959:68:0;;10879:2:1;47959:68:0;;;10861:21:1;10918:2;10898:18;;;10891:30;10957:34;10937:18;;;10930:62;-1:-1:-1;;;11008:18:1;;;11001:35;11053:19;;47959:68:0;10677:401:1;47959:68:0;-1:-1:-1;;;;;48042:16:0;;48034:64;;;;-1:-1:-1;;;48034:64:0;;5376:2:1;48034:64:0;;;5358:21:1;5415:2;5395:18;;;5388:30;5454:34;5434:18;;;5427:62;-1:-1:-1;;;5505:18:1;;;5498:33;5548:19;;48034:64:0;5174:399:1;48034:64:0;48122:1;48113:6;:10;48105:64;;;;-1:-1:-1;;;48105:64:0;;10469:2:1;48105:64:0;;;10451:21:1;10508:2;10488:18;;;10481:30;10547:34;10527:18;;;10520:62;-1:-1:-1;;;10598:18:1;;;10591:39;10647:19;;48105:64:0;10267:405:1;48105:64:0;34932:10;;:15;;;48183:38;;;48204:17;-1:-1:-1;;;;;48198:23:0;:2;-1:-1:-1;;;;;48198:23:0;;48183:38;48182:56;;;-1:-1:-1;48226:12:0;;;;48182:56;48178:216;;;48285:1;48267:15;48277:4;48267:9;:15::i;:::-;:19;48249:120;;;;-1:-1:-1;;;48249:120:0;;6133:2:1;48249:120:0;;;6115:21:1;6172:2;6152:18;;;6145:30;6211:34;6191:18;;;6184:62;6282:31;6262:18;;;6255:59;6331:19;;48249:120:0;5931:425:1;48249:120:0;48378:8;34845:12;34832:10;:25;34798:65;48378:8;20507:7;20530:6;-1:-1:-1;;;;;48407:15:0;;;20530:6;;48407:15;;;;:32;;-1:-1:-1;20507:7:0;20530:6;-1:-1:-1;;;;;48426:13:0;;;20530:6;;48426:13;;48407:32;48406:69;;;-1:-1:-1;;;;;;48446:28:0;;;;;;:22;:28;;;;;;;;48444:31;48406:69;48402:209;;;48514:12;;48504:6;:22;;48486:117;;;;-1:-1:-1;;;48486:117:0;;8140:2:1;48486:117:0;;;8122:21:1;8179:2;8159:18;;;8152:30;8218:34;8198:18;;;8191:62;8289:25;8269:18;;;8262:53;8332:19;;48486:117:0;7938:419:1;48486:117:0;48885:28;48916:24;48934:4;48916:9;:24::i;:::-;48885:55;;49088:12;;49064:20;:36;49060:94;;-1:-1:-1;49134:12:0;;49060:94;49293:29;;49262:60;;;;;;;49342:47;;-1:-1:-1;49373:16:0;;;;;;;49372:17;49342:47;:83;;;;;49408:17;-1:-1:-1;;;;;49400:25:0;:4;-1:-1:-1;;;;;49400:25:0;;;49342:83;:115;;;;-1:-1:-1;49436:21:0;;;;;;;49342:115;49330:272;;;49497:29;;49474:52;;49558:36;49573:20;49558:14;:36::i;:::-;-1:-1:-1;;;;;49782:24:0;;49667:12;49782:24;;;:18;:24;;;;;;49682:4;;49782:24;;;:50;;-1:-1:-1;;;;;;49810:22:0;;;;;;:18;:22;;;;;;;;49782:50;49778:88;;;-1:-1:-1;49853:5:0;49778:88;49906:20;;49874:13;;49906:20;;:54;;;;;49948:12;49930:10;;49943:1;49930:14;;;;:::i;:::-;:30;;49906:54;49902:141;;;-1:-1:-1;50031:4:0;49902:141;50051:19;50095:17;-1:-1:-1;;;;;50089:23:0;:2;-1:-1:-1;;;;;50089:23:0;;50085:95;;;-1:-1:-1;50168:4:0;50085:95;50255:41;50270:4;50276:2;50280:6;50288:7;50255:14;:41::i;:::-;47952:2350;;;;;47863:2439;;;:::o;12024:198::-;12130:7;12162:12;12154:6;;;;12146:29;;;;-1:-1:-1;;;12146:29:0;;;;;;;;:::i;:::-;-1:-1:-1;12182:9:0;12194:5;12198:1;12194;:5;:::i;:::-;12182:17;12024:198;-1:-1:-1;;;;;12024:198:0:o;45309:154::-;45351:7;45368:15;45385;45404:19;:17;:19::i;:::-;45367:56;;-1:-1:-1;45367:56:0;-1:-1:-1;45437:20:0;45367:56;;45437:11;:20::i;:::-;45430:27;;;;45309:154;:::o;13340:126::-;13398:7;13421:39;13425:1;13428;13421:39;;;;;;;;;;;;;;;;;:3;:39::i;11185:167::-;11243:7;;11271:5;11275:1;11271;:5;:::i;:::-;11259:17;;11296:1;11291;:6;;11283:46;;;;-1:-1:-1;;;11283:46:0;;7784:2:1;11283:46:0;;;7766:21:1;7823:2;7803:18;;;7796:30;7862:29;7842:18;;;7835:57;7909:18;;11283:46:0;7582:351:1;42599:1016:0;42681:7;42697;42713;42729;42745;42761;42786:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42786:25:0;42818;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;42818:25:0;42860:23;42885:12;42899:18;42921:38;42943:7;42921:11;:38::i;:::-;42968:44;;;43021:15;;;:22;;;43052:21;;;:34;;;42968:26;;-1:-1:-1;42968:26:0;;-1:-1:-1;42968:26:0;;-1:-1:-1;43168:117:0;;43190:7;;42859:100;43266:10;:8;:10::i;:::-;43168:11;:117::i;:::-;43294:28;;;43331:26;;;;:44;;;43384:15;;;;:22;;;43522:26;;43557:15;;;;43581:21;;;;;43294:28;;43331:44;;-1:-1:-1;43384:22:0;-1:-1:-1;43522:26:0;;-1:-1:-1;43557:15:0;;-1:-1:-1;43581:21:0;;-1:-1:-1;42599:1016:0;;-1:-1:-1;;;;;42599:1016:0:o;11613:130::-;11671:7;11694:43;11698:1;11701;11694:43;;;;;;;;;;;;;;;;;:3;:43::i;12459:431::-;12517:7;12746:6;12742:37;;-1:-1:-1;12770:1:0;12763:8;;12742:37;12787:9;12799:5;12803:1;12799;:5;:::i;:::-;12787:17;-1:-1:-1;12828:1:0;12819:5;12823:1;12787:17;12819:5;:::i;:::-;:10;12811:56;;;;-1:-1:-1;;;12811:56:0;;9706:2:1;12811:56:0;;;9688:21:1;9745:2;9725:18;;;9718:30;9784:34;9764:18;;;9757:62;-1:-1:-1;;;9835:18:1;;;9828:31;9876:19;;12811:56:0;9504:397:1;50308:1462:0;33333:16;:23;;-1:-1:-1;;33333:23:0;;;;;50486:13:::1;::::0;50468::::1;::::0;33333:23;;50416:91:::1;::::0;50468:32:::1;::::0;:17:::1;:32::i;:::-;50441:13;::::0;50416:39:::1;::::0;:20;;:24:::1;:39::i;:91::-;50389:118:::0;-1:-1:-1;50514:24:0::1;50541:42;:20:::0;50389:118;50541:24:::1;:42::i;:::-;50514:69:::0;-1:-1:-1;50640:12:0::1;50655:23;50514:69:::0;50676:1:::1;50655:20;:23::i;:::-;50640:38:::0;-1:-1:-1;50685:17:0::1;50705:26;:16:::0;50640:38;50705:20:::1;:26::i;:::-;50685:46:::0;-1:-1:-1;50738:26:0::1;50767;:4:::0;50776:16;50767:8:::1;:26::i;:::-;50738:55:::0;-1:-1:-1;51076:21:0::1;51134:36;50738:55:::0;51134:16:::1;:36::i;:::-;51293:18;51314:41;:21;51340:14:::0;51314:25:::1;:41::i;:::-;51293:62:::0;-1:-1:-1;51364:27:0::1;51394:70;51439:18:::0;51394:32:::1;51293:62:::0;51409:16;51394:14:::1;:32::i;:70::-;51364:100:::0;-1:-1:-1;51471:27:0::1;51501:35;:10:::0;51364:100;51501:14:::1;:35::i;:::-;51471:65;;51578:44;51591:9;51602:19;51578:12;:44::i;:::-;51668:39;51687:19;51668:18;:39::i;:::-;51721:43;::::0;;14034:25:1;;;14090:2;14075:18;;14068:34;;;14118:18;;;14111:34;;;51721:43:0::1;::::0;14022:2:1;14007:18;51721:43:0::1;;;;;;;-1:-1:-1::0;;33371:16:0;:24;;-1:-1:-1;;33371:24:0;;;-1:-1:-1;;;;;;;;50308:1462:0:o;52961:756::-;53095:7;53090:28;;53104:14;:12;:14::i;:::-;-1:-1:-1;;;;;53131:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;53155:22:0;;;;;;:11;:22;;;;;;;;53154:23;53131:46;53127:547;;;53188:48;53210:6;53218:9;53229:6;53188:21;:48::i;:::-;53127:547;;;-1:-1:-1;;;;;53255:19:0;;;;;;:11;:19;;;;;;;;53254:20;:46;;;;-1:-1:-1;;;;;;53278:22:0;;;;;;:11;:22;;;;;;;;53254:46;53250:424;;;53311:46;53331:6;53339:9;53350:6;53311:19;:46::i;53250:424::-;-1:-1:-1;;;;;53376:19:0;;;;;;:11;:19;;;;;;;;53375:20;:47;;;;-1:-1:-1;;;;;;53400:22:0;;;;;;:11;:22;;;;;;;;53399:23;53375:47;53371:303;;;53433:44;53451:6;53459:9;53470:6;53433:17;:44::i;53371:303::-;-1:-1:-1;;;;;53495:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;53518:22:0;;;;;;:11;:22;;;;;;;;53495:45;53491:183;;;53551:48;53573:6;53581:9;53592:6;53551:21;:48::i;53491:183::-;53622:44;53640:6;53648:9;53659:6;53622:17;:44::i;:::-;53687:7;53682:29;;53696:15;47236;;47226:7;:25;47274:21;;47258:13;:37;47318:21;;47302:13;:37;47186:159;53696:15;52961:756;;;;:::o;45469:521::-;45563:7;;45595;;45520;;;;;45609:276;45633:9;:16;45629:20;;45609:276;;;45693:7;45669;:21;45677:9;45687:1;45677:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;45677:12:0;45669:21;;;;;;;;;;;;;:31;;:66;;;45728:7;45704;:21;45712:9;45722:1;45712:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;45712:12:0;45704:21;;;;;;;;;;;;;:31;45669:66;45665:106;;;45754:7;;45763;;45746:25;;;;;;;45469:521;;:::o;45665:106::-;45790:34;45802:7;:21;45810:9;45820:1;45810:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;45810:12:0;45802:21;;;;;;;;;;;;;45790:7;;:11;:34::i;:::-;45780:44;;45843:34;45855:7;:21;45863:9;45873:1;45863:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;45863:12:0;45855:21;;;;;;;;;;;;;45843:7;;:11;:34::i;:::-;45833:44;-1:-1:-1;45651:3:0;;;;:::i;:::-;;;;45609:276;;;-1:-1:-1;45917:7:0;;45905;;:20;;:11;:20::i;:::-;45895:7;:30;45891:61;;;45935:7;;45944;;45927:25;;;;;;45469:521;;:::o;45891:61::-;45967:7;;45976;;-1:-1:-1;45469:521:0;-1:-1:-1;45469:521:0:o;13936:280::-;14042:7;14073:12;14066:5;14058:28;;;;-1:-1:-1;;;14058:28:0;;;;;;;;:::i;:::-;-1:-1:-1;14093:9:0;14105:5;14109:1;14105;:5;:::i;44326:398::-;44409:7;44425;44441;44466:12;44481:24;44497:7;44481:15;:24::i;:::-;44466:39;;44512:18;44533:30;44555:7;44533:21;:30::i;:::-;44512:51;-1:-1:-1;44570:23:0;44596:17;:7;44608:4;44596:11;:17::i;:::-;44570:43;-1:-1:-1;44638:31:0;44570:43;44658:10;44638:19;:31::i;:::-;44620:49;44701:4;;-1:-1:-1;44707:10:0;;-1:-1:-1;44326:398:0;;-1:-1:-1;;;44326:398:0:o;44730:573::-;44893:7;;;;44968:24;:7;44980:11;44968;:24::i;:::-;44950:42;-1:-1:-1;44999:23:0;;45064:21;:4;45073:11;45064:8;:21::i;:::-;45057:28;-1:-1:-1;45094:18:0;45115:27;:10;45130:11;45115:14;:27::i;:::-;45094:48;-1:-1:-1;45169:17:0;:7;45181:4;45169:11;:17::i;:::-;45151:35;-1:-1:-1;45213:31:0;45151:35;45233:10;45213:19;:31::i;:::-;45266:7;;;;-1:-1:-1;45292:4:0;;-1:-1:-1;44730:573:0;;-1:-1:-1;;;;;;;44730:573:0:o;51776:525::-;51918:16;;;51932:1;51918:16;;;;;;;;51894:21;;51918:16;;;;;;;;;;-1:-1:-1;51918:16:0;51894:40;;51959:4;51941;51946:1;51941:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;51941:23:0;;;-1:-1:-1;;;;;51941:23:0;;;;;51981:15;-1:-1:-1;;;;;51981:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51971:4;51976:1;51971:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;51971:32:0;;;-1:-1:-1;;;;;51971:32:0;;;;;52012:62;52029:4;52044:15;52062:11;52012:8;:62::i;:::-;52105:190;;-1:-1:-1;;;52105:190:0;;-1:-1:-1;;;;;52105:15:0;:66;;;;:190;;52180:11;;52200:1;;52238:4;;52259;;52273:15;;52105:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51831:470;51776:525;:::o;52307:457::-;52447:62;52464:4;52479:15;52497:11;52447:8;:62::i;:::-;52544:15;-1:-1:-1;;;;;52544:31:0;;52584:9;52612:4;52626:11;52646:1;52683;52720:7;20507;20530:6;-1:-1:-1;;;;;20530:6:0;;20469:73;52720:7;52544:214;;;;;;-1:-1:-1;;;;;;52544:214:0;;;-1:-1:-1;;;;;3892:15:1;;;52544:214:0;;;3874:34:1;3924:18;;;3917:34;;;;3967:18;;;3960:34;;;;4010:18;;;4003:34;4074:15;;;4053:19;;;4046:44;52736:15:0;4106:19:1;;;4099:35;3808:19;;52544:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52307:457;;:::o;52770:114::-;52829:23;;:49;;-1:-1:-1;;;;;52829:23:0;;;;52866:6;;52829:49;;;;52866:6;52829:23;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46899:281;46942:7;;:12;:34;;;;-1:-1:-1;46958:13:0;;:18;46942:34;46938:47;;;46899:281::o;46938:47::-;47011:7;;;46993:15;:25;47049:13;;;47025:21;:37;47093:13;;;47069:21;:37;-1:-1:-1;47115:11:0;;;;47133:17;;;;47157;46899:281::o;55568:935::-;55715:15;55739:23;55771:12;55792:23;55824:12;55845:18;55873:19;55884:7;55873:10;:19::i;:::-;-1:-1:-1;;;;;56230:15:0;;;;;;:7;:15;;;;;;55706:186;;-1:-1:-1;55706:186:0;;-1:-1:-1;55706:186:0;;-1:-1:-1;55706:186:0;-1:-1:-1;55706:186:0;-1:-1:-1;55706:186:0;-1:-1:-1;56230:28:0;;56250:7;56230:19;:28::i;:::-;-1:-1:-1;;;;;56212:15:0;;;;;;:7;:15;;;;;;;;:46;;;;56283:7;:15;;;;:28;;56303:7;56283:19;:28::i;:::-;-1:-1:-1;;;;;56265:15:0;;;;;;;:7;:15;;;;;;:46;;;;56339:18;;;;;;;:39;;56362:15;56339:22;:39::i;:::-;-1:-1:-1;;;;;56318:18:0;;;;;;:7;:18;;;;;:60;56385:26;56400:10;56385:14;:26::i;:::-;56418:23;56430:4;56436;56418:11;:23::i;:::-;56470:9;-1:-1:-1;;;;;56453:44:0;56462:6;-1:-1:-1;;;;;56453:44:0;;56481:15;56453:44;;;;12811:25:1;;12799:2;12784:18;;12665:177;56453:44:0;;;;;;;;55679:824;;;;;;55568:935;;;:::o;54617:945::-;54760:15;54784:23;54816:12;54837:23;54869:12;54890:18;54918:19;54929:7;54918:10;:19::i;:::-;-1:-1:-1;;;;;55275:15:0;;;;;;:7;:15;;;;;;54751:186;;-1:-1:-1;54751:186:0;;-1:-1:-1;54751:186:0;;-1:-1:-1;54751:186:0;-1:-1:-1;54751:186:0;-1:-1:-1;54751:186:0;-1:-1:-1;55275:28:0;;54751:186;55275:19;:28::i;:::-;-1:-1:-1;;;;;55257:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;55331:18;;;;;:7;:18;;;;;:39;;55354:15;55331:22;:39::i;:::-;-1:-1:-1;;;;;55310:18:0;;;;;;:7;:18;;;;;;;;:60;;;;55398:7;:18;;;;:39;;55421:15;55398:22;:39::i;53723:888::-;53864:15;53888:23;53920:12;53941:23;53973:12;53994:18;54022:19;54033:7;54022:10;:19::i;:::-;-1:-1:-1;;;;;54391:15:0;;;;;;:7;:15;;;;;;53855:186;;-1:-1:-1;53855:186:0;;-1:-1:-1;53855:186:0;;-1:-1:-1;53855:186:0;-1:-1:-1;53855:186:0;-1:-1:-1;53855:186:0;-1:-1:-1;54391:28:0;;53855:186;54391:19;:28::i;39732:1002::-;39877:15;39901:23;39933:12;39954:23;39986:12;40007:18;40035:19;40046:7;40035:10;:19::i;:::-;-1:-1:-1;;;;;40394:15:0;;;;;;:7;:15;;;;;;39868:186;;-1:-1:-1;39868:186:0;;-1:-1:-1;39868:186:0;;-1:-1:-1;39868:186:0;-1:-1:-1;39868:186:0;-1:-1:-1;39868:186:0;-1:-1:-1;40394:28:0;;40414:7;40394:19;:28::i;:::-;-1:-1:-1;;;;;40376:15:0;;;;;;:7;:15;;;;;;;;:46;;;;40447:7;:15;;;;:28;;40467:7;40447:19;:28::i;46333:162::-;46435:7;;46397;;46456:33;46485:3;46456:24;:7;46435;46456:11;:24::i;46501:171::-;46586:7;46612:54;46662:3;46612:45;46624:32;46642:13;;46624;;:17;;:32;;;;:::i;:::-;46612:7;;:11;:45::i;45996:331::-;46055:19;46077:10;:8;:10::i;:::-;46055:32;-1:-1:-1;46094:18:0;46115:27;:10;46055:32;46115:14;:27::i;:::-;46190:4;46174:22;;;;:7;:22;;;;;;46094:48;;-1:-1:-1;46174:38:0;;46094:48;46174:26;:38::i;:::-;46165:4;46149:22;;;;:7;:22;;;;;;;;:63;;;;46223:11;:26;;;;;;46219:102;;;46299:4;46283:22;;;;:7;:22;;;;;;:38;;46310:10;46283:26;:38::i;:::-;46274:4;46258:22;;;;:7;:22;;;;;:63;46219:102;46048:279;;45996:331;:::o;41982:137::-;42056:7;;:17;;42068:4;42056:11;:17::i;:::-;42046:7;:27;42093:10;;:20;;42108:4;42093:14;:20::i;:::-;42080:10;:33;-1:-1:-1;;41982:137:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:52;;;570:1;567;560:12;522:52;602:9;596:16;621:31;646:5;621:31;:::i;687:388::-;755:6;763;816:2;804:9;795:7;791:23;787:32;784:52;;;832:1;829;822:12;784:52;871:9;858:23;890:31;915:5;890:31;:::i;:::-;940:5;-1:-1:-1;997:2:1;982:18;;969:32;1010:33;969:32;1010:33;:::i;:::-;1062:7;1052:17;;;687:388;;;;;:::o;1080:456::-;1157:6;1165;1173;1226:2;1214:9;1205:7;1201:23;1197:32;1194:52;;;1242:1;1239;1232:12;1194:52;1281:9;1268:23;1300:31;1325:5;1300:31;:::i;:::-;1350:5;-1:-1:-1;1407:2:1;1392:18;;1379:32;1420:33;1379:32;1420:33;:::i;:::-;1080:456;;1472:7;;-1:-1:-1;;;1526:2:1;1511:18;;;;1498:32;;1080:456::o;1541:315::-;1606:6;1614;1667:2;1655:9;1646:7;1642:23;1638:32;1635:52;;;1683:1;1680;1673:12;1635:52;1722:9;1709:23;1741:31;1766:5;1741:31;:::i;:::-;1791:5;-1:-1:-1;1815:35:1;1846:2;1831:18;;1815:35;:::i;:::-;1805:45;;1541:315;;;;;:::o;1861:::-;1929:6;1937;1990:2;1978:9;1969:7;1965:23;1961:32;1958:52;;;2006:1;2003;1996:12;1958:52;2045:9;2032:23;2064:31;2089:5;2064:31;:::i;:::-;2114:5;2166:2;2151:18;;;;2138:32;;-1:-1:-1;;;1861:315:1:o;2181:180::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:26;2345:9;2329:26;:::i;2366:180::-;2425:6;2478:2;2466:9;2457:7;2453:23;2449:32;2446:52;;;2494:1;2491;2484:12;2446:52;-1:-1:-1;2517:23:1;;2366:180;-1:-1:-1;2366:180:1:o;2551:248::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2729:9;2716:23;2706:33;;2758:35;2789:2;2778:9;2774:18;2758:35;:::i;2804:306::-;2892:6;2900;2908;2961:2;2949:9;2940:7;2936:23;2932:32;2929:52;;;2977:1;2974;2967:12;2929:52;3006:9;3000:16;2990:26;;3056:2;3045:9;3041:18;3035:25;3025:35;;3100:2;3089:9;3085:18;3079:25;3069:35;;2804:306;;;;;:::o;4572:597::-;4684:4;4713:2;4742;4731:9;4724:21;4774:6;4768:13;4817:6;4812:2;4801:9;4797:18;4790:34;4842:1;4852:140;4866:6;4863:1;4860:13;4852:140;;;4961:14;;;4957:23;;4951:30;4927:17;;;4946:2;4923:26;4916:66;4881:10;;4852:140;;;5010:6;5007:1;5004:13;5001:91;;;5080:1;5075:2;5066:6;5055:9;5051:22;5047:31;5040:42;5001:91;-1:-1:-1;5153:2:1;5132:15;-1:-1:-1;;5128:29:1;5113:45;;;;5160:2;5109:54;;4572:597;-1:-1:-1;;;4572:597:1:o;9906:356::-;10108:2;10090:21;;;10127:18;;;10120:30;10186:34;10181:2;10166:18;;10159:62;10253:2;10238:18;;9906:356::o;12847:980::-;13109:4;13157:3;13146:9;13142:19;13188:6;13177:9;13170:25;13214:2;13252:6;13247:2;13236:9;13232:18;13225:34;13295:3;13290:2;13279:9;13275:18;13268:31;13319:6;13354;13348:13;13385:6;13377;13370:22;13423:3;13412:9;13408:19;13401:26;;13462:2;13454:6;13450:15;13436:29;;13483:1;13493:195;13507:6;13504:1;13501:13;13493:195;;;13572:13;;-1:-1:-1;;;;;13568:39:1;13556:52;;13663:15;;;;13628:12;;;;13604:1;13522:9;13493:195;;;-1:-1:-1;;;;;;;13744:32:1;;;;13739:2;13724:18;;13717:60;-1:-1:-1;;;13808:3:1;13793:19;13786:35;13705:3;12847:980;-1:-1:-1;;;12847:980:1:o;14345:128::-;14385:3;14416:1;14412:6;14409:1;14406:13;14403:39;;;14422:18;;:::i;:::-;-1:-1:-1;14458:9:1;;14345:128::o;14478:217::-;14518:1;14544;14534:132;;14588:10;14583:3;14579:20;14576:1;14569:31;14623:4;14620:1;14613:15;14651:4;14648:1;14641:15;14534:132;-1:-1:-1;14680:9:1;;14478:217::o;14700:168::-;14740:7;14806:1;14802;14798:6;14794:14;14791:1;14788:21;14783:1;14776:9;14769:17;14765:45;14762:71;;;14813:18;;:::i;:::-;-1:-1:-1;14853:9:1;;14700:168::o;14873:125::-;14913:4;14941:1;14938;14935:8;14932:34;;;14946:18;;:::i;:::-;-1:-1:-1;14983:9:1;;14873:125::o;15003:380::-;15082:1;15078:12;;;;15125;;;15146:61;;15200:4;15192:6;15188:17;15178:27;;15146:61;15253:2;15245:6;15242:14;15222:18;15219:38;15216:161;;;15299:10;15294:3;15290:20;15287:1;15280:31;15334:4;15331:1;15324:15;15362:4;15359:1;15352:15;15216:161;;15003:380;;;:::o;15388:135::-;15427:3;-1:-1:-1;;15448:17:1;;15445:43;;;15468:18;;:::i;:::-;-1:-1:-1;15515:1:1;15504:13;;15388:135::o;15528:127::-;15589:10;15584:3;15580:20;15577:1;15570:31;15620:4;15617:1;15610:15;15644:4;15641:1;15634:15;15660:127;15721:10;15716:3;15712:20;15709:1;15702:31;15752:4;15749:1;15742:15;15776:4;15773:1;15766:15;15792:127;15853:10;15848:3;15844:20;15841:1;15834:31;15884:4;15881:1;15874:15;15908:4;15905:1;15898:15;16056:131;-1:-1:-1;;;;;16131:31:1;;16121:42;;16111:70;;16177:1;16174;16167:12;16111:70;16056:131;:::o

Swarm Source

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