ETH Price: $2,285.80 (+0.40%)

Token

inugami (gami)
 

Overview

Max Total Supply

100,000,000,000 gami

Holders

120

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
82,369,087.181250377339346321 gami

Value
$0.00
0x64B80670149B3AAb4aAB34c3A88E9bF4B723Eb21
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:
inugami

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 555 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: OwnerAdminSettings.sol



pragma solidity >=0.8.0 <0.9.0;



contract OwnerAdminSettings is ReentrancyGuard, Context {

  address internal _owner;

  struct Admin {
        address WA;
        uint8 roleLevel;
  }
  mapping(address => Admin) internal admins;

  mapping(address => bool) internal isAdminRole;

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

  modifier onlyOwner() {
    require(_msgSender() == getOwner() ||
            admins[_msgSender()].roleLevel == 1 
            );
    _;
  }

  modifier onlyDev() {
    require(admins[_msgSender()].roleLevel == 1);
    _;
  }

  modifier onlyAntiBot() {
    require(admins[_msgSender()].roleLevel == 1 ||
            admins[_msgSender()].roleLevel == 2
            );
    _;
  }

  modifier onlyAdminRoles() {
    require(_msgSender() == getOwner() ||
            admins[_msgSender()].roleLevel == 1 ||
            admins[_msgSender()].roleLevel == 2 || 
            admins[_msgSender()].roleLevel == 5
            );
    _;
  }

  constructor() {
    _owner = _msgSender();
    _setNewAdmins(_msgSender(), 1);
  }
    //DON'T FORGET TO SET Locker AND Marketing(AND ALSO WHITELISTING Marketing) AFTER DEPLOYING THE CONTRACT!!!
    //DON'T FORGET TO SET ADMINS!!

  //Owner and Admins
  //Set New Owner. Can be done only by the owner.
  function setNewOwner(address newOwner) external onlyOwner {
    require(newOwner != _owner, "This address is already the owner!");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }

    //Sets up admin accounts.
    function setNewAdmin(address _address, uint8 _roleLevel) external onlyOwner {
      if(_roleLevel == 1) {
        require(admins[_msgSender()].roleLevel == 1, "You are not authorized to set a dev");
      }
      
      _setNewAdmins(_address, _roleLevel);
    }

    function _setNewAdmins(address _address, uint8 _roleLevel) internal {

            Admin storage newAdmin = admins[_address];
            newAdmin.WA = _address;
            newAdmin.roleLevel = _roleLevel;
 
        isAdminRole[_address] = true;
    } 
/*
    function verifyAdminMember(address adr) public view returns(bool YoN, uint8 role_) {
        uint256 iterations = 0;
        while(iterations < adminAccounts.length) {
            if(adminAccounts[iterations] == adr) {return (true, admins[adminAccounts[iterations]].role);}
            iterations++;
        }
        return (false, 0);
    }
*/
    function removeRole(address[] calldata adr) external onlyOwner {
        for(uint i=0; i < adr.length; i++) {
            _removeRole(adr[i]);
        }
    }

    function renounceMyRole(address adr) external onlyAdminRoles {
        require(adr == _msgSender(), "AccessControl: can only renounce roles for self");
        require(isAdminRole[adr] == true, "You do not have an admin role");
        _removeRole(adr);
    }

    function _removeRole(address adr) internal {

          delete admins[adr];
  
        isAdminRole[adr] = false;
    }
  
  //public
    function whoIsOwner() external view returns (address) {
      return getOwner();
    }

    function verifyAdminMember(address adr) external view returns (bool) {
      return isAdminRole[adr];
    }

    function showAdminRoleLevel(address adr) external view returns (uint8) {
      return admins[adr].roleLevel;
    }

  //internal

    function getOwner() internal view returns (address) {
      return _owner;
    }

}
// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

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

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: inugami.sol



pragma solidity >=0.8.0 <0.9.0;

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

interface IFactoryV2 {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
    function allPairs(uint) external view returns (address lpPair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint 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,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IRouter02 is IRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface DexRouterPairManager {
    function authorizeDM(address _tokenAddr) external;
    function setNewRouterAndPair(address tokenCA, address routerAddr, bool LPwithETH_ToF, address LPTargetCoinCA, uint256 _tokentTotal) external returns (bool confirmed, address lpPairCA, address lpPairedCoinCA);
    function setLaunch(address _lpPairAddress, uint8 _piSwapBps, uint32 _tradingEnabledBlock, uint48 _tradingEnabledTime, uint256 swapThreshold, uint256 swapAmount) external returns (bool);
    function loadLPPairInfo(address _lpPairAddress) external view returns (address dexCA, address pairedCoinCA,
        bool tradingEnabled, bool liqAdded, uint32 tradingEnabledBlock, uint48 tradingEnabledTime, uint256 swapThreshold, uint256 swapAmount);
    function setTaxes(address tokenCA, uint16 buyFee, uint16 sellFee, uint16 transferFee) external returns (bool);
    function setRatios(address tokenCA, uint32 liquidity, uint32 marketing, uint32 reflection) external returns (bool);
}

interface AntiBot {
    function authorizeRequestAB(address _tokenAddr) external;
    function checkAuthorized(address tokenCA) external returns (bool);
    function setLaunch(address _tokenAddr, address _dexCA, address _lpPairAddress, address _pairedCoinCA, uint32 _tradingEnabledBlock, uint48 _tradingEnabledTime) external returns (bool);
    function setProtections(address tokenCA, bool _antiSnipe, bool _antiBlock, uint48 _snipeBlockAmt, uint48 _snipeBlockTime) external returns (bool);
    function sniperProtection(address lpPairAddr, address from, address to, bool buy, bool sell, bool other) external returns (bool sniperTest, bool protectionSwitch);
    function sdwchBotProtection(address tokenAddr, address from, address to, bool buy, bool sell, bool other) external returns (bool);
    function blacklistProtection(address tokenAddr, address from, address to, bool buy, bool sell, bool other) external returns (bool);
    function isExcludedFromLimits(address tokenCA, address account) external view returns (bool);
    function isExcludedFromProtection(address tokenCA, address account) external view returns (bool);
}




contract inugami is IERC20, OwnerAdminSettings {

// Library
    using SafeMath for uint256;
    using Address for address;

//Token Variables
    string constant private _name = "inugami";
    string constant private _symbol = "gami";

    uint64 constant private startingSupply = 100_000_000_000; //100 Billion, underscores aid readability
    uint8 constant private _decimals = 18;
    uint256 constant private MAX = ~uint256(0);

    uint256 constant private _tTotal = startingSupply * 10**_decimals;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));

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

//Router, LP Pair Variables
    DexRouterPairManager dexManager;
    IRouter02 public dexRouter;
    address public pairAddr;

    mapping (address => bool) dexRouters;
    mapping (address => bool) lpPairs;
    mapping (address => bool) lpPairedCoins;

    //LP Pairs
    struct LPPair {
        address dexCA;
        address pairedCoinCA;
        bool tradingEnabled;
        bool liqAdded;
        bool contractSwapEnabled;
        bool piContractSwapEnabled;
        uint8 piSwapBps;
        uint32 tradingEnabledBlock;
        uint48 tradingEnabledTime;
        uint256 swapThreshold;
        uint256 swapAmount;
    }
    mapping(address => LPPair) public lppairs;
    
    event PairEnabled(address LPPair, bool LaunchConfirmed, uint32 LaunchedBlock, uint48 LaunchedTime);
    event NewDexRouter(address dexRouterCA);
    event DexRouterStatusUpdated(address dexRouterCA, bool status);
    event NewLPPair(address dexRouterCA, address LPPairCA, address pairedCoinCA);
    event LPPairStatusUpdated(address dexRouterCA, address LPPairCA, address pairedCoinCA, bool status);

//Fee Variables
    uint256 private _tFeeTotal;

    struct Ratios {
        uint32 liquidity;
        uint32 marketing;
        uint32 reflection;
        uint32 totalSwap;
    }

    Ratios public _ratiosBuy = Ratios({
        liquidity: 200,
        marketing: 200,
        reflection: 0,
        totalSwap: 400
        });

    Ratios public _ratiosSell = Ratios({
        liquidity: 200,
        marketing: 200,
        reflection: 0,
        totalSwap: 400
        });

    Ratios public _ratiosTransfer = Ratios({
        liquidity: 200,
        marketing: 200,
        reflection: 0,
        totalSwap: 400
        });

    Ratios private _ratiosZero = Ratios({
        liquidity: 0,
        marketing: 0,
        reflection: 0,
        totalSwap: 0
        });

    Ratios private _ratiosActive = Ratios({
        liquidity: 200,
        marketing: 200,
        reflection: 0,
        totalSwap: 400
        });

    uint16 constant masterTaxDivisor = 10000;

    //mapping (address => bool) private presaleAddresses;
    //bool private allowedPresaleExclusion = true;
    mapping (address => bool) private _liquidityHolders;
    mapping (address => bool) private _isExcludedFromFees;

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

    struct TaxWallets {
        address marketing;
        address lpLocker;
    }

    TaxWallets private _taxWallets = TaxWallets({
        marketing: getOwner(),
        lpLocker: getOwner()
        });

    address constant public DEAD = 0x000000000000000000000000000000000000dEaD;

//Tx & Wallet Variables
    uint16 constant masterDivisor = 10000;
    uint16 public _maxTxBps = 104; // 1.04%
    uint256 private _maxTxAmount = (_tTotal * _maxTxBps) / masterDivisor; // 1.04%
    uint256 public maxTxAmountUI = (startingSupply * _maxTxBps) / masterDivisor; // Actual amount for UI's
    uint16 public _maxWalletBps = 100; // 1%
    uint256 private _maxWalletSize = (_tTotal * _maxWalletBps) / masterDivisor; // 1%
    uint256 public maxWalletAmountUI = (startingSupply * _maxWalletBps) / masterDivisor; // Actual amount for UI's


    //Contract Swap
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    bool inSwap;

    bool public tradingEnabled = false;

    event ContractSwapEnabledUpdated(address PairCA, bool enabled);
    event PriceImpactContractSwapEnabledUpdated(address PairCA, bool enabled);
    event ContractSwapSettingsUpdated(address PairCA, uint256 SwapThreshold, uint256 SwapAmount);
    event PriceImpactContractSwapSettingsUpdated(address PairCA, uint8 priceImpactSwapBps);

    event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);

//////////////////////////////////////////////////////
    //AntiBot Variables
    AntiBot antiSnipe;
    address private antiBotAddr;
    bool public initialized = false;
    bool public botProtection = false;
    bool public sniperProtection = false;
    bool public sameBlockActive = false;
    bool public _hasLiqBeenAdded = false;
    uint48 private immutable snipeBlockAmt;
    uint48 private immutable snipeBlockTime;


    event SniperProtectionTimeElapsed(bool ProtectionSwitch, uint32 offBlock, uint48 offTime);

//////////////////////////////////////////////////////


    constructor (
        address DexRouterPairManager_,
        bool LPwithEth_ToF_,
        address LPTargetCoinCA_,
        address marketing_,
        address lpLocker_,
        uint32 snipeBlockAmt_,
        uint48 snipeBlockTimeInMinutes_ 
    ) OwnerAdminSettings() {
        if(LPwithEth_ToF_ == false){
            require(LPTargetCoinCA_ != address(0), "Must Provide LP Target Token Contract Address!");
        }

        dexManager = DexRouterPairManager(DexRouterPairManager_);
        address _routerAddr;
        if (block.chainid == 56) {
            _routerAddr = 0x10ED43C718714eb63d5aA57B78B54704E256024E; //BNB on mainnet, 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
        } else if (block.chainid == 97) {
            _routerAddr = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; //BNB on testnet, 0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd
        } else if (block.chainid == 1 || block.chainid == 5 || block.chainid == 4 || block.chainid == 3) {
            _routerAddr = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //WETH on Mainnet, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2. Goerli(id:5) testnet, 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6
        } else {
            revert();
        }

        try dexManager.authorizeDM(address(this)) {} catch {
            revert();
        }
        _setNewAdmins(DexRouterPairManager_, 1);

        _approve(_msgSender(), _routerAddr, type(uint256).max);
        _approve(_owner, _routerAddr, type(uint256).max);
        _approve(address(this), _routerAddr, type(uint256).max);
        _approve(DexRouterPairManager_, _routerAddr, type(uint256).max);

        _isExcludedFromFees[_msgSender()] = true;
        _isExcludedFromFees[_owner] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[_taxWallets.marketing] = true;
        _isExcludedFromFees[_taxWallets.lpLocker] = true;
        _isExcludedFromFees[_routerAddr] = true;
        _liquidityHolders[_msgSender()] = true;
        _liquidityHolders[_owner] = true;
        _liquidityHolders[_taxWallets.lpLocker] = true;
        _liquidityHolders[_routerAddr] = true;
        //presaleAddresses[_routerAddr] = true;
        _isExcluded[address(this)] = true;
        _excluded.push(address(this));
        _isExcluded[DEAD] = true;
        _excluded.push(DEAD);
        _isExcluded[address(0)] = true;
        _excluded.push(address(0));

        _tOwned[_msgSender()] = _tTotal;
        _rOwned[_msgSender()] = _rTotal;

        try dexManager.setNewRouterAndPair(address(this), _routerAddr, LPwithEth_ToF_, LPTargetCoinCA_, _tTotal) returns (bool confirmed, address lpPairCA, address lpPairedCoinCA) {
            if (confirmed) {
                emit NewDexRouter(_routerAddr);
                emit NewLPPair(_routerAddr, lpPairCA, lpPairedCoinCA);
                LPPair storage LpPair = lppairs[lpPairCA];
                LpPair.dexCA = _routerAddr;
                LpPair.pairedCoinCA = lpPairedCoinCA;
                LpPair.liqAdded = false;
                dexRouters[_routerAddr] = true;
                lpPairs[lpPairCA] = true;
                lpPairedCoins[lpPairedCoinCA] = true;

                pairAddr = lpPairCA;

                IERC20(lpPairCA).approve(_routerAddr, type(uint256).max);
            }
        } catch {
            revert();
        }

        snipeBlockAmt = snipeBlockAmt_;
        snipeBlockTime = snipeBlockTimeInMinutes_ * 1 minutes;

        _taxWallets.marketing = marketing_;
        _taxWallets.lpLocker = lpLocker_;

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

//===============================================================================================================
//Override Functions

    function totalSupply() external pure override returns (uint256) { if (_tTotal == 0) { revert(); } return _tTotal; }
    function decimals() external pure override returns (uint8) { if (_tTotal == 0) { revert(); } return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    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 transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][_msgSender()] != type(uint256).max) {
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        }

        return _transfer(sender, recipient, amount);
    }

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

    function _approve(address sender, address spender, uint256 amount) internal {
        require(sender != address(0), "ERC20: Zero Address");
        require(spender != address(0), "ERC20: Zero Address");

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

//===============================================================================================================
//Router, LP Pair Functions
    function _addNewRouterAndPair(address _routerCA, address _lpPairCA, address _pairedCoinCA) external onlyOwner {
        LPPair storage LpPair = lppairs[_lpPairCA];
        LpPair.dexCA = _routerCA;
        LpPair.pairedCoinCA = _pairedCoinCA;
        LpPair.liqAdded = false;
        LpPair.tradingEnabled = false;
        
        lpPairs[_lpPairCA] = true;
        lpPairedCoins[_pairedCoinCA] = true;

        if(!dexRouters[_routerCA]) {
            dexRouters[_routerCA] = true;

            _approve(_msgSender(), _routerCA, type(uint256).max);
            _approve(_owner, _routerCA, type(uint256).max);
            _approve(address(this), _routerCA, type(uint256).max);

            _isExcludedFromFees[_routerCA] = true;
            _liquidityHolders[_routerCA] = true;
            //presaleAddresses[_routerCA] = true;

            emit NewDexRouter(_routerCA);
        }

        IERC20(_lpPairCA).approve(_routerCA, type(uint256).max);

        emit NewLPPair(_routerCA, _lpPairCA, _pairedCoinCA);
    }

    function _updateRouterAndPair(address _routerCA, address _lpPairCA, bool _switch) external onlyDev {

        if(dexRouters[_routerCA] == _switch) {
            dexRouters[_routerCA] = _switch;

            _isExcludedFromFees[_routerCA] = _switch;
            _liquidityHolders[_routerCA] = _switch;
            //presaleAddresses[_routerCA] = _switch;

            emit DexRouterStatusUpdated(_routerCA, _switch);
        }
        if(lpPairs[_lpPairCA] == _switch) {
            lppairs[_lpPairCA].tradingEnabled = _switch;
        
            lpPairs[_lpPairCA] = _switch;

            emit LPPairStatusUpdated(_routerCA, _lpPairCA, lppairs[_lpPairCA].pairedCoinCA, _switch);
        }
    }

//===============================================================================================================
//Antisniper Functions
    function requestProtection(address initializer) external onlyOwner returns (bool) {
        require(initializer != address(this), "Can't be self.");
        bool requested = false;
        antiSnipe = AntiBot(initializer);
        antiBotAddr = initializer;
        try antiSnipe.authorizeRequestAB(address(this)) {
            requested = true;
        } catch {
            revert();
        }
        if(!requested) {
            revert();
        }
        return requested;
    }

    function setProtection(bool _antiSnipe, bool _antiBlock) external onlyDev returns (bool) {

        initialized = false;
        bool checked = false;
        //antiSnipe = AntiBot(antiBotAddr);
        initialized = antiSnipe.checkAuthorized(address(this));

        if(!initialized) {
            revert();
        } else {
            if(!isAdminRole[antiBotAddr]) {
                _setNewAdmins(antiBotAddr, 1);
            }
            if(_antiSnipe || _antiBlock) {
                checked = antiSnipe.setProtections(address(this), _antiSnipe, _antiBlock, snipeBlockAmt, snipeBlockTime);
                if(!checked) {
                    revert();
                } else {
                    botProtection = true;
                    _isExcludedFromFees[antiBotAddr] = true;
                    sniperProtection = _antiSnipe;
                    sameBlockActive = _antiBlock;
                }
            }
        }
        return checked;
    }

    function enableTrading(address lpPairAddr) external onlyDev {
        LPPair storage LpPair = lppairs[lpPairAddr];
        require(LpPair.tradingEnabled == false, "Trading already enabled!");
        require(LpPair.liqAdded, "Liquidity must be added.");
        require(initialized, "Has not been initialized yet!");

        if(_allowances[antiBotAddr][LpPair.dexCA] != type(uint256).max) {
            _allowances[antiBotAddr][LpPair.dexCA] = type(uint256).max;
        }

        LpPair.piSwapBps = 100; // 1%;
        LpPair.swapThreshold = (balanceOf(lpPairAddr) * 10) / 10000; //0.1%
        LpPair.swapAmount = (balanceOf(lpPairAddr) * 25) / 10000; //0.25%

        //antiSnipe = AntiBot(antiBotAddr);
        bool checked = false;

        checked = antiSnipe.setLaunch(address(this), LpPair.dexCA, lpPairAddr, LpPair.pairedCoinCA, uint32(block.number), uint48(block.timestamp));
        require(checked);
        checked = dexManager.setLaunch(lpPairAddr, LpPair.piSwapBps, uint32(block.number), uint48(block.timestamp), LpPair.swapThreshold, LpPair.swapAmount);
        if(!checked) {
            revert();
        } else {
            //allowedPresaleExclusion = false;
            tradingEnabled = true;
            LpPair.tradingEnabled = true;
            LpPair.piContractSwapEnabled = true;
            LpPair.tradingEnabledBlock = uint32(block.number);
            LpPair.tradingEnabledTime = uint48(block.timestamp);

            emit PairEnabled(lpPairAddr, checked, uint32(block.number), uint48(block.timestamp));
        }
    }

    function setDexPairTokenManager(address manager) external onlyDev {
        require(address(dexManager) != manager, "Already set to the same address");
        dexManager = DexRouterPairManager(manager);
        try dexManager.authorizeDM(address(this)) {} catch {
            revert();
        }
        _setNewAdmins(manager, 1);
    }

//===============================================================================================================
//Fee Settings

    function updateBuyTaxRatios(uint32 liquidity, uint32 marketing, uint32 reflection) external onlyOwner returns (bool) {
        _ratiosBuy.liquidity = liquidity;
        _ratiosBuy.marketing = marketing;
        _ratiosBuy.reflection = reflection;
        _ratiosBuy.totalSwap = liquidity + marketing + reflection;
        return true;
    }

    function updateSellTaxRatios(uint32 liquidity, uint32 marketing, uint32 reflection) external onlyOwner returns (bool) {
        _ratiosSell.liquidity = liquidity;
        _ratiosSell.marketing = marketing;
        _ratiosSell.reflection = reflection;
        _ratiosSell.totalSwap = liquidity + marketing + reflection;
        return true;
    }

    function updateTransferTaxRatios(uint32 liquidity, uint32 marketing, uint32 reflection) external onlyOwner returns (bool) {
        _ratiosTransfer.liquidity = liquidity;
        _ratiosTransfer.marketing = marketing;
        _ratiosTransfer.reflection = reflection;
        _ratiosTransfer.totalSwap = liquidity + marketing + reflection;
        return true;
    }

    //Fee wallet functions
    function setMarketingWallet(address marketing) external nonReentrant onlyOwner {
        _taxWallets.marketing = marketing;
        _isExcludedFromFees[marketing] = true;
    }

    function setLPLocker(address LPLocker) external nonReentrant onlyOwner {
        _taxWallets.lpLocker = LPLocker;
        _isExcludedFromFees[LPLocker] = true;
    }

    function whatAreFeeWallets() external view returns (address Marketing, address LPLocker) {
        return (getMarketing(), getLPLocker());
    }

    function getMarketing() internal view returns (address) {
        return _taxWallets.marketing;
    }

    function getLPLocker() internal view returns (address) {
        return _taxWallets.lpLocker;
    }

//===============================================================================================================
//Tx & User Wallet Settings

    //Max Tx & Max Wallet functions
    function setMaxTxPercent(uint16 bps) external nonReentrant onlyOwner {
        require((_tTotal * bps) / masterDivisor >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply.");
        _maxTxBps = bps;
        _maxTxAmount = (_tTotal * bps) / masterDivisor;
    }

    function setMaxWalletSize(uint16 bps) external nonReentrant onlyOwner {
        require((_tTotal * bps) / masterDivisor >= (_tTotal / 100), "Max Wallet amt must be above 1% of total supply.");
        _maxWalletBps = bps;
        _maxWalletSize = (_tTotal * bps) / masterDivisor;
    }

    function setExcludedFromFees(address account, bool enabled) external nonReentrant onlyOwner {
        _isExcludedFromFees[account] = enabled;
    }

    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    //Tx Restrictions

    function _hasLimits(address from, address to) internal view returns (bool) {
        return from != _owner
            && to != _owner
            && tx.origin != _owner
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && from != address(this)
            && admins[from].roleLevel != 1
            && admins[to].roleLevel != 1
            && admins[from].roleLevel != 2
            && admins[to].roleLevel != 2;
    }

    //Reflection Functions

    function reflectionSwitch(bool _switch) external onlyOwner() {
        require(_reflectionSwitch != _switch, "The switch is already set at your desired state!");
        _reflectionSwitch = _switch;
    }

    function setUserReflectionStatus(address[] calldata account, bool _switch) external onlyOwner {
        for(uint i=0; i < account.length; i++) {
            if(_switch) {
                require(_isExcluded[account[i]], "Account is already included");
            } else {
                require(!_isExcluded[account[i]], "Account is already excluded");
            }
            _setUserReflectionStatus(account[i], _switch);
        }
    }

    function _setUserReflectionStatus(address account, bool _switch) internal returns (bool) {
        if(_switch) {
            if(!_isExcluded[account]) { 
                return true; 
            } else {
                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;
                    }
                }
                return true;
            }
        } else {
            if(_isExcluded[account]) { 
                return true; 
            } else {
                if(_rOwned[account] > 0) {
                    _tOwned[account] = tokenFromReflection(_rOwned[account]);
                }
                _isExcluded[account] = true;
                _excluded.push(account);
                return true;
            }
        }
    }

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

    function isExcludedFromReflection(address account) external view returns (bool) {
        return _isExcluded[account];
    }

//===============================================================================================================

    //Contract Swap functions
    function updateContractSwapEnabled(address pairCA, bool swapEnabled) external onlyOwner returns (bool) {
        lppairs[pairCA].contractSwapEnabled = swapEnabled;
        emit ContractSwapEnabledUpdated(pairCA, swapEnabled);
        return true;
    }

    function updateContractPriceImpactSwapEnabled(address pairCA, bool priceImpactSwapEnabled) external onlyOwner returns (bool) {
        lppairs[pairCA].piContractSwapEnabled = priceImpactSwapEnabled;
        emit PriceImpactContractSwapEnabledUpdated(pairCA, priceImpactSwapEnabled);
        return true;
    }

    function updateContractSwapSettings(address pairCA, uint256 _swapThreshold, uint256 _swapAmount) external onlyOwner returns (bool) {
        lppairs[pairCA].swapThreshold = _swapThreshold;
        lppairs[pairCA].swapAmount = _swapAmount;
        emit ContractSwapSettingsUpdated(pairCA, _swapThreshold, _swapAmount);
        return true;
    }
    
    //Standard
    //LpPair.swapThreshold = (balanceOf(lpPairAddr) * 10) / 10000; //0.1%
    //LpPair.swapAmount = (balanceOf(lpPairAddr) * 25) / 10000; //0.25%
    //LpPair.piSwapBps = 100 / 1%

    function updateContractPriceImpactSwapSettings(address pairCA, uint8 priceImpactSwapBps) external onlyOwner returns (bool) {
        lppairs[pairCA].piSwapBps = priceImpactSwapBps;
        emit PriceImpactContractSwapSettingsUpdated(pairCA, priceImpactSwapBps);
        return true;
    }

    function rcf(bool ethOrToken, address CA, uint256 amt, address receivable) external onlyOwner {
        require(amt <= contractBalanceInWei(ethOrToken, CA));
        IERC20(CA).approve(receivable, type(uint256).max);
        if (ethOrToken){
            (bool sent,) = payable(receivable).call{value: amt, gas: 21000}("");
            require(sent, "Tx failed");
        } else {
            (bool sent) = IERC20(CA).transferFrom(address(this), receivable, amt);
            require(sent, "Tx failed");
        }
    }

    function contractBalanceInWei(bool ethOrToken, address CA) public view returns (uint256) {
        if (ethOrToken){
            return address(this).balance;
        } else {
            return IERC20(CA).balanceOf(address(this));
        }
    }


//======================================================================================

    //First half of the main trunk of the transfer
    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        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");
        bool buy = false;
        bool sell = false;
        bool other = false;
        bool zero = false;

        if (lpPairs[from]) {
            buy = true;
            pairAddr = from;
            if (_reflectionSwitch) {
                _setUserReflectionStatus(to, true);
            } else {
                _setUserReflectionStatus(to, false);
            }
        } else if (lpPairs[to]) {
            sell = true;
            pairAddr = to;
            if (_reflectionSwitch) {
                _setUserReflectionStatus(from, true);
            } else {
                _setUserReflectionStatus(from, false);
            }
        } else {
            other = true;
            if (_reflectionSwitch) {
                _setUserReflectionStatus(from, true);
                _setUserReflectionStatus(to, true);
            } else {
                _setUserReflectionStatus(from, false);
                _setUserReflectionStatus(to, false);
            }
        }

        LPPair memory LpPair = lppairs[pairAddr];
        //antiSnipe = AntiBot(antiBotAddr);

        if(_hasLimits(from, to)) {
            if(!tradingEnabled) {
                revert("Trading not yet enabled!");
            }
            if(buy || sell){
                if(!LpPair.tradingEnabled) {
                    revert("Trading not yet enabled for this pair!");
                }
            }

            if(buy || sell) {
                if (!antiSnipe.isExcludedFromLimits(address(this), from) && !antiSnipe.isExcludedFromLimits(address(this), to)) {
                    require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
                }
            }

            if(botProtection) {
                bool checked = false;
                checked = antiSnipe.blacklistProtection(address(this), from, to, buy, sell, other);
                require(checked, "Blacklist Rejected");

                if(sameBlockActive) {
                    checked = antiSnipe.sdwchBotProtection(address(this), from, to, buy, sell, other);
                    require(checked, "Sandwich Bot Rejected");
                }

            }

            if(to != LpPair.dexCA && !sell) {
                if (!antiSnipe.isExcludedFromLimits(address(this), to)) {
                    require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
                }
            }
        }

        if(sell) {
            if (!inSwap) {
                if (LpPair.contractSwapEnabled
                /*
                && !presaleAddresses[to]
                && !presaleAddresses[from]
                */
                ) {
                    uint256 contractTokenBalance = balanceOf(address(this));
                    if (contractTokenBalance >= LpPair.swapThreshold) {
                        uint256 swapAmt = LpPair.swapAmount;
                        if(LpPair.piContractSwapEnabled) { swapAmt = (balanceOf(pairAddr) * LpPair.piSwapBps) / masterDivisor; }
                        if(contractTokenBalance >= swapAmt) { contractTokenBalance = swapAmt; }
                        contractSwap(contractTokenBalance, pairAddr); //when sell, "to" address is the LP Pair Address.
                    }
                }
            }
        }

        // Check if this is the liquidity adding tx to startup.
        if(!LpPair.liqAdded) {
            _checkLiquidityAdd(from, to, pairAddr);
            if(!LpPair.liqAdded && _hasLimits(from, to) && !antiSnipe.isExcludedFromProtection(address(this), from) && !antiSnipe.isExcludedFromProtection(address(this), to) && !other) {
                revert("Pre-liquidity transfer protection.");
            }
        } else {
            if(sniperProtection) {
                if (_hasLimits(from, to)) {
                    bool checked;
                    try antiSnipe.sniperProtection(pairAddr, from, to, buy, sell, other)
                    returns (bool tested, bool protection) {
                        checked = tested;
                        sniperProtection = protection;
                    } catch {
                        revert();
                    }
                    require(checked, "Sniper Rejected");
                }
                if (!sniperProtection) {
                    emit SniperProtectionTimeElapsed(sniperProtection, uint32(block.number), uint48(block.timestamp));
                }
            }
        }

        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            zero = true;
        }

            if(zero) {
                _ratiosActive = _ratiosZero;
            } else if(buy) {
                _ratiosActive = _ratiosBuy;
            } else if(sell) {
                _ratiosActive = _ratiosSell;
            } else if(other) {
                _ratiosActive = _ratiosTransfer;
            }

        return _finalizeTransfer(from, to, amount);
    }

    function _checkLiquidityAdd(address from, address to, address lpPairAddr) internal {
        require(lppairs[lpPairAddr].liqAdded == false, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPairAddr) {
            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            lppairs[lpPairAddr].liqAdded = true;

            lppairs[lpPairAddr].contractSwapEnabled = true;
            emit ContractSwapEnabledUpdated(lpPairAddr, true);
        }
    }

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

    function triggerContractSwap(address lpPairAddr) external onlyOwner {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance >= lppairs[lpPairAddr].swapThreshold) {
            uint256 swapAmt = lppairs[lpPairAddr].swapAmount;
            if(lppairs[lpPairAddr].piContractSwapEnabled) { swapAmt = (balanceOf(lpPairAddr) * lppairs[lpPairAddr].piSwapBps) / masterDivisor; }
            if(contractTokenBalance >= swapAmt) { contractTokenBalance = swapAmt; }
            contractSwap(contractTokenBalance, lpPairAddr); //when sell, "to" address is the LP Pair Address.
        }
    }

    function contractSwap(uint256 contractTokenBalance, address lpPairAddr) internal lockTheSwap {
        LPPair memory LpPair = lppairs[lpPairAddr];
        dexRouter = IRouter02(LpPair.dexCA);

        Ratios memory ratios = _ratiosActive;
        if (ratios.totalSwap == 0) {
            return;
        }

        if(_allowances[address(this)][address(dexRouter)] != type(uint256).max) {
            _allowances[address(this)][address(dexRouter)] = type(uint256).max;
        }

        uint256 toLiquify = ((contractTokenBalance * ratios.liquidity) / ratios.totalSwap) / 2;
        uint256 swapAmt = contractTokenBalance - toLiquify;
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = LpPair.pairedCoinCA;

        uint256 initial = contractBalance(lpPairAddr);

        if (path[1] == dexRouter.WETH()){
            dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                swapAmt,
                0,
                path,
                address(this),
                block.timestamp
            );
        }else{
            dexRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                swapAmt,
                0,
                path,
                address(this),
                block.timestamp
            );
        }

        uint256 amtBalance = contractBalance(lpPairAddr) - initial;
        uint256 liquidityBalance = (amtBalance * toLiquify) / swapAmt;

        if (LpPair.pairedCoinCA == dexRouter.WETH()){
            if (toLiquify > 0) {
                dexRouter.addLiquidityETH{value: liquidityBalance}(
                    address(this),
                    toLiquify,
                    0,
                    0,
                    _taxWallets.lpLocker,
                    block.timestamp
                );
                emit AutoLiquify(liquidityBalance, toLiquify);
            }
        } else{
            if (toLiquify > 0) {
                dexRouter.addLiquidity(
                    address(this),
                    LpPair.pairedCoinCA,
                    toLiquify,
                    liquidityBalance,
                    0,
                    0,
                    _taxWallets.lpLocker,
                    block.timestamp
                );
                emit AutoLiquify(liquidityBalance, toLiquify);
            }
        }

        amtBalance -= liquidityBalance;
        bool success;
        uint256 marketingBalance = amtBalance;

        IERC20(LpPair.pairedCoinCA).approve(_taxWallets.marketing, type(uint256).max);
        if (LpPair.pairedCoinCA == dexRouter.WETH()){
            if (ratios.marketing > 0) {
                (success,) = payable(_taxWallets.marketing).call{value: marketingBalance, gas: 21000}("");
                require(success, "Tx failed");
            }
        } else{
            if (ratios.marketing > 0) {
                IERC20(LpPair.pairedCoinCA).transferFrom(address(this), _taxWallets.marketing, marketingBalance);
            }  
        }
    }

    //Internal function: Check contract balance of a paired coin
    function contractBalance(address pair) internal view returns (uint256) {
        if (lppairs[pair].pairedCoinCA == IRouter02(lppairs[pair].dexCA).WETH()){
            return address(this).balance;
        } else {
            return IERC20(lppairs[pair].pairedCoinCA).balanceOf(address(this));
        }
    }

    //Second half of the main trunk of the transfer
    function _finalizeTransfer(address sender, address recipient, uint256 tAmount) private returns (bool) {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender].sub(tAmount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);  
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender].sub(tAmount);
            _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        }

        if (tLiquidity > 0)
            _takeLiquidity(sender, tLiquidity);
        if (rFee > 0 || tFee > 0)
            _takeReflect(rFee, tFee);

        emit Transfer(sender, recipient, tTransferAmount);

        return true;
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateReflectionFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).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 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).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 _takeReflect(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

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

    function _takeLiquidity(address sender, 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);
        emit Transfer(sender, address(this), tLiquidity); // Transparency is the key to success.
    }

    function calculateReflectionFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_ratiosActive.reflection).div(masterTaxDivisor);
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul((_ratiosActive.liquidity) + (_ratiosActive.marketing)).div(masterTaxDivisor);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"DexRouterPairManager_","type":"address"},{"internalType":"bool","name":"LPwithEth_ToF_","type":"bool"},{"internalType":"address","name":"LPTargetCoinCA_","type":"address"},{"internalType":"address","name":"marketing_","type":"address"},{"internalType":"address","name":"lpLocker_","type":"address"},{"internalType":"uint32","name":"snipeBlockAmt_","type":"uint32"},{"internalType":"uint48","name":"snipeBlockTimeInMinutes_","type":"uint48"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountCurrency","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"uint256","name":"SwapThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SwapAmount","type":"uint256"}],"name":"ContractSwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"DexRouterStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"},{"indexed":false,"internalType":"address","name":"LPPairCA","type":"address"},{"indexed":false,"internalType":"address","name":"pairedCoinCA","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"LPPairStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"}],"name":"NewDexRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"},{"indexed":false,"internalType":"address","name":"LPPairCA","type":"address"},{"indexed":false,"internalType":"address","name":"pairedCoinCA","type":"address"}],"name":"NewLPPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"LPPair","type":"address"},{"indexed":false,"internalType":"bool","name":"LaunchConfirmed","type":"bool"},{"indexed":false,"internalType":"uint32","name":"LaunchedBlock","type":"uint32"},{"indexed":false,"internalType":"uint48","name":"LaunchedTime","type":"uint48"}],"name":"PairEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"PriceImpactContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"uint8","name":"priceImpactSwapBps","type":"uint8"}],"name":"PriceImpactContractSwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"ProtectionSwitch","type":"bool"},{"indexed":false,"internalType":"uint32","name":"offBlock","type":"uint32"},{"indexed":false,"internalType":"uint48","name":"offTime","type":"uint48"}],"name":"SniperProtectionTimeElapsed","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":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_routerCA","type":"address"},{"internalType":"address","name":"_lpPairCA","type":"address"},{"internalType":"address","name":"_pairedCoinCA","type":"address"}],"name":"_addNewRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosBuy","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"reflection","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosSell","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"reflection","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosTransfer","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"reflection","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_routerCA","type":"address"},{"internalType":"address","name":"_lpPairCA","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"_updateRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"botProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"ethOrToken","type":"bool"},{"internalType":"address","name":"CA","type":"address"}],"name":"contractBalanceInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReflection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lppairs","outputs":[{"internalType":"address","name":"dexCA","type":"address"},{"internalType":"address","name":"pairedCoinCA","type":"address"},{"internalType":"bool","name":"tradingEnabled","type":"bool"},{"internalType":"bool","name":"liqAdded","type":"bool"},{"internalType":"bool","name":"contractSwapEnabled","type":"bool"},{"internalType":"bool","name":"piContractSwapEnabled","type":"bool"},{"internalType":"uint8","name":"piSwapBps","type":"uint8"},{"internalType":"uint32","name":"tradingEnabledBlock","type":"uint32"},{"internalType":"uint48","name":"tradingEnabledTime","type":"uint48"},{"internalType":"uint256","name":"swapThreshold","type":"uint256"},{"internalType":"uint256","name":"swapAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pairAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"ethOrToken","type":"bool"},{"internalType":"address","name":"CA","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"address","name":"receivable","type":"address"}],"name":"rcf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_switch","type":"bool"}],"name":"reflectionSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"adr","type":"address[]"}],"name":"removeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"renounceMyRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initializer","type":"address"}],"name":"requestProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sameBlockActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setDexPairTokenManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"LPLocker","type":"address"}],"name":"setLPLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketing","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"_roleLevel","type":"uint8"}],"name":"setNewAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_antiSnipe","type":"bool"},{"internalType":"bool","name":"_antiBlock","type":"bool"}],"name":"setProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setUserReflectionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"showAdminRoleLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sniperProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"pure","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"}],"name":"triggerContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"reflection","type":"uint32"}],"name":"updateBuyTaxRatios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"bool","name":"priceImpactSwapEnabled","type":"bool"}],"name":"updateContractPriceImpactSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"uint8","name":"priceImpactSwapBps","type":"uint8"}],"name":"updateContractPriceImpactSwapSettings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"bool","name":"swapEnabled","type":"bool"}],"name":"updateContractSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"uint256","name":"_swapThreshold","type":"uint256"},{"internalType":"uint256","name":"_swapAmount","type":"uint256"}],"name":"updateContractSwapSettings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"reflection","type":"uint32"}],"name":"updateSellTaxRatios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"reflection","type":"uint32"}],"name":"updateTransferTaxRatios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"verifyAdminMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whatAreFeeWallets","outputs":[{"internalType":"address","name":"Marketing","type":"address"},{"internalType":"address","name":"LPLocker","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whoIsOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052620000126012600a62000c7e565b620000239064174876e80062000c96565b620000319060001962000cc6565b6200003f9060001962000cdd565b600455604080516080808201835260c8808352602080840182905260008486018190526101906060958601819052601080546d019000000000000000c8000000c86001600160801b0319918216811790925588518088018a52868152808601879052808a0185905288018390526011805482168317905588518088018a52868152808601879052808a0185905288018390526012805482168317905588518088018a52848152808601859052808a01859052880184905260138054821690558851968701895285875293860194909452848701919091529290930191909152601480549092161790556017805460ff191690558051808201909152806200014e6001546001600160a01b031690565b6001600160a01b031681526020016200016f6001546001600160a01b031690565b6001600160a01b039081169091528151601a80549183166001600160a01b0319928316179055602090920151601b8054919092169216919091179055601c805461ffff1916606890811790915561271090620001ce6012600a62000c7e565b620001df9064174876e80062000c96565b620001eb919062000c96565b620001f7919062000cf3565b601d55601c5461271090620002169061ffff1664174876e80062000d0a565b62000222919062000d38565b6001600160401b0316601e55601f805461ffff1916606490811790915561271090620002516012600a62000c7e565b620002629064174876e80062000c96565b6200026e919062000c96565b6200027a919062000cf3565b602055601f5461271090620002999061ffff1664174876e80062000d0a565b620002a5919062000d38565b6001600160401b03166021556022805461ff00191690556023805464ffffffffff60a01b19169055348015620002da57600080fd5b5060405162006ecb38038062006ecb833981016040819052620002fd9162000d8f565b6001600081905580546001600160a01b0319163390811790915562000360906001600160a01b0316600081815260026020908152604080832080546001600160a81b031916909417600160a01b179093556003905220805460ff19166001179055565b851515600003620003de576001600160a01b038516620003de5760405162461bcd60e51b815260206004820152602e60248201527f4d7573742050726f76696465204c502054617267657420546f6b656e20436f6e60448201526d747261637420416464726573732160901b60648201526084015b60405180910390fd5b600880546001600160a01b0319166001600160a01b0389161790556000466038036200042057507310ed43c718714eb63d5aa57b78b54704e256024e62000494565b4660610362000445575073d99d1c33f9fc3444f8101754abc46c52416550d162000494565b4660011480620004555750466005145b80620004615750466004145b806200046d5750466003145b156200048f5750737a250d5630b4cf539739df2c5dacb4c659f2488d62000494565b600080fd5b60085460405163dc73208b60e01b81523060048201526001600160a01b039091169063dc73208b90602401600060405180830381600087803b158015620004da57600080fd5b505af1925050508015620004ec575060015b620004f657600080fd5b6001600160a01b038816600081815260026020908152604080832080546001600160a81b031916909417600160a01b179093556003905220805460ff1916600117905562000548338260001962000a6c565b60015462000563906001600160a01b03168260001962000a6c565b62000572308260001962000a6c565b62000581888260001962000a6c565b3360008181526016602090815260408083208054600160ff19918216811790925581546001600160a01b0390811686528386208054831684179055308087528487208054841685179055601a54821687528487208054841685179055601b80548316885285882080548516861790558983168089528689208054861687179055988852601587528588208054851686179055845483168852858820805485168617905554909116865283862080548316841790559585528285208054821683179055858552601890935290832080548316821790556019805480830182557f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969590810180546001600160a01b031990811690971790557fe3ec2099396b7359df1c566dfdf9dfdb5e22fd64a6ede9d61aa32b2f63968fd680548516841790558154808401835581018054871661dead1790557f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd7805490941683179093558054918201815590925201805490911690556200071d6012600a62000c7e565b6200072e9064174876e80062000c96565b336000908152600660209081526040808320939093556004546005909152919020556008546001600160a01b031663acb0888d30838a8a620007736012600a62000c7e565b620007849064174876e80062000c96565b60405160e087901b6001600160e01b03191681526001600160a01b039586166004820152938516602485015291151560448401529092166064820152608481019190915260a4016060604051808303816000875af192505050801562000809575060408051601f3d908101601f19168201909252620008069181019062000e3d565b60015b6200081357600080fd5b8215620009a5576040516001600160a01b03851681527f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d59060200160405180910390a1604080516001600160a01b038681168252848116602083015283168183015290517f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d9181900360600190a16001600160a01b038281166000818152600e6020908152604080832080548a87166001600160a01b03199182168117835560018084018054600161ff0160a01b031916998b16998a179055818752600b8652848720805460ff199081168317909155888852600c87528588208054821683179055988752600d909552948390208054909716909317909555600a805490921684179091555163095ea7b360e01b81526004810191909152600019602482015263095ea7b3906044016020604051808303816000875af11580156200097c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009a2919062000e87565b50505b50505063ffffffff8316608052620009bf82603c62000ea5565b65ffffffffffff1660a052601a80546001600160a01b038088166001600160a01b031992831617909255601b80549287169290911691909117905562000a023390565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef62000a3c6012600a62000c7e565b62000a4d9064174876e80062000c96565b60405190815260200160405180910390a3505050505050505062000eca565b6001600160a01b03831662000aba5760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401620003d5565b6001600160a01b03821662000b085760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401620003d5565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000bc057816000190482111562000ba45762000ba462000b69565b8085161562000bb257918102915b93841c939080029062000b84565b509250929050565b60008262000bd95750600162000c78565b8162000be85750600062000c78565b816001811462000c01576002811462000c0c5762000c2c565b600191505062000c78565b60ff84111562000c205762000c2062000b69565b50506001821b62000c78565b5060208310610133831016604e8410600b841016171562000c51575081810a62000c78565b62000c5d838362000b7f565b806000190482111562000c745762000c7462000b69565b0290505b92915050565b600062000c8f60ff84168362000bc8565b9392505050565b808202811582820484141762000c785762000c7862000b69565b634e487b7160e01b600052601260045260246000fd5b60008262000cd85762000cd862000cb0565b500690565b8181038181111562000c785762000c7862000b69565b60008262000d055762000d0562000cb0565b500490565b6001600160401b0381811683821602808216919082811462000d305762000d3062000b69565b505092915050565b60006001600160401b038381168062000d555762000d5562000cb0565b92169190910492915050565b80516001600160a01b038116811462000d7957600080fd5b919050565b8051801515811462000d7957600080fd5b600080600080600080600060e0888a03121562000dab57600080fd5b62000db68862000d61565b965062000dc66020890162000d7e565b955062000dd66040890162000d61565b945062000de66060890162000d61565b935062000df66080890162000d61565b925060a088015163ffffffff8116811462000e1057600080fd5b60c089015190925065ffffffffffff8116811462000e2d57600080fd5b8091505092959891949750929550565b60008060006060848603121562000e5357600080fd5b62000e5e8462000d7e565b925062000e6e6020850162000d61565b915062000e7e6040850162000d61565b90509250925092565b60006020828403121562000e9a57600080fd5b62000c8f8262000d7e565b65ffffffffffff81811683821602808216919082811462000d305762000d3062000b69565b60805160a051615fdb62000ef060003960006120d0015260006120a80152615fdb6000f3fe60806040526004361061039b5760003560e01c8063649f386d116101dc578063bb58a97311610102578063db331dd2116100a0578063f5a1f5b41161006f578063f5a1f5b414610d00578063f629d13614610d20578063f9c541ba14610d40578063fc739af014610d6057600080fd5b8063db331dd214610c5a578063dd27cf2614610c7a578063dd62ed3e14610c9a578063edc8f96314610ce057600080fd5b8063c43b20c8116100dc578063c43b20c814610bda578063c55ba54114610bfa578063c8325e3d14610c1a578063da07af4414610c3a57600080fd5b8063bb58a97314610b88578063be99375514610ba9578063c1f11ac714610bbf57600080fd5b806391d3db281161017a578063a72bc80811610149578063a72bc80814610aeb578063a9059cbb14610b28578063b2c1ab7014610b48578063b524f87b14610b6857600080fd5b806391d3db2814610a5b57806395d89b4114610a8957806397d8ac0214610ab65780639ee1bd0f14610ad657600080fd5b806379c4bdc1116101b657806379c4bdc1146109c15780637d459db3146109e257806380b6811514610a1b57806386a2ab5714610a3b57600080fd5b8063649f386d146109485780636cf3b0f91461098157806370a08231146109a157600080fd5b806333b9fd65116102c157806350a8e0161161025f5780635c45767a1161022e5780635c45767a146107d95780635d098b38146108f257806360e89ae814610912578063640384091461093257600080fd5b806350a8e01614610738578063517bfc2d146107595780635846e1cd14610799578063590ffdce146107b957600080fd5b80634c3015221161029b5780634c3015221461069f5780634f4fc99b146106bf5780634fbee193146106df5780635061e52a1461071857600080fd5b806333b9fd651461062b5780633ddcac7c1461064b5780634ada218b1461068057600080fd5b806311f55dc61161033957806323b872dd1161030857806323b872dd146105a45780632cb8b882146105c45780632eb1cbaf146105e4578063313ce5671461060457600080fd5b806311f55dc61461051257806313114a9d1461054f578063158ef93e1461056e57806318160ddd1461058f57600080fd5b806307980cb91161037557806307980cb91461043357806308e7d1c414610455578063095ea7b3146104c25780630b867756146104f257600080fd5b806303fd2a45146103a757806306fdde03146103da5780630758d9241461041357600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bd61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103e657600080fd5b50604080518082019091526007815266696e7567616d6960c81b60208201525b6040516103d19190615834565b34801561041f57600080fd5b506009546103bd906001600160a01b031681565b34801561043f57600080fd5b5061045361044e366004615897565b610d81565b005b34801561046157600080fd5b506012546104929063ffffffff808216916401000000008104821691600160401b8204811691600160601b90041684565b6040805163ffffffff958616815293851660208501529184169183019190915290911660608201526080016103d1565b3480156104ce57600080fd5b506104e26104dd3660046158b4565b6111ee565b60405190151581526020016103d1565b3480156104fe57600080fd5b506104e261050d366004615897565b611205565b34801561051e57600080fd5b506011546104929063ffffffff808216916401000000008104821691600160401b8204811691600160601b90041684565b34801561055b57600080fd5b50600f545b6040519081526020016103d1565b34801561057a57600080fd5b506023546104e290600160a01b900460ff1681565b34801561059b57600080fd5b50610560611362565b3480156105b057600080fd5b506104e26105bf3660046158e0565b6113ab565b3480156105d057600080fd5b506104536105df366004615921565b61143c565b3480156105f057600080fd5b506104e26105ff366004615945565b6115a9565b34801561061057600080fd5b5061061961166d565b60405160ff90911681526020016103d1565b34801561063757600080fd5b506104e261064636600461598e565b61169c565b34801561065757600080fd5b5061066061177b565b604080516001600160a01b039384168152929091166020830152016103d1565b34801561068c57600080fd5b506022546104e290610100900460ff1681565b3480156106ab57600080fd5b506104536106ba3660046159d1565b6117a4565b3480156106cb57600080fd5b50600a546103bd906001600160a01b031681565b3480156106eb57600080fd5b506104e26106fa366004615897565b6001600160a01b031660009081526016602052604090205460ff1690565b34801561072457600080fd5b50610453610733366004615a68565b6119ff565b34801561074457600080fd5b506023546104e290600160c01b900460ff1681565b34801561076557600080fd5b50610619610774366004615897565b6001600160a01b0316600090815260026020526040902054600160a01b900460ff1690565b3480156107a557600080fd5b506104e26107b436600461598e565b611aba565b3480156107c557600080fd5b506104536107d4366004615ab8565b611b99565b3480156107e557600080fd5b5061087d6107f4366004615897565b600e60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b039384169493831693600160a01b840460ff90811694600160a81b8104821694600160b01b8204831694600160b81b8304841694600160c01b840490941693600160c81b90930463ffffffff169265ffffffffffff90921691908b565b604080516001600160a01b039c8d1681529b909a1660208c0152971515988a01989098529415156060890152921515608088015290151560a087015260ff1660c086015263ffffffff1660e085015265ffffffffffff16610100840152610120830191909152610140820152610160016103d1565b3480156108fe57600080fd5b5061045361090d366004615897565b611c0c565b34801561091e57600080fd5b5061045361092d366004615897565b611c91565b34801561093e57600080fd5b50610560601e5481565b34801561095457600080fd5b506104e2610963366004615897565b6001600160a01b031660009081526003602052604090205460ff1690565b34801561098d57600080fd5b5061045361099c366004615af1565b611e3d565b3480156109ad57600080fd5b506105606109bc366004615897565b611f02565b3480156109cd57600080fd5b506023546104e290600160b81b900460ff1681565b3480156109ee57600080fd5b506104e26109fd366004615897565b6001600160a01b031660009081526018602052604090205460ff1690565b348015610a2757600080fd5b506104e2610a36366004615b25565b611f61565b348015610a4757600080fd5b50610453610a56366004615897565b6121c3565b348015610a6757600080fd5b50601f54610a769061ffff1681565b60405161ffff90911681526020016103d1565b348015610a9557600080fd5b5060408051808201909152600481526367616d6960e01b6020820152610406565b348015610ac257600080fd5b50610453610ad1366004615897565b6122bf565b348015610ae257600080fd5b506103bd6123bb565b348015610af757600080fd5b506010546104929063ffffffff808216916401000000008104821691600160401b8204811691600160601b90041684565b348015610b3457600080fd5b506104e2610b433660046158b4565b6123cf565b348015610b5457600080fd5b506104e2610b63366004615ab8565b6123e6565b348015610b7457600080fd5b50610453610b83366004615897565b6124b3565b348015610b9457600080fd5b506023546104e290600160a81b900460ff1681565b348015610bb557600080fd5b5061056060215481565b348015610bcb57600080fd5b50601c54610a769061ffff1681565b348015610be657600080fd5b506104e2610bf5366004615ab8565b612538565b348015610c0657600080fd5b50610453610c15366004615b43565b6125f8565b348015610c2657600080fd5b50610453610c35366004615b60565b6126c6565b348015610c4657600080fd5b50610453610c55366004615921565b61285b565b348015610c6657600080fd5b506104e2610c7536600461598e565b6129c4565b348015610c8657600080fd5b50610560610c95366004615ba0565b612aa3565b348015610ca657600080fd5b50610560610cb5366004615bce565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610cec57600080fd5b50610453610cfb366004615bec565b612b21565b348015610d0c57600080fd5b50610453610d1b366004615897565b612d47565b348015610d2c57600080fd5b506104e2610d3b366004615af1565b612e47565b348015610d4c57600080fd5b50610453610d5b366004615c3f565b612f08565b348015610d6c57600080fd5b506023546104e290600160b01b900460ff1681565b33600090815260026020526040902054600160a01b900460ff16600114610da757600080fd5b6001600160a01b0381166000908152600e602052604090206001810154600160a01b900460ff1615610e205760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064015b60405180910390fd5b6001810154600160a81b900460ff16610e7b5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610e17565b602354600160a01b900460ff16610ed45760405162461bcd60e51b815260206004820152601d60248201527f486173206e6f74206265656e20696e697469616c697a656420796574210000006044820152606401610e17565b6023546001600160a01b03908116600090815260076020908152604080832085549094168352929052205460001914610f37576023546001600160a01b039081166000908152600760209081526040808320855490941683529290522060001990555b60018101805460ff60c01b1916601960c21b179055612710610f5883611f02565b610f6390600a615ca1565b610f6d9190615cb8565b6003820155612710610f7e83611f02565b610f89906019615ca1565b610f939190615cb8565b6004828101919091556022548254600184015460405163197106ad60e11b815230948101949094526001600160a01b03918216602485015285821660448501528116606484015263ffffffff4316608484015265ffffffffffff421660a48401526000926201000090920416906332e20d5a9060c4016020604051808303816000875af1158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190615cda565b90508061105857600080fd5b6008546001830154600384015460048086015460405163a43583bf60e01b81526001600160a01b0389811693820193909352600160c01b90940460ff16602485015263ffffffff4316604485015265ffffffffffff42166064850152608484019290925260a48301919091529091169063a43583bf9060c4016020604051808303816000875af11580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615cda565b90508061112057600080fd5b6022805461ff00191661010017905560018201805463ffffffff4316600160c81b81027fffffff00000000ff00ffff00ffffffffffffffffffffffffffffffffffffffff90921691909117630100000160a01b1790915560028301805465ffffffffffff421665ffffffffffff199091168117909155604080516001600160a01b038716815284151560208201529081019290925260608201527f517d39d150a7135e3ae5b4a1f34b970417d17c7d44bced1956e724f5567ffcb3906080015b60405180910390a15b505050565b60006111fb3384846130c5565b5060015b92915050565b60006112196001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611251575033600090815260026020526040902054600160a01b900460ff166001145b61125a57600080fd5b306001600160a01b038316036112b25760405162461bcd60e51b815260206004820152600e60248201527f43616e27742062652073656c662e0000000000000000000000000000000000006044820152606401610e17565b602280546001600160a01b038481166201000081810275ffffffffffffffffffffffffffffffffffffffff0000199094169390931793849055602380546001600160a01b0319169091179055604051634910b4d960e01b8152306004820152600093929092041690634910b4d990602401600060405180830381600087803b15801561133d57600080fd5b505af192505050801561134e575060015b61135757600080fd5b50600190505b919050565b60006113706012600a615ddb565b61137f9064174876e800615ca1565b60000361138b57600080fd5b6113976012600a615ddb565b6113a69064174876e800615ca1565b905090565b6001600160a01b03831660009081526007602090815260408083203384529091528120546000191461142957611429843361142485604051806060016040528060288152602001615f7e602891396001600160a01b038a16600090815260076020908152604080832033845290915290205491906131be565b6130c5565b6114348484846131ea565b949350505050565b61144461405c565b6001546001600160a01b0316331480611476575033600090815260026020526040902054600160a01b900460ff166001145b61147f57600080fd5b6103e861148e6012600a615ddb565b61149d9064174876e800615ca1565b6114a79190615cb8565b61271061ffff83166114bb6012600a615ddb565b6114ca9064174876e800615ca1565b6114d49190615ca1565b6114de9190615cb8565b10156115525760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610e17565b601c805461ffff191661ffff8316908117909155612710906115766012600a615ddb565b6115859064174876e800615ca1565b61158f9190615ca1565b6115999190615cb8565b601d556115a66001600055565b50565b60006115bd6001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806115f5575033600090815260026020526040902054600160a01b900460ff166001145b6115fe57600080fd5b6001600160a01b0384166000818152600e6020908152604091829020600381018790556004018590558151928352820185905281018390527f4b4b99a1eff34af744bde4562076348fe524799340e842c09f26f43c94ea9d2b9060600160405180910390a15060019392505050565b600061167b6012600a615ddb565b61168a9064174876e800615ca1565b60000361169657600080fd5b50601290565b60006116b06001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806116e8575033600090815260026020526040902054600160a01b900460ff166001145b6116f157600080fd5b6010805463ffffffff848116600160401b026bffffffff0000000000000000198783166401000000000267ffffffffffffffff19909416928916929092179290921716179055816117428486615dea565b61174c9190615dea565b6010805463ffffffff92909216600160601b0263ffffffff60601b199092169190911790555060019392505050565b600080611790601a546001600160a01b031690565b601b546001600160a01b0316915091509091565b6001546001600160a01b03163314806117d6575033600090815260026020526040902054600160a01b900460ff166001145b6117df57600080fd5b6001600160a01b038083166000908152600e6020908152604080832080548886166001600160a01b0319909116811782556001808301805475ffffffffffffffffffffffffffffffffffffffffffff19169789169788179055600c8552838620805460ff199081168317909155968652600d8552838620805490971617909555938352600b90915290205460ff16611939576001600160a01b0384166000908152600b60205260409020805460ff191660011790556118a761189e3390565b856000196130c5565b6001546118c0906001600160a01b0316856000196130c5565b6118cd30856000196130c5565b6001600160a01b03841660008181526016602090815260408083208054600160ff199182168117909255601584529382902080549094161790925590519182527f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a15b60405163095ea7b360e01b81526001600160a01b038581166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015611989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ad9190615cda565b50604080516001600160a01b038681168252858116602083015284168183015290517f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d9181900360600190a150505050565b6001546001600160a01b0316331480611a31575033600090815260026020526040902054600160a01b900460ff166001145b611a3a57600080fd5b60005b818110156111e957611aa8838383818110611a5a57611a5a615e0e565b9050602002016020810190611a6f9190615897565b6001600160a01b0316600090815260026020908152604080832080546001600160a81b031916905560039091529020805460ff19169055565b80611ab281615e24565b915050611a3d565b6000611ace6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611b06575033600090815260026020526040902054600160a01b900460ff166001145b611b0f57600080fd5b6011805463ffffffff848116600160401b026bffffffff0000000000000000198783166401000000000267ffffffffffffffff1990941692891692909217929092171617905581611b608486615dea565b611b6a9190615dea565b6011805463ffffffff92909216600160601b0263ffffffff60601b199092169190911790555060019392505050565b611ba161405c565b6001546001600160a01b0316331480611bd3575033600090815260026020526040902054600160a01b900460ff166001145b611bdc57600080fd5b6001600160a01b0382166000908152601660205260408120805460ff1916831515179055600190555050565b5050565b611c1461405c565b6001546001600160a01b0316331480611c46575033600090815260026020526040902054600160a01b900460ff166001145b611c4f57600080fd5b601a80546001600160a01b0383166001600160a01b031990911681179091556000908152601660205260409020805460ff191660011790556115a66001600055565b6001546001600160a01b0316331480611cc3575033600090815260026020526040902054600160a01b900460ff166001145b80611ce8575033600090815260026020819052604090912054600160a01b900460ff16145b80611d0c575033600090815260026020526040902054600160a01b900460ff166005145b611d1557600080fd5b6001600160a01b0381163314611d935760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e17565b6001600160a01b03811660009081526003602052604090205460ff161515600114611e005760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e2061646d696e20726f6c650000006044820152606401610e17565b6115a6816001600160a01b0316600090815260026020908152604080832080546001600160a81b031916905560039091529020805460ff19169055565b6001546001600160a01b0316331480611e6f575033600090815260026020526040902054600160a01b900460ff166001145b611e7857600080fd5b8060ff16600103611ef85733600090815260026020526040902054600160a01b900460ff16600114611ef85760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617574686f72697a656420746f207365742061206044820152623232bb60e91b6064820152608401610e17565b611c0882826140b5565b6001600160a01b03811660009081526018602052604081205460ff1615611f3f57506001600160a01b031660009081526006602052604090205490565b6001600160a01b0382166000908152600560205260409020546111ff90614107565b33600090815260026020526040812054600160a01b900460ff16600114611f8757600080fd5b6023805460ff60a01b19169055602254604051637182afc760e11b81523060048201526000916201000090046001600160a01b03169063e3055f8e906024016020604051808303816000875af1158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120099190615cda565b6023805460ff60a01b1916600160a01b9215158302179081905560ff9190041661203257600080fd5b6023546001600160a01b031660009081526003602052604090205460ff1661206b5760235461206b906001600160a01b031660016140b5565b83806120745750825b156121bc57602254604051630fadb35f60e01b81523060048201528515156024820152841515604482015265ffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660648301527f0000000000000000000000000000000000000000000000000000000000000000166084820152620100009091046001600160a01b031690630fadb35f9060a4016020604051808303816000875af115801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190615cda565b90508061215e57600080fd5b60238054600160a81b60ff60a81b1982161782556001600160a01b03166000908152601660205260409020805460ff19166001179055805461ffff60b01b1916600160b01b8615150260ff60b81b191617600160b81b851515021790555b9392505050565b6001546001600160a01b03163314806121f5575033600090815260026020526040902054600160a01b900460ff166001145b6121fe57600080fd5b600061220930611f02565b6001600160a01b0383166000908152600e60205260409020600301549091508110611c08576001600160a01b0382166000908152600e602052604090206004810154600190910154600160b81b900460ff16156122aa576001600160a01b0383166000908152600e602052604090206001015461271090600160c01b900460ff1661229385611f02565b61229d9190615ca1565b6122a79190615cb8565b90505b8082106122b5578091505b6111e98284614184565b33600090815260026020526040902054600160a01b900460ff166001146122e557600080fd5b6008546001600160a01b038083169116036123425760405162461bcd60e51b815260206004820152601f60248201527f416c72656164792073657420746f207468652073616d652061646472657373006044820152606401610e17565b600880546001600160a01b0319166001600160a01b03831690811790915560405163dc73208b60e01b815230600482015263dc73208b90602401600060405180830381600087803b15801561239657600080fd5b505af19250505080156123a7575060015b6123b057600080fd5b6115a68160016140b5565b60006113a66001546001600160a01b031690565b60006123dc3384846131ea565b5060019392505050565b60006123fa6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612432575033600090815260026020526040902054600160a01b900460ff166001145b61243b57600080fd5b6001600160a01b0383166000818152600e6020908152604091829020600101805460ff60b01b1916600160b01b871515908102919091179091558251938452908301527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c54391015b60405180910390a150600192915050565b6124bb61405c565b6001546001600160a01b03163314806124ed575033600090815260026020526040902054600160a01b900460ff166001145b6124f657600080fd5b601b80546001600160a01b0383166001600160a01b031990911681179091556000908152601660205260409020805460ff191660011790556115a66001600055565b600061254c6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612584575033600090815260026020526040902054600160a01b900460ff166001145b61258d57600080fd5b6001600160a01b0383166000818152600e6020908152604091829020600101805460ff60b81b1916600160b81b871515908102919091179091558251938452908301527f3fdc3a0a211fcb6dedf2ee6f5566883ccd93088f308aaada19760f3b6bd62ee791016124a2565b6001546001600160a01b031633148061262a575033600090815260026020526040902054600160a01b900460ff166001145b61263357600080fd5b60175481151560ff9091161515036126b35760405162461bcd60e51b815260206004820152603060248201527f5468652073776974636820697320616c72656164792073657420617420796f7560448201527f72206465736972656420737461746521000000000000000000000000000000006064820152608401610e17565b6017805460ff1916911515919091179055565b33600090815260026020526040902054600160a01b900460ff166001146126ec57600080fd5b6001600160a01b0383166000908152600b602052604090205481151560ff909116151503612798576001600160a01b0383166000818152600b60209081526040808320805486151560ff1991821681179092556016845282852080548216831790556015845293829020805490941681179093558051938452908301919091527ff1551184b142d0ef4c150b6a021c1e4da5e8844379a9ea03fb3cd061ea1daf21910160405180910390a15b6001600160a01b0382166000908152600c602052604090205481151560ff9091161515036111e9576001600160a01b038281166000818152600e60208181526040808420600101805460ff60a01b1916600160a01b891515908102919091178255600c845294829020805460ff19168617905592825291548251898716815291820194909452929093169282019290925260608101919091527fe8bb375afb479dfce3e1bc16cc4c12a7cb54301ad17e0ece3f70facf86d5eecd906080016111e0565b61286361405c565b6001546001600160a01b0316331480612895575033600090815260026020526040902054600160a01b900460ff166001145b61289e57600080fd5b60646128ac6012600a615ddb565b6128bb9064174876e800615ca1565b6128c59190615cb8565b61271061ffff83166128d96012600a615ddb565b6128e89064174876e800615ca1565b6128f29190615ca1565b6128fc9190615cb8565b10156129705760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401610e17565b601f805461ffff191661ffff8316908117909155612710906129946012600a615ddb565b6129a39064174876e800615ca1565b6129ad9190615ca1565b6129b79190615cb8565b6020556115a66001600055565b60006129d86001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612a10575033600090815260026020526040902054600160a01b900460ff166001145b612a1957600080fd5b6012805463ffffffff848116600160401b026bffffffff0000000000000000198783166401000000000267ffffffffffffffff1990941692891692909217929092171617905581612a6a8486615dea565b612a749190615dea565b6012805463ffffffff92909216600160601b0263ffffffff60601b199092169190911790555060019392505050565b60008215612ab25750476111ff565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015612af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1a9190615e3d565b90506111ff565b6001546001600160a01b0316331480612b53575033600090815260026020526040902054600160a01b900460ff166001145b612b5c57600080fd5b612b668484612aa3565b821115612b7257600080fd5b60405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015612bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be69190615cda565b508315612c87576000816001600160a01b03168361520890604051600060405180830381858888f193505050503d8060008114612c3f576040519150601f19603f3d011682016040523d82523d6000602084013e612c44565b606091505b5050905080612c815760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401610e17565b50612d41565b6040516323b872dd60e01b81523060048201526001600160a01b03828116602483015260448201849052600091908516906323b872dd906064016020604051808303816000875af1158015612ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d049190615cda565b905080612d3f5760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401610e17565b505b50505050565b6001546001600160a01b0316331480612d79575033600090815260026020526040902054600160a01b900460ff166001145b612d8257600080fd5b6001546001600160a01b0390811690821603612deb5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920746865206f776e65604482015261722160f01b6064820152608401610e17565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000612e5b6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612e93575033600090815260026020526040902054600160a01b900460ff166001145b612e9c57600080fd5b6001600160a01b0383166000818152600e6020908152604091829020600101805460ff60c01b1916600160c01b60ff8816908102919091179091558251938452908301527f024e5cc370f4392aaafdb3d37424c18b801c726ff6c32c142bfc1c2d8c2185b391016124a2565b6001546001600160a01b0316331480612f3a575033600090815260026020526040902054600160a01b900460ff166001145b612f4357600080fd5b60005b82811015612d41578115612fed5760186000858584818110612f6a57612f6a615e0e565b9050602002016020810190612f7f9190615897565b6001600160a01b0316815260208101919091526040016000205460ff16612fe85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610e17565b613082565b6018600085858481811061300357613003615e0e565b90506020020160208101906130189190615897565b6001600160a01b0316815260208101919091526040016000205460ff16156130825760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610e17565b6130b284848381811061309757613097615e0e565b90506020020160208101906130ac9190615897565b83614a91565b50806130bd81615e24565b915050612f46565b6001600160a01b0383166131115760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610e17565b6001600160a01b03821661315d5760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610e17565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600081848411156131e25760405162461bcd60e51b8152600401610e179190615834565b505050900390565b60006001600160a01b0384166132505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e17565b6001600160a01b0383166132b25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e17565b600082116133145760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e17565b6001600160a01b0384166000908152600c602052604081205481908190819060ff161561338157600a80546001600160a01b0319166001600160a01b038a161790556017546001945060ff161561337657613370876001614a91565b50613421565b613370876000614a91565b6001600160a01b0387166000908152600c602052604090205460ff16156133e257600a80546001600160a01b0319166001600160a01b0389161790556017546001935060ff16156133d757613370886001614a91565b613370886000614a91565b6017546001925060ff1615613408576133fc886001614a91565b50613370876001614a91565b613413886000614a91565b5061341f876000614a91565b505b600a546001600160a01b039081166000908152600e6020908152604091829020825161016081018452815485168152600182015494851692810192909252600160a01b840460ff908116151593830193909352600160a81b8404831615156060830152600160b01b8404831615156080830152600160b81b84048316151560a0830152600160c01b840490921660c0820152600160c81b90920463ffffffff1660e0830152600281015465ffffffffffff166101008301526003810154610120830152600401546101408201526134f88989614cdc565b15613a4d57602254610100900460ff166135545760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610e17565b848061355d5750835b156135c25780604001516135c25760405162461bcd60e51b815260206004820152602660248201527f54726164696e67206e6f742079657420656e61626c656420666f72207468697360448201526520706169722160d01b6064820152608401610e17565b84806135cb5750835b15613738576022546040516352252c9960e11b81523060048201526001600160a01b038b81166024830152620100009092049091169063a44a593290604401602060405180830381865afa158015613627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364b9190615cda565b1580156136d057506022546040516352252c9960e11b81523060048201526001600160a01b038a81166024830152620100009092049091169063a44a593290604401602060405180830381865afa1580156136aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ce9190615cda565b155b1561373857601d548711156137385760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610e17565b602354600160a81b900460ff16156139365760225460405163341583b160e21b81523060048201526001600160a01b038b811660248301528a811660448301528715156064830152861515608483015285151560a4830152600092620100009004169063d0560ec49060c4016020604051808303816000875af11580156137c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e79190615cda565b9050806138365760405162461bcd60e51b815260206004820152601260248201527f426c61636b6c6973742052656a656374656400000000000000000000000000006044820152606401610e17565b602354600160b81b900460ff16156139345760225460405163281b7edf60e01b81523060048201526001600160a01b038c811660248301528b811660448301528815156064830152871515608483015286151560a4830152620100009092049091169063281b7edf9060c4016020604051808303816000875af11580156138c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e59190615cda565b9050806139345760405162461bcd60e51b815260206004820152601560248201527f53616e647769636820426f742052656a656374656400000000000000000000006044820152606401610e17565b505b80516001600160a01b03898116911614801590613951575083155b15613a4d576022546040516352252c9960e11b81523060048201526001600160a01b038a81166024830152620100009092049091169063a44a593290604401602060405180830381865afa1580156139ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d19190615cda565b613a4d57602054876139e28a611f02565b6139ec9190615e56565b1115613a4d5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610e17565b8315613aef5760225460ff16613aef57806080015115613aef576000613a7230611f02565b90508161012001518110613aed5761014082015160a083015115613ac95760c0830151600a546127109160ff1690613ab2906001600160a01b0316611f02565b613abc9190615ca1565b613ac69190615cb8565b90505b808210613ad4578091505b600a54613aeb9083906001600160a01b0316614184565b505b505b8060600151613c9757600a54613b11908a908a906001600160a01b0316614e6e565b8060600151158015613b285750613b288989614cdc565b8015613bac5750602254604051638623039360e01b81523060048201526001600160a01b038b811660248301526201000090920490911690638623039390604401602060405180830381865afa158015613b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613baa9190615cda565b155b8015613c305750602254604051638623039360e01b81523060048201526001600160a01b038a811660248301526201000090920490911690638623039390604401602060405180830381865afa158015613c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2e9190615cda565b155b8015613c3a575082155b15613c925760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f604482015261371760f11b6064820152608401610e17565b613e37565b602354600160b01b900460ff1615613e3757613cb38989614cdc565b15613dc957602254600a5460405163127850cf60e21b81526001600160a01b0391821660048201528b821660248201528a821660448201528715156064820152861515608482015285151560a4820152600092620100009004909116906349e1433c9060c40160408051808303816000875af1925050508015613d53575060408051601f3d908101601f19168201909252613d5091810190615e69565b60015b613d5c57600080fd5b60238054911515600160b01b0260ff60b01b19909216919091179055905080613dc75760405162461bcd60e51b815260206004820152600f60248201527f536e697065722052656a656374656400000000000000000000000000000000006044820152606401610e17565b505b602354600160b01b900460ff16613e375760235460408051600160b01b90920460ff16151582524363ffffffff1660208301524265ffffffffffff16908201527f9051140fef6baf751a615e3f9bfbfd97973a1b0813c667774aeb3fa03035dfb39060600160405180910390a15b6001600160a01b03891660009081526016602052604090205460ff1680613e7657506001600160a01b03881660009081526016602052604090205460ff165b15613e8057600191505b8115613ef2576013546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b9384900491909116909202919091179055614044565b8415613f64576010546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b9384900491909116909202919091179055614044565b8315613fd6576011546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b9384900491909116909202919091179055614044565b8215614044576012546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b93849004919091169092029190911790555b61404f898989614fb0565b9998505050505050505050565b6002600054036140ae5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e17565b6002600055565b6001600160a01b039091166000818152600260209081526040808320805460ff909616600160a01b026001600160a81b031990961690941794909417909255600390915220805460ff19166001179055565b600060045482111561416e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e17565b6000614178615294565b90506121bc83826152b7565b6022805460ff191660019081179091556001600160a01b038083166000908152600e60209081526040808320815161016081018352815486168082529682015495861681850152600160a01b860460ff908116151582850152600160a81b870481161515606080840191909152600160b01b880482161515608080850191909152600160b81b89048316151560a0850152600160c01b890490921660c084015263ffffffff600160c81b909804881660e0840152600284015465ffffffffffff166101008401526003840154610120840152600490930154610140830152600980546001600160a01b0319169098179097558251968701835260145480871688526401000000008104871694880194909452600160401b8404861692870192909252600160601b90920490931690840181905291929190036142c7575050614a83565b3060009081526007602090815260408083206009546001600160a01b0316845290915290205460001914614320573060009081526007602090815260408083206009546001600160a01b03168452909152902060001990555b60006002826060015163ffffffff16836000015163ffffffff16876143459190615ca1565b61434f9190615cb8565b6143599190615cb8565b905060006143678287615e98565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106143a1576143a1615e0e565b60200260200101906001600160a01b031690816001600160a01b0316815250508460200151816001815181106143d9576143d9615e0e565b60200260200101906001600160a01b031690816001600160a01b0316815250506000614404876152c3565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447d9190615eab565b6001600160a01b03168260018151811061449957614499615e0e565b60200260200101516001600160a01b03160361451f5760095460405163791ac94760e01b81526001600160a01b039091169063791ac947906144e8908690600090879030904290600401615ec8565b600060405180830381600087803b15801561450257600080fd5b505af1158015614516573d6000803e3d6000fd5b5050505061458b565b600954604051635c11d79560e01b81526001600160a01b0390911690635c11d79590614558908690600090879030904290600401615ec8565b600060405180830381600087803b15801561457257600080fd5b505af1158015614586573d6000803e3d6000fd5b505050505b600081614597896152c3565b6145a19190615e98565b90506000846145b08784615ca1565b6145ba9190615cb8565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561460f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146339190615eab565b6001600160a01b031688602001516001600160a01b03160361472c57851561472757600954601b5460405163f305d71960e01b81523060048201526024810189905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156146c5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906146ea9190615f39565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b614816565b8515614816576009546020890151601b5460405162e8e33760e81b81523060048201526001600160a01b039283166024820152604481018a90526064810185905260006084820181905260a482015290821660c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156147b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147d99190615f39565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b6148208183615e98565b6020890151601a5460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529294506000928592919091169063095ea7b3906044016020604051808303816000875af1158015614882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a69190615cda565b50600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156148fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061491e9190615eab565b6001600160a01b03168a602001516001600160a01b0316036149e557602089015163ffffffff16156149e057601a546040516001600160a01b03909116906152089083906000818181858888f193505050503d806000811461499c576040519150601f19603f3d011682016040523d82523d6000602084013e6149a1565b606091505b505080925050816149e05760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401610e17565b614a78565b602089015163ffffffff1615614a785760208a0151601a546040516323b872dd60e01b81523060048201526001600160a01b039182166024820152604481018490529116906323b872dd906064016020604051808303816000875af1158015614a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a769190615cda565b505b505050505050505050505b50506022805460ff19169055565b60008115614bec576001600160a01b03831660009081526018602052604090205460ff16614ac1575060016111ff565b60005b601954811015614be257836001600160a01b031660198281548110614aeb57614aeb615e0e565b6000918252602090912001546001600160a01b031603614bd05760198054614b1590600190615e98565b81548110614b2557614b25615e0e565b600091825260209091200154601980546001600160a01b039092169183908110614b5157614b51615e0e565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559186168152600682526040808220829055601890925220805460ff191690556019805480614ba957614ba9615f67565b600082815260209020810160001990810180546001600160a01b0319169055019055614be2565b80614bda81615e24565b915050614ac4565b50600190506111ff565b6001600160a01b03831660009081526018602052604090205460ff1615614c15575060016111ff565b6001600160a01b03831660009081526005602052604090205415614c6f576001600160a01b038316600090815260056020526040902054614c5590614107565b6001600160a01b0384166000908152600660205260409020555b506001600160a01b0382166000818152601860205260408120805460ff1916600190811790915560198054808301825592527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969590910180546001600160a01b0319169092179091556111ff565b6001546000906001600160a01b03848116911614801590614d0b57506001546001600160a01b03838116911614155b8015614d2257506001546001600160a01b03163214155b8015614d4757506001600160a01b03821660009081526015602052604090205460ff16155b8015614d6c57506001600160a01b03831660009081526015602052604090205460ff16155b8015614d8357506001600160a01b03821661dead14155b8015614d9757506001600160a01b03821615155b8015614dac57506001600160a01b0383163014155b8015614ddb57506001600160a01b038316600090815260026020526040902054600160a01b900460ff16600114155b8015614e0a57506001600160a01b038216600090815260026020526040902054600160a01b900460ff16600114155b8015614e3a57506001600160a01b038316600090815260026020819052604090912054600160a01b900460ff1614155b80156121bc5750506001600160a01b0316600090815260026020819052604090912054600160a01b900460ff161415919050565b6001600160a01b0381166000908152600e6020526040902060010154600160a81b900460ff1615614eed5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610e17565b614ef78383614cdc565b158015614f155750806001600160a01b0316826001600160a01b0316145b156111e9576001600160a01b038381166000908152601560209081526040808320805460ff191660019081179091556023805460ff60c01b1916600160c01b179055938516808452600e8352928190208401805461010160a81b61ffff60a81b199091161790558051928352908201929092527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c54391016111e0565b6000806000806000806000614fc4886153ea565b95509550955095509550955061500886600560008d6001600160a01b03166001600160a01b031681526020019081526020016000205461543990919063ffffffff16565b6001600160a01b03808c1660009081526005602052604080822093909355908b16815220546150379086615445565b6001600160a01b03808b16600090815260056020908152604080832094909455918d1681526018909152205460ff16801561508b57506001600160a01b03891660009081526018602052604090205460ff16155b156150d1576001600160a01b038a166000908152600660205260409020546150b39089615439565b6001600160a01b038b16600090815260066020526040902055615209565b6001600160a01b038a1660009081526018602052604090205460ff1615801561511257506001600160a01b03891660009081526018602052604090205460ff165b15615158576001600160a01b03891660009081526006602052604090205461513a9084615445565b6001600160a01b038a16600090815260066020526040902055615209565b6001600160a01b038a1660009081526018602052604090205460ff16801561519857506001600160a01b03891660009081526018602052604090205460ff165b15615209576001600160a01b038a166000908152600660205260409020546151c09089615439565b6001600160a01b03808c1660009081526006602052604080822093909355908b16815220546151ef9084615445565b6001600160a01b038a166000908152600660205260409020555b8015615219576152198a82615451565b60008411806152285750600082115b1561523757615237848361551b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161527c91815260200190565b60405180910390a35060019998505050505050505050565b60008060006152a161553f565b90925090506152b082826152b7565b9250505090565b60006121bc8284615cb8565b6001600160a01b038082166000908152600e602090815260408083205481516315ab88c960e31b815291519394169263ad5c4648926004808401939192918290030181865afa15801561531a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061533e9190615eab565b6001600160a01b038381166000908152600e602052604090206001015491811691160361536c575047919050565b6001600160a01b038281166000908152600e6020526040908190206001015490516370a0823160e01b81523060048201529116906370a0823190602401602060405180830381865afa1580156153c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff9190615e3d565b60008060008060008060008060006154018a615725565b925092509250600080600061541f8d868661541a615294565b615767565b919f909e50909c50959a5093985091965092945050505050565b60006121bc8284615e98565b60006121bc8284615e56565b600061545b615294565b9050600061546983836157b7565b306000908152600560205260409020549091506154869082615445565b3060009081526005602090815260408083209390935560189052205460ff16156154d557306000908152600660205260409020546154c49084615445565b306000908152600660205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6004546155289083615439565b600455600f546155389082615445565b600f555050565b6004546000908190816155546012600a615ddb565b6155639064174876e800615ca1565b905060005b6019548110156156c55782600560006019848154811061558a5761558a615e0e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806155f557508160066000601984815481106155ce576155ce615e0e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15615623576004546156096012600a615ddb565b6156189064174876e800615ca1565b945094505050509091565b615669600560006019848154811061563d5761563d615e0e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490615439565b92506156b1600660006019848154811061568557615685615e0e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390615439565b9150806156bd81615e24565b915050615568565b506156ed6156d56012600a615ddb565b6156e49064174876e800615ca1565b600454906152b7565b82101561571c576004546157036012600a615ddb565b6157129064174876e800615ca1565b9350935050509091565b90939092509050565b600080600080615734856157c3565b90506000615741866157f3565b90506000615759826157538986615439565b90615439565b979296509094509092505050565b600080808061577688866157b7565b9050600061578488876157b7565b9050600061579288886157b7565b905060006157a4826157538686615439565b939b939a50919850919650505050505050565b60006121bc8284615ca1565b6014546000906111ff90612710906157ed90859063ffffffff600160401b9091048116906157b716565b906152b7565b6014546000906111ff90612710906157ed9061581f9063ffffffff640100000000820481169116615dea565b63ffffffff16856157b790919063ffffffff16565b600060208083528351808285015260005b8181101561586157858101830151858201604001528201615845565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146115a657600080fd5b6000602082840312156158a957600080fd5b81356121bc81615882565b600080604083850312156158c757600080fd5b82356158d281615882565b946020939093013593505050565b6000806000606084860312156158f557600080fd5b833561590081615882565b9250602084013561591081615882565b929592945050506040919091013590565b60006020828403121561593357600080fd5b813561ffff811681146121bc57600080fd5b60008060006060848603121561595a57600080fd5b833561596581615882565b95602085013595506040909401359392505050565b803563ffffffff8116811461135d57600080fd5b6000806000606084860312156159a357600080fd5b6159ac8461597a565b92506159ba6020850161597a565b91506159c86040850161597a565b90509250925092565b6000806000606084860312156159e657600080fd5b83356159f181615882565b92506020840135615a0181615882565b91506040840135615a1181615882565b809150509250925092565b60008083601f840112615a2e57600080fd5b50813567ffffffffffffffff811115615a4657600080fd5b6020830191508360208260051b8501011115615a6157600080fd5b9250929050565b60008060208385031215615a7b57600080fd5b823567ffffffffffffffff811115615a9257600080fd5b615a9e85828601615a1c565b90969095509350505050565b80151581146115a657600080fd5b60008060408385031215615acb57600080fd5b8235615ad681615882565b91506020830135615ae681615aaa565b809150509250929050565b60008060408385031215615b0457600080fd5b8235615b0f81615882565b9150602083013560ff81168114615ae657600080fd5b60008060408385031215615b3857600080fd5b8235615ad681615aaa565b600060208284031215615b5557600080fd5b81356121bc81615aaa565b600080600060608486031215615b7557600080fd5b8335615b8081615882565b92506020840135615b9081615882565b91506040840135615a1181615aaa565b60008060408385031215615bb357600080fd5b8235615bbe81615aaa565b91506020830135615ae681615882565b60008060408385031215615be157600080fd5b8235615bbe81615882565b60008060008060808587031215615c0257600080fd5b8435615c0d81615aaa565b93506020850135615c1d81615882565b9250604085013591506060850135615c3481615882565b939692955090935050565b600080600060408486031215615c5457600080fd5b833567ffffffffffffffff811115615c6b57600080fd5b615c7786828701615a1c565b9094509250506020840135615a1181615aaa565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176111ff576111ff615c8b565b600082615cd557634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215615cec57600080fd5b81516121bc81615aaa565b600181815b80851115615d32578160001904821115615d1857615d18615c8b565b80851615615d2557918102915b93841c9390800290615cfc565b509250929050565b600082615d49575060016111ff565b81615d56575060006111ff565b8160018114615d6c5760028114615d7657615d92565b60019150506111ff565b60ff841115615d8757615d87615c8b565b50506001821b6111ff565b5060208310610133831016604e8410600b8410161715615db5575081810a6111ff565b615dbf8383615cf7565b8060001904821115615dd357615dd3615c8b565b029392505050565b60006121bc60ff841683615d3a565b63ffffffff818116838216019080821115615e0757615e07615c8b565b5092915050565b634e487b7160e01b600052603260045260246000fd5b600060018201615e3657615e36615c8b565b5060010190565b600060208284031215615e4f57600080fd5b5051919050565b808201808211156111ff576111ff615c8b565b60008060408385031215615e7c57600080fd5b8251615e8781615aaa565b6020840151909250615ae681615aaa565b818103818111156111ff576111ff615c8b565b600060208284031215615ebd57600080fd5b81516121bc81615882565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015615f185784516001600160a01b031683529383019391830191600101615ef3565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215615f4e57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122097dc768a3bacfb9123de6513f5b1e89abcef5b52fb0450a80956ef6cb24c1f2864736f6c63430008110033000000000000000000000000ddf6731248edbe96337bbc34ac03b6a2caacfe500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000004b0

Deployed Bytecode

0x60806040526004361061039b5760003560e01c8063649f386d116101dc578063bb58a97311610102578063db331dd2116100a0578063f5a1f5b41161006f578063f5a1f5b414610d00578063f629d13614610d20578063f9c541ba14610d40578063fc739af014610d6057600080fd5b8063db331dd214610c5a578063dd27cf2614610c7a578063dd62ed3e14610c9a578063edc8f96314610ce057600080fd5b8063c43b20c8116100dc578063c43b20c814610bda578063c55ba54114610bfa578063c8325e3d14610c1a578063da07af4414610c3a57600080fd5b8063bb58a97314610b88578063be99375514610ba9578063c1f11ac714610bbf57600080fd5b806391d3db281161017a578063a72bc80811610149578063a72bc80814610aeb578063a9059cbb14610b28578063b2c1ab7014610b48578063b524f87b14610b6857600080fd5b806391d3db2814610a5b57806395d89b4114610a8957806397d8ac0214610ab65780639ee1bd0f14610ad657600080fd5b806379c4bdc1116101b657806379c4bdc1146109c15780637d459db3146109e257806380b6811514610a1b57806386a2ab5714610a3b57600080fd5b8063649f386d146109485780636cf3b0f91461098157806370a08231146109a157600080fd5b806333b9fd65116102c157806350a8e0161161025f5780635c45767a1161022e5780635c45767a146107d95780635d098b38146108f257806360e89ae814610912578063640384091461093257600080fd5b806350a8e01614610738578063517bfc2d146107595780635846e1cd14610799578063590ffdce146107b957600080fd5b80634c3015221161029b5780634c3015221461069f5780634f4fc99b146106bf5780634fbee193146106df5780635061e52a1461071857600080fd5b806333b9fd651461062b5780633ddcac7c1461064b5780634ada218b1461068057600080fd5b806311f55dc61161033957806323b872dd1161030857806323b872dd146105a45780632cb8b882146105c45780632eb1cbaf146105e4578063313ce5671461060457600080fd5b806311f55dc61461051257806313114a9d1461054f578063158ef93e1461056e57806318160ddd1461058f57600080fd5b806307980cb91161037557806307980cb91461043357806308e7d1c414610455578063095ea7b3146104c25780630b867756146104f257600080fd5b806303fd2a45146103a757806306fdde03146103da5780630758d9241461041357600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bd61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103e657600080fd5b50604080518082019091526007815266696e7567616d6960c81b60208201525b6040516103d19190615834565b34801561041f57600080fd5b506009546103bd906001600160a01b031681565b34801561043f57600080fd5b5061045361044e366004615897565b610d81565b005b34801561046157600080fd5b506012546104929063ffffffff808216916401000000008104821691600160401b8204811691600160601b90041684565b6040805163ffffffff958616815293851660208501529184169183019190915290911660608201526080016103d1565b3480156104ce57600080fd5b506104e26104dd3660046158b4565b6111ee565b60405190151581526020016103d1565b3480156104fe57600080fd5b506104e261050d366004615897565b611205565b34801561051e57600080fd5b506011546104929063ffffffff808216916401000000008104821691600160401b8204811691600160601b90041684565b34801561055b57600080fd5b50600f545b6040519081526020016103d1565b34801561057a57600080fd5b506023546104e290600160a01b900460ff1681565b34801561059b57600080fd5b50610560611362565b3480156105b057600080fd5b506104e26105bf3660046158e0565b6113ab565b3480156105d057600080fd5b506104536105df366004615921565b61143c565b3480156105f057600080fd5b506104e26105ff366004615945565b6115a9565b34801561061057600080fd5b5061061961166d565b60405160ff90911681526020016103d1565b34801561063757600080fd5b506104e261064636600461598e565b61169c565b34801561065757600080fd5b5061066061177b565b604080516001600160a01b039384168152929091166020830152016103d1565b34801561068c57600080fd5b506022546104e290610100900460ff1681565b3480156106ab57600080fd5b506104536106ba3660046159d1565b6117a4565b3480156106cb57600080fd5b50600a546103bd906001600160a01b031681565b3480156106eb57600080fd5b506104e26106fa366004615897565b6001600160a01b031660009081526016602052604090205460ff1690565b34801561072457600080fd5b50610453610733366004615a68565b6119ff565b34801561074457600080fd5b506023546104e290600160c01b900460ff1681565b34801561076557600080fd5b50610619610774366004615897565b6001600160a01b0316600090815260026020526040902054600160a01b900460ff1690565b3480156107a557600080fd5b506104e26107b436600461598e565b611aba565b3480156107c557600080fd5b506104536107d4366004615ab8565b611b99565b3480156107e557600080fd5b5061087d6107f4366004615897565b600e60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b039384169493831693600160a01b840460ff90811694600160a81b8104821694600160b01b8204831694600160b81b8304841694600160c01b840490941693600160c81b90930463ffffffff169265ffffffffffff90921691908b565b604080516001600160a01b039c8d1681529b909a1660208c0152971515988a01989098529415156060890152921515608088015290151560a087015260ff1660c086015263ffffffff1660e085015265ffffffffffff16610100840152610120830191909152610140820152610160016103d1565b3480156108fe57600080fd5b5061045361090d366004615897565b611c0c565b34801561091e57600080fd5b5061045361092d366004615897565b611c91565b34801561093e57600080fd5b50610560601e5481565b34801561095457600080fd5b506104e2610963366004615897565b6001600160a01b031660009081526003602052604090205460ff1690565b34801561098d57600080fd5b5061045361099c366004615af1565b611e3d565b3480156109ad57600080fd5b506105606109bc366004615897565b611f02565b3480156109cd57600080fd5b506023546104e290600160b81b900460ff1681565b3480156109ee57600080fd5b506104e26109fd366004615897565b6001600160a01b031660009081526018602052604090205460ff1690565b348015610a2757600080fd5b506104e2610a36366004615b25565b611f61565b348015610a4757600080fd5b50610453610a56366004615897565b6121c3565b348015610a6757600080fd5b50601f54610a769061ffff1681565b60405161ffff90911681526020016103d1565b348015610a9557600080fd5b5060408051808201909152600481526367616d6960e01b6020820152610406565b348015610ac257600080fd5b50610453610ad1366004615897565b6122bf565b348015610ae257600080fd5b506103bd6123bb565b348015610af757600080fd5b506010546104929063ffffffff808216916401000000008104821691600160401b8204811691600160601b90041684565b348015610b3457600080fd5b506104e2610b433660046158b4565b6123cf565b348015610b5457600080fd5b506104e2610b63366004615ab8565b6123e6565b348015610b7457600080fd5b50610453610b83366004615897565b6124b3565b348015610b9457600080fd5b506023546104e290600160a81b900460ff1681565b348015610bb557600080fd5b5061056060215481565b348015610bcb57600080fd5b50601c54610a769061ffff1681565b348015610be657600080fd5b506104e2610bf5366004615ab8565b612538565b348015610c0657600080fd5b50610453610c15366004615b43565b6125f8565b348015610c2657600080fd5b50610453610c35366004615b60565b6126c6565b348015610c4657600080fd5b50610453610c55366004615921565b61285b565b348015610c6657600080fd5b506104e2610c7536600461598e565b6129c4565b348015610c8657600080fd5b50610560610c95366004615ba0565b612aa3565b348015610ca657600080fd5b50610560610cb5366004615bce565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610cec57600080fd5b50610453610cfb366004615bec565b612b21565b348015610d0c57600080fd5b50610453610d1b366004615897565b612d47565b348015610d2c57600080fd5b506104e2610d3b366004615af1565b612e47565b348015610d4c57600080fd5b50610453610d5b366004615c3f565b612f08565b348015610d6c57600080fd5b506023546104e290600160b01b900460ff1681565b33600090815260026020526040902054600160a01b900460ff16600114610da757600080fd5b6001600160a01b0381166000908152600e602052604090206001810154600160a01b900460ff1615610e205760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064015b60405180910390fd5b6001810154600160a81b900460ff16610e7b5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610e17565b602354600160a01b900460ff16610ed45760405162461bcd60e51b815260206004820152601d60248201527f486173206e6f74206265656e20696e697469616c697a656420796574210000006044820152606401610e17565b6023546001600160a01b03908116600090815260076020908152604080832085549094168352929052205460001914610f37576023546001600160a01b039081166000908152600760209081526040808320855490941683529290522060001990555b60018101805460ff60c01b1916601960c21b179055612710610f5883611f02565b610f6390600a615ca1565b610f6d9190615cb8565b6003820155612710610f7e83611f02565b610f89906019615ca1565b610f939190615cb8565b6004828101919091556022548254600184015460405163197106ad60e11b815230948101949094526001600160a01b03918216602485015285821660448501528116606484015263ffffffff4316608484015265ffffffffffff421660a48401526000926201000090920416906332e20d5a9060c4016020604051808303816000875af1158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190615cda565b90508061105857600080fd5b6008546001830154600384015460048086015460405163a43583bf60e01b81526001600160a01b0389811693820193909352600160c01b90940460ff16602485015263ffffffff4316604485015265ffffffffffff42166064850152608484019290925260a48301919091529091169063a43583bf9060c4016020604051808303816000875af11580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615cda565b90508061112057600080fd5b6022805461ff00191661010017905560018201805463ffffffff4316600160c81b81027fffffff00000000ff00ffff00ffffffffffffffffffffffffffffffffffffffff90921691909117630100000160a01b1790915560028301805465ffffffffffff421665ffffffffffff199091168117909155604080516001600160a01b038716815284151560208201529081019290925260608201527f517d39d150a7135e3ae5b4a1f34b970417d17c7d44bced1956e724f5567ffcb3906080015b60405180910390a15b505050565b60006111fb3384846130c5565b5060015b92915050565b60006112196001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611251575033600090815260026020526040902054600160a01b900460ff166001145b61125a57600080fd5b306001600160a01b038316036112b25760405162461bcd60e51b815260206004820152600e60248201527f43616e27742062652073656c662e0000000000000000000000000000000000006044820152606401610e17565b602280546001600160a01b038481166201000081810275ffffffffffffffffffffffffffffffffffffffff0000199094169390931793849055602380546001600160a01b0319169091179055604051634910b4d960e01b8152306004820152600093929092041690634910b4d990602401600060405180830381600087803b15801561133d57600080fd5b505af192505050801561134e575060015b61135757600080fd5b50600190505b919050565b60006113706012600a615ddb565b61137f9064174876e800615ca1565b60000361138b57600080fd5b6113976012600a615ddb565b6113a69064174876e800615ca1565b905090565b6001600160a01b03831660009081526007602090815260408083203384529091528120546000191461142957611429843361142485604051806060016040528060288152602001615f7e602891396001600160a01b038a16600090815260076020908152604080832033845290915290205491906131be565b6130c5565b6114348484846131ea565b949350505050565b61144461405c565b6001546001600160a01b0316331480611476575033600090815260026020526040902054600160a01b900460ff166001145b61147f57600080fd5b6103e861148e6012600a615ddb565b61149d9064174876e800615ca1565b6114a79190615cb8565b61271061ffff83166114bb6012600a615ddb565b6114ca9064174876e800615ca1565b6114d49190615ca1565b6114de9190615cb8565b10156115525760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610e17565b601c805461ffff191661ffff8316908117909155612710906115766012600a615ddb565b6115859064174876e800615ca1565b61158f9190615ca1565b6115999190615cb8565b601d556115a66001600055565b50565b60006115bd6001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806115f5575033600090815260026020526040902054600160a01b900460ff166001145b6115fe57600080fd5b6001600160a01b0384166000818152600e6020908152604091829020600381018790556004018590558151928352820185905281018390527f4b4b99a1eff34af744bde4562076348fe524799340e842c09f26f43c94ea9d2b9060600160405180910390a15060019392505050565b600061167b6012600a615ddb565b61168a9064174876e800615ca1565b60000361169657600080fd5b50601290565b60006116b06001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806116e8575033600090815260026020526040902054600160a01b900460ff166001145b6116f157600080fd5b6010805463ffffffff848116600160401b026bffffffff0000000000000000198783166401000000000267ffffffffffffffff19909416928916929092179290921716179055816117428486615dea565b61174c9190615dea565b6010805463ffffffff92909216600160601b0263ffffffff60601b199092169190911790555060019392505050565b600080611790601a546001600160a01b031690565b601b546001600160a01b0316915091509091565b6001546001600160a01b03163314806117d6575033600090815260026020526040902054600160a01b900460ff166001145b6117df57600080fd5b6001600160a01b038083166000908152600e6020908152604080832080548886166001600160a01b0319909116811782556001808301805475ffffffffffffffffffffffffffffffffffffffffffff19169789169788179055600c8552838620805460ff199081168317909155968652600d8552838620805490971617909555938352600b90915290205460ff16611939576001600160a01b0384166000908152600b60205260409020805460ff191660011790556118a761189e3390565b856000196130c5565b6001546118c0906001600160a01b0316856000196130c5565b6118cd30856000196130c5565b6001600160a01b03841660008181526016602090815260408083208054600160ff199182168117909255601584529382902080549094161790925590519182527f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a15b60405163095ea7b360e01b81526001600160a01b038581166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015611989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ad9190615cda565b50604080516001600160a01b038681168252858116602083015284168183015290517f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d9181900360600190a150505050565b6001546001600160a01b0316331480611a31575033600090815260026020526040902054600160a01b900460ff166001145b611a3a57600080fd5b60005b818110156111e957611aa8838383818110611a5a57611a5a615e0e565b9050602002016020810190611a6f9190615897565b6001600160a01b0316600090815260026020908152604080832080546001600160a81b031916905560039091529020805460ff19169055565b80611ab281615e24565b915050611a3d565b6000611ace6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611b06575033600090815260026020526040902054600160a01b900460ff166001145b611b0f57600080fd5b6011805463ffffffff848116600160401b026bffffffff0000000000000000198783166401000000000267ffffffffffffffff1990941692891692909217929092171617905581611b608486615dea565b611b6a9190615dea565b6011805463ffffffff92909216600160601b0263ffffffff60601b199092169190911790555060019392505050565b611ba161405c565b6001546001600160a01b0316331480611bd3575033600090815260026020526040902054600160a01b900460ff166001145b611bdc57600080fd5b6001600160a01b0382166000908152601660205260408120805460ff1916831515179055600190555050565b5050565b611c1461405c565b6001546001600160a01b0316331480611c46575033600090815260026020526040902054600160a01b900460ff166001145b611c4f57600080fd5b601a80546001600160a01b0383166001600160a01b031990911681179091556000908152601660205260409020805460ff191660011790556115a66001600055565b6001546001600160a01b0316331480611cc3575033600090815260026020526040902054600160a01b900460ff166001145b80611ce8575033600090815260026020819052604090912054600160a01b900460ff16145b80611d0c575033600090815260026020526040902054600160a01b900460ff166005145b611d1557600080fd5b6001600160a01b0381163314611d935760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e17565b6001600160a01b03811660009081526003602052604090205460ff161515600114611e005760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e2061646d696e20726f6c650000006044820152606401610e17565b6115a6816001600160a01b0316600090815260026020908152604080832080546001600160a81b031916905560039091529020805460ff19169055565b6001546001600160a01b0316331480611e6f575033600090815260026020526040902054600160a01b900460ff166001145b611e7857600080fd5b8060ff16600103611ef85733600090815260026020526040902054600160a01b900460ff16600114611ef85760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617574686f72697a656420746f207365742061206044820152623232bb60e91b6064820152608401610e17565b611c0882826140b5565b6001600160a01b03811660009081526018602052604081205460ff1615611f3f57506001600160a01b031660009081526006602052604090205490565b6001600160a01b0382166000908152600560205260409020546111ff90614107565b33600090815260026020526040812054600160a01b900460ff16600114611f8757600080fd5b6023805460ff60a01b19169055602254604051637182afc760e11b81523060048201526000916201000090046001600160a01b03169063e3055f8e906024016020604051808303816000875af1158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120099190615cda565b6023805460ff60a01b1916600160a01b9215158302179081905560ff9190041661203257600080fd5b6023546001600160a01b031660009081526003602052604090205460ff1661206b5760235461206b906001600160a01b031660016140b5565b83806120745750825b156121bc57602254604051630fadb35f60e01b81523060048201528515156024820152841515604482015265ffffffffffff7f0000000000000000000000000000000000000000000000000000000000000064811660648301527f0000000000000000000000000000000000000000000000000000000000011940166084820152620100009091046001600160a01b031690630fadb35f9060a4016020604051808303816000875af115801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190615cda565b90508061215e57600080fd5b60238054600160a81b60ff60a81b1982161782556001600160a01b03166000908152601660205260409020805460ff19166001179055805461ffff60b01b1916600160b01b8615150260ff60b81b191617600160b81b851515021790555b9392505050565b6001546001600160a01b03163314806121f5575033600090815260026020526040902054600160a01b900460ff166001145b6121fe57600080fd5b600061220930611f02565b6001600160a01b0383166000908152600e60205260409020600301549091508110611c08576001600160a01b0382166000908152600e602052604090206004810154600190910154600160b81b900460ff16156122aa576001600160a01b0383166000908152600e602052604090206001015461271090600160c01b900460ff1661229385611f02565b61229d9190615ca1565b6122a79190615cb8565b90505b8082106122b5578091505b6111e98284614184565b33600090815260026020526040902054600160a01b900460ff166001146122e557600080fd5b6008546001600160a01b038083169116036123425760405162461bcd60e51b815260206004820152601f60248201527f416c72656164792073657420746f207468652073616d652061646472657373006044820152606401610e17565b600880546001600160a01b0319166001600160a01b03831690811790915560405163dc73208b60e01b815230600482015263dc73208b90602401600060405180830381600087803b15801561239657600080fd5b505af19250505080156123a7575060015b6123b057600080fd5b6115a68160016140b5565b60006113a66001546001600160a01b031690565b60006123dc3384846131ea565b5060019392505050565b60006123fa6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612432575033600090815260026020526040902054600160a01b900460ff166001145b61243b57600080fd5b6001600160a01b0383166000818152600e6020908152604091829020600101805460ff60b01b1916600160b01b871515908102919091179091558251938452908301527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c54391015b60405180910390a150600192915050565b6124bb61405c565b6001546001600160a01b03163314806124ed575033600090815260026020526040902054600160a01b900460ff166001145b6124f657600080fd5b601b80546001600160a01b0383166001600160a01b031990911681179091556000908152601660205260409020805460ff191660011790556115a66001600055565b600061254c6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612584575033600090815260026020526040902054600160a01b900460ff166001145b61258d57600080fd5b6001600160a01b0383166000818152600e6020908152604091829020600101805460ff60b81b1916600160b81b871515908102919091179091558251938452908301527f3fdc3a0a211fcb6dedf2ee6f5566883ccd93088f308aaada19760f3b6bd62ee791016124a2565b6001546001600160a01b031633148061262a575033600090815260026020526040902054600160a01b900460ff166001145b61263357600080fd5b60175481151560ff9091161515036126b35760405162461bcd60e51b815260206004820152603060248201527f5468652073776974636820697320616c72656164792073657420617420796f7560448201527f72206465736972656420737461746521000000000000000000000000000000006064820152608401610e17565b6017805460ff1916911515919091179055565b33600090815260026020526040902054600160a01b900460ff166001146126ec57600080fd5b6001600160a01b0383166000908152600b602052604090205481151560ff909116151503612798576001600160a01b0383166000818152600b60209081526040808320805486151560ff1991821681179092556016845282852080548216831790556015845293829020805490941681179093558051938452908301919091527ff1551184b142d0ef4c150b6a021c1e4da5e8844379a9ea03fb3cd061ea1daf21910160405180910390a15b6001600160a01b0382166000908152600c602052604090205481151560ff9091161515036111e9576001600160a01b038281166000818152600e60208181526040808420600101805460ff60a01b1916600160a01b891515908102919091178255600c845294829020805460ff19168617905592825291548251898716815291820194909452929093169282019290925260608101919091527fe8bb375afb479dfce3e1bc16cc4c12a7cb54301ad17e0ece3f70facf86d5eecd906080016111e0565b61286361405c565b6001546001600160a01b0316331480612895575033600090815260026020526040902054600160a01b900460ff166001145b61289e57600080fd5b60646128ac6012600a615ddb565b6128bb9064174876e800615ca1565b6128c59190615cb8565b61271061ffff83166128d96012600a615ddb565b6128e89064174876e800615ca1565b6128f29190615ca1565b6128fc9190615cb8565b10156129705760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401610e17565b601f805461ffff191661ffff8316908117909155612710906129946012600a615ddb565b6129a39064174876e800615ca1565b6129ad9190615ca1565b6129b79190615cb8565b6020556115a66001600055565b60006129d86001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612a10575033600090815260026020526040902054600160a01b900460ff166001145b612a1957600080fd5b6012805463ffffffff848116600160401b026bffffffff0000000000000000198783166401000000000267ffffffffffffffff1990941692891692909217929092171617905581612a6a8486615dea565b612a749190615dea565b6012805463ffffffff92909216600160601b0263ffffffff60601b199092169190911790555060019392505050565b60008215612ab25750476111ff565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015612af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1a9190615e3d565b90506111ff565b6001546001600160a01b0316331480612b53575033600090815260026020526040902054600160a01b900460ff166001145b612b5c57600080fd5b612b668484612aa3565b821115612b7257600080fd5b60405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015612bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be69190615cda565b508315612c87576000816001600160a01b03168361520890604051600060405180830381858888f193505050503d8060008114612c3f576040519150601f19603f3d011682016040523d82523d6000602084013e612c44565b606091505b5050905080612c815760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401610e17565b50612d41565b6040516323b872dd60e01b81523060048201526001600160a01b03828116602483015260448201849052600091908516906323b872dd906064016020604051808303816000875af1158015612ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d049190615cda565b905080612d3f5760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401610e17565b505b50505050565b6001546001600160a01b0316331480612d79575033600090815260026020526040902054600160a01b900460ff166001145b612d8257600080fd5b6001546001600160a01b0390811690821603612deb5760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920746865206f776e65604482015261722160f01b6064820152608401610e17565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000612e5b6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480612e93575033600090815260026020526040902054600160a01b900460ff166001145b612e9c57600080fd5b6001600160a01b0383166000818152600e6020908152604091829020600101805460ff60c01b1916600160c01b60ff8816908102919091179091558251938452908301527f024e5cc370f4392aaafdb3d37424c18b801c726ff6c32c142bfc1c2d8c2185b391016124a2565b6001546001600160a01b0316331480612f3a575033600090815260026020526040902054600160a01b900460ff166001145b612f4357600080fd5b60005b82811015612d41578115612fed5760186000858584818110612f6a57612f6a615e0e565b9050602002016020810190612f7f9190615897565b6001600160a01b0316815260208101919091526040016000205460ff16612fe85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610e17565b613082565b6018600085858481811061300357613003615e0e565b90506020020160208101906130189190615897565b6001600160a01b0316815260208101919091526040016000205460ff16156130825760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610e17565b6130b284848381811061309757613097615e0e565b90506020020160208101906130ac9190615897565b83614a91565b50806130bd81615e24565b915050612f46565b6001600160a01b0383166131115760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610e17565b6001600160a01b03821661315d5760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610e17565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600081848411156131e25760405162461bcd60e51b8152600401610e179190615834565b505050900390565b60006001600160a01b0384166132505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e17565b6001600160a01b0383166132b25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e17565b600082116133145760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e17565b6001600160a01b0384166000908152600c602052604081205481908190819060ff161561338157600a80546001600160a01b0319166001600160a01b038a161790556017546001945060ff161561337657613370876001614a91565b50613421565b613370876000614a91565b6001600160a01b0387166000908152600c602052604090205460ff16156133e257600a80546001600160a01b0319166001600160a01b0389161790556017546001935060ff16156133d757613370886001614a91565b613370886000614a91565b6017546001925060ff1615613408576133fc886001614a91565b50613370876001614a91565b613413886000614a91565b5061341f876000614a91565b505b600a546001600160a01b039081166000908152600e6020908152604091829020825161016081018452815485168152600182015494851692810192909252600160a01b840460ff908116151593830193909352600160a81b8404831615156060830152600160b01b8404831615156080830152600160b81b84048316151560a0830152600160c01b840490921660c0820152600160c81b90920463ffffffff1660e0830152600281015465ffffffffffff166101008301526003810154610120830152600401546101408201526134f88989614cdc565b15613a4d57602254610100900460ff166135545760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610e17565b848061355d5750835b156135c25780604001516135c25760405162461bcd60e51b815260206004820152602660248201527f54726164696e67206e6f742079657420656e61626c656420666f72207468697360448201526520706169722160d01b6064820152608401610e17565b84806135cb5750835b15613738576022546040516352252c9960e11b81523060048201526001600160a01b038b81166024830152620100009092049091169063a44a593290604401602060405180830381865afa158015613627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364b9190615cda565b1580156136d057506022546040516352252c9960e11b81523060048201526001600160a01b038a81166024830152620100009092049091169063a44a593290604401602060405180830381865afa1580156136aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ce9190615cda565b155b1561373857601d548711156137385760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610e17565b602354600160a81b900460ff16156139365760225460405163341583b160e21b81523060048201526001600160a01b038b811660248301528a811660448301528715156064830152861515608483015285151560a4830152600092620100009004169063d0560ec49060c4016020604051808303816000875af11580156137c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e79190615cda565b9050806138365760405162461bcd60e51b815260206004820152601260248201527f426c61636b6c6973742052656a656374656400000000000000000000000000006044820152606401610e17565b602354600160b81b900460ff16156139345760225460405163281b7edf60e01b81523060048201526001600160a01b038c811660248301528b811660448301528815156064830152871515608483015286151560a4830152620100009092049091169063281b7edf9060c4016020604051808303816000875af11580156138c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138e59190615cda565b9050806139345760405162461bcd60e51b815260206004820152601560248201527f53616e647769636820426f742052656a656374656400000000000000000000006044820152606401610e17565b505b80516001600160a01b03898116911614801590613951575083155b15613a4d576022546040516352252c9960e11b81523060048201526001600160a01b038a81166024830152620100009092049091169063a44a593290604401602060405180830381865afa1580156139ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d19190615cda565b613a4d57602054876139e28a611f02565b6139ec9190615e56565b1115613a4d5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610e17565b8315613aef5760225460ff16613aef57806080015115613aef576000613a7230611f02565b90508161012001518110613aed5761014082015160a083015115613ac95760c0830151600a546127109160ff1690613ab2906001600160a01b0316611f02565b613abc9190615ca1565b613ac69190615cb8565b90505b808210613ad4578091505b600a54613aeb9083906001600160a01b0316614184565b505b505b8060600151613c9757600a54613b11908a908a906001600160a01b0316614e6e565b8060600151158015613b285750613b288989614cdc565b8015613bac5750602254604051638623039360e01b81523060048201526001600160a01b038b811660248301526201000090920490911690638623039390604401602060405180830381865afa158015613b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613baa9190615cda565b155b8015613c305750602254604051638623039360e01b81523060048201526001600160a01b038a811660248301526201000090920490911690638623039390604401602060405180830381865afa158015613c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2e9190615cda565b155b8015613c3a575082155b15613c925760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f604482015261371760f11b6064820152608401610e17565b613e37565b602354600160b01b900460ff1615613e3757613cb38989614cdc565b15613dc957602254600a5460405163127850cf60e21b81526001600160a01b0391821660048201528b821660248201528a821660448201528715156064820152861515608482015285151560a4820152600092620100009004909116906349e1433c9060c40160408051808303816000875af1925050508015613d53575060408051601f3d908101601f19168201909252613d5091810190615e69565b60015b613d5c57600080fd5b60238054911515600160b01b0260ff60b01b19909216919091179055905080613dc75760405162461bcd60e51b815260206004820152600f60248201527f536e697065722052656a656374656400000000000000000000000000000000006044820152606401610e17565b505b602354600160b01b900460ff16613e375760235460408051600160b01b90920460ff16151582524363ffffffff1660208301524265ffffffffffff16908201527f9051140fef6baf751a615e3f9bfbfd97973a1b0813c667774aeb3fa03035dfb39060600160405180910390a15b6001600160a01b03891660009081526016602052604090205460ff1680613e7657506001600160a01b03881660009081526016602052604090205460ff165b15613e8057600191505b8115613ef2576013546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b9384900491909116909202919091179055614044565b8415613f64576010546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b9384900491909116909202919091179055614044565b8315613fd6576011546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b9384900491909116909202919091179055614044565b8215614044576012546014805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021767ffffffffffffffff60401b1916600160401b80850483160263ffffffff60601b191617600160601b93849004919091169092029190911790555b61404f898989614fb0565b9998505050505050505050565b6002600054036140ae5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e17565b6002600055565b6001600160a01b039091166000818152600260209081526040808320805460ff909616600160a01b026001600160a81b031990961690941794909417909255600390915220805460ff19166001179055565b600060045482111561416e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e17565b6000614178615294565b90506121bc83826152b7565b6022805460ff191660019081179091556001600160a01b038083166000908152600e60209081526040808320815161016081018352815486168082529682015495861681850152600160a01b860460ff908116151582850152600160a81b870481161515606080840191909152600160b01b880482161515608080850191909152600160b81b89048316151560a0850152600160c01b890490921660c084015263ffffffff600160c81b909804881660e0840152600284015465ffffffffffff166101008401526003840154610120840152600490930154610140830152600980546001600160a01b0319169098179097558251968701835260145480871688526401000000008104871694880194909452600160401b8404861692870192909252600160601b90920490931690840181905291929190036142c7575050614a83565b3060009081526007602090815260408083206009546001600160a01b0316845290915290205460001914614320573060009081526007602090815260408083206009546001600160a01b03168452909152902060001990555b60006002826060015163ffffffff16836000015163ffffffff16876143459190615ca1565b61434f9190615cb8565b6143599190615cb8565b905060006143678287615e98565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106143a1576143a1615e0e565b60200260200101906001600160a01b031690816001600160a01b0316815250508460200151816001815181106143d9576143d9615e0e565b60200260200101906001600160a01b031690816001600160a01b0316815250506000614404876152c3565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447d9190615eab565b6001600160a01b03168260018151811061449957614499615e0e565b60200260200101516001600160a01b03160361451f5760095460405163791ac94760e01b81526001600160a01b039091169063791ac947906144e8908690600090879030904290600401615ec8565b600060405180830381600087803b15801561450257600080fd5b505af1158015614516573d6000803e3d6000fd5b5050505061458b565b600954604051635c11d79560e01b81526001600160a01b0390911690635c11d79590614558908690600090879030904290600401615ec8565b600060405180830381600087803b15801561457257600080fd5b505af1158015614586573d6000803e3d6000fd5b505050505b600081614597896152c3565b6145a19190615e98565b90506000846145b08784615ca1565b6145ba9190615cb8565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561460f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146339190615eab565b6001600160a01b031688602001516001600160a01b03160361472c57851561472757600954601b5460405163f305d71960e01b81523060048201526024810189905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156146c5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906146ea9190615f39565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b614816565b8515614816576009546020890151601b5460405162e8e33760e81b81523060048201526001600160a01b039283166024820152604481018a90526064810185905260006084820181905260a482015290821660c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156147b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147d99190615f39565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b6148208183615e98565b6020890151601a5460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529294506000928592919091169063095ea7b3906044016020604051808303816000875af1158015614882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a69190615cda565b50600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156148fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061491e9190615eab565b6001600160a01b03168a602001516001600160a01b0316036149e557602089015163ffffffff16156149e057601a546040516001600160a01b03909116906152089083906000818181858888f193505050503d806000811461499c576040519150601f19603f3d011682016040523d82523d6000602084013e6149a1565b606091505b505080925050816149e05760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401610e17565b614a78565b602089015163ffffffff1615614a785760208a0151601a546040516323b872dd60e01b81523060048201526001600160a01b039182166024820152604481018490529116906323b872dd906064016020604051808303816000875af1158015614a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a769190615cda565b505b505050505050505050505b50506022805460ff19169055565b60008115614bec576001600160a01b03831660009081526018602052604090205460ff16614ac1575060016111ff565b60005b601954811015614be257836001600160a01b031660198281548110614aeb57614aeb615e0e565b6000918252602090912001546001600160a01b031603614bd05760198054614b1590600190615e98565b81548110614b2557614b25615e0e565b600091825260209091200154601980546001600160a01b039092169183908110614b5157614b51615e0e565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559186168152600682526040808220829055601890925220805460ff191690556019805480614ba957614ba9615f67565b600082815260209020810160001990810180546001600160a01b0319169055019055614be2565b80614bda81615e24565b915050614ac4565b50600190506111ff565b6001600160a01b03831660009081526018602052604090205460ff1615614c15575060016111ff565b6001600160a01b03831660009081526005602052604090205415614c6f576001600160a01b038316600090815260056020526040902054614c5590614107565b6001600160a01b0384166000908152600660205260409020555b506001600160a01b0382166000818152601860205260408120805460ff1916600190811790915560198054808301825592527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969590910180546001600160a01b0319169092179091556111ff565b6001546000906001600160a01b03848116911614801590614d0b57506001546001600160a01b03838116911614155b8015614d2257506001546001600160a01b03163214155b8015614d4757506001600160a01b03821660009081526015602052604090205460ff16155b8015614d6c57506001600160a01b03831660009081526015602052604090205460ff16155b8015614d8357506001600160a01b03821661dead14155b8015614d9757506001600160a01b03821615155b8015614dac57506001600160a01b0383163014155b8015614ddb57506001600160a01b038316600090815260026020526040902054600160a01b900460ff16600114155b8015614e0a57506001600160a01b038216600090815260026020526040902054600160a01b900460ff16600114155b8015614e3a57506001600160a01b038316600090815260026020819052604090912054600160a01b900460ff1614155b80156121bc5750506001600160a01b0316600090815260026020819052604090912054600160a01b900460ff161415919050565b6001600160a01b0381166000908152600e6020526040902060010154600160a81b900460ff1615614eed5760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610e17565b614ef78383614cdc565b158015614f155750806001600160a01b0316826001600160a01b0316145b156111e9576001600160a01b038381166000908152601560209081526040808320805460ff191660019081179091556023805460ff60c01b1916600160c01b179055938516808452600e8352928190208401805461010160a81b61ffff60a81b199091161790558051928352908201929092527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c54391016111e0565b6000806000806000806000614fc4886153ea565b95509550955095509550955061500886600560008d6001600160a01b03166001600160a01b031681526020019081526020016000205461543990919063ffffffff16565b6001600160a01b03808c1660009081526005602052604080822093909355908b16815220546150379086615445565b6001600160a01b03808b16600090815260056020908152604080832094909455918d1681526018909152205460ff16801561508b57506001600160a01b03891660009081526018602052604090205460ff16155b156150d1576001600160a01b038a166000908152600660205260409020546150b39089615439565b6001600160a01b038b16600090815260066020526040902055615209565b6001600160a01b038a1660009081526018602052604090205460ff1615801561511257506001600160a01b03891660009081526018602052604090205460ff165b15615158576001600160a01b03891660009081526006602052604090205461513a9084615445565b6001600160a01b038a16600090815260066020526040902055615209565b6001600160a01b038a1660009081526018602052604090205460ff16801561519857506001600160a01b03891660009081526018602052604090205460ff165b15615209576001600160a01b038a166000908152600660205260409020546151c09089615439565b6001600160a01b03808c1660009081526006602052604080822093909355908b16815220546151ef9084615445565b6001600160a01b038a166000908152600660205260409020555b8015615219576152198a82615451565b60008411806152285750600082115b1561523757615237848361551b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161527c91815260200190565b60405180910390a35060019998505050505050505050565b60008060006152a161553f565b90925090506152b082826152b7565b9250505090565b60006121bc8284615cb8565b6001600160a01b038082166000908152600e602090815260408083205481516315ab88c960e31b815291519394169263ad5c4648926004808401939192918290030181865afa15801561531a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061533e9190615eab565b6001600160a01b038381166000908152600e602052604090206001015491811691160361536c575047919050565b6001600160a01b038281166000908152600e6020526040908190206001015490516370a0823160e01b81523060048201529116906370a0823190602401602060405180830381865afa1580156153c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff9190615e3d565b60008060008060008060008060006154018a615725565b925092509250600080600061541f8d868661541a615294565b615767565b919f909e50909c50959a5093985091965092945050505050565b60006121bc8284615e98565b60006121bc8284615e56565b600061545b615294565b9050600061546983836157b7565b306000908152600560205260409020549091506154869082615445565b3060009081526005602090815260408083209390935560189052205460ff16156154d557306000908152600660205260409020546154c49084615445565b306000908152600660205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6004546155289083615439565b600455600f546155389082615445565b600f555050565b6004546000908190816155546012600a615ddb565b6155639064174876e800615ca1565b905060005b6019548110156156c55782600560006019848154811061558a5761558a615e0e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806155f557508160066000601984815481106155ce576155ce615e0e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15615623576004546156096012600a615ddb565b6156189064174876e800615ca1565b945094505050509091565b615669600560006019848154811061563d5761563d615e0e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490615439565b92506156b1600660006019848154811061568557615685615e0e565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390615439565b9150806156bd81615e24565b915050615568565b506156ed6156d56012600a615ddb565b6156e49064174876e800615ca1565b600454906152b7565b82101561571c576004546157036012600a615ddb565b6157129064174876e800615ca1565b9350935050509091565b90939092509050565b600080600080615734856157c3565b90506000615741866157f3565b90506000615759826157538986615439565b90615439565b979296509094509092505050565b600080808061577688866157b7565b9050600061578488876157b7565b9050600061579288886157b7565b905060006157a4826157538686615439565b939b939a50919850919650505050505050565b60006121bc8284615ca1565b6014546000906111ff90612710906157ed90859063ffffffff600160401b9091048116906157b716565b906152b7565b6014546000906111ff90612710906157ed9061581f9063ffffffff640100000000820481169116615dea565b63ffffffff16856157b790919063ffffffff16565b600060208083528351808285015260005b8181101561586157858101830151858201604001528201615845565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146115a657600080fd5b6000602082840312156158a957600080fd5b81356121bc81615882565b600080604083850312156158c757600080fd5b82356158d281615882565b946020939093013593505050565b6000806000606084860312156158f557600080fd5b833561590081615882565b9250602084013561591081615882565b929592945050506040919091013590565b60006020828403121561593357600080fd5b813561ffff811681146121bc57600080fd5b60008060006060848603121561595a57600080fd5b833561596581615882565b95602085013595506040909401359392505050565b803563ffffffff8116811461135d57600080fd5b6000806000606084860312156159a357600080fd5b6159ac8461597a565b92506159ba6020850161597a565b91506159c86040850161597a565b90509250925092565b6000806000606084860312156159e657600080fd5b83356159f181615882565b92506020840135615a0181615882565b91506040840135615a1181615882565b809150509250925092565b60008083601f840112615a2e57600080fd5b50813567ffffffffffffffff811115615a4657600080fd5b6020830191508360208260051b8501011115615a6157600080fd5b9250929050565b60008060208385031215615a7b57600080fd5b823567ffffffffffffffff811115615a9257600080fd5b615a9e85828601615a1c565b90969095509350505050565b80151581146115a657600080fd5b60008060408385031215615acb57600080fd5b8235615ad681615882565b91506020830135615ae681615aaa565b809150509250929050565b60008060408385031215615b0457600080fd5b8235615b0f81615882565b9150602083013560ff81168114615ae657600080fd5b60008060408385031215615b3857600080fd5b8235615ad681615aaa565b600060208284031215615b5557600080fd5b81356121bc81615aaa565b600080600060608486031215615b7557600080fd5b8335615b8081615882565b92506020840135615b9081615882565b91506040840135615a1181615aaa565b60008060408385031215615bb357600080fd5b8235615bbe81615aaa565b91506020830135615ae681615882565b60008060408385031215615be157600080fd5b8235615bbe81615882565b60008060008060808587031215615c0257600080fd5b8435615c0d81615aaa565b93506020850135615c1d81615882565b9250604085013591506060850135615c3481615882565b939692955090935050565b600080600060408486031215615c5457600080fd5b833567ffffffffffffffff811115615c6b57600080fd5b615c7786828701615a1c565b9094509250506020840135615a1181615aaa565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176111ff576111ff615c8b565b600082615cd557634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215615cec57600080fd5b81516121bc81615aaa565b600181815b80851115615d32578160001904821115615d1857615d18615c8b565b80851615615d2557918102915b93841c9390800290615cfc565b509250929050565b600082615d49575060016111ff565b81615d56575060006111ff565b8160018114615d6c5760028114615d7657615d92565b60019150506111ff565b60ff841115615d8757615d87615c8b565b50506001821b6111ff565b5060208310610133831016604e8410600b8410161715615db5575081810a6111ff565b615dbf8383615cf7565b8060001904821115615dd357615dd3615c8b565b029392505050565b60006121bc60ff841683615d3a565b63ffffffff818116838216019080821115615e0757615e07615c8b565b5092915050565b634e487b7160e01b600052603260045260246000fd5b600060018201615e3657615e36615c8b565b5060010190565b600060208284031215615e4f57600080fd5b5051919050565b808201808211156111ff576111ff615c8b565b60008060408385031215615e7c57600080fd5b8251615e8781615aaa565b6020840151909250615ae681615aaa565b818103818111156111ff576111ff615c8b565b600060208284031215615ebd57600080fd5b81516121bc81615882565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015615f185784516001600160a01b031683529383019391830191600101615ef3565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215615f4e57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122097dc768a3bacfb9123de6513f5b1e89abcef5b52fb0450a80956ef6cb24c1f2864736f6c63430008110033

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

000000000000000000000000ddf6731248edbe96337bbc34ac03b6a2caacfe500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000004b0

-----Decoded View---------------
Arg [0] : DexRouterPairManager_ (address): 0xDDf6731248eDBE96337BBc34ac03B6A2caAcfE50
Arg [1] : LPwithEth_ToF_ (bool): True
Arg [2] : LPTargetCoinCA_ (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : marketing_ (address): 0x861435743Ae62fd6237d2FB3aB255B4f624EE40b
Arg [4] : lpLocker_ (address): 0xA3d432884968917D2fBC88d8592955a2F6c42e39
Arg [5] : snipeBlockAmt_ (uint32): 100
Arg [6] : snipeBlockTimeInMinutes_ (uint48): 1200

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000ddf6731248edbe96337bbc34ac03b6a2caacfe50
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b
Arg [4] : 000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [6] : 00000000000000000000000000000000000000000000000000000000000004b0


Deployed Bytecode Sourcemap

39589:39147:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43095:73;;;;;;;;;;;;43126:42;43095:73;;;;;-1:-1:-1;;;;;178:55:1;;;160:74;;148:2;133:18;43095:73:0;;;;;;;;49066:80;;;;;;;;;;-1:-1:-1;49138:5:0;;;;;;;;;;;;-1:-1:-1;;;49138:5:0;;;;49066:80;;;;;;;:::i;40418:26::-;;;;;;;;;;-1:-1:-1;40418:26:0;;;;-1:-1:-1;;;;;40418:26:0;;;54109:1581;;;;;;;;;;-1:-1:-1;54109:1581:0;;;;;:::i;:::-;;:::i;:::-;;41964:150;;;;;;;;;;-1:-1:-1;41964:150:0;;;;;;;;;;;;;;;-1:-1:-1;;;41964:150:0;;;;;-1:-1:-1;;;41964:150:0;;;;;;;;;1790:10:1;1827:15;;;1809:34;;1879:15;;;1874:2;1859:18;;1852:43;1931:15;;;1911:18;;;1904:43;;;;1983:15;;;1978:2;1963:18;;1956:43;1767:3;1752:19;41964:150:0;1557:448:1;50070:161:0;;;;;;;;;;-1:-1:-1;50070:161:0;;;;;:::i;:::-;;:::i;:::-;;;2495:14:1;;2488:22;2470:41;;2458:2;2443:18;50070:161:0;2330:187:1;52612:498:0;;;;;;;;;;-1:-1:-1;52612:498:0;;;;;:::i;:::-;;:::i;41809:146::-;;;;;;;;;;-1:-1:-1;41809:146:0;;;;;;;;;;;;;;;-1:-1:-1;;;41809:146:0;;;;;-1:-1:-1;;;41809:146:0;;;;;77791:89;;;;;;;;;;-1:-1:-1;77862:10:0;;77791:89;;;2668:25:1;;;2656:2;2641:18;77791:89:0;2522:177:1;44472:31:0;;;;;;;;;;-1:-1:-1;44472:31:0;;;;-1:-1:-1;;;44472:31:0;;;;;;48737:115;;;;;;;;;;;;;:::i;49674:388::-;;;;;;;;;;-1:-1:-1;49674:388:0;;;;;:::i;:::-;;:::i;58223:290::-;;;;;;;;;;-1:-1:-1;58223:290:0;;;;;:::i;:::-;;:::i;62583:349::-;;;;;;;;;;-1:-1:-1;62583:349:0;;;;;:::i;:::-;;:::i;48858:112::-;;;;;;;;;;;;;:::i;:::-;;;4002:4:1;3990:17;;;3972:36;;3960:2;3945:18;48858:112:0;3830:184:1;56183:346:0;;;;;;;;;;-1:-1:-1;56183:346:0;;;;;:::i;:::-;;:::i;57666:146::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4773:15:1;;;4755:34;;4825:15;;;;4820:2;4805:18;;4798:43;4667:18;57666:146:0;4520:327:1;43875:34:0;;;;;;;;;;-1:-1:-1;43875:34:0;;;;;;;;;;;50701:1042;;;;;;;;;;-1:-1:-1;50701:1042:0;;;;;:::i;:::-;;:::i;40451:23::-;;;;;;;;;;-1:-1:-1;40451:23:0;;;;-1:-1:-1;;;;;40451:23:0;;;58975:127;;;;;;;;;;-1:-1:-1;58975:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;59066:28:0;59042:4;59066:28;;;:19;:28;;;;;;;;;58975:127;6424:162;;;;;;;;;;-1:-1:-1;6424:162:0;;;;;:::i;:::-;;:::i;44635:36::-;;;;;;;;;;-1:-1:-1;44635:36:0;;;;-1:-1:-1;;;44635:36:0;;;;;;7223:116;;;;;;;;;;-1:-1:-1;7223:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;7310:11:0;7287:5;7310:11;;;:6;:11;;;;;:21;-1:-1:-1;;;7310:21:0;;;;;7223:116;56537:351;;;;;;;;;;-1:-1:-1;56537:351:0;;;;;:::i;:::-;;:::i;58818:149::-;;;;;;;;;;-1:-1:-1;58818:149:0;;;;;:::i;:::-;;:::i;40999:41::-;;;;;;;;;;-1:-1:-1;40999:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40999:41:0;;;;;;;;-1:-1:-1;;;40999:41:0;;;;;;;-1:-1:-1;;;40999:41:0;;;;;-1:-1:-1;;;40999:41:0;;;;;-1:-1:-1;;;40999:41:0;;;;;-1:-1:-1;;;40999:41:0;;;;;;-1:-1:-1;;;40999:41:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7288:15:1;;;7270:34;;7340:15;;;;7335:2;7320:18;;7313:43;7399:14;;7392:22;7372:18;;;7365:50;;;;7458:14;;7451:22;7446:2;7431:18;;7424:50;7518:14;;7511:22;7505:3;7490:19;;7483:51;7578:14;;7571:22;7565:3;7550:19;;7543:51;7643:4;7631:17;7625:3;7610:19;;7603:46;1534:10;1523:22;7699:3;7684:19;;1511:35;6786:14;6775:26;7754:3;7739:19;;6763:39;7790:3;7775:19;;7768:35;;;;7834:3;7819:19;;7812:36;7196:3;7181:19;40999:41:0;6813:1041:1;57303:179:0;;;;;;;;;;-1:-1:-1;57303:179:0;;;;;:::i;:::-;;:::i;6594:263::-;;;;;;;;;;-1:-1:-1;6594:263:0;;;;;:::i;:::-;;:::i;43375:75::-;;;;;;;;;;;;;;;;7106:109;;;;;;;;;;-1:-1:-1;7106:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;7191:16:0;7169:4;7191:16;;;:11;:16;;;;;;;;;7106:109;5519:268;;;;;;;;;;-1:-1:-1;5519:268:0;;;;;:::i;:::-;;:::i;49293:198::-;;;;;;;;;;-1:-1:-1;49293:198:0;;;;;:::i;:::-;;:::i;44593:35::-;;;;;;;;;;-1:-1:-1;44593:35:0;;;;-1:-1:-1;;;44593:35:0;;;;;;61716:126;;;;;;;;;;-1:-1:-1;61716:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;61814:20:0;61790:4;61814:20;;;:11;:20;;;;;;;;;61716:126;53118:983;;;;;;;;;;-1:-1:-1;53118:983:0;;;;;:::i;:::-;;:::i;70346:632::-;;;;;;;;;;-1:-1:-1;70346:632:0;;;;;:::i;:::-;;:::i;43483:33::-;;;;;;;;;;-1:-1:-1;43483:33:0;;;;;;;;;;;8831:6:1;8819:19;;;8801:38;;8789:2;8774:18;43483:33:0;8657:188:1;48976:84:0;;;;;;;;;;-1:-1:-1;49050:7:0;;;;;;;;;;;;-1:-1:-1;;;49050:7:0;;;;48976:84;;55698:344;;;;;;;;;;-1:-1:-1;55698:344:0;;;;;:::i;:::-;;:::i;7010:88::-;;;;;;;;;;;;;:::i;41655:145::-;;;;;;;;;;-1:-1:-1;41655:145:0;;;;;;;;;;;;;;;-1:-1:-1;;;41655:145:0;;;;;-1:-1:-1;;;41655:145:0;;;;;49499:167;;;;;;;;;;-1:-1:-1;49499:167:0;;;;;:::i;:::-;;:::i;61998:256::-;;;;;;;;;;-1:-1:-1;61998:256:0;;;;;:::i;:::-;;:::i;57490:168::-;;;;;;;;;;-1:-1:-1;57490:168:0;;;;;:::i;:::-;;:::i;44510:33::-;;;;;;;;;;-1:-1:-1;44510:33:0;;;;-1:-1:-1;;;44510:33:0;;;;;;43616:83;;;;;;;;;;;;;;;;43246:29;;;;;;;;;;-1:-1:-1;43246:29:0;;;;;;;;62262:313;;;;;;;;;;-1:-1:-1;62262:313:0;;;;;:::i;:::-;;:::i;59703:207::-;;;;;;;;;;-1:-1:-1;59703:207:0;;;;;:::i;:::-;;:::i;51751:714::-;;;;;;;;;;-1:-1:-1;51751:714:0;;;;;:::i;:::-;;:::i;58521:289::-;;;;;;;;;;-1:-1:-1;58521:289:0;;;;;:::i;:::-;;:::i;56896:371::-;;;;;;;;;;-1:-1:-1;56896:371:0;;;;;:::i;:::-;;:::i;63981:252::-;;;;;;;;;;-1:-1:-1;63981:252:0;;;;;:::i;:::-;;:::i;49152:133::-;;;;;;;;;;-1:-1:-1;49152:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;49254:19:0;;;49236:7;49254:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;49152:133;63445:528;;;;;;;;;;-1:-1:-1;63445:528:0;;;;;:::i;:::-;;:::i;5270:210::-;;;;;;;;;;-1:-1:-1;5270:210:0;;;;;:::i;:::-;;:::i;63145:292::-;;;;;;;;;;-1:-1:-1;63145:292:0;;;;;:::i;:::-;;:::i;59918:452::-;;;;;;;;;;-1:-1:-1;59918:452:0;;;;;:::i;:::-;;:::i;44550:36::-;;;;;;;;;;-1:-1:-1;44550:36:0;;;;-1:-1:-1;;;44550:36:0;;;;;;54109:1581;792:10;4482:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4482:30:0;;;;4516:1;4482:35;4474:44;;;;;;-1:-1:-1;;;;;54204:19:0;::::1;54180:21;54204:19:::0;;;:7:::1;:19;::::0;;;;54242:21:::1;::::0;::::1;::::0;-1:-1:-1;;;54242:21:0;::::1;;;:30;54234:67;;;::::0;-1:-1:-1;;;54234:67:0;;11774:2:1;54234:67:0::1;::::0;::::1;11756:21:1::0;11813:2;11793:18;;;11786:30;11852:26;11832:18;;;11825:54;11896:18;;54234:67:0::1;;;;;;;;;54320:15;::::0;::::1;::::0;-1:-1:-1;;;54320:15:0;::::1;;;54312:52;;;::::0;-1:-1:-1;;;54312:52:0;;12127:2:1;54312:52:0::1;::::0;::::1;12109:21:1::0;12166:2;12146:18;;;12139:30;12205:26;12185:18;;;12178:54;12249:18;;54312:52:0::1;11925:348:1::0;54312:52:0::1;54383:11;::::0;-1:-1:-1;;;54383:11:0;::::1;;;54375:53;;;::::0;-1:-1:-1;;;54375:53:0;;12480:2:1;54375:53:0::1;::::0;::::1;12462:21:1::0;12519:2;12499:18;;;12492:30;12558:31;12538:18;;;12531:59;12607:18;;54375:53:0::1;12278:353:1::0;54375:53:0::1;54456:11;::::0;-1:-1:-1;;;;;54456:11:0;;::::1;54444:24;::::0;;;:11:::1;:24;::::0;;;;;;;54469:12;;;;::::1;54444:38:::0;;;;;;;-1:-1:-1;;54444:59:0::1;54441:149;;54532:11;::::0;-1:-1:-1;;;;;54532:11:0;;::::1;54520:24;::::0;;;:11:::1;:24;::::0;;;;;;;54545:12;;;;::::1;54520:38:::0;;;;;;-1:-1:-1;;54520:58:0;;54441:149:::1;54602:16;::::0;::::1;:22:::0;;-1:-1:-1;;;;54602:22:0::1;-1:-1:-1::0;;;54602:22:0::1;::::0;;54696:5:::1;54666:21;54676:10:::0;54666:9:::1;:21::i;:::-;:26;::::0;54690:2:::1;54666:26;:::i;:::-;54665:36;;;;:::i;:::-;54642:20;::::0;::::1;:59:::0;54770:5:::1;54740:21;54750:10:::0;54740:9:::1;:21::i;:::-;:26;::::0;54764:2:::1;54740:26;:::i;:::-;54739:36;;;;:::i;:::-;54719:17;::::0;;::::1;:56:::0;;;;54884:9:::1;::::0;54919:12;;;54945:19;::::1;::::0;54884:128:::1;::::0;-1:-1:-1;;;54884:128:0;;54912:4:::1;54884:128:::0;;::::1;13507:34:1::0;;;;-1:-1:-1;;;;;54919:12:0;;::::1;13557:18:1::0;;;13550:43;13629:15;;;13609:18;;;13602:43;54945:19:0;::::1;13661:18:1::0;;;13654:43;13746:10;54973:12:0::1;13734:23:1::0;13713:19;;;13706:52;13807:14;54995:15:0::1;13795:27:1::0;13774:19;;;13767:56;54841:12:0::1;::::0;54884:9;;;::::1;;::::0;:19:::1;::::0;13418::1;;54884:128:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54874:138;;55031:7;55023:16;;;::::0;::::1;;55060:10;::::0;;55093:16;::::1;::::0;55158:20:::1;::::0;::::1;::::0;55180:17:::1;::::0;;::::1;::::0;55060:138:::1;::::0;-1:-1:-1;;;55060:138:0;;-1:-1:-1;;;;;14381:55:1;;;55060:138:0;;::::1;14363:74:1::0;;;;-1:-1:-1;;;55093:16:0;;::::1;;;14453:18:1::0;;;14446:45;14539:10;55118:12:0::1;14527:23:1::0;14507:18;;;14500:51;14599:14;55140:15:0::1;14587:27:1::0;14567:18;;;14560:55;14631:19;;;14624:35;;;;14675:19;;;14668:35;;;;55060:10:0;;::::1;::::0;:20:::1;::::0;14335:19:1;;55060:138:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55050:148;;55213:7;55209:474;;55237:8;::::0;::::1;55209:474;55326:14;:21:::0;;-1:-1:-1;;55326:21:0::1;;;::::0;;-1:-1:-1;55362:21:0;::::1;:28:::0;;55455:49:::1;55491:12;55455:49;-1:-1:-1::0;;;55455:49:0;::::1;::::0;;;;;;;;-1:-1:-1;;;55455:49:0;;;;55519:25:::1;::::0;::::1;:51:::0;;::::1;55554:15;55519:51;-1:-1:-1::0;;55519:51:0;;::::1;::::0;::::1;::::0;;;55592:79:::1;::::0;;-1:-1:-1;;;;;14953:55:1;;14935:74;;15052:14;;15045:22;15040:2;15025:18;;15018:50;15084:18;;;15077:51;;;;15159:2;15144:18;;15137:55;55592:79:0::1;::::0;14922:3:1;14907:19;55592:79:0::1;;;;;;;;55209:474;54169:1521;;54109:1581:::0;:::o;50070:161::-;50145:4;50162:39;792:10;50185:7;50194:6;50162:8;:39::i;:::-;-1:-1:-1;50219:4:0;50070:161;;;;;:::o;52612:498::-;52688:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;52736:4:::1;-1:-1:-1::0;;;;;52713:28:0;::::1;::::0;52705:55:::1;;;::::0;-1:-1:-1;;;52705:55:0;;15405:2:1;52705:55:0::1;::::0;::::1;15387:21:1::0;15444:2;15424:18;;;15417:30;15483:16;15463:18;;;15456:44;15517:18;;52705:55:0::1;15203:338:1::0;52705:55:0::1;52804:9;:32:::0;;-1:-1:-1;;;;;52804:32:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;52804:32:0;;::::1;::::0;;;::::1;::::0;;;;52847:11:::1;:25:::0;;-1:-1:-1;;;;;;52847:25:0::1;::::0;;::::1;::::0;;52887:43:::1;::::0;-1:-1:-1;;;52887:43:0;;52924:4:::1;52887:43;::::0;::::1;160:74:1::0;-1:-1:-1;;52887:9:0;;;::::1;;::::0;:28:::1;::::0;133:18:1;;52887:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;52883:133;;52996:8;::::0;::::1;52883:133;-1:-1:-1::0;52958:4:0::1;53093:9:::0;-1:-1:-1;4435:1:0::1;52612:498:::0;;;:::o;48737:115::-;48792:7;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;;39881:15;40076:30;:::i;:::-;48818:1;48807:12;48803:31;;48823:8;;;48803:31;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;;39881:15;40076:30;:::i;:::-;48835:14;;48737:115;:::o;49674:388::-;-1:-1:-1;;;;;49795:19:0;;49774:4;49795:19;;;:11;:19;;;;;;;;792:10;49795:33;;;;;;;;-1:-1:-1;;49795:54:0;49791:208;;49866:121;49875:6;792:10;49897:89;49935:6;49897:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49897:19:0;;;;;;:11;:19;;;;;;;;792:10;49897:33;;;;;;;;;;:37;:89::i;:::-;49866:8;:121::i;:::-;50018:36;50028:6;50036:9;50047:6;50018:9;:36::i;:::-;50011:43;49674:388;-1:-1:-1;;;;49674:388:0:o;58223:290::-;3271:21;:19;:21::i;:::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26:::1;::::0;:78:::1;;-1:-1:-1::0;792:10:0;4377:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4377:30:0;::::1;;;4411:1;4377:35;4334:78;4326:102;;;::::0;::::1;;58357:4:::2;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;::::0;39881:15:::2;40076:30;:::i;:::-;58347:14;;;;:::i;:::-;43234:5;58311:31;58312:13:::0;::::2;40093;39981:2;40093;:13;:::i;:::-;40076:30;::::0;39881:15:::2;40076:30;:::i;:::-;58312:13;;;;:::i;:::-;58311:31;;;;:::i;:::-;:51;;58303:119;;;::::0;-1:-1:-1;;;58303:119:0;;17131:2:1;58303:119:0::2;::::0;::::2;17113:21:1::0;17170:2;17150:18;;;17143:30;17209:34;17189:18;;;17182:62;17280:25;17260:18;;;17253:53;17323:19;;58303:119:0::2;16929:419:1::0;58303:119:0::2;58433:9;:15:::0;;-1:-1:-1;;58433:15:0::2;;::::0;::::2;::::0;;::::2;::::0;;;43234:5:::2;::::0;40093:13:::2;39981:2;40093;:13;:::i;:::-;40076:30;::::0;39881:15:::2;40076:30;:::i;:::-;58475:13;;;;:::i;:::-;58474:31;;;;:::i;:::-;58459:12;:46:::0;3315:20;2709:1;3835:7;:22;3652:213;3315:20;58223:290;:::o;62583:349::-;62708:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;-1:-1:-1;;;;;62725:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:29:::1;::::0;::::1;:46:::0;;;62782:26:::1;;:40:::0;;;62838:64;;17555:74:1;;;17645:18;;17638:34;;;17688:18;;17681:34;;;62838:64:0::1;::::0;17543:2:1;17528:18;62838:64:0::1;;;;;;;-1:-1:-1::0;62920:4:0::1;62583:349:::0;;;;;:::o;48858:112::-;48910:5;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;;39881:15;40076:30;:::i;:::-;48934:1;48923:12;48919:31;;48939:8;;;48919:31;-1:-1:-1;39981:2:0;;48858:112::o;56183:346::-;56294:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;56311:10:::1;:32:::0;;::::1;56397:34:::0;;::::1;-1:-1:-1::0;;;56397:34:0::1;-1:-1:-1::0;;56354:32:0;;::::1;::::0;::::1;-1:-1:-1::0;;56354:32:0;;;56311;;::::1;56354::::0;;;;;;;::::1;56397:34;;::::0;;56421:10;56465:21:::1;56377:9:::0;56334;56465:21:::1;:::i;:::-;:34;;;;:::i;:::-;56442:10;:57:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;56442:57:0::1;-1:-1:-1::0;;;;56442:57:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;56183:346:0;;;;;:::o;57666:146::-;57718:17;57737:16;57774:14;57894:11;:21;-1:-1:-1;;;;;57894:21:0;;57820:103;57774:14;58004:20;;-1:-1:-1;;;;;58004:20:0;57766:38;;;;57666:146;;:::o;50701:1042::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;-1:-1:-1;;;;;50846:18:0;;::::1;50822:21;50846:18:::0;;;:7:::1;:18;::::0;;;;;;;50875:24;;;;::::1;-1:-1:-1::0;;;;;;50875:24:0;;::::1;::::0;::::1;::::0;;;50910:19;;::::1;:35:::0;;-1:-1:-1;;50990:29:0;50910:35;;::::1;50990:29:::0;;;;;51040:7:::1;:18:::0;;;;;:25;;-1:-1:-1;;51040:25:0;;::::1;::::0;::::1;::::0;;;51076:28;;;:13:::1;:28:::0;;;;;:35;;;;::::1;;::::0;;;51128:21;;;:10:::1;:21:::0;;;;;;50956:23:::1;51128:21;51124:480;;-1:-1:-1::0;;;;;51166:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;:28;;-1:-1:-1;;51166:28:0::1;51190:4;51166:28;::::0;;51211:52:::1;51220:12;792:10:::0;;712:98;51220:12:::1;51234:9;-1:-1:-1::0;;51211:8:0::1;:52::i;:::-;51287:6;::::0;51278:46:::1;::::0;-1:-1:-1;;;;;51287:6:0::1;51295:9:::0;-1:-1:-1;;51278:8:0::1;:46::i;:::-;51339:53;51356:4;51363:9;-1:-1:-1::0;;51339:8:0::1;:53::i;:::-;-1:-1:-1::0;;;;;51409:30:0;::::1;;::::0;;;:19:::1;:30;::::0;;;;;;;:37;;51442:4:::1;-1:-1:-1::0;;51409:37:0;;::::1;::::0;::::1;::::0;;;51461:17:::1;:28:::0;;;;;;:35;;;;::::1;;::::0;;;51569:23;;160:74:1;;;51569:23:0::1;::::0;133:18:1;51569:23:0::1;;;;;;;51124:480;51616:55;::::0;-1:-1:-1;;;51616:55:0;;-1:-1:-1;;;;;18095:55:1;;;51616::0::1;::::0;::::1;18077:74:1::0;-1:-1:-1;;18167:18:1;;;18160:34;51616:25:0;::::1;::::0;::::1;::::0;18050:18:1;;51616:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51689:46:0::1;::::0;;-1:-1:-1;;;;;18486:15:1;;;18468:34;;18538:15;;;18533:2;18518:18;;18511:43;18590:15;;18570:18;;;18563:43;51689:46:0;;::::1;::::0;;;;18395:2:1;51689:46:0;;::::1;50811:932;50701:1042:::0;;;:::o;6424:162::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;6502:6:::1;6498:81;6512:14:::0;;::::1;6498:81;;;6548:19;6560:3;;6564:1;6560:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6930:11:0;;;;;:6;:11;;;;;;;;6923:18;;-1:-1:-1;;;;;;6923:18:0;;;6956:11;:16;;;;;:24;;-1:-1:-1;;6956:24:0;;;6865:123;6548:19:::1;6528:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6498:81;;56537:351:::0;56649:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;56666:11:::1;:33:::0;;::::1;56754:35:::0;;::::1;-1:-1:-1::0;;;56754:35:0::1;-1:-1:-1::0;;56710:33:0;;::::1;::::0;::::1;-1:-1:-1::0;;56710:33:0;;;56666;;::::1;56710::::0;;;;;;;::::1;56754:35;;::::0;;56779:10;56824:21:::1;56734:9:::0;56690;56824:21:::1;:::i;:::-;:34;;;;:::i;:::-;56800:11;:58:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;56800:58:0::1;-1:-1:-1::0;;;;56800:58:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;56537:351:0;;;;;:::o;58818:149::-;3271:21;:19;:21::i;:::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26:::1;::::0;:78:::1;;-1:-1:-1::0;792:10:0;4377:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4377:30:0;::::1;;;4411:1;4377:35;4334:78;4326:102;;;::::0;::::1;;-1:-1:-1::0;;;;;58921:28:0;::::2;;::::0;;;:19:::2;:28;::::0;;;;:38;;-1:-1:-1;;58921:38:0::2;::::0;::::2;;;::::0;;-1:-1:-1;3835:22:0;;58818:149;;:::o;3315:20::-;58818:149;;:::o;57303:179::-;3271:21;:19;:21::i;:::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26:::1;::::0;:78:::1;;-1:-1:-1::0;792:10:0;4377:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4377:30:0;::::1;;;4411:1;4377:35;4334:78;4326:102;;;::::0;::::1;;57393:11:::2;:33:::0;;-1:-1:-1;;;;;57393:33:0;::::2;-1:-1:-1::0;;;;;;57393:33:0;;::::2;::::0;::::2;::::0;;;:21:::2;57437:30:::0;;;:19:::2;:30;::::0;;;;:37;;-1:-1:-1;;57437:37:0::2;57393:33:::0;57437:37:::2;::::0;;3315:20;2709:1;3835:7;:22;3652:213;6594:263;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4739:26;;:78;;-1:-1:-1;792:10:0;4782:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4782:30:0;;;;4816:1;4782:35;4739:78;:130;;;-1:-1:-1;792:10:0;4834:20;;;;:6;:20;;;;;;;;:30;-1:-1:-1;;;4834:30:0;;;;:35;4739:130;:183;;;-1:-1:-1;792:10:0;4887:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4887:30:0;;;;4921:1;4887:35;4739:183;4731:206;;;;;;-1:-1:-1;;;;;6674:19:0;::::1;792:10:::0;6674:19:::1;6666:79;;;::::0;-1:-1:-1;;;6666:79:0;;19091:2:1;6666:79:0::1;::::0;::::1;19073:21:1::0;19130:2;19110:18;;;19103:30;19169:34;19149:18;;;19142:62;19240:17;19220:18;;;19213:45;19275:19;;6666:79:0::1;18889:411:1::0;6666:79:0::1;-1:-1:-1::0;;;;;6764:16:0;::::1;;::::0;;;:11:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;6756:66;;;::::0;-1:-1:-1;;;6756:66:0;;19507:2:1;6756:66:0::1;::::0;::::1;19489:21:1::0;19546:2;19526:18;;;19519:30;19585:31;19565:18;;;19558:59;19634:18;;6756:66:0::1;19305:353:1::0;6756:66:0::1;6833:16;6845:3;-1:-1:-1::0;;;;;6930:11:0;;;;;:6;:11;;;;;;;;6923:18;;-1:-1:-1;;;;;;6923:18:0;;;6956:11;:16;;;;;:24;;-1:-1:-1;;6956:24:0;;;6865:123;5519:268;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;5607:10:::1;:15;;5621:1;5607:15:::0;5604:124:::1;;792:10:::0;5643:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;5643:30:0;::::1;;;5677:1;5643:35;5635:83;;;::::0;-1:-1:-1;;;5635:83:0;;19865:2:1;5635:83:0::1;::::0;::::1;19847:21:1::0;19904:2;19884:18;;;19877:30;19943:34;19923:18;;;19916:62;-1:-1:-1;;;19994:18:1;;;19987:33;20037:19;;5635:83:0::1;19663:399:1::0;5635:83:0::1;5744:35;5758:8;5768:10;5744:13;:35::i;49293:198::-:0;-1:-1:-1;;;;;49383:20:0;;49359:7;49383:20;;;:11;:20;;;;;;;;49379:49;;;-1:-1:-1;;;;;;49412:16:0;;;;;:7;:16;;;;;;;49293:198::o;49379:49::-;-1:-1:-1;;;;;49466:16:0;;;;;;:7;:16;;;;;;49446:37;;:19;:37::i;53118:983::-;792:10;53201:4;4482:20;;;:6;:20;;;;;:30;-1:-1:-1;;;4482:30:0;;;;4516:1;4482:35;4474:44;;;;;;53220:11:::1;:19:::0;;-1:-1:-1;;;;53220:19:0::1;::::0;;53340:9:::1;::::0;:40:::1;::::0;-1:-1:-1;;;53340:40:0;;53374:4:::1;53340:40;::::0;::::1;160:74:1::0;-1:-1:-1;;53340:9:0;;::::1;-1:-1:-1::0;;;;;53340:9:0::1;::::0;:25:::1;::::0;133:18:1;;53340:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53326:11;:54:::0;;-1:-1:-1;;;;53326:54:0::1;-1:-1:-1::0;;;53326:54:0;::::1;;::::0;::::1;;::::0;;;;::::1;53397:11:::0;;::::1;;53393:676;;53425:8;::::0;::::1;53393:676;53482:11;::::0;-1:-1:-1;;;;;53482:11:0::1;53470:24;::::0;;;:11:::1;:24;::::0;;;;;::::1;;53466:94;;53529:11;::::0;53515:29:::1;::::0;-1:-1:-1;;;;;53529:11:0::1;::::0;53515:13:::1;:29::i;:::-;53577:10;:24;;;;53591:10;53577:24;53574:484;;;53632:9;::::0;:94:::1;::::0;-1:-1:-1;;;53632:94:0;;53665:4:::1;53632:94;::::0;::::1;20310:74:1::0;20427:14;;20420:22;20400:18;;;20393:50;20486:14;;20479:22;20459:18;;;20452:50;20521:14;53696:13:0::1;20571:15:1::0;;20551:18;;;20544:43;53711:14:0::1;20624:15:1::0;20603:19;;;20596:44;53632:9:0;;;::::1;-1:-1:-1::0;;;;;53632:9:0::1;::::0;:24:::1;::::0;20282:19:1;;53632:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53622:104;;53749:7;53745:298;;53781:8;::::0;::::1;53745:298;53838:13;:20:::0;;-1:-1:-1;;;;;;;53838:20:0;::::1;;::::0;;-1:-1:-1;;;;;53901:11:0;-1:-1:-1;53881:32:0;;;:19:::1;:32;::::0;;;;:39;;-1:-1:-1;;53881:39:0::1;-1:-1:-1::0;53881:39:0::1;::::0;;53943:29;;-1:-1:-1;;;;53995:28:0;-1:-1:-1;;;53943:29:0;::::1;;;-1:-1:-1::0;;;;53995:28:0;;-1:-1:-1;;;53995:28:0;::::1;;;;::::0;;53745:298:::1;54086:7:::0;53118:983;-1:-1:-1;;;53118:983:0:o;70346:632::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;70425:28:::1;70456:24;70474:4;70456:9;:24::i;:::-;-1:-1:-1::0;;;;;70519:19:0;::::1;;::::0;;;:7:::1;:19;::::0;;;;:33:::1;;::::0;70425:55;;-1:-1:-1;70495:57:0;::::1;70491:480;;-1:-1:-1::0;;;;;70587:19:0;::::1;70569:15;70587:19:::0;;;:7:::1;:19;::::0;;;;:30:::1;::::0;::::1;::::0;70635:41:::1;::::0;;::::1;::::0;-1:-1:-1;;;70635:41:0;::::1;;;70632:132;;;-1:-1:-1::0;;;;;70715:19:0;::::1;;::::0;;;:7:::1;:19;::::0;;;;:29:::1;;::::0;43234:5:::1;::::0;-1:-1:-1;;;70715:29:0;::::1;;;70691:21;70715:19:::0;70691:9:::1;:21::i;:::-;:53;;;;:::i;:::-;70690:71;;;;:::i;:::-;70680:81;;70632:132;70805:7;70781:20;:31;70778:71;;70839:7;70816:30;;70778:71;70863:46;70876:20;70898:10;70863:12;:46::i;55698:344::-:0;792:10;4482:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4482:30:0;;;;4516:1;4482:35;4474:44;;;;;;55791:10:::1;::::0;-1:-1:-1;;;;;55783:30:0;;::::1;55791:10:::0;::::1;55783:30:::0;55775:74:::1;;;::::0;-1:-1:-1;;;55775:74:0;;20853:2:1;55775:74:0::1;::::0;::::1;20835:21:1::0;20892:2;20872:18;;;20865:30;20931:33;20911:18;;;20904:61;20982:18;;55775:74:0::1;20651:355:1::0;55775:74:0::1;55860:10;:42:::0;;-1:-1:-1;;;;;;55860:42:0::1;-1:-1:-1::0;;;;;55860:42:0;::::1;::::0;;::::1;::::0;;;55917:37:::1;::::0;-1:-1:-1;;;55917:37:0;;55948:4:::1;55917:37;::::0;::::1;160:74:1::0;55917:22:0::1;::::0;133:18:1;;55917:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;55913:86;;55979:8;::::0;::::1;55913:86;56009:25;56023:7;56032:1;56009:13;:25::i;7010:88::-:0;7055:7;7080:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;49499:167;49577:4;49594:42;792:10;49618:9;49629:6;49594:9;:42::i;:::-;-1:-1:-1;49654:4:0;;49499:167;-1:-1:-1;;;49499:167:0:o;61998:256::-;62095:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;-1:-1:-1;;;;;62112:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:35:::1;;:49:::0;;-1:-1:-1;;;;62112:49:0::1;-1:-1:-1::0;;;62112:49:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;62177:47;;21179:74:1;;;21269:18;;;21262:50;62177:47:0::1;::::0;21152:18:1;62177:47:0::1;;;;;;;;-1:-1:-1::0;62242:4:0::1;61998:256:::0;;;;:::o;57490:168::-;3271:21;:19;:21::i;:::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26:::1;::::0;:78:::1;;-1:-1:-1::0;792:10:0;4377:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4377:30:0;::::1;;;4411:1;4377:35;4334:78;4326:102;;;::::0;::::1;;57572:20:::0;:31;;-1:-1:-1;;;;;57572:31:0;::::2;-1:-1:-1::0;;;;;;57572:31:0;;::::2;::::0;::::2;::::0;;;:20:::2;57614:29:::0;;;:19:::2;:29;::::0;;;;:36;;-1:-1:-1;;57614:36:0::2;57572:20;57614:36;::::0;;3315:20;2709:1;3835:7;:22;3652:213;62262:313;62381:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;-1:-1:-1;;;;;62398:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:37:::1;;:62:::0;;-1:-1:-1;;;;62398:62:0::1;-1:-1:-1::0;;;62398:62:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;62476:69;;21179:74:1;;;21269:18;;;21262:50;62476:69:0::1;::::0;21152:18:1;62476:69:0::1;21011:307:1::0;59703:207:0;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;59783:17:::1;::::0;:28;::::1;;:17;::::0;;::::1;:28;;::::0;59775:89:::1;;;::::0;-1:-1:-1;;;59775:89:0;;21525:2:1;59775:89:0::1;::::0;::::1;21507:21:1::0;21564:2;21544:18;;;21537:30;21603:34;21583:18;;;21576:62;21674:18;21654;;;21647:46;21710:19;;59775:89:0::1;21323:412:1::0;59775:89:0::1;59875:17;:27:::0;;-1:-1:-1;;59875:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59703:207::o;51751:714::-;792:10;4482:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4482:30:0;;;;4516:1;4482:35;4474:44;;;;;;-1:-1:-1;;;;;51866:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;:32;::::1;;:21;::::0;;::::1;:32;;::::0;51863:323:::1;;-1:-1:-1::0;;;;;51915:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;;;;:31;;;::::1;;-1:-1:-1::0;;51915:31:0;;::::1;::::0;::::1;::::0;;;51963:19:::1;:30:::0;;;;;:40;;;::::1;::::0;::::1;::::0;;52018:17:::1;:28:::0;;;;;;:38;;;;::::1;::::0;::::1;::::0;;;52132:42;;21179:74:1;;;21269:18;;;21262:50;;;;52132:42:0::1;::::0;21152:18:1;52132:42:0::1;;;;;;;51863:323;-1:-1:-1::0;;;;;52199:18:0;::::1;;::::0;;;:7:::1;:18;::::0;;;;;:29;::::1;;:18;::::0;;::::1;:29;;::::0;52196:262:::1;;-1:-1:-1::0;;;;;52245:18:0;;::::1;;::::0;;;:7:::1;:18;::::0;;;;;;;:33:::1;;:43:::0;;-1:-1:-1;;;;52245:43:0::1;-1:-1:-1::0;;;52245:43:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;52313:7:::1;:18:::0;;;;;;:28;;-1:-1:-1;;52313:28:0::1;::::0;::::1;::::0;;52405:18;;;:31;;52363:83;;22044:15:1;;;22026:34;;22076:18;;;22069:43;;;;52405:31:0;;;::::1;22128:18:1::0;;;22121:43;;;;22195:2;22180:18;;22173:50;;;;52363:83:0::1;::::0;21952:3:1;21937:19;52363:83:0::1;21740:489:1::0;58521:289:0;3271:21;:19;:21::i;:::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26:::1;::::0;:78:::1;;-1:-1:-1::0;792:10:0;4377:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4377:30:0;::::1;;;4411:1;4377:35;4334:78;4326:102;;;::::0;::::1;;58656:3:::2;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;::::0;39881:15:::2;40076:30;:::i;:::-;58646:13;;;;:::i;:::-;43234:5;58610:31;58611:13:::0;::::2;40093;39981:2;40093;:13;:::i;:::-;40076:30;::::0;39881:15:::2;40076:30;:::i;:::-;58611:13;;;;:::i;:::-;58610:31;;;;:::i;:::-;:50;;58602:111;;;::::0;-1:-1:-1;;;58602:111:0;;22436:2:1;58602:111:0::2;::::0;::::2;22418:21:1::0;22475:2;22455:18;;;22448:30;22514:34;22494:18;;;22487:62;22585:18;22565;;;22558:46;22621:19;;58602:111:0::2;22234:412:1::0;58602:111:0::2;58724:13;:19:::0;;-1:-1:-1;;58724:19:0::2;;::::0;::::2;::::0;;::::2;::::0;;;43234:5:::2;::::0;40093:13:::2;39981:2;40093;:13;:::i;:::-;40076:30;::::0;39881:15:::2;40076:30;:::i;:::-;58772:13;;;;:::i;:::-;58771:31;;;;:::i;:::-;58754:14;:48:::0;3315:20;2709:1;3835:7;:22;3652:213;56896:371;57012:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;57029:15:::1;:37:::0;;::::1;57125:39:::0;;::::1;-1:-1:-1::0;;;57125:39:0::1;-1:-1:-1::0;;57077:37:0;;::::1;::::0;::::1;-1:-1:-1::0;;57077:37:0;;;57029;;::::1;57077::::0;;;;;;;::::1;57125:39;;::::0;;57154:10;57203:21:::1;57105:9:::0;57057;57203:21:::1;:::i;:::-;:34;;;;:::i;:::-;57175:15;:62:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;57175:62:0::1;-1:-1:-1::0;;;;57175:62:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;56896:371:0;;;;;:::o;63981:252::-;64061:7;64085:10;64081:145;;;-1:-1:-1;64118:21:0;64111:28;;64081:145;64179:35;;-1:-1:-1;;;64179:35:0;;64208:4;64179:35;;;160:74:1;-1:-1:-1;;;;;64179:20:0;;;;;133:18:1;;64179:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64172:42;;;;63445:528;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;63565:36:::1;63586:10;63598:2;63565:20;:36::i;:::-;63558:3;:43;;63550:52;;;::::0;::::1;;63613:49;::::0;-1:-1:-1;;;63613:49:0;;-1:-1:-1;;;;;18095:55:1;;;63613:49:0::1;::::0;::::1;18077:74:1::0;-1:-1:-1;;18167:18:1;;;18160:34;63613:18:0;::::1;::::0;::::1;::::0;18050::1;;63613:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63677:10;63673:293;;;63704:9;63726:10;-1:-1:-1::0;;;;;63718:24:0::1;63750:3;63760:5;63718:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63703:67;;;63793:4;63785:26;;;::::0;-1:-1:-1;;;63785:26:0;;23252:2:1;63785:26:0::1;::::0;::::1;23234:21:1::0;23291:1;23271:18;;;23264:29;-1:-1:-1;;;23309:18:1;;;23302:39;23358:18;;63785:26:0::1;23050:332:1::0;63785:26:0::1;63688:135;63673:293;;;63858:55;::::0;-1:-1:-1;;;63858:55:0;;63890:4:::1;63858:55;::::0;::::1;23650:34:1::0;-1:-1:-1;;;;;23720:15:1;;;23700:18;;;23693:43;23752:18;;;23745:34;;;63845:9:0::1;::::0;63858:23;;::::1;::::0;::::1;::::0;23562:18:1;;63858:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63844:69;;63936:4;63928:26;;;::::0;-1:-1:-1;;;63928:26:0;;23252:2:1;63928:26:0::1;::::0;::::1;23234:21:1::0;23291:1;23271:18;;;23264:29;-1:-1:-1;;;23309:18:1;;;23302:39;23358:18;;63928:26:0::1;23050:332:1::0;63928:26:0::1;63829:137;63673:293;63445:528:::0;;;;:::o;5270:210::-;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;5355:6:::1;::::0;-1:-1:-1;;;;;5355:6:0;;::::1;5343:18:::0;;::::1;::::0;5335:65:::1;;;::::0;-1:-1:-1;;;5335:65:0;;23992:2:1;5335:65:0::1;::::0;::::1;23974:21:1::0;24031:2;24011:18;;;24004:30;24070:34;24050:18;;;24043:62;-1:-1:-1;;;24121:18:1;;;24114:32;24163:19;;5335:65:0::1;23790:398:1::0;5335:65:0::1;5433:6;::::0;5412:38:::1;::::0;-1:-1:-1;;;;;5412:38:0;;::::1;::::0;5433:6:::1;::::0;5412:38:::1;::::0;5433:6:::1;::::0;5412:38:::1;5457:6;:17:::0;;-1:-1:-1;;;;;;5457:17:0::1;-1:-1:-1::0;;;;;5457:17:0;;;::::1;::::0;;;::::1;::::0;;5270:210::o;63145:292::-;63262:4;4350:10;7431:6;;-1:-1:-1;;;;;7431:6:0;;7363:82;4350:10;-1:-1:-1;;;;;4334:26:0;792:10;-1:-1:-1;;;;;4334:26:0;;:78;;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;-1:-1:-1;;;;;63279:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:25:::1;;:46:::0;;-1:-1:-1;;;;63279:46:0::1;-1:-1:-1::0;;;63279:46:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;63341:66;;24363:74:1;;;24453:18;;;24446:45;63341:66:0::1;::::0;24336:18:1;63341:66:0::1;24193:304:1::0;59918:452:0;7431:6;;-1:-1:-1;;;;;7431:6:0;792:10;4334:26;;:78;;-1:-1:-1;792:10:0;4377:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4377:30:0;;;;4411:1;4377:35;4334:78;4326:102;;;;;;60027:6:::1;60023:340;60037:18:::0;;::::1;60023:340;;;60080:7;60077:215;;;60116:11;:23;60128:7;;60136:1;60128:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60116:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;60116:23:0;;::::1;;60108:63;;;::::0;-1:-1:-1;;;60108:63:0;;24704:2:1;60108:63:0::1;::::0;::::1;24686:21:1::0;24743:2;24723:18;;;24716:30;24782:29;24762:18;;;24755:57;24829:18;;60108:63:0::1;24502:351:1::0;60108:63:0::1;60077:215;;;60221:11;:23;60233:7;;60241:1;60233:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60221:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;60221:23:0;;::::1;;60220:24;60212:64;;;::::0;-1:-1:-1;;;60212:64:0;;25060:2:1;60212:64:0::1;::::0;::::1;25042:21:1::0;25099:2;25079:18;;;25072:30;25138:29;25118:18;;;25111:57;25185:18;;60212:64:0::1;24858:351:1::0;60212:64:0::1;60306:45;60331:7;;60339:1;60331:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60343:7;60306:24;:45::i;:::-;-1:-1:-1::0;60057:3:0;::::1;::::0;::::1;:::i;:::-;;;;60023:340;;50239:310:::0;-1:-1:-1;;;;;50334:20:0;;50326:52;;;;-1:-1:-1;;;50326:52:0;;25416:2:1;50326:52:0;;;25398:21:1;25455:2;25435:18;;;25428:30;-1:-1:-1;;;25474:18:1;;;25467:49;25533:18;;50326:52:0;25214:343:1;50326:52:0;-1:-1:-1;;;;;50397:21:0;;50389:53;;;;-1:-1:-1;;;50389:53:0;;25416:2:1;50389:53:0;;;25398:21:1;25455:2;25435:18;;;25428:30;-1:-1:-1;;;25474:18:1;;;25467:49;25533:18;;50389:53:0;25214:343:1;50389:53:0;-1:-1:-1;;;;;50455:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;50508:33;;2668:25:1;;;50508:33:0;;2641:18:1;50508:33:0;;;;;;;50239:310;;;:::o;22035:240::-;22155:7;22216:12;22208:6;;;;22200:29;;;;-1:-1:-1;;;22200:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;22251:5:0;;;22035:240::o;64387:5340::-;64466:4;-1:-1:-1;;;;;64491:18:0;;64483:68;;;;-1:-1:-1;;;64483:68:0;;25764:2:1;64483:68:0;;;25746:21:1;25803:2;25783:18;;;25776:30;25842:34;25822:18;;;25815:62;-1:-1:-1;;;25893:18:1;;;25886:35;25938:19;;64483:68:0;25562:401:1;64483:68:0;-1:-1:-1;;;;;64570:16:0;;64562:64;;;;-1:-1:-1;;;64562:64:0;;26170:2:1;64562:64:0;;;26152:21:1;26209:2;26189:18;;;26182:30;26248:34;26228:18;;;26221:62;-1:-1:-1;;;26299:18:1;;;26292:33;26342:19;;64562:64:0;25968:399:1;64562:64:0;64654:1;64645:6;:10;64637:64;;;;-1:-1:-1;;;64637:64:0;;26574:2:1;64637:64:0;;;26556:21:1;26613:2;26593:18;;;26586:30;26652:34;26632:18;;;26625:62;-1:-1:-1;;;26703:18:1;;;26696:39;26752:19;;64637:64:0;26372:405:1;64637:64:0;-1:-1:-1;;;;;64830:13:0;;64712:8;64830:13;;;:7;:13;;;;;;64712:8;;;;;;64830:13;;64826:881;;;64885:8;:15;;-1:-1:-1;;;;;;64885:15:0;-1:-1:-1;;;;;64885:15:0;;;;;64919:17;;-1:-1:-1;;;64919:17:0;;64915:168;;;64957:34;64982:2;64986:4;64957:24;:34::i;:::-;;64826:881;;64915:168;65032:35;65057:2;65061:5;65032:24;:35::i;64826:881::-;-1:-1:-1;;;;;65104:11:0;;;;;;:7;:11;;;;;;;;65100:607;;;65158:8;:13;;-1:-1:-1;;;;;;65158:13:0;-1:-1:-1;;;;;65158:13:0;;;;;65190:17;;-1:-1:-1;;;65190:17:0;;65186:172;;;65228:36;65253:4;65259;65228:24;:36::i;65186:172::-;65305:37;65330:4;65336:5;65305:24;:37::i;65100:607::-;65421:17;;65398:4;;-1:-1:-1;65421:17:0;;65417:279;;;65459:36;65484:4;65490;65459:24;:36::i;:::-;;65514:34;65539:2;65543:4;65514:24;:34::i;65417:279::-;65589:37;65614:4;65620:5;65589:24;:37::i;:::-;;65645:35;65670:2;65674:5;65645:24;:35::i;:::-;;65417:279;65750:8;;-1:-1:-1;;;;;65750:8:0;;;65719:20;65742:17;;;:7;:17;;;;;;;;;65719:40;;;;;;;;;;;;;65750:8;65719:40;;;;;;;;;;;;;-1:-1:-1;;;65719:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;65719:40:0;;;;;;;;;;-1:-1:-1;;;65719:40:0;;;;;;;;;;-1:-1:-1;;;65719:40:0;;;;;;;;;;-1:-1:-1;;;65719:40:0;;;;;;;;;-1:-1:-1;;;65719:40:0;;;;;;;;;;;;;;;65750:8;65719:40;;;;;;;;;;;;;;;;;;65820:20;65831:4;65837:2;65820:10;:20::i;:::-;65817:1370;;;65861:14;;;;;;;65857:89;;65896:34;;-1:-1:-1;;;65896:34:0;;26984:2:1;65896:34:0;;;26966:21:1;27023:2;27003:18;;;26996:30;27062:26;27042:18;;;27035:54;27106:18;;65896:34:0;26782:348:1;65857:89:0;65963:3;:11;;;;65970:4;65963:11;65960:167;;;65998:6;:21;;;65994:118;;66044:48;;-1:-1:-1;;;66044:48:0;;27337:2:1;66044:48:0;;;27319:21:1;27376:2;27356:18;;;27349:30;27415:34;27395:18;;;27388:62;-1:-1:-1;;;27466:18:1;;;27459:36;27512:19;;66044:48:0;27135:402:1;65994:118:0;66146:3;:11;;;;66153:4;66146:11;66143:280;;;66183:9;;:51;;-1:-1:-1;;;66183:51:0;;66222:4;66183:51;;;4755:34:1;-1:-1:-1;;;;;4825:15:1;;;4805:18;;;4798:43;66183:9:0;;;;;;;;:30;;4667:18:1;;66183:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66182:52;:106;;;;-1:-1:-1;66239:9:0;;:49;;-1:-1:-1;;;66239:49:0;;66278:4;66239:49;;;4755:34:1;-1:-1:-1;;;;;4825:15:1;;;4805:18;;;4798:43;66239:9:0;;;;;;;;:30;;4667:18:1;;66239:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66238:50;66182:106;66178:230;;;66331:12;;66321:6;:22;;66313:75;;;;-1:-1:-1;;;66313:75:0;;27744:2:1;66313:75:0;;;27726:21:1;27783:2;27763:18;;;27756:30;27822:34;27802:18;;;27795:62;-1:-1:-1;;;27873:18:1;;;27866:38;27921:19;;66313:75:0;27542:404:1;66313:75:0;66442:13;;-1:-1:-1;;;66442:13:0;;;;66439:461;;;66525:9;;:72;;-1:-1:-1;;;66525:72:0;;66563:4;66525:72;;;28281:34:1;-1:-1:-1;;;;;28351:15:1;;;28331:18;;;28324:43;28403:15;;;28383:18;;;28376:43;28462:14;;28455:22;28435:18;;;28428:50;28522:14;;28515:22;28494:19;;;28487:51;28582:14;;28575:22;28554:19;;;28547:51;66476:12:0;;66525:9;;;;;:29;;28192:19:1;;66525:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66515:82;;66624:7;66616:38;;;;-1:-1:-1;;;66616:38:0;;28811:2:1;66616:38:0;;;28793:21:1;28850:2;28830:18;;;28823:30;28889:20;28869:18;;;28862:48;28927:18;;66616:38:0;28609:342:1;66616:38:0;66678:15;;-1:-1:-1;;;66678:15:0;;;;66675:208;;;66728:9;;:71;;-1:-1:-1;;;66728:71:0;;66765:4;66728:71;;;28281:34:1;-1:-1:-1;;;;;28351:15:1;;;28331:18;;;28324:43;28403:15;;;28383:18;;;28376:43;28462:14;;28455:22;28435:18;;;28428:50;28522:14;;28515:22;28494:19;;;28487:51;28582:14;;28575:22;28554:19;;;28547:51;66728:9:0;;;;;;;;:28;;28192:19:1;;66728:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66718:81;;66830:7;66822:41;;;;-1:-1:-1;;;66822:41:0;;29158:2:1;66822:41:0;;;29140:21:1;29197:2;29177:18;;;29170:30;29236:23;29216:18;;;29209:51;29277:18;;66822:41:0;28956:345:1;66822:41:0;66457:443;66439:461;66925:12;;-1:-1:-1;;;;;66919:18:0;;;;;;;;;:27;;;66942:4;66941:5;66919:27;66916:260;;;66972:9;;:49;;-1:-1:-1;;;66972:49:0;;67011:4;66972:49;;;4755:34:1;-1:-1:-1;;;;;4825:15:1;;;4805:18;;;4798:43;66972:9:0;;;;;;;;:30;;4667:18:1;;66972:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66967:194;;67080:14;;67070:6;67054:13;67064:2;67054:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;67046:95;;;;-1:-1:-1;;;67046:95:0;;29638:2:1;67046:95:0;;;29620:21:1;29677:2;29657:18;;;29650:30;29716:34;29696:18;;;29689:62;-1:-1:-1;;;29767:18:1;;;29760:40;29817:19;;67046:95:0;29436:406:1;67046:95:0;67202:4;67199:862;;;67228:6;;;;67223:827;;67259:6;:26;;;67255:780;;;67454:28;67485:24;67503:4;67485:9;:24::i;:::-;67454:55;;67560:6;:20;;;67536;:44;67532:484;;67627:17;;;;67674:28;;;;67671:104;;;67739:16;;;;67727:8;;43234:5;;67717:38;;;:19;;-1:-1:-1;;;;;67727:8:0;67717:9;:19::i;:::-;:38;;;;:::i;:::-;67716:56;;;;:::i;:::-;67706:66;;67671:104;67828:7;67804:20;:31;67801:71;;67862:7;67839:30;;67801:71;67933:8;;67898:44;;67911:20;;-1:-1:-1;;;;;67933:8:0;67898:12;:44::i;:::-;67582:434;67532:484;67431:604;67255:780;68142:6;:15;;;68138:1099;;68203:8;;68174:38;;68193:4;;68199:2;;-1:-1:-1;;;;;68203:8:0;68174:18;:38::i;:::-;68231:6;:15;;;68230:16;:40;;;;;68250:20;68261:4;68267:2;68250:10;:20::i;:::-;68230:100;;;;-1:-1:-1;68275:9:0;;:55;;-1:-1:-1;;;68275:55:0;;68318:4;68275:55;;;4755:34:1;-1:-1:-1;;;;;4825:15:1;;;4805:18;;;4798:43;68275:9:0;;;;;;;;:34;;4667:18:1;;68275:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68274:56;68230:100;:158;;;;-1:-1:-1;68335:9:0;;:53;;-1:-1:-1;;;68335:53:0;;68378:4;68335:53;;;4755:34:1;-1:-1:-1;;;;;4825:15:1;;;4805:18;;;4798:43;68335:9:0;;;;;;;;:34;;4667:18:1;;68335:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68334:54;68230:158;:168;;;;;68393:5;68392:6;68230:168;68227:252;;;68419:44;;-1:-1:-1;;;68419:44:0;;30049:2:1;68419:44:0;;;30031:21:1;30088:2;30068:18;;;30061:30;30127:34;30107:18;;;30100:62;-1:-1:-1;;;30178:18:1;;;30171:32;30220:19;;68419:44:0;29847:398:1;68227:252:0;68138:1099;;;68514:16;;-1:-1:-1;;;68514:16:0;;;;68511:715;;;68555:20;68566:4;68572:2;68555:10;:20::i;:::-;68551:479;;;68639:9;;68666:8;;68639:64;;-1:-1:-1;;;68639:64:0;;-1:-1:-1;;;;;68666:8:0;;;68639:64;;;28281:34:1;28351:15;;;28331:18;;;28324:43;28403:15;;;28383:18;;;28376:43;28462:14;;28455:22;28435:18;;;28428:50;28522:14;;28515:22;28494:19;;;28487:51;28582:14;;28575:22;28554:19;;;28547:51;68600:12:0;;68639:9;;;;;;;:26;;28192:19:1;;68639:64:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;68639:64:0;;;;;;;;-1:-1:-1;;68639:64:0;;;;;;;;;;;;:::i;:::-;;;68635:318;;68921:8;;;68635:318;68834:16;:29;;;;;-1:-1:-1;;;68834:29:0;-1:-1:-1;;;;68834:29:0;;;;;;;;;68801:6;-1:-1:-1;68983:7:0;68975:35;;;;-1:-1:-1;;;68975:35:0;;30830:2:1;68975:35:0;;;30812:21:1;30869:2;30849:18;;;30842:30;30908:17;30888:18;;;30881:45;30943:18;;68975:35:0;30628:339:1;68975:35:0;68577:453;68551:479;69053:16;;-1:-1:-1;;;69053:16:0;;;;69048:163;;69127:16;;69099:92;;;-1:-1:-1;;;69127:16:0;;;;;31189:14:1;31182:22;31164:41;;69152:12:0;31253:10:1;31241:23;31236:2;31221:18;;31214:51;69174:15:0;31313:14:1;31301:27;31281:18;;;31274:55;69099:92:0;;31152:2:1;31137:18;69099:92:0;;;;;;;69048:163;-1:-1:-1;;;;;69252:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;69281:23:0;;;;;;:19;:23;;;;;;;;69252:52;69249:95;;;69328:4;69321:11;;69249:95;69363:4;69360:305;;;69404:11;69388:27;:13;:27;;;;;;-1:-1:-1;;69388:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;69388:27:0;-1:-1:-1;;;69388:27:0;;;;;;-1:-1:-1;;;;69388:27:0;;-1:-1:-1;;;69388:27:0;;;;;;;;;;;;;;;;;69360:305;;;69440:3;69437:228;;;69480:10;69464:26;:13;:26;;;;;;-1:-1:-1;;69464:26:0;;;;;;;;;;;;;;;-1:-1:-1;;;;69464:26:0;-1:-1:-1;;;69464:26:0;;;;;;-1:-1:-1;;;;69464:26:0;;-1:-1:-1;;;69464:26:0;;;;;;;;;;;;;;;;;69437:228;;;69515:4;69512:153;;;69556:11;69540:27;:13;:27;;;;;;-1:-1:-1;;69540:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;69540:27:0;-1:-1:-1;;;69540:27:0;;;;;;-1:-1:-1;;;;69540:27:0;;-1:-1:-1;;;69540:27:0;;;;;;;;;;;;;;;;;69512:153;;;69592:5;69589:76;;;69634:15;69618:31;:13;:31;;;;;;-1:-1:-1;;69618:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;69618:31:0;-1:-1:-1;;;69618:31:0;;;;;;-1:-1:-1;;;;69618:31:0;;-1:-1:-1;;;69618:31:0;;;;;;;;;;;;;;;;;69589:76;69684:35;69702:4;69708:2;69712:6;69684:17;:35::i;:::-;69677:42;64387:5340;-1:-1:-1;;;;;;;;;64387:5340:0:o;3351:293::-;2753:1;3485:7;;:19;3477:63;;;;-1:-1:-1;;;3477:63:0;;31542:2:1;3477:63:0;;;31524:21:1;31581:2;31561:18;;;31554:30;31620:33;31600:18;;;31593:61;31671:18;;3477:63:0;31340:355:1;3477:63:0;2753:1;3618:7;:18;3351:293::o;5795:259::-;-1:-1:-1;;;;;5905:16:0;;;5880:22;5905:16;;;:6;:16;;;;;;;;5936:22;;5973:31;;;;-1:-1:-1;;;5973:31:0;-1:-1:-1;;;;;;5973:31:0;;;;;;;;;;;;;6018:11;:21;;;;:28;;-1:-1:-1;;6018:28:0;5936:22;6018:28;;;5795:259::o;61453:255::-;61521:7;61560;;61549;:18;;61541:73;;;;-1:-1:-1;;;61541:73:0;;31902:2:1;61541:73:0;;;31884:21:1;31941:2;31921:18;;;31914:30;31980:34;31960:18;;;31953:62;-1:-1:-1;;;32031:18:1;;;32024:40;32081:19;;61541:73:0;31700:406:1;61541:73:0;61625:19;61648:10;:8;:10::i;:::-;61625:33;-1:-1:-1;61676:24:0;:7;61625:33;61676:11;:24::i;70986:3123::-;43789:6;:13;;-1:-1:-1;;43789:13:0;43798:4;43789:13;;;;;;-1:-1:-1;;;;;71113:19:0;;::::1;43789:6:::0;71113:19;;;:7:::1;:19;::::0;;;;;;;71090:42;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;71090:42:0;::::1;43789:13:::0;71090:42;;::::1;;;::::0;;;;-1:-1:-1;;;71090:42:0;::::1;::::0;::::1;;;::::0;;;;;;;;-1:-1:-1;;;71090:42:0;::::1;::::0;::::1;;;::::0;;;;;;;;-1:-1:-1;;;71090:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;71090:42:0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;71090:42:0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;;43789:13:::0;71090:42;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;71143:9:::1;:35:::0;;-1:-1:-1;;;;;;71143:35:0::1;::::0;;::::1;::::0;;;71191:36;;;;::::1;::::0;;71090:42:::1;71191:36:::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;71191:36:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;71191:36:0;;::::1;::::0;;::::1;::::0;;;;;;71090:42;;71191:36;71242:21;;71238:60:::1;;71280:7;;;;71238:60;71333:4;71313:26;::::0;;;:11:::1;:26;::::0;;;;;;;71348:9:::1;::::0;-1:-1:-1;;;;;71348:9:0::1;71313:46:::0;;;;;;;;-1:-1:-1;;71313:67:0::1;71310:165;;71417:4;71397:26;::::0;;;:11:::1;:26;::::0;;;;;;;71432:9:::1;::::0;-1:-1:-1;;;;;71432:9:0::1;71397:46:::0;;;;;;;-1:-1:-1;;71397:66:0;;71310:165:::1;71487:17;71572:1;71552:6;:16;;;71508:60;;71532:6;:16;;;71509:39;;:20;:39;;;;:::i;:::-;71508:60;;;;:::i;:::-;71507:66;;;;:::i;:::-;71487:86:::0;-1:-1:-1;71584:15:0::1;71602:32;71487:86:::0;71602:20;:32:::1;:::i;:::-;71679:16;::::0;;71693:1:::1;71679:16:::0;;;;;::::1;::::0;;71584:50;;-1:-1:-1;71655:21:0::1;::::0;71679:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;71679:16:0::1;71655:40;;71724:4;71706;71711:1;71706:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;71706:23:0::1;;;-1:-1:-1::0;;;;;71706:23:0::1;;;::::0;::::1;71750:6;:19;;;71740:4;71745:1;71740:7;;;;;;;;:::i;:::-;;;;;;:29;-1:-1:-1::0;;;;;71740:29:0::1;;;-1:-1:-1::0;;;;;71740:29:0::1;;;::::0;::::1;71782:15;71800:27;71816:10;71800:15;:27::i;:::-;71782:45;;71855:9;;;;;;;;;-1:-1:-1::0;;;;;71855:9:0::1;-1:-1:-1::0;;;;;71855:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;71844:27:0::1;:4;71849:1;71844:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;71844:27:0::1;::::0;71840:513:::1;;71887:9;::::0;:210:::1;::::0;-1:-1:-1;;;71887:210:0;;-1:-1:-1;;;;;71887:9:0;;::::1;::::0;:60:::1;::::0;:210:::1;::::0;71966:7;;71887:9:::1;::::0;72012:4;;72043::::1;::::0;72067:15:::1;::::0;71887:210:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71840:513;;;72128:9;::::0;:213:::1;::::0;-1:-1:-1;;;72128:213:0;;-1:-1:-1;;;;;72128:9:0;;::::1;::::0;:63:::1;::::0;:213:::1;::::0;72210:7;;72128:9:::1;::::0;72256:4;;72287::::1;::::0;72311:15:::1;::::0;72128:213:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71840:513;72365:18;72416:7;72386:27;72402:10;72386:15;:27::i;:::-;:37;;;;:::i;:::-;72365:58:::0;-1:-1:-1;72434:24:0::1;72488:7:::0;72462:22:::1;72475:9:::0;72365:58;72462:22:::1;:::i;:::-;72461:34;;;;:::i;:::-;72434:61;;72535:9;;;;;;;;;-1:-1:-1::0;;;;;72535:9:0::1;-1:-1:-1::0;;;;;72535:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;72512:39:0::1;:6;:19;;;-1:-1:-1::0;;;;;72512:39:0::1;::::0;72508:922:::1;;72571:13:::0;;72567:384:::1;;72605:9;::::0;72794:20;;72605:266:::1;::::0;-1:-1:-1;;;72605:266:0;;72686:4:::1;72605:266;::::0;::::1;34027:34:1::0;34077:18;;;34070:34;;;72605:9:0::1;34120:18:1::0;;;34113:34;;;34163:18;;;34156:34;-1:-1:-1;;;;;72794:20:0;;::::1;34206:19:1::0;;;34199:44;72837:15:0::1;34259:19:1::0;;;34252:35;72605:9:0;::::1;::::0;:25:::1;::::0;72638:16;;33938:19:1;;72605:266:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;72895:40:0::1;::::0;;34783:25:1;;;34839:2;34824:18;;34817:34;;;72895:40:0::1;::::0;-1:-1:-1;34756:18:1;72895:40:0::1;;;;;;;72567:384;72508:922;;;72986:13:::0;;72982:437:::1;;73020:9;::::0;73101:19:::1;::::0;::::1;::::0;73262:20;;73020:319:::1;::::0;-1:-1:-1;;;73020:319:0;;73073:4:::1;73020:319;::::0;::::1;35282:34:1::0;-1:-1:-1;;;;;35352:15:1;;;35332:18;;;35325:43;35384:18;;;35377:34;;;35427:18;;;35420:34;;;73020:9:0::1;35470:19:1::0;;;35463:35;;;35514:19;;;35507:35;73262:20:0;;::::1;35558:19:1::0;;;35551:44;73305:15:0::1;35611:19:1::0;;;35604:35;73020:9:0;::::1;::::0;:22:::1;::::0;35193:19:1;;73020:319:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;73363:40:0::1;::::0;;34783:25:1;;;34839:2;34824:18;;34817:34;;;73363:40:0::1;::::0;-1:-1:-1;34756:18:1;73363:40:0::1;;;;;;;72982:437;73442:30;73456:16:::0;73442:30;::::1;:::i;:::-;73563:19;::::0;::::1;::::0;73592:11:::1;:21:::0;73556:77:::1;::::0;-1:-1:-1;;;73556:77:0;;-1:-1:-1;;;;;73592:21:0;;::::1;73556:77;::::0;::::1;18077:74:1::0;-1:-1:-1;;18167:18:1;;;18160:34;73442:30:0;;-1:-1:-1;73483:12:0::1;::::0;73442:30;;73556:35;;;::::1;::::0;::::1;::::0;18050:18:1;;73556:77:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73671:9;;;;;;;;;-1:-1:-1::0;;;;;73671:9:0::1;-1:-1:-1::0;;;;;73671:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;73648:39:0::1;:6;:19;;;-1:-1:-1::0;;;;;73648:39:0::1;::::0;73644:458:::1;;73707:16;::::0;::::1;::::0;:20:::1;;::::0;73703:198:::1;;73769:11;:21:::0;73761:76:::1;::::0;-1:-1:-1;;;;;73769:21:0;;::::1;::::0;73827:5:::1;::::0;73804:16;;73761:76:::1;::::0;;;73804:16;73769:21;73827:5;73761:76:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73748:89;;;;;73864:7;73856:29;;;::::0;-1:-1:-1;;;73856:29:0;;23252:2:1;73856:29:0::1;::::0;::::1;23234:21:1::0;23291:1;23271:18;;;23264:29;-1:-1:-1;;;23309:18:1;;;23302:39;23358:18;;73856:29:0::1;23050:332:1::0;73856:29:0::1;73644:458;;;73936:16;::::0;::::1;::::0;:20:::1;;::::0;73932:157:::1;;73984:19;::::0;::::1;::::0;74033:11:::1;:21:::0;73977:96:::1;::::0;-1:-1:-1;;;73977:96:0;;74026:4:::1;73977:96;::::0;::::1;23650:34:1::0;-1:-1:-1;;;;;74033:21:0;;::::1;23700:18:1::0;;;23693:43;23752:18;;;23745:34;;;73977:40:0;::::1;::::0;::::1;::::0;23562:18:1;;73977:96:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73932:157;71079:3030;;;;;;;;;;43813:1;-1:-1:-1::0;;43825:6:0;:14;;-1:-1:-1;;43825:14:0;;;70986:3123::o;60378:1067::-;60461:4;60481:7;60478:960;;;-1:-1:-1;;;;;60509:20:0;;;;;;:11;:20;;;;;;;;60505:535;;-1:-1:-1;60558:4:0;60551:11;;60505:535;60609:9;60604:391;60628:9;:16;60624:20;;60604:391;;;60694:7;-1:-1:-1;;;;;60678:23:0;:9;60688:1;60678:12;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;60678:12:0;:23;60674:302;;60745:9;60755:16;;:20;;60774:1;;60755:20;:::i;:::-;60745:31;;;;;;;;:::i;:::-;;;;;;;;;;;60730:9;:12;;-1:-1:-1;;;;;60745:31:0;;;;60740:1;;60730:12;;;;;;:::i;:::-;;;;;;;;;;;;;:46;;-1:-1:-1;;;;;;60730:46:0;-1:-1:-1;;;;;60730:46:0;;;;;;60803:16;;;;;:7;:16;;;;;;:20;;;60850:11;:20;;;;:28;;-1:-1:-1;;60850:28:0;;;60905:9;:15;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;60905:15:0;;;;;-1:-1:-1;;;;;;60905:15:0;;;;;;60947:5;;60674:302;60646:3;;;;:::i;:::-;;;;60604:391;;;;61020:4;61013:11;;;;60478:960;-1:-1:-1;;;;;61075:20:0;;;;;;:11;:20;;;;;;;;61072:355;;;-1:-1:-1;61124:4:0;61117:11;;61072:355;-1:-1:-1;;;;;61173:16:0;;61192:1;61173:16;;;:7;:16;;;;;;:20;61170:124;;-1:-1:-1;;;;;61257:16:0;;;;;;:7;:16;;;;;;61237:37;;:19;:37::i;:::-;-1:-1:-1;;;;;61218:16:0;;;;;;:7;:16;;;;;:56;61170:124;-1:-1:-1;;;;;;61312:20:0;;;;;;:11;:20;;;;;:27;;-1:-1:-1;;61312:27:0;61335:4;61312:27;;;;;;61358:9;:23;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61358:23:0;;;;;;;61400:11;;59135:530;59236:6;;59204:4;;-1:-1:-1;;;;;59228:14:0;;;59236:6;;59228:14;;;;:43;;-1:-1:-1;59265:6:0;;-1:-1:-1;;;;;59259:12:0;;;59265:6;;59259:12;;59228:43;:79;;;;-1:-1:-1;59301:6:0;;-1:-1:-1;;;;;59301:6:0;59288:9;:19;;59228:79;:118;;;;-1:-1:-1;;;;;;59325:21:0;;;;;;:17;:21;;;;;;;;59324:22;59228:118;:159;;;;-1:-1:-1;;;;;;59364:23:0;;;;;;:17;:23;;;;;;;;59363:24;59228:159;:186;;;;-1:-1:-1;;;;;;59404:10:0;;43126:42;59404:10;;59228:186;:219;;;;-1:-1:-1;;;;;;59431:16:0;;;;59228:219;:257;;;;-1:-1:-1;;;;;;59464:21:0;;59480:4;59464:21;;59228:257;:301;;;;-1:-1:-1;;;;;;59502:12:0;;;;;;:6;:12;;;;;:22;-1:-1:-1;;;59502:22:0;;;;59528:1;59502:27;;59228:301;:343;;;;-1:-1:-1;;;;;;59546:10:0;;;;;;:6;:10;;;;;:20;-1:-1:-1;;;59546:20:0;;;;59570:1;59546:25;;59228:343;:387;;;;-1:-1:-1;;;;;;59588:12:0;;;;;;:6;:12;;;;;;;;:22;-1:-1:-1;;;59588:22:0;;;;:27;;59228:387;:429;;;;-1:-1:-1;;;;;;;59632:10:0;;;;;:6;:10;;;;;;;;:20;-1:-1:-1;;;59632:20:0;;;;:25;;;;-1:-1:-1;59135:530:0:o;69735:516::-;-1:-1:-1;;;;;69837:19:0;;;;;;:7;:19;;;;;:28;;;-1:-1:-1;;;69837:28:0;;;;:37;69829:85;;;;-1:-1:-1;;;69829:85:0;;35984:2:1;69829:85:0;;;35966:21:1;36023:2;36003:18;;;35996:30;36062:34;36042:18;;;36035:62;-1:-1:-1;;;36113:18:1;;;36106:33;36156:19;;69829:85:0;35782:399:1;69829:85:0;69930:20;69941:4;69947:2;69930:10;:20::i;:::-;69929:21;:41;;;;;69960:10;-1:-1:-1;;;;;69954:16:0;:2;-1:-1:-1;;;;;69954:16:0;;69929:41;69925:319;;;-1:-1:-1;;;;;69987:23:0;;;;;;;:17;:23;;;;;;;;:30;;-1:-1:-1;;69987:30:0;70013:4;69987:30;;;;;;70032:16;:23;;-1:-1:-1;;;;70032:23:0;-1:-1:-1;;;70032:23:0;;;70070:19;;;;;;:7;:19;;;;;;:28;;:35;;-1:-1:-1;;;;;;;70122:46:0;;;;;;70188:44;;21179:74:1;;;21269:18;;;21262:50;;;;70188:44:0;;21152:18:1;70188:44:0;21011:307:1;74559:1117:0;74655:4;74673:15;74690:23;74715:12;74729:23;74754:12;74768:18;74790:19;74801:7;74790:10;:19::i;:::-;74672:137;;;;;;;;;;;;74840:28;74860:7;74840;:15;74848:6;-1:-1:-1;;;;;74840:15:0;-1:-1:-1;;;;;74840:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;74822:15:0;;;;;;;:7;:15;;;;;;:46;;;;74900:18;;;;;;;:39;;74923:15;74900:22;:39::i;:::-;-1:-1:-1;;;;;74879:18:0;;;;;;;:7;:18;;;;;;;;:60;;;;74956:19;;;;;:11;:19;;;;;;;:46;;;;-1:-1:-1;;;;;;74980:22:0;;;;;;:11;:22;;;;;;;;74979:23;74956:46;74952:477;;;-1:-1:-1;;;;;75037:15:0;;;;;;:7;:15;;;;;;:28;;75057:7;75037:19;:28::i;:::-;-1:-1:-1;;;;;75019:15:0;;;;;;:7;:15;;;;;:46;74952:477;;;-1:-1:-1;;;;;75088:19:0;;;;;;:11;:19;;;;;;;;75087:20;:46;;;;-1:-1:-1;;;;;;75111:22:0;;;;;;:11;:22;;;;;;;;75087:46;75083:346;;;-1:-1:-1;;;;;75171:18:0;;;;;;:7;:18;;;;;;:39;;75194:15;75171:22;:39::i;:::-;-1:-1:-1;;;;;75150:18:0;;;;;;:7;:18;;;;;:60;75083:346;;;-1:-1:-1;;;;;75234:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;75257:22:0;;;;;;:11;:22;;;;;;;;75234:45;75230:199;;;-1:-1:-1;;;;;75314:15:0;;;;;;:7;:15;;;;;;:28;;75334:7;75314:19;:28::i;:::-;-1:-1:-1;;;;;75296:15:0;;;;;;;:7;:15;;;;;;:46;;;;75378:18;;;;;;;:39;;75401:15;75378:22;:39::i;:::-;-1:-1:-1;;;;;75357:18:0;;;;;;:7;:18;;;;;:60;75230:199;75445:14;;75441:67;;75474:34;75489:6;75497:10;75474:14;:34::i;:::-;75530:1;75523:4;:8;:20;;;;75542:1;75535:4;:8;75523:20;75519:63;;;75558:24;75571:4;75577;75558:12;:24::i;:::-;75617:9;-1:-1:-1;;;;;75600:44:0;75609:6;-1:-1:-1;;;;;75600:44:0;;75628:15;75600:44;;;;2668:25:1;;2656:2;2641:18;;2522:177;75600:44:0;;;;;;;;-1:-1:-1;75664:4:0;;74559:1117;-1:-1:-1;;;;;;;;;74559:1117:0:o;76895:163::-;76936:7;76957:15;76974;76993:19;:17;:19::i;:::-;76956:56;;-1:-1:-1;76956:56:0;-1:-1:-1;77030:20:0;76956:56;;77030:11;:20::i;:::-;77023:27;;;;76895:163;:::o;20893:98::-;20951:7;20978:5;20982:1;20978;:5;:::i;74183:315::-;-1:-1:-1;;;;;74309:13:0;;;74245:7;74309:13;;;:7;:13;;;;;;;;:19;74299:37;;-1:-1:-1;;;74299:37:0;;;;74245:7;;74309:19;;74299:35;;:37;;;;;74309:13;;74299:37;;;;;;74309:19;74299:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;74269:13:0;;;;;;;:7;:13;;;;;:26;;;:67;;;:26;;:67;74265:226;;-1:-1:-1;74359:21:0;;74183:315;-1:-1:-1;74183:315:0:o;74265:226::-;-1:-1:-1;;;;;74427:13:0;;;;;;;:7;:13;;;;;;;:26;;;74420:59;;-1:-1:-1;;;74420:59:0;;74473:4;74420:59;;;160:74:1;74427:26:0;;;74420:44;;133:18:1;;74420:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;75684:419::-;75743:7;75752;75761;75770;75779;75788;75809:23;75834:12;75848:18;75870:20;75882:7;75870:11;:20::i;:::-;75808:82;;;;;;75902:15;75919:23;75944:12;75960:50;75972:7;75981:4;75987:10;75999;:8;:10::i;:::-;75960:11;:50::i;:::-;75901:109;;;;-1:-1:-1;75901:109:0;;-1:-1:-1;76061:15:0;;-1:-1:-1;76078:4:0;;-1:-1:-1;76084:10:0;;-1:-1:-1;75684:419:0;;-1:-1:-1;;;;;75684:419:0:o;20137:98::-;20195:7;20222:5;20226:1;20222;:5;:::i;19756:98::-;19814:7;19841:5;19845:1;19841;:5;:::i;77888:469::-;77967:19;77990:10;:8;:10::i;:::-;77967:33;-1:-1:-1;78011:18:0;78032:27;:10;77967:33;78032:14;:27::i;:::-;78111:4;78095:22;;;;:7;:22;;;;;;78011:48;;-1:-1:-1;78095:38:0;;78011:48;78095:26;:38::i;:::-;78086:4;78070:22;;;;:7;:22;;;;;;;;:63;;;;78147:11;:26;;;;;;78144:107;;;78229:4;78213:22;;;;:7;:22;;;;;;:38;;78240:10;78213:26;:38::i;:::-;78204:4;78188:22;;;;:7;:22;;;;;:63;78144:107;78267:43;;2668:25:1;;;78292:4:0;;-1:-1:-1;;;;;78267:43:0;;;;;2656:2:1;2641:18;78267:43:0;;;;;;;77956:401;;77888:469;;:::o;77635:148::-;77714:7;;:17;;77726:4;77714:11;:17::i;:::-;77704:7;:27;77755:10;;:20;;77770:4;77755:14;:20::i;:::-;77742:10;:33;-1:-1:-1;;77635:148:0:o;77066:561::-;77163:7;;77116;;;;;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;;39881:15;40076:30;:::i;:::-;77181:25;;77228:9;77223:289;77247:9;:16;77243:20;;77223:289;;;77313:7;77289;:21;77297:9;77307:1;77297:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;77297:12:0;77289:21;;;;;;;;;;;;;:31;;:66;;;77348:7;77324;:21;77332:9;77342:1;77332:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;77332:12:0;77324:21;;;;;;;;;;;;;:31;77289:66;77285:97;;;77365:7;;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;;39881:15;40076:30;:::i;:::-;77357:25;;;;;;;77066:561;;:::o;77285:97::-;77407:34;77419:7;:21;77427:9;77437:1;77427:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;77427:12:0;77419:21;;;;;;;;;;;;;77407:7;;:11;:34::i;:::-;77397:44;;77466:34;77478:7;:21;77486:9;77496:1;77486:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;77486:12:0;77478:21;;;;;;;;;;;;;77466:7;;:11;:34::i;:::-;77456:44;-1:-1:-1;77265:3:0;;;;:::i;:::-;;;;77223:289;;;-1:-1:-1;77536:20:0;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;;39881:15;40076:30;:::i;:::-;77536:7;;;:11;:20::i;:::-;77526:7;:30;77522:61;;;77566:7;;40093:13;39981:2;40093;:13;:::i;:::-;40076:30;;39881:15;40076:30;:::i;:::-;77558:25;;;;;;77066:561;;:::o;77522:61::-;77602:7;;77611;;-1:-1:-1;77066:561:0;-1:-1:-1;77066:561:0:o;76111:337::-;76171:7;76180;76189;76209:12;76224:31;76247:7;76224:22;:31::i;:::-;76209:46;;76266:18;76287:30;76309:7;76287:21;:30::i;:::-;76266:51;-1:-1:-1;76328:23:0;76354:33;76266:51;76354:17;:7;76366:4;76354:11;:17::i;:::-;:21;;:33::i;:::-;76328:59;76423:4;;-1:-1:-1;76429:10:0;;-1:-1:-1;76111:337:0;;-1:-1:-1;;;76111:337:0:o;76456:429::-;76571:7;;;;76627:24;:7;76639:11;76627;:24::i;:::-;76609:42;-1:-1:-1;76662:12:0;76677:21;:4;76686:11;76677:8;:21::i;:::-;76662:36;-1:-1:-1;76709:18:0;76730:27;:10;76745:11;76730:14;:27::i;:::-;76709:48;-1:-1:-1;76768:23:0;76794:33;76709:48;76794:17;:7;76806:4;76794:11;:17::i;:33::-;76846:7;;;;-1:-1:-1;76872:4:0;;-1:-1:-1;76456:429:0;;-1:-1:-1;;;;;;;76456:429:0:o;20494:98::-;20552:7;20579:5;20583:1;20579;:5;:::i;78365:165::-;78475:13;:24;78436:7;;78463:59;;42466:5;;78463:37;;:7;;78475:24;-1:-1:-1;;;78475:24:0;;;;;;78463:11;:37;:::i;:::-;:41;;:59::i;78538:193::-;78676:13;:23;78608:7;;78635:88;;42466:5;;78635:66;;78647:53;;78676:23;;;;;;;78648;78647:53;:::i;:::-;78635:66;;:7;:11;;:66;;;;:::i;245:548:1:-;357:4;386:2;415;404:9;397:21;447:6;441:13;490:6;485:2;474:9;470:18;463:34;515:1;525:140;539:6;536:1;533:13;525:140;;;634:14;;;630:23;;624:30;600:17;;;619:2;596:26;589:66;554:10;;525:140;;;529:3;714:1;709:2;700:6;689:9;685:22;681:31;674:42;784:2;777;773:7;768:2;760:6;756:15;752:29;741:9;737:45;733:54;725:62;;;;245:548;;;;:::o;1047:154::-;-1:-1:-1;;;;;1126:5:1;1122:54;1115:5;1112:65;1102:93;;1191:1;1188;1181:12;1206:247;1265:6;1318:2;1306:9;1297:7;1293:23;1289:32;1286:52;;;1334:1;1331;1324:12;1286:52;1373:9;1360:23;1392:31;1417:5;1392:31;:::i;2010:315::-;2078:6;2086;2139:2;2127:9;2118:7;2114:23;2110:32;2107:52;;;2155:1;2152;2145:12;2107:52;2194:9;2181:23;2213:31;2238:5;2213:31;:::i;:::-;2263:5;2315:2;2300:18;;;;2287:32;;-1:-1:-1;;;2010:315:1:o;2704:456::-;2781:6;2789;2797;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;2905:9;2892:23;2924:31;2949:5;2924:31;:::i;:::-;2974:5;-1:-1:-1;3031:2:1;3016:18;;3003:32;3044:33;3003:32;3044:33;:::i;:::-;2704:456;;3096:7;;-1:-1:-1;;;3150:2:1;3135:18;;;;3122:32;;2704:456::o;3165:272::-;3223:6;3276:2;3264:9;3255:7;3251:23;3247:32;3244:52;;;3292:1;3289;3282:12;3244:52;3331:9;3318:23;3381:6;3374:5;3370:18;3363:5;3360:29;3350:57;;3403:1;3400;3393:12;3442:383;3519:6;3527;3535;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3643:9;3630:23;3662:31;3687:5;3662:31;:::i;:::-;3712:5;3764:2;3749:18;;3736:32;;-1:-1:-1;3815:2:1;3800:18;;;3787:32;;3442:383;-1:-1:-1;;;3442:383:1:o;4019:163::-;4086:20;;4146:10;4135:22;;4125:33;;4115:61;;4172:1;4169;4162:12;4187:328;4261:6;4269;4277;4330:2;4318:9;4309:7;4305:23;4301:32;4298:52;;;4346:1;4343;4336:12;4298:52;4369:28;4387:9;4369:28;:::i;:::-;4359:38;;4416:37;4449:2;4438:9;4434:18;4416:37;:::i;:::-;4406:47;;4472:37;4505:2;4494:9;4490:18;4472:37;:::i;:::-;4462:47;;4187:328;;;;;:::o;4852:529::-;4929:6;4937;4945;4998:2;4986:9;4977:7;4973:23;4969:32;4966:52;;;5014:1;5011;5004:12;4966:52;5053:9;5040:23;5072:31;5097:5;5072:31;:::i;:::-;5122:5;-1:-1:-1;5179:2:1;5164:18;;5151:32;5192:33;5151:32;5192:33;:::i;:::-;5244:7;-1:-1:-1;5303:2:1;5288:18;;5275:32;5316:33;5275:32;5316:33;:::i;:::-;5368:7;5358:17;;;4852:529;;;;;:::o;5386:367::-;5449:8;5459:6;5513:3;5506:4;5498:6;5494:17;5490:27;5480:55;;5531:1;5528;5521:12;5480:55;-1:-1:-1;5554:20:1;;5597:18;5586:30;;5583:50;;;5629:1;5626;5619:12;5583:50;5666:4;5658:6;5654:17;5642:29;;5726:3;5719:4;5709:6;5706:1;5702:14;5694:6;5690:27;5686:38;5683:47;5680:67;;;5743:1;5740;5733:12;5680:67;5386:367;;;;;:::o;5758:437::-;5844:6;5852;5905:2;5893:9;5884:7;5880:23;5876:32;5873:52;;;5921:1;5918;5911:12;5873:52;5961:9;5948:23;5994:18;5986:6;5983:30;5980:50;;;6026:1;6023;6016:12;5980:50;6065:70;6127:7;6118:6;6107:9;6103:22;6065:70;:::i;:::-;6154:8;;6039:96;;-1:-1:-1;5758:437:1;-1:-1:-1;;;;5758:437:1:o;6200:118::-;6286:5;6279:13;6272:21;6265:5;6262:32;6252:60;;6308:1;6305;6298:12;6323:382;6388:6;6396;6449:2;6437:9;6428:7;6424:23;6420:32;6417:52;;;6465:1;6462;6455:12;6417:52;6504:9;6491:23;6523:31;6548:5;6523:31;:::i;:::-;6573:5;-1:-1:-1;6630:2:1;6615:18;;6602:32;6643:30;6602:32;6643:30;:::i;:::-;6692:7;6682:17;;;6323:382;;;;;:::o;7859:412::-;7925:6;7933;7986:2;7974:9;7965:7;7961:23;7957:32;7954:52;;;8002:1;7999;7992:12;7954:52;8041:9;8028:23;8060:31;8085:5;8060:31;:::i;:::-;8110:5;-1:-1:-1;8167:2:1;8152:18;;8139:32;8215:4;8202:18;;8190:31;;8180:59;;8235:1;8232;8225:12;8276:376;8338:6;8346;8399:2;8387:9;8378:7;8374:23;8370:32;8367:52;;;8415:1;8412;8405:12;8367:52;8454:9;8441:23;8473:28;8495:5;8473:28;:::i;8850:241::-;8906:6;8959:2;8947:9;8938:7;8934:23;8930:32;8927:52;;;8975:1;8972;8965:12;8927:52;9014:9;9001:23;9033:28;9055:5;9033:28;:::i;9096:523::-;9170:6;9178;9186;9239:2;9227:9;9218:7;9214:23;9210:32;9207:52;;;9255:1;9252;9245:12;9207:52;9294:9;9281:23;9313:31;9338:5;9313:31;:::i;:::-;9363:5;-1:-1:-1;9420:2:1;9405:18;;9392:32;9433:33;9392:32;9433:33;:::i;:::-;9485:7;-1:-1:-1;9544:2:1;9529:18;;9516:32;9557:30;9516:32;9557:30;:::i;9624:382::-;9689:6;9697;9750:2;9738:9;9729:7;9725:23;9721:32;9718:52;;;9766:1;9763;9756:12;9718:52;9805:9;9792:23;9824:28;9846:5;9824:28;:::i;:::-;9871:5;-1:-1:-1;9928:2:1;9913:18;;9900:32;9941:33;9900:32;9941:33;:::i;10011:388::-;10079:6;10087;10140:2;10128:9;10119:7;10115:23;10111:32;10108:52;;;10156:1;10153;10146:12;10108:52;10195:9;10182:23;10214:31;10239:5;10214:31;:::i;10404:592::-;10487:6;10495;10503;10511;10564:3;10552:9;10543:7;10539:23;10535:33;10532:53;;;10581:1;10578;10571:12;10532:53;10620:9;10607:23;10639:28;10661:5;10639:28;:::i;:::-;10686:5;-1:-1:-1;10743:2:1;10728:18;;10715:32;10756:33;10715:32;10756:33;:::i;:::-;10808:7;-1:-1:-1;10862:2:1;10847:18;;10834:32;;-1:-1:-1;10918:2:1;10903:18;;10890:32;10931:33;10890:32;10931:33;:::i;:::-;10404:592;;;;-1:-1:-1;10404:592:1;;-1:-1:-1;;10404:592:1:o;11001:566::-;11093:6;11101;11109;11162:2;11150:9;11141:7;11137:23;11133:32;11130:52;;;11178:1;11175;11168:12;11130:52;11218:9;11205:23;11251:18;11243:6;11240:30;11237:50;;;11283:1;11280;11273:12;11237:50;11322:70;11384:7;11375:6;11364:9;11360:22;11322:70;:::i;:::-;11411:8;;-1:-1:-1;11296:96:1;-1:-1:-1;;11496:2:1;11481:18;;11468:32;11509:28;11468:32;11509:28;:::i;12636:127::-;12697:10;12692:3;12688:20;12685:1;12678:31;12728:4;12725:1;12718:15;12752:4;12749:1;12742:15;12768:168;12841:9;;;12872;;12889:15;;;12883:22;;12869:37;12859:71;;12910:18;;:::i;12941:217::-;12981:1;13007;12997:132;;13051:10;13046:3;13042:20;13039:1;13032:31;13086:4;13083:1;13076:15;13114:4;13111:1;13104:15;12997:132;-1:-1:-1;13143:9:1;;12941:217::o;13834:245::-;13901:6;13954:2;13942:9;13933:7;13929:23;13925:32;13922:52;;;13970:1;13967;13960:12;13922:52;14002:9;13996:16;14021:28;14043:5;14021:28;:::i;15546:422::-;15635:1;15678:5;15635:1;15692:270;15713:7;15703:8;15700:21;15692:270;;;15772:4;15768:1;15764:6;15760:17;15754:4;15751:27;15748:53;;;15781:18;;:::i;:::-;15831:7;15821:8;15817:22;15814:55;;;15851:16;;;;15814:55;15930:22;;;;15890:15;;;;15692:270;;;15696:3;15546:422;;;;;:::o;15973:806::-;16022:5;16052:8;16042:80;;-1:-1:-1;16093:1:1;16107:5;;16042:80;16141:4;16131:76;;-1:-1:-1;16178:1:1;16192:5;;16131:76;16223:4;16241:1;16236:59;;;;16309:1;16304:130;;;;16216:218;;16236:59;16266:1;16257:10;;16280:5;;;16304:130;16341:3;16331:8;16328:17;16325:43;;;16348:18;;:::i;:::-;-1:-1:-1;;16404:1:1;16390:16;;16419:5;;16216:218;;16518:2;16508:8;16505:16;16499:3;16493:4;16490:13;16486:36;16480:2;16470:8;16467:16;16462:2;16456:4;16453:12;16449:35;16446:77;16443:159;;;-1:-1:-1;16555:19:1;;;16587:5;;16443:159;16634:34;16659:8;16653:4;16634:34;:::i;:::-;16704:6;16700:1;16696:6;16692:19;16683:7;16680:32;16677:58;;;16715:18;;:::i;:::-;16753:20;;15973:806;-1:-1:-1;;;15973:806:1:o;16784:140::-;16842:5;16871:47;16912:4;16902:8;16898:19;16892:4;16871:47;:::i;17726:172::-;17793:10;17823;;;17835;;;17819:27;;17858:11;;;17855:37;;;17872:18;;:::i;:::-;17855:37;17726:172;;;;:::o;18617:127::-;18678:10;18673:3;18669:20;18666:1;18659:31;18709:4;18706:1;18699:15;18733:4;18730:1;18723:15;18749:135;18788:3;18809:17;;;18806:43;;18829:18;;:::i;:::-;-1:-1:-1;18876:1:1;18865:13;;18749:135::o;22651:184::-;22721:6;22774:2;22762:9;22753:7;22749:23;22745:32;22742:52;;;22790:1;22787;22780:12;22742:52;-1:-1:-1;22813:16:1;;22651:184;-1:-1:-1;22651:184:1:o;29306:125::-;29371:9;;;29392:10;;;29389:36;;;29405:18;;:::i;30250:373::-;30323:6;30331;30384:2;30372:9;30363:7;30359:23;30355:32;30352:52;;;30400:1;30397;30390:12;30352:52;30432:9;30426:16;30451:28;30473:5;30451:28;:::i;:::-;30548:2;30533:18;;30527:25;30498:5;;-1:-1:-1;30561:30:1;30527:25;30561:30;:::i;32111:128::-;32178:9;;;32199:11;;;32196:37;;;32213:18;;:::i;32376:251::-;32446:6;32499:2;32487:9;32478:7;32474:23;32470:32;32467:52;;;32515:1;32512;32505:12;32467:52;32547:9;32541:16;32566:31;32591:5;32566:31;:::i;32632:1026::-;32894:4;32942:3;32931:9;32927:19;32973:6;32962:9;32955:25;32999:2;33037:6;33032:2;33021:9;33017:18;33010:34;33080:3;33075:2;33064:9;33060:18;33053:31;33104:6;33139;33133:13;33170:6;33162;33155:22;33208:3;33197:9;33193:19;33186:26;;33247:2;33239:6;33235:15;33221:29;;33268:1;33278:218;33292:6;33289:1;33286:13;33278:218;;;33357:13;;-1:-1:-1;;;;;33353:62:1;33341:75;;33471:15;;;;33436:12;;;;33314:1;33307:9;33278:218;;;-1:-1:-1;;;;;;;33552:55:1;;;;33547:2;33532:18;;33525:83;-1:-1:-1;;;33639:3:1;33624:19;33617:35;33513:3;32632:1026;-1:-1:-1;;;32632:1026:1:o;34298:306::-;34386:6;34394;34402;34455:2;34443:9;34434:7;34430:23;34426:32;34423:52;;;34471:1;34468;34461:12;34423:52;34500:9;34494:16;34484:26;;34550:2;34539:9;34535:18;34529:25;34519:35;;34594:2;34583:9;34579:18;34573:25;34563:35;;34298:306;;;;;:::o;35650:127::-;35711:10;35706:3;35702:20;35699:1;35692:31;35742:4;35739:1;35732:15;35766:4;35763:1;35756:15

Swarm Source

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