ETH Price: $2,442.01 (+3.71%)

Token

Digipolis (DIGI)
 

Overview

Max Total Supply

1,000,000,000 DIGI

Holders

27 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
14,368,184.687028956 DIGI

Value
$0.00
0xc3b967df0c09d2a917fce8b9e953030e94040cbd
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Digipolis revolutionizes remote virtual collaboration with digital offices, a democratic governance model, and a unique economic ecosystem anchored by $DIGI.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Digipolis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

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

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

interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the token decimals.
   */
  function decimals() external view returns (uint8);

  /**
   * @dev Returns the token symbol.
   */
  function symbol() external view returns (string memory);

  /**
  * @dev Returns the token name.
  */
  function name() external view returns (string memory);

  /**
   * @dev Returns the bep token owner.
   */
  function getOwner() external view returns (address);

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

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

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

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

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

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

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

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

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

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     * b̵a̷b̴y̷p̶l̵u̵t̸o̸ ̶o̴r̵i̷g̸i̷n̵a̶l̵
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2b̴a̴b̶y̸p̵l̸u̷t̴o̶ ̵d̸u̵p̸e̵53ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

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

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

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


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

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

interface IUniswapV2Factory {
    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;
}

abstract contract Ownable is Context {
    address private _owner;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }    
}

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

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

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

    mapping (address => bool) private presaleAddresses;
    mapping (address => bool) private _liquidityHolders;
   
    uint private startingSupply = 1000000000; //1 Billion
   
    uint256 private constant MAX = ~uint256(0);
    uint8 private _decimals = 9;
    uint256 private _decimalsMul = _decimals;
    uint256 private _tTotal = startingSupply * 10**_decimalsMul;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "Digipolis";
    string private _symbol = "DIGI";    
    
    uint256 private _liquidityFee = 0; // Set dynamically
    uint256 public _buyLiquidityFee = 2;
    uint256 public _sellLiquidityFee = 5;
    uint256 private maxLiquidityFee = 7;

    uint256 private _treasuryFee = 0; // Set dynamically
    uint256 public _buyTreasuryFee = 3;
    uint256 public _sellTreasuryFee = 5;
    uint256 private maxTreasuryFee = 8;

    uint256 private masterTaxDivisor = 100; // All tax calculations are divided by this number.

    IUniswapV2Router02 public dexRouter;
    address public lpPair;

     //uniswap router v2 address: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
    address private _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address  public TreasuryWallet = 0x6E9eaC03b3a0F812a52f6B454Af95ca71ACDB470;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    
    uint256 private numTokensSellToAddToLiquidity = (_tTotal * 5) / 10000;
    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _tOwned[_msgSender()] = _tTotal;
        _rOwned[_msgSender()] = _rTotal;


        IUniswapV2Router02 _dexRouter = IUniswapV2Router02(_routerAddress);
        lpPair = IUniswapV2Factory(_dexRouter.factory())
            .createPair(address(this), _dexRouter.WETH());

        dexRouter = _dexRouter;
        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _liquidityHolders[owner()] = true;
        _isExcluded[address(this)] = true;
        _excluded.push(address(this));
        _isExcluded[owner()] = true;
        _excluded.push(owner());
        _isExcluded[TreasuryWallet] = true;
        _excluded.push(TreasuryWallet);
        _isExcluded[lpPair] = true;
        _excluded.push(lpPair);

        // Approve the owner for PancakeSwap, timesaver.
        _approve(_msgSender(), _routerAddress, _tTotal);

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

    function totalSupply() external view override returns (uint256) { return _tTotal; }
    function decimals() external view override returns (uint8) { return _decimals; }
    function symbol() external view override returns (string memory) { return _symbol; }
    function name() external view override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return owner(); }
    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 approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

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

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

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

    function setNewRouter(address newRouter) public onlyOwner() {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
        if (get_pair == address(0)) {
            lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
        }
        else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
    }

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

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function setBuyTaxes(uint256 liquidityFee,  uint256 treasuryFee) external onlyOwner() {
        require(liquidityFee <= maxLiquidityFee); // Prevents owner from abusing fees.
        require(treasuryFee <= maxTreasuryFee); // Prevents owner from abusing fees.
        _buyLiquidityFee = liquidityFee;
        _buyTreasuryFee = treasuryFee;
    }
    
    function setSellTaxes( uint256 liquidityFee, uint256 treasuryFee) external onlyOwner() {
        require(liquidityFee <= maxLiquidityFee); // Prevents owner from abusing fees.
        require(treasuryFee <= maxTreasuryFee); // Prevents owner from abusing fees.
        _sellLiquidityFee = liquidityFee;
        _sellTreasuryFee = treasuryFee;
    }

    function setTreasuryWallet(address  newWallet) external onlyOwner {
        require(TreasuryWallet != newWallet, "Wallet already set!");
        TreasuryWallet = newWallet;
    }

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

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

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

    function excludePresaleAddresses(address router, address presale) external onlyOwner {
        _liquidityHolders[router] = true;
        _liquidityHolders[presale] = true;
        presaleAddresses[router] = true;
        presaleAddresses[presale] = true;
        excludeFromFee(router);
        excludeFromFee(presale);
    }

    function _hasLimits(address from, address to) private view returns (bool) {
        return from != owner()
            && to != owner()
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != address(0);
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) private view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

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

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

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

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

    function _transfer(address from, address to, uint256 amount) private {
        
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 contractTokenBalance = balanceOf(address(this));        
        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;

        if (!inSwapAndLiquify
            && to == lpPair
            && swapAndLiquifyEnabled
            && !presaleAddresses[to]
            && !presaleAddresses[from]
        ) {
            if (overMinTokenBalance) {
                contractTokenBalance = numTokensSellToAddToLiquidity;
                swapAndLiquify(contractTokenBalance);
            }
        }
        
        bool takeFee = true;
        
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

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

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

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

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

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

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

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

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

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

        adjustTaxes(sender, recipient, amount, takeFee);

        _finalizeTransfer(sender, recipient, amount);

    }

    function _finalizeTransfer(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tTreasury) = _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);
        if (tTreasury > 0)
            _takeTreasury(sender, tTreasury);

        emit Transfer(sender, recipient, tTransferAmount);
    }

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

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

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tTreasury, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTreasury = tTreasury.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rTreasury);
        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 _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 _takeTreasury(address sender, uint256 tTreasury) private {
        uint256 currentRate =  _getRate();
        uint256 rTreasury = tTreasury.mul(currentRate);
        _rOwned[TreasuryWallet] = _rOwned[TreasuryWallet].add(rTreasury);
        if(_isExcluded[TreasuryWallet])
            _tOwned[TreasuryWallet] = _tOwned[TreasuryWallet].add(tTreasury);
        emit Transfer(sender, TreasuryWallet, tTreasury); // Transparency is the key to success.
    }

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

    function calculateTreasuryFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_treasuryFee).div(masterTaxDivisor);
    }
    
    function adjustTaxes(address from, address to, uint256 amount, bool takeFee) internal {
        if (!takeFee) {
            _liquidityFee = 0;
            _treasuryFee = 0;
        } else if (from == lpPair) {
            _liquidityFee = _buyLiquidityFee;
            _treasuryFee = _buyTreasuryFee;
        } else if (to == lpPair) {
            if (amount >= (_tTotal / 100)) {
                _liquidityFee = _sellLiquidityFee * 2;
                _treasuryFee = _sellTreasuryFee * 2;
            } else {
                _liquidityFee = _sellLiquidityFee;
                _treasuryFee = _sellTreasuryFee;
            }
        } else {
            _liquidityFee = 0;
            _treasuryFee = 0;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TreasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"presale","type":"address"}],"name":"excludePresaleAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052633b9aca006009908155600a805460ff191682178155600b8290556200002b91906200083a565b6009546200003a9190620008f8565b600c8190556200004d9060001962000971565b6200005b906000196200091a565b600d556040805180820190915260098082526844696769706f6c697360b81b60209092019182526200009091600f9162000702565b50604080518082019091526004808252634449474960e01b6020909201918252620000be9160109162000702565b506000601181905560026012556005601381905560076014556015919091556003601655601781905560086018556064601955601c80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055601d80547501006e9eac03b3a0f812a52f6b454af95ca71acdb470600161ff0160a01b0319909116179055600c5461271091620001559190620008f8565b620001619190620007da565b601e553480156200017157600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c5433600090815260026020908152604080832093909355600d54600182529183902091909155601c54825163c45a015560e01b815292516001600160a01b0390911692839263c45a015592600480840193829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002569190620007a8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029f57600080fd5b505afa158015620002b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002da9190620007a8565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200032357600080fd5b505af115801562000338573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035e9190620007a8565b601b80546001600160a01b03199081166001600160a01b0393841617909155601a8054909116918316919091179055600160046000620003a66000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526004909252812080549092166001908117909255600890620003ff6000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553080825260059384905291812080549094166001908117909455600680548086018255908252600080516020620030658339815191520180546001600160a01b031916909217909155620004876000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556006620004c46000546001600160a01b031690565b8154600181810184556000938452602080852090920180546001600160a01b039485166001600160a01b031991821617909155601d80548516865260059093526040808620805460ff1990811685179091559354600680548086018255600080516020620030658339815191529081018054861693891693909317909255601b8054881689529288208054909616851790955590548454938401855593909552930180549093169116179055620005946200057c3390565b601c54600c546001600160a01b0390911690620005d6565b600c5460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350620009b4565b6001600160a01b0383166200063e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620006a15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000635565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b828054620007109062000934565b90600052602060002090601f0160209004810192826200073457600085556200077f565b82601f106200074f57805160ff19168380011785556200077f565b828001600101855582156200077f579182015b828111156200077f57825182559160200191906001019062000762565b506200078d92915062000791565b5090565b5b808211156200078d576000815560010162000792565b600060208284031215620007bb57600080fd5b81516001600160a01b0381168114620007d357600080fd5b9392505050565b600082620007ec57620007ec6200099e565b500490565b600181815b808511156200083257816000190482111562000816576200081662000988565b808516156200082457918102915b93841c9390800290620007f6565b509250929050565b6000620007d383836000826200085357506001620008f2565b816200086257506000620008f2565b81600181146200087b57600281146200088657620008a6565b6001915050620008f2565b60ff8411156200089a576200089a62000988565b50506001821b620008f2565b5060208310610133831016604e8410600b8410161715620008cb575081810a620008f2565b620008d78383620007f1565b8060001904821115620008ee57620008ee62000988565b0290505b92915050565b600081600019048311821515161562000915576200091562000988565b500290565b6000828210156200092f576200092f62000988565b500390565b600181811c908216806200094957607f821691505b602082108114156200096b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200098357620009836200099e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6126a180620009c46000396000f3fe6080604052600436106102085760003560e01c8063715018a611610118578063a9059cbb116100a0578063dc44b6a01161006f578063dc44b6a0146105dc578063dd62ed3e146105f2578063ea2f0b3714610638578063eafb5a3c14610658578063f2fde38b1461067857600080fd5b8063a9059cbb14610566578063aa35822c14610586578063c49b9a80146105a6578063d628df9c146105c657600080fd5b80638da5cb5b116100e75780638da5cb5b146104d357806395d89b41146104f1578063a11a168214610506578063a457c2d714610526578063a8602fea1461054657600080fd5b8063715018a61461046f57806388790a681461048457806388f820201461049a578063893d20e8146104d357600080fd5b806324fcf8cf1161019b578063437823ec1161016a578063437823ec146103b5578063452ed4f1146103d55780634a74bb02146103f55780635342acb41461041657806370a082311461044f57600080fd5b806324fcf8cf1461033d578063313ce5671461035357806339509351146103755780633bd5d1731461039557600080fd5b806313114a9d116101d757806313114a9d146102c757806313b4a7f4146102e657806318160ddd1461030857806323b872dd1461031d57600080fd5b806306fdde03146102145780630758d9241461023f578063095ea7b31461027757806311ffeaf2146102a757600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b50610229610698565b6040516102369190612419565b60405180910390f35b34801561024b57600080fd5b50601a5461025f906001600160a01b031681565b6040516001600160a01b039091168152602001610236565b34801561028357600080fd5b50610297610292366004612362565b61072a565b6040519015158152602001610236565b3480156102b357600080fd5b50601d5461025f906001600160a01b031681565b3480156102d357600080fd5b50600e545b604051908152602001610236565b3480156102f257600080fd5b506103066103013660046122e8565b610741565b005b34801561031457600080fd5b50600c546102d8565b34801561032957600080fd5b50610297610338366004612321565b6107e7565b34801561034957600080fd5b506102d860175481565b34801561035f57600080fd5b50600a5460405160ff9091168152602001610236565b34801561038157600080fd5b50610297610390366004612362565b610850565b3480156103a157600080fd5b506103066103b03660046123b0565b610886565b3480156103c157600080fd5b506103066103d03660046122ae565b610972565b3480156103e157600080fd5b50601b5461025f906001600160a01b031681565b34801561040157600080fd5b50601d5461029790600160a81b900460ff1681565b34801561042257600080fd5b506102976104313660046122ae565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561045b57600080fd5b506102d861046a3660046122ae565b6109c0565b34801561047b57600080fd5b50610306610a1f565b34801561049057600080fd5b506102d860135481565b3480156104a657600080fd5b506102976104b53660046122ae565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156104df57600080fd5b506000546001600160a01b031661025f565b3480156104fd57600080fd5b50610229610a93565b34801561051257600080fd5b506103066105213660046123c9565b610aa2565b34801561053257600080fd5b50610297610541366004612362565b610af5565b34801561055257600080fd5b506103066105613660046122ae565b610b44565b34801561057257600080fd5b50610297610581366004612362565b610be4565b34801561059257600080fd5b506103066105a13660046123c9565b610bf1565b3480156105b257600080fd5b506103066105c136600461238e565b610c44565b3480156105d257600080fd5b506102d860165481565b3480156105e857600080fd5b506102d860125481565b3480156105fe57600080fd5b506102d861060d3660046122e8565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561064457600080fd5b506103066106533660046122ae565b610cc6565b34801561066457600080fd5b506103066106733660046122ae565b610d11565b34801561068457600080fd5b506103066106933660046122ae565b611097565b6060600f80546106a790612584565b80601f01602080910402602001604051908101604052809291908181526020018280546106d390612584565b80156107205780601f106106f557610100808354040283529160200191610720565b820191906000526020600020905b81548152906001019060200180831161070357829003601f168201915b5050505050905090565b6000610737338484611181565b5060015b92915050565b6000546001600160a01b031633146107745760405162461bcd60e51b815260040161076b9061246e565b60405180910390fd5b6001600160a01b0382811660008181526008602090815260408083208054600160ff19918216811790925595871680855282852080548816831790559484526007909252808320805486168317905592825291902080549092161790556107da82610972565b6107e381610972565b5050565b60006107f48484846112a5565b61084684336108418560405180606001604052806028815260200161261f602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906114e0565b611181565b5060019392505050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610737918590610841908661151a565b3360008181526005602052604090205460ff16156108fb5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b606482015260840161076b565b600061090683611580565b5050506001600160a01b038616600090815260016020526040902054939450610934939250849150506115db565b6001600160a01b038316600090815260016020526040902055600d5461095a90826115db565b600d55600e5461096a908461151a565b600e55505050565b6000546001600160a01b0316331461099c5760405162461bcd60e51b815260040161076b9061246e565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6001600160a01b03811660009081526005602052604081205460ff16156109fd57506001600160a01b031660009081526002602052604090205490565b6001600160a01b03821660009081526001602052604090205461073b9061161d565b6000546001600160a01b03163314610a495760405162461bcd60e51b815260040161076b9061246e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6060601080546106a790612584565b6000546001600160a01b03163314610acc5760405162461bcd60e51b815260040161076b9061246e565b601454821115610adb57600080fd5b601854811115610aea57600080fd5b601391909155601755565b6000610737338461084185604051806060016040528060258152602001612647602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906114e0565b6000546001600160a01b03163314610b6e5760405162461bcd60e51b815260040161076b9061246e565b601d546001600160a01b0382811691161415610bc25760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b604482015260640161076b565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b60006107373384846112a5565b6000546001600160a01b03163314610c1b5760405162461bcd60e51b815260040161076b9061246e565b601454821115610c2a57600080fd5b601854811115610c3957600080fd5b601291909155601655565b6000546001600160a01b03163314610c6e5760405162461bcd60e51b815260040161076b9061246e565b601d8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610cbb90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610cf05760405162461bcd60e51b815260040161076b9061246e565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b03163314610d3b5760405162461bcd60e51b815260040161076b9061246e565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7b57600080fd5b505afa158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db391906122cb565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3391906122cb565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb191906122cb565b90506001600160a01b03811661105757816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610efa57600080fd5b505afa158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3291906122cb565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7a57600080fd5b505afa158015610f8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb291906122cb565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103291906122cb565b601b80546001600160a01b0319166001600160a01b0392909216919091179055611073565b601b80546001600160a01b0319166001600160a01b0383161790555b50601a80546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146110c15760405162461bcd60e51b815260040161076b9061246e565b6001600160a01b0381166111265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166111e35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076b565b6001600160a01b0382166112445760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166113095760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161076b565b6001600160a01b03821661136b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161076b565b600081116113cd5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161076b565b60006113d8306109c0565b601e54601d5491925082101590600160a01b900460ff161580156114095750601b546001600160a01b038581169116145b801561141e5750601d54600160a81b900460ff165b801561144357506001600160a01b03841660009081526007602052604090205460ff16155b801561146857506001600160a01b03851660009081526007602052604090205460ff16155b1561148157801561148157601e5491506114818261169a565b6001600160a01b03851660009081526004602052604090205460019060ff16806114c357506001600160a01b03851660009081526004602052604090205460ff165b156114cc575060005b6114d886868684611741565b505050505050565b600081848411156115045760405162461bcd60e51b815260040161076b9190612419565b506000611511848661256d565b95945050505050565b6000806115278385612514565b9050838110156115795760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161076b565b9392505050565b600080600080600080600080600080600061159a8c61175e565b935093509350935060008060006115bb8f8787876115b66117a7565b6117ca565b919f509d509b509599509397509195509350505050919395979092949650565b600061157983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114e0565b6000600d548211156116845760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161076b565b600061168e6117a7565b9050611579838261182c565b601d805460ff60a01b1916600160a01b17905560006116ba82600261182c565b905060006116c883836115db565b9050476116d48361186e565b60006116e047836115db565b90506116ec83826119cf565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601d805460ff60a01b19169055505050565b61174d84848484611ab3565b611758848484611b61565b50505050565b60008060008060008061177087611e53565b9050600061177d88611e76565b905060006117978261179185818d896115db565b906115db565b9993985091965094509092505050565b60008060006117b4611e93565b90925090506117c3828261182c565b9250505090565b60008080806117d98986612015565b905060006117e78987612015565b905060006117f58988612015565b905060006118038989612015565b9050600061181782611791858189896115db565b949d949c50929a509298505050505050505050565b600061157983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612094565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106118a3576118a36125f0565b6001600160a01b03928316602091820292909201810191909152601a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156118f757600080fd5b505afa15801561190b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192f91906122cb565b81600181518110611942576119426125f0565b6001600160a01b039283166020918202929092010152601a546119689130911684611181565b601a5460405163791ac94760e01b81526001600160a01b039091169063791ac947906119a19085906000908690309042906004016124a3565b600060405180830381600087803b1580156119bb57600080fd5b505af11580156114d8573d6000803e3d6000fd5b601a546119e79030906001600160a01b031684611181565b601a546001600160a01b031663f305d719823085600080611a106000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015611a7357600080fd5b505af1158015611a87573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611aac91906123eb565b5050505050565b80611ac75760006011819055601555611758565b601b546001600160a01b0385811691161415611aee57601254601155601654601555611758565b601b546001600160a01b0384811691161415611b51576064600c54611b13919061252c565b8210611b4057601354611b2790600261254e565b601155601754611b3890600261254e565b601555611758565b601354601155601754601555611758565b6000601181905560155550505050565b6000806000806000806000611b7588611580565b9650965096509650965096509650611bbb87600160008d6001600160a01b03166001600160a01b03168152602001908152602001600020546115db90919063ffffffff16565b6001600160a01b03808c1660009081526001602052604080822093909355908b1681522054611bea908761151a565b6001600160a01b03808b16600090815260016020908152604080832094909455918d1681526005909152205460ff168015611c3e57506001600160a01b03891660009081526005602052604090205460ff16155b15611c84576001600160a01b038a16600090815260026020526040902054611c6690896115db565b6001600160a01b038b16600090815260026020526040902055611dbc565b6001600160a01b038a1660009081526005602052604090205460ff16158015611cc557506001600160a01b03891660009081526005602052604090205460ff165b15611d0b576001600160a01b038916600090815260026020526040902054611ced908561151a565b6001600160a01b038a16600090815260026020526040902055611dbc565b6001600160a01b038a1660009081526005602052604090205460ff168015611d4b57506001600160a01b03891660009081526005602052604090205460ff165b15611dbc576001600160a01b038a16600090815260026020526040902054611d7390896115db565b6001600160a01b03808c1660009081526002602052604080822093909355908b1681522054611da2908561151a565b6001600160a01b038a166000908152600260205260409020555b8115611dcc57611dcc8a836120c2565b6000851180611ddb5750600083115b15611dea57611dea858461218d565b8015611dfa57611dfa8a826121b1565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611e3f91815260200190565b60405180910390a350505050505050505050565b600061073b601954611e706011548561201590919063ffffffff16565b9061182c565b600061073b601954611e706015548561201590919063ffffffff16565b600d54600c546000918291825b600654811015611fe557826001600060068481548110611ec257611ec26125f0565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611f2d5750816002600060068481548110611f0657611f066125f0565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611f4357600d54600c54945094505050509091565b611f896001600060068481548110611f5d57611f5d6125f0565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906115db565b9250611fd16002600060068481548110611fa557611fa56125f0565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906115db565b915080611fdd816125bf565b915050611ea0565b50600c54600d54611ff59161182c565b82101561200c57600d54600c549350935050509091565b90939092509050565b6000826120245750600061073b565b6000612030838561254e565b90508261203d858361252c565b146115795760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161076b565b600081836120b55760405162461bcd60e51b815260040161076b9190612419565b506000611511848661252c565b60006120cc6117a7565b905060006120da8383612015565b306000908152600160205260409020549091506120f7908261151a565b3060009081526001602090815260408083209390935560059052205460ff16156121465730600090815260026020526040902054612135908461151a565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b600d5461219a90836115db565b600d55600e546121aa908261151a565b600e555050565b60006121bb6117a7565b905060006121c98383612015565b601d546001600160a01b03166000908152600160205260409020549091506121f1908261151a565b601d80546001600160a01b03908116600090815260016020908152604080832095909555925490911681526005909152205460ff161561226c57601d546001600160a01b0316600090815260026020526040902054612250908461151a565b601d546001600160a01b03166000908152600260205260409020555b601d546040518481526001600160a01b03918216918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161217f565b6000602082840312156122c057600080fd5b813561157981612606565b6000602082840312156122dd57600080fd5b815161157981612606565b600080604083850312156122fb57600080fd5b823561230681612606565b9150602083013561231681612606565b809150509250929050565b60008060006060848603121561233657600080fd5b833561234181612606565b9250602084013561235181612606565b929592945050506040919091013590565b6000806040838503121561237557600080fd5b823561238081612606565b946020939093013593505050565b6000602082840312156123a057600080fd5b8135801515811461157957600080fd5b6000602082840312156123c257600080fd5b5035919050565b600080604083850312156123dc57600080fd5b50508035926020909101359150565b60008060006060848603121561240057600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156124465785810183015185820160400152820161242a565b81811115612458576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156124f35784516001600160a01b0316835293830193918301916001016124ce565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612527576125276125da565b500190565b60008261254957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612568576125686125da565b500290565b60008282101561257f5761257f6125da565b500390565b600181811c9082168061259857607f821691505b602082108114156125b957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125d3576125d36125da565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461261b57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b06672034f661b668b837e7a534e7d0b9a95e81d6ff1b28ab6d2ec82784ffc9564736f6c63430008070033f652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f

Deployed Bytecode

0x6080604052600436106102085760003560e01c8063715018a611610118578063a9059cbb116100a0578063dc44b6a01161006f578063dc44b6a0146105dc578063dd62ed3e146105f2578063ea2f0b3714610638578063eafb5a3c14610658578063f2fde38b1461067857600080fd5b8063a9059cbb14610566578063aa35822c14610586578063c49b9a80146105a6578063d628df9c146105c657600080fd5b80638da5cb5b116100e75780638da5cb5b146104d357806395d89b41146104f1578063a11a168214610506578063a457c2d714610526578063a8602fea1461054657600080fd5b8063715018a61461046f57806388790a681461048457806388f820201461049a578063893d20e8146104d357600080fd5b806324fcf8cf1161019b578063437823ec1161016a578063437823ec146103b5578063452ed4f1146103d55780634a74bb02146103f55780635342acb41461041657806370a082311461044f57600080fd5b806324fcf8cf1461033d578063313ce5671461035357806339509351146103755780633bd5d1731461039557600080fd5b806313114a9d116101d757806313114a9d146102c757806313b4a7f4146102e657806318160ddd1461030857806323b872dd1461031d57600080fd5b806306fdde03146102145780630758d9241461023f578063095ea7b31461027757806311ffeaf2146102a757600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b50610229610698565b6040516102369190612419565b60405180910390f35b34801561024b57600080fd5b50601a5461025f906001600160a01b031681565b6040516001600160a01b039091168152602001610236565b34801561028357600080fd5b50610297610292366004612362565b61072a565b6040519015158152602001610236565b3480156102b357600080fd5b50601d5461025f906001600160a01b031681565b3480156102d357600080fd5b50600e545b604051908152602001610236565b3480156102f257600080fd5b506103066103013660046122e8565b610741565b005b34801561031457600080fd5b50600c546102d8565b34801561032957600080fd5b50610297610338366004612321565b6107e7565b34801561034957600080fd5b506102d860175481565b34801561035f57600080fd5b50600a5460405160ff9091168152602001610236565b34801561038157600080fd5b50610297610390366004612362565b610850565b3480156103a157600080fd5b506103066103b03660046123b0565b610886565b3480156103c157600080fd5b506103066103d03660046122ae565b610972565b3480156103e157600080fd5b50601b5461025f906001600160a01b031681565b34801561040157600080fd5b50601d5461029790600160a81b900460ff1681565b34801561042257600080fd5b506102976104313660046122ae565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561045b57600080fd5b506102d861046a3660046122ae565b6109c0565b34801561047b57600080fd5b50610306610a1f565b34801561049057600080fd5b506102d860135481565b3480156104a657600080fd5b506102976104b53660046122ae565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156104df57600080fd5b506000546001600160a01b031661025f565b3480156104fd57600080fd5b50610229610a93565b34801561051257600080fd5b506103066105213660046123c9565b610aa2565b34801561053257600080fd5b50610297610541366004612362565b610af5565b34801561055257600080fd5b506103066105613660046122ae565b610b44565b34801561057257600080fd5b50610297610581366004612362565b610be4565b34801561059257600080fd5b506103066105a13660046123c9565b610bf1565b3480156105b257600080fd5b506103066105c136600461238e565b610c44565b3480156105d257600080fd5b506102d860165481565b3480156105e857600080fd5b506102d860125481565b3480156105fe57600080fd5b506102d861060d3660046122e8565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561064457600080fd5b506103066106533660046122ae565b610cc6565b34801561066457600080fd5b506103066106733660046122ae565b610d11565b34801561068457600080fd5b506103066106933660046122ae565b611097565b6060600f80546106a790612584565b80601f01602080910402602001604051908101604052809291908181526020018280546106d390612584565b80156107205780601f106106f557610100808354040283529160200191610720565b820191906000526020600020905b81548152906001019060200180831161070357829003601f168201915b5050505050905090565b6000610737338484611181565b5060015b92915050565b6000546001600160a01b031633146107745760405162461bcd60e51b815260040161076b9061246e565b60405180910390fd5b6001600160a01b0382811660008181526008602090815260408083208054600160ff19918216811790925595871680855282852080548816831790559484526007909252808320805486168317905592825291902080549092161790556107da82610972565b6107e381610972565b5050565b60006107f48484846112a5565b61084684336108418560405180606001604052806028815260200161261f602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906114e0565b611181565b5060019392505050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610737918590610841908661151a565b3360008181526005602052604090205460ff16156108fb5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b606482015260840161076b565b600061090683611580565b5050506001600160a01b038616600090815260016020526040902054939450610934939250849150506115db565b6001600160a01b038316600090815260016020526040902055600d5461095a90826115db565b600d55600e5461096a908461151a565b600e55505050565b6000546001600160a01b0316331461099c5760405162461bcd60e51b815260040161076b9061246e565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6001600160a01b03811660009081526005602052604081205460ff16156109fd57506001600160a01b031660009081526002602052604090205490565b6001600160a01b03821660009081526001602052604090205461073b9061161d565b6000546001600160a01b03163314610a495760405162461bcd60e51b815260040161076b9061246e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6060601080546106a790612584565b6000546001600160a01b03163314610acc5760405162461bcd60e51b815260040161076b9061246e565b601454821115610adb57600080fd5b601854811115610aea57600080fd5b601391909155601755565b6000610737338461084185604051806060016040528060258152602001612647602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906114e0565b6000546001600160a01b03163314610b6e5760405162461bcd60e51b815260040161076b9061246e565b601d546001600160a01b0382811691161415610bc25760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b604482015260640161076b565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b60006107373384846112a5565b6000546001600160a01b03163314610c1b5760405162461bcd60e51b815260040161076b9061246e565b601454821115610c2a57600080fd5b601854811115610c3957600080fd5b601291909155601655565b6000546001600160a01b03163314610c6e5760405162461bcd60e51b815260040161076b9061246e565b601d8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610cbb90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610cf05760405162461bcd60e51b815260040161076b9061246e565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b03163314610d3b5760405162461bcd60e51b815260040161076b9061246e565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7b57600080fd5b505afa158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db391906122cb565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3391906122cb565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015610e7957600080fd5b505afa158015610e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb191906122cb565b90506001600160a01b03811661105757816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610efa57600080fd5b505afa158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3291906122cb565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7a57600080fd5b505afa158015610f8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb291906122cb565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103291906122cb565b601b80546001600160a01b0319166001600160a01b0392909216919091179055611073565b601b80546001600160a01b0319166001600160a01b0383161790555b50601a80546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146110c15760405162461bcd60e51b815260040161076b9061246e565b6001600160a01b0381166111265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166111e35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076b565b6001600160a01b0382166112445760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166113095760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161076b565b6001600160a01b03821661136b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161076b565b600081116113cd5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161076b565b60006113d8306109c0565b601e54601d5491925082101590600160a01b900460ff161580156114095750601b546001600160a01b038581169116145b801561141e5750601d54600160a81b900460ff165b801561144357506001600160a01b03841660009081526007602052604090205460ff16155b801561146857506001600160a01b03851660009081526007602052604090205460ff16155b1561148157801561148157601e5491506114818261169a565b6001600160a01b03851660009081526004602052604090205460019060ff16806114c357506001600160a01b03851660009081526004602052604090205460ff165b156114cc575060005b6114d886868684611741565b505050505050565b600081848411156115045760405162461bcd60e51b815260040161076b9190612419565b506000611511848661256d565b95945050505050565b6000806115278385612514565b9050838110156115795760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161076b565b9392505050565b600080600080600080600080600080600061159a8c61175e565b935093509350935060008060006115bb8f8787876115b66117a7565b6117ca565b919f509d509b509599509397509195509350505050919395979092949650565b600061157983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114e0565b6000600d548211156116845760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161076b565b600061168e6117a7565b9050611579838261182c565b601d805460ff60a01b1916600160a01b17905560006116ba82600261182c565b905060006116c883836115db565b9050476116d48361186e565b60006116e047836115db565b90506116ec83826119cf565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601d805460ff60a01b19169055505050565b61174d84848484611ab3565b611758848484611b61565b50505050565b60008060008060008061177087611e53565b9050600061177d88611e76565b905060006117978261179185818d896115db565b906115db565b9993985091965094509092505050565b60008060006117b4611e93565b90925090506117c3828261182c565b9250505090565b60008080806117d98986612015565b905060006117e78987612015565b905060006117f58988612015565b905060006118038989612015565b9050600061181782611791858189896115db565b949d949c50929a509298505050505050505050565b600061157983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612094565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106118a3576118a36125f0565b6001600160a01b03928316602091820292909201810191909152601a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156118f757600080fd5b505afa15801561190b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192f91906122cb565b81600181518110611942576119426125f0565b6001600160a01b039283166020918202929092010152601a546119689130911684611181565b601a5460405163791ac94760e01b81526001600160a01b039091169063791ac947906119a19085906000908690309042906004016124a3565b600060405180830381600087803b1580156119bb57600080fd5b505af11580156114d8573d6000803e3d6000fd5b601a546119e79030906001600160a01b031684611181565b601a546001600160a01b031663f305d719823085600080611a106000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015611a7357600080fd5b505af1158015611a87573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611aac91906123eb565b5050505050565b80611ac75760006011819055601555611758565b601b546001600160a01b0385811691161415611aee57601254601155601654601555611758565b601b546001600160a01b0384811691161415611b51576064600c54611b13919061252c565b8210611b4057601354611b2790600261254e565b601155601754611b3890600261254e565b601555611758565b601354601155601754601555611758565b6000601181905560155550505050565b6000806000806000806000611b7588611580565b9650965096509650965096509650611bbb87600160008d6001600160a01b03166001600160a01b03168152602001908152602001600020546115db90919063ffffffff16565b6001600160a01b03808c1660009081526001602052604080822093909355908b1681522054611bea908761151a565b6001600160a01b03808b16600090815260016020908152604080832094909455918d1681526005909152205460ff168015611c3e57506001600160a01b03891660009081526005602052604090205460ff16155b15611c84576001600160a01b038a16600090815260026020526040902054611c6690896115db565b6001600160a01b038b16600090815260026020526040902055611dbc565b6001600160a01b038a1660009081526005602052604090205460ff16158015611cc557506001600160a01b03891660009081526005602052604090205460ff165b15611d0b576001600160a01b038916600090815260026020526040902054611ced908561151a565b6001600160a01b038a16600090815260026020526040902055611dbc565b6001600160a01b038a1660009081526005602052604090205460ff168015611d4b57506001600160a01b03891660009081526005602052604090205460ff165b15611dbc576001600160a01b038a16600090815260026020526040902054611d7390896115db565b6001600160a01b03808c1660009081526002602052604080822093909355908b1681522054611da2908561151a565b6001600160a01b038a166000908152600260205260409020555b8115611dcc57611dcc8a836120c2565b6000851180611ddb5750600083115b15611dea57611dea858461218d565b8015611dfa57611dfa8a826121b1565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611e3f91815260200190565b60405180910390a350505050505050505050565b600061073b601954611e706011548561201590919063ffffffff16565b9061182c565b600061073b601954611e706015548561201590919063ffffffff16565b600d54600c546000918291825b600654811015611fe557826001600060068481548110611ec257611ec26125f0565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611f2d5750816002600060068481548110611f0657611f066125f0565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611f4357600d54600c54945094505050509091565b611f896001600060068481548110611f5d57611f5d6125f0565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906115db565b9250611fd16002600060068481548110611fa557611fa56125f0565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906115db565b915080611fdd816125bf565b915050611ea0565b50600c54600d54611ff59161182c565b82101561200c57600d54600c549350935050509091565b90939092509050565b6000826120245750600061073b565b6000612030838561254e565b90508261203d858361252c565b146115795760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161076b565b600081836120b55760405162461bcd60e51b815260040161076b9190612419565b506000611511848661252c565b60006120cc6117a7565b905060006120da8383612015565b306000908152600160205260409020549091506120f7908261151a565b3060009081526001602090815260408083209390935560059052205460ff16156121465730600090815260026020526040902054612135908461151a565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b600d5461219a90836115db565b600d55600e546121aa908261151a565b600e555050565b60006121bb6117a7565b905060006121c98383612015565b601d546001600160a01b03166000908152600160205260409020549091506121f1908261151a565b601d80546001600160a01b03908116600090815260016020908152604080832095909555925490911681526005909152205460ff161561226c57601d546001600160a01b0316600090815260026020526040902054612250908461151a565b601d546001600160a01b03166000908152600260205260409020555b601d546040518481526001600160a01b03918216918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161217f565b6000602082840312156122c057600080fd5b813561157981612606565b6000602082840312156122dd57600080fd5b815161157981612606565b600080604083850312156122fb57600080fd5b823561230681612606565b9150602083013561231681612606565b809150509250929050565b60008060006060848603121561233657600080fd5b833561234181612606565b9250602084013561235181612606565b929592945050506040919091013590565b6000806040838503121561237557600080fd5b823561238081612606565b946020939093013593505050565b6000602082840312156123a057600080fd5b8135801515811461157957600080fd5b6000602082840312156123c257600080fd5b5035919050565b600080604083850312156123dc57600080fd5b50508035926020909101359150565b60008060006060848603121561240057600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156124465785810183015185820160400152820161242a565b81811115612458576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156124f35784516001600160a01b0316835293830193918301916001016124ce565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612527576125276125da565b500190565b60008261254957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612568576125686125da565b500290565b60008282101561257f5761257f6125da565b500390565b600181811c9082168061259857607f821691505b602082108114156125b957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125d3576125d36125da565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461261b57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b06672034f661b668b837e7a534e7d0b9a95e81d6ff1b28ab6d2ec82784ffc9564736f6c63430008070033

Deployed Bytecode Sourcemap

20717:18640:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24320:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22196:35;;;;;;;;;;-1:-1:-1;22196:35:0;;;;-1:-1:-1;;;;;22196:35:0;;;;;;-1:-1:-1;;;;;2887:32:1;;;2869:51;;2857:2;2842:18;22196:35:0;2723:203:1;25014:161:0;;;;;;;;;;-1:-1:-1;25014:161:0;;;;;:::i;:::-;;:::i;:::-;;;4017:14:1;;4010:22;3992:41;;3980:2;3965:18;25014:161:0;3852:187:1;22430:75:0;;;;;;;;;;-1:-1:-1;22430:75:0;;;;-1:-1:-1;;;;;22430:75:0;;;28113:87;;;;;;;;;;-1:-1:-1;28182:10:0;;28113:87;;;9753:25:1;;;9741:2;9726:18;28113:87:0;9607:177:1;28208:332:0;;;;;;;;;;-1:-1:-1;28208:332:0;;;;;:::i;:::-;;:::i;:::-;;24055:83;;;;;;;;;;-1:-1:-1;24128:7:0;;24055:83;;25183:313;;;;;;;;;;-1:-1:-1;25183:313:0;;;;;:::i;:::-;;:::i;22012:35::-;;;;;;;;;;;;;;;;24144:80;;;;;;;;;;-1:-1:-1;24212:9:0;;24144:80;;24212:9;;;;11240:36:1;;11228:2;11213:18;24144:80:0;11098:184:1;25504:218:0;;;;;;;;;;-1:-1:-1;25504:218:0;;;;;:::i;:::-;;:::i;28814:378::-;;;;;;;;;;-1:-1:-1;28814:378:0;;;;;:::i;:::-;;:::i;27870:111::-;;;;;;;;;;-1:-1:-1;27870:111:0;;;;;:::i;:::-;;:::i;22238:21::-;;;;;;;;;;-1:-1:-1;22238:21:0;;;;-1:-1:-1;;;;;22238:21:0;;;22546:40;;;;;;;;;;-1:-1:-1;22546:40:0;;;;-1:-1:-1;;;22546:40:0;;;;;;26644:123;;;;;;;;;;-1:-1:-1;26644:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;26732:27:0;26708:4;26732:27;;;:18;:27;;;;;;;;;26644:123;24633:198;;;;;;;;;;-1:-1:-1;24633:198:0;;;;;:::i;:::-;;:::i;20296:148::-;;;;;;;;;;;;;:::i;21826:36::-;;;;;;;;;;;;;;;;26516:120;;;;;;;;;;-1:-1:-1;26516:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;26608:20:0;26584:4;26608:20;;;:11;:20;;;;;;;;;26516:120;24406:80;;;;;;;;;;-1:-1:-1;24458:7:0;20147:6;-1:-1:-1;;;;;20147:6:0;24406:80;;24230:84;;;;;;;;;;;;;:::i;27141:353::-;;;;;;;;;;-1:-1:-1;27141:353:0;;;;;:::i;:::-;;:::i;25730:269::-;;;;;;;;;;-1:-1:-1;25730:269:0;;;;;:::i;:::-;;:::i;27502:181::-;;;;;;;;;;-1:-1:-1;27502:181:0;;;;;:::i;:::-;;:::i;24839:167::-;;;;;;;;;;-1:-1:-1;24839:167:0;;;;;:::i;:::-;;:::i;26779:350::-;;;;;;;;;;-1:-1:-1;26779:350:0;;;;;:::i;:::-;;:::i;27691:171::-;;;;;;;;;;-1:-1:-1;27691:171:0;;;;;:::i;:::-;;:::i;21971:34::-;;;;;;;;;;;;;;;;21784:35;;;;;;;;;;;;;;;;24492:133;;;;;;;;;;-1:-1:-1;24492:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;24594:19:0;;;24576:7;24594:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;24492:133;27993:112;;;;;;;;;;-1:-1:-1;27993:112:0;;;;;:::i;:::-;;:::i;26007:501::-;;;;;;;;;;-1:-1:-1;26007:501:0;;;;;:::i;:::-;;:::i;20452:254::-;;;;;;;;;;-1:-1:-1;20452:254:0;;;;;:::i;:::-;;:::i;24320:80::-;24368:13;24392:5;24385:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24320:80;:::o;25014:161::-;25089:4;25106:39;260:10;25129:7;25138:6;25106:8;:39::i;:::-;-1:-1:-1;25163:4:0;25014:161;;;;;:::o;28208:332::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;28304:25:0;;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:32;;28332:4:::1;-1:-1:-1::0;;28304:32:0;;::::1;::::0;::::1;::::0;;;28347:26;;::::1;::::0;;;;;;:33;;;::::1;::::0;::::1;::::0;;28391:24;;;:16:::1;:24:::0;;;;;;:31;;;::::1;::::0;::::1;::::0;;28433:25;;;;;;:32;;;;::::1;;::::0;;28476:22:::1;28304:25:::0;28476:14:::1;:22::i;:::-;28509:23;28524:7;28509:14;:23::i;:::-;28208:332:::0;;:::o;25183:313::-;25281:4;25298:36;25308:6;25316:9;25327:6;25298:9;:36::i;:::-;25345:121;25354:6;260:10;25376:89;25414:6;25376:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25376:19:0;;;;;;:11;:19;;;;;;;;260:10;25376:33;;;;;;;;;;:37;:89::i;:::-;25345:8;:121::i;:::-;-1:-1:-1;25484:4:0;25183:313;;;;;:::o;25504:218::-;260:10;25592:4;25641:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;25641:34:0;;;;;;;;;;25592:4;;25609:83;;25632:7;;25641:50;;25680:10;25641:38;:50::i;28814:378::-;260:10;28866:14;28915:19;;;:11;:19;;;;;;;;28914:20;28906:77;;;;-1:-1:-1;;;28906:77:0;;9396:2:1;28906:77:0;;;9378:21:1;9435:2;9415:18;;;9408:30;9474:34;9454:18;;;9447:62;-1:-1:-1;;;9525:18:1;;;9518:42;9577:19;;28906:77:0;9194:408:1;28906:77:0;28995:15;29020:19;29031:7;29020:10;:19::i;:::-;-1:-1:-1;;;;;;;;29068:15:0;;;;;;:7;:15;;;;;;28994:45;;-1:-1:-1;29068:28:0;;:15;-1:-1:-1;28994:45:0;;-1:-1:-1;;29068:19:0;:28::i;:::-;-1:-1:-1;;;;;29050:15:0;;;;;;:7;:15;;;;;:46;29117:7;;:20;;29129:7;29117:11;:20::i;:::-;29107:7;:30;29161:10;;:23;;29176:7;29161:14;:23::i;:::-;29148:10;:36;-1:-1:-1;;;28814:378:0:o;27870:111::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27939:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;27939:34:0::1;27969:4;27939:34;::::0;;27870:111::o;24633:198::-;-1:-1:-1;;;;;24723:20:0;;24699:7;24723:20;;;:11;:20;;;;;;;;24719:49;;;-1:-1:-1;;;;;;24752:16:0;;;;;:7;:16;;;;;;;24633:198::o;24719:49::-;-1:-1:-1;;;;;24806:16:0;;;;;;:7;:16;;;;;;24786:37;;:19;:37::i;20296:148::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;20403:1:::1;20387:6:::0;;20366:40:::1;::::0;-1:-1:-1;;;;;20387:6:0;;::::1;::::0;20366:40:::1;::::0;20403:1;;20366:40:::1;20434:1;20417:19:::0;;-1:-1:-1;;;;;;20417:19:0::1;::::0;;20296:148::o;24230:84::-;24280:13;24304:7;24297:14;;;;;:::i;27141:353::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;27263:15:::1;;27247:12;:31;;27239:40;;;::::0;::::1;;27350:14;;27335:11;:29;;27327:38;;;::::0;::::1;;27413:17;:32:::0;;;;27456:16:::1;:30:::0;27141:353::o;25730:269::-;25823:4;25840:129;260:10;25863:7;25872:96;25911:15;25872:96;;;;;;;;;;;;;;;;;260:10;25872:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;25872:34:0;;;;;;;;;;;;:38;:96::i;27502:181::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;27587:14:::1;::::0;-1:-1:-1;;;;;27587:27:0;;::::1;:14:::0;::::1;:27;;27579:59;;;::::0;-1:-1:-1;;;27579:59:0;;7064:2:1;27579:59:0::1;::::0;::::1;7046:21:1::0;7103:2;7083:18;;;7076:30;-1:-1:-1;;;7122:18:1;;;7115:49;7181:18;;27579:59:0::1;6862:343:1::0;27579:59:0::1;27649:14;:26:::0;;-1:-1:-1;;;;;;27649:26:0::1;-1:-1:-1::0;;;;;27649:26:0;;;::::1;::::0;;;::::1;::::0;;27502:181::o;24839:167::-;24917:4;24934:42;260:10;24958:9;24969:6;24934:9;:42::i;26779:350::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;26900:15:::1;;26884:12;:31;;26876:40;;;::::0;::::1;;26987:14;;26972:11;:29;;26964:38;;;::::0;::::1;;27050:16;:31:::0;;;;27092:15:::1;:29:::0;26779:350::o;27691:171::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;27768:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;27768:32:0::1;-1:-1:-1::0;;;;27768:32:0;;::::1;;::::0;;27816:38:::1;::::0;::::1;::::0;::::1;::::0;27792:8;4017:14:1;4010:22;3992:41;;3980:2;3965:18;;3852:187;27816:38:0::1;;;;;;;;27691:171:::0;:::o;27993:112::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28062:27:0::1;28092:5;28062:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;28062:35:0::1;::::0;;27993:112::o;26007:501::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;26078:29:::1;26129:9;26078:61;;26150:16;26187:10;-1:-1:-1::0;;;;;26187:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26169:47:0::1;;26225:4;26232:10;-1:-1:-1::0;;;;;26232:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26169:81;::::0;-1:-1:-1;;;;;;26169:81:0::1;::::0;;;;;;-1:-1:-1;;;;;3161:15:1;;;26169:81:0::1;::::0;::::1;3143:34:1::0;3213:15;;3193:18;;;3186:43;3078:18;;26169:81:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26150:100:::0;-1:-1:-1;;;;;;26265:22:0;::::1;26261:207;;26331:10;-1:-1:-1::0;;;;;26331:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26313:50:0::1;;26372:4;26379:10;-1:-1:-1::0;;;;;26379:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26313:84;::::0;-1:-1:-1;;;;;;26313:84:0::1;::::0;;;;;;-1:-1:-1;;;;;3161:15:1;;;26313:84:0::1;::::0;::::1;3143:34:1::0;3213:15;;3193:18;;;3186:43;3078:18;;26313:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26304:6;:93:::0;;-1:-1:-1;;;;;;26304:93:0::1;-1:-1:-1::0;;;;;26304:93:0;;;::::1;::::0;;;::::1;::::0;;26261:207:::1;;;26439:6;:17:::0;;-1:-1:-1;;;;;;26439:17:0::1;-1:-1:-1::0;;;;;26439:17:0;::::1;;::::0;;26261:207:::1;-1:-1:-1::0;26478:9:0::1;:22:::0;;-1:-1:-1;;;;;;26478:22:0::1;-1:-1:-1::0;;;;;26478:22:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;26007:501:0:o;20452:254::-;20209:6;;-1:-1:-1;;;;;20209:6:0;260:10;20209:22;20201:67;;;;-1:-1:-1;;;20201:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20541:22:0;::::1;20533:73;;;::::0;-1:-1:-1;;;20533:73:0;;5898:2:1;20533:73:0::1;::::0;::::1;5880:21:1::0;5937:2;5917:18;;;5910:30;5976:34;5956:18;;;5949:62;-1:-1:-1;;;6027:18:1;;;6020:36;6073:19;;20533:73:0::1;5696:402:1::0;20533:73:0::1;20653:6;::::0;;20632:38:::1;::::0;-1:-1:-1;;;;;20632:38:0;;::::1;::::0;20653:6;::::1;::::0;20632:38:::1;::::0;::::1;20681:6;:17:::0;;-1:-1:-1;;;;;;20681:17:0::1;-1:-1:-1::0;;;;;20681:17:0;;;::::1;::::0;;;::::1;::::0;;20452:254::o;30003:337::-;-1:-1:-1;;;;;30096:19:0;;30088:68;;;;-1:-1:-1;;;30088:68:0;;8991:2:1;30088:68:0;;;8973:21:1;9030:2;9010:18;;;9003:30;9069:34;9049:18;;;9042:62;-1:-1:-1;;;9120:18:1;;;9113:34;9164:19;;30088:68:0;8789:400:1;30088:68:0;-1:-1:-1;;;;;30175:21:0;;30167:68;;;;-1:-1:-1;;;30167:68:0;;6305:2:1;30167:68:0;;;6287:21:1;6344:2;6324:18;;;6317:30;6383:34;6363:18;;;6356:62;-1:-1:-1;;;6434:18:1;;;6427:32;6476:19;;30167:68:0;6103:398:1;30167:68:0;-1:-1:-1;;;;;30248:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30300:32;;9753:25:1;;;30300:32:0;;9726:18:1;30300:32:0;;;;;;;30003:337;;;:::o;30348:1091::-;-1:-1:-1;;;;;30446:18:0;;30438:68;;;;-1:-1:-1;;;30438:68:0;;8585:2:1;30438:68:0;;;8567:21:1;8624:2;8604:18;;;8597:30;8663:34;8643:18;;;8636:62;-1:-1:-1;;;8714:18:1;;;8707:35;8759:19;;30438:68:0;8383:401:1;30438:68:0;-1:-1:-1;;;;;30525:16:0;;30517:64;;;;-1:-1:-1;;;30517:64:0;;5083:2:1;30517:64:0;;;5065:21:1;5122:2;5102:18;;;5095:30;5161:34;5141:18;;;5134:62;-1:-1:-1;;;5212:18:1;;;5205:33;5255:19;;30517:64:0;4881:399:1;30517:64:0;30609:1;30600:6;:10;30592:64;;;;-1:-1:-1;;;30592:64:0;;8175:2:1;30592:64:0;;;8157:21:1;8214:2;8194:18;;;8187:30;8253:34;8233:18;;;8226:62;-1:-1:-1;;;8304:18:1;;;8297:39;8353:19;;30592:64:0;7973:405:1;30592:64:0;30669:28;30700:24;30718:4;30700:9;:24::i;:::-;30804:29;;30851:16;;30669:55;;-1:-1:-1;30780:53:0;;;;-1:-1:-1;;;30851:16:0;;;;30850:17;:46;;;;-1:-1:-1;30890:6:0;;-1:-1:-1;;;;;30884:12:0;;;30890:6;;30884:12;30850:46;:84;;;;-1:-1:-1;30913:21:0;;-1:-1:-1;;;30913:21:0;;;;30850:84;:122;;;;-1:-1:-1;;;;;;30952:20:0;;;;;;:16;:20;;;;;;;;30951:21;30850:122;:162;;;;-1:-1:-1;;;;;;30990:22:0;;;;;;:16;:22;;;;;;;;30989:23;30850:162;30846:371;;;31043:19;31039:167;;;31106:29;;31083:52;;31154:36;31169:20;31154:14;:36::i;:::-;-1:-1:-1;;;;;31280:24:0;;31237:12;31280:24;;;:18;:24;;;;;;31252:4;;31280:24;;;:50;;-1:-1:-1;;;;;;31308:22:0;;;;;;:18;:22;;;;;;;;31280:50;31277:96;;;-1:-1:-1;31356:5:0;31277:96;31393:38;31408:4;31413:2;31416:6;31423:7;31393:14;:38::i;:::-;30417:1022;;;30348:1091;;;:::o;5278:192::-;5364:7;5400:12;5392:6;;;;5384:29;;;;-1:-1:-1;;;5384:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5424:9:0;5436:5;5440:1;5436;:5;:::i;:::-;5424:17;5278:192;-1:-1:-1;;;;;5278:192:0:o;4320:181::-;4378:7;;4410:5;4414:1;4410;:5;:::i;:::-;4398:17;;4439:1;4434;:6;;4426:46;;;;-1:-1:-1;;;4426:46:0;;6708:2:1;4426:46:0;;;6690:21:1;6747:2;6727:18;;;6720:30;6786:29;6766:18;;;6759:57;6833:18;;4426:46:0;6506:351:1;4426:46:0;4492:1;4320:181;-1:-1:-1;;;4320:181:0:o;35023:469::-;35082:7;35091;35100;35109;35118;35127;35136;35157:23;35182:12;35196:18;35216:17;35237:20;35249:7;35237:11;:20::i;:::-;35156:101;;;;;;;;35269:15;35286:23;35311:12;35327:61;35339:7;35348:4;35354:10;35366:9;35377:10;:8;:10::i;:::-;35327:11;:61::i;:::-;35268:120;;-1:-1:-1;35268:120:0;-1:-1:-1;35268:120:0;-1:-1:-1;35439:15:0;;-1:-1:-1;35456:4:0;;-1:-1:-1;35462:10:0;;-1:-1:-1;35474:9:0;-1:-1:-1;;;;35023:469:0;;;;;;;;;:::o;4839:136::-;4897:7;4924:43;4928:1;4931;4924:43;;;;;;;;;;;;;;;;;:3;:43::i;29647:254::-;29714:7;29753;;29742;:18;;29734:73;;;;-1:-1:-1;;;29734:73:0;;5487:2:1;29734:73:0;;;5469:21:1;5526:2;5506:18;;;5499:30;5565:34;5545:18;;;5538:62;-1:-1:-1;;;5616:18:1;;;5609:40;5666:19;;29734:73:0;5285:406:1;29734:73:0;29818:19;29841:10;:8;:10::i;:::-;29818:33;-1:-1:-1;29869:24:0;:7;29818:33;29869:11;:24::i;31447:985::-;22975:16;:23;;-1:-1:-1;;;;22975:23:0;-1:-1:-1;;;22975:23:0;;;;31598:27:::1;:20:::0;31623:1:::1;31598:24;:27::i;:::-;31583:42:::0;-1:-1:-1;31636:17:0::1;31656:30;:20:::0;31583:42;31656:24:::1;:30::i;:::-;31636:50:::0;-1:-1:-1;31989:21:0::1;32055:22;32072:4:::0;32055:16:::1;:22::i;:::-;32208:18;32229:41;:21;32255:14:::0;32229:25:::1;:41::i;:::-;32208:62;;32320:35;32333:9;32344:10;32320:12;:35::i;:::-;32381:43;::::0;;10976:25:1;;;11032:2;11017:18;;11010:34;;;11060:18;;;11053:34;;;32381:43:0::1;::::0;10964:2:1;10949:18;32381:43:0::1;;;;;;;-1:-1:-1::0;;23021:16:0;:24;;-1:-1:-1;;;;23021:24:0;;;-1:-1:-1;;;31447:985:0:o;33603:232::-;33721:47;33733:6;33741:9;33752:6;33760:7;33721:11;:47::i;:::-;33781:44;33799:6;33807:9;33818:6;33781:17;:44::i;:::-;33603:232;;;;:::o;35500:402::-;35560:7;35569;35578;35587;35607:12;35634:18;35655:30;35677:7;35655:21;:30::i;:::-;35634:51;;35696:17;35716:29;35737:7;35716:20;:29::i;:::-;35696:49;-1:-1:-1;35756:23:0;35782:48;35696:49;35782:33;35804:10;35782:33;:7;35794:4;35782:11;:17::i;:::-;:21;;:33::i;:48::-;35756:74;35866:4;;-1:-1:-1;35872:10:0;;-1:-1:-1;35872:10:0;-1:-1:-1;35500:402:0;;-1:-1:-1;;;35500:402:0:o;36438:163::-;36479:7;36500:15;36517;36536:19;:17;:19::i;:::-;36499:56;;-1:-1:-1;36499:56:0;-1:-1:-1;36573:20:0;36499:56;;36573:11;:20::i;:::-;36566:27;;;;36438:163;:::o;35910:520::-;36044:7;;;;36100:24;:7;36112:11;36100;:24::i;:::-;36082:42;-1:-1:-1;36135:12:0;36150:21;:4;36159:11;36150:8;:21::i;:::-;36135:36;-1:-1:-1;36182:18:0;36203:27;:10;36218:11;36203:14;:27::i;:::-;36182:48;-1:-1:-1;36241:17:0;36261:26;:9;36275:11;36261:13;:26::i;:::-;36241:46;-1:-1:-1;36298:23:0;36324:48;36241:46;36324:33;36346:10;36324:33;:7;36336:4;36324:11;:17::i;:48::-;36391:7;;;;-1:-1:-1;36417:4:0;;-1:-1:-1;35910:520:0;;-1:-1:-1;;;;;;;;;35910:520:0:o;6695:132::-;6753:7;6780:39;6784:1;6787;6780:39;;;;;;;;;;;;;;;;;:3;:39::i;32440:573::-;32592:16;;;32606:1;32592:16;;;;;;;;32568:21;;32592:16;;;;;;;;;;-1:-1:-1;32592:16:0;32568:40;;32637:4;32619;32624:1;32619:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32619:23:0;;;:7;;;;;;;;;;:23;;;;32663:9;;:16;;;-1:-1:-1;;;32663:16:0;;;;:9;;;;;:14;;:16;;;;;32619:7;;32663:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32653:4;32658:1;32653:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32653:26:0;;;:7;;;;;;;;;:26;32724:9;;32692:56;;32709:4;;32724:9;32736:11;32692:8;:56::i;:::-;32787:9;;:218;;-1:-1:-1;;;32787:218:0;;-1:-1:-1;;;;;32787:9:0;;;;:60;;:218;;32862:11;;32787:9;;32932:4;;32959;;32979:15;;32787:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33021:501;33201:9;;33169:56;;33186:4;;-1:-1:-1;;;;;33201:9:0;33213:11;33169:8;:56::i;:::-;33268:9;;-1:-1:-1;;;;;33268:9:0;:25;33301:9;33334:4;33354:11;33268:9;;33466:7;20120;20147:6;-1:-1:-1;;;;;20147:6:0;;20082:79;33466:7;33268:246;;;;;;-1:-1:-1;;;;;;33268:246:0;;;-1:-1:-1;;;;;3599:15:1;;;33268:246:0;;;3581:34:1;3631:18;;;3624:34;;;;3674:18;;;3667:34;;;;3717:18;;;3710:34;3781:15;;;3760:19;;;3753:44;33488:15:0;3813:19:1;;;3806:35;3515:19;;33268:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;33021:501;;:::o;38619:735::-;38721:7;38716:631;;38761:1;38745:13;:17;;;38777:12;:16;38716:631;;;38823:6;;-1:-1:-1;;;;;38815:14:0;;;38823:6;;38815:14;38811:536;;;38862:16;;38846:13;:32;38908:15;;38893:12;:30;38811:536;;;38951:6;;-1:-1:-1;;;;;38945:12:0;;;38951:6;;38945:12;38941:406;;;38999:3;38989:7;;:13;;;;:::i;:::-;38978:6;:25;38974:281;;39040:17;;:21;;39060:1;39040:21;:::i;:::-;39024:13;:37;39095:16;;:20;;39114:1;39095:20;:::i;:::-;39080:12;:35;38941:406;;38974:281;39172:17;;39156:13;:33;39223:16;;39208:12;:31;38941:406;;;39303:1;39287:13;:17;;;39319:12;:16;38619:735;;;;:::o;33843:1172::-;33942:15;33959:23;33984:12;33998:23;34023:12;34037:18;34057:17;34078:19;34089:7;34078:10;:19::i;:::-;33941:156;;;;;;;;;;;;;;34128:28;34148:7;34128;:15;34136:6;-1:-1:-1;;;;;34128:15:0;-1:-1:-1;;;;;34128:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;34110:15:0;;;;;;;:7;:15;;;;;;:46;;;;34188:18;;;;;;;:39;;34211:15;34188:22;:39::i;:::-;-1:-1:-1;;;;;34167:18:0;;;;;;;:7;:18;;;;;;;;:60;;;;34244:19;;;;;:11;:19;;;;;;;:46;;;;-1:-1:-1;;;;;;34268:22:0;;;;;;:11;:22;;;;;;;;34267:23;34244:46;34240:477;;;-1:-1:-1;;;;;34325:15:0;;;;;;:7;:15;;;;;;:28;;34345:7;34325:19;:28::i;:::-;-1:-1:-1;;;;;34307:15:0;;;;;;:7;:15;;;;;:46;34240:477;;;-1:-1:-1;;;;;34376:19:0;;;;;;:11;:19;;;;;;;;34375:20;:46;;;;-1:-1:-1;;;;;;34399:22:0;;;;;;:11;:22;;;;;;;;34375:46;34371:346;;;-1:-1:-1;;;;;34459:18:0;;;;;;:7;:18;;;;;;:39;;34482:15;34459:22;:39::i;:::-;-1:-1:-1;;;;;34438:18:0;;;;;;:7;:18;;;;;:60;34371:346;;;-1:-1:-1;;;;;34522:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;34545:22:0;;;;;;:11;:22;;;;;;;;34522:45;34518:199;;;-1:-1:-1;;;;;34602:15:0;;;;;;:7;:15;;;;;;:28;;34622:7;34602:19;:28::i;:::-;-1:-1:-1;;;;;34584:15:0;;;;;;;:7;:15;;;;;;:46;;;;34666:18;;;;;;;:39;;34689:15;34666:22;:39::i;:::-;-1:-1:-1;;;;;34645:18:0;;;;;;:7;:18;;;;;:60;34518:199;34733:14;;34729:67;;34762:34;34777:6;34785:10;34762:14;:34::i;:::-;34818:1;34811:4;:8;:20;;;;34830:1;34823:4;:8;34811:20;34807:63;;;34846:24;34859:4;34865;34846:12;:24::i;:::-;34885:13;;34881:64;;34913:32;34927:6;34935:9;34913:13;:32::i;:::-;34980:9;-1:-1:-1;;;;;34963:44:0;34972:6;-1:-1:-1;;;;;34963:44:0;;34991:15;34963:44;;;;9753:25:1;;9741:2;9726:18;;9607:177;34963:44:0;;;;;;;;33930:1085;;;;;;;33843:1172;;;:::o;38295:153::-;38365:7;38392:48;38423:16;;38392:26;38404:13;;38392:7;:11;;:26;;;;:::i;:::-;:30;;:48::i;38456:151::-;38525:7;38552:47;38582:16;;38552:25;38564:12;;38552:7;:11;;:25;;;;:::i;36609:561::-;36706:7;;36742;;36659;;;;;36766:289;36790:9;:16;36786:20;;36766:289;;;36856:7;36832;:21;36840:9;36850:1;36840:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36840:12:0;36832:21;;;;;;;;;;;;;:31;;:66;;;36891:7;36867;:21;36875:9;36885:1;36875:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36875:12:0;36867:21;;;;;;;;;;;;;:31;36832:66;36828:97;;;36908:7;;36917;;36900:25;;;;;;;36609:561;;:::o;36828:97::-;36950:34;36962:7;:21;36970:9;36980:1;36970:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36970:12:0;36962:21;;;;;;;;;;;;;36950:7;;:11;:34::i;:::-;36940:44;;37009:34;37021:7;:21;37029:9;37039:1;37029:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;37029:12:0;37021:21;;;;;;;;;;;;;37009:7;;:11;:34::i;:::-;36999:44;-1:-1:-1;36808:3:0;;;;:::i;:::-;;;;36766:289;;;-1:-1:-1;37091:7:0;;37079;;:20;;:11;:20::i;:::-;37069:7;:30;37065:61;;;37109:7;;37118;;37101:25;;;;;;36609:561;;:::o;37065:61::-;37145:7;;37154;;-1:-1:-1;36609:561:0;-1:-1:-1;36609:561:0:o;5729:490::-;5787:7;6051:6;6047:47;;-1:-1:-1;6081:1:0;6074:8;;6047:47;6106:9;6118:5;6122:1;6118;:5;:::i;:::-;6106:17;-1:-1:-1;6151:1:0;6142:5;6146:1;6106:17;6142:5;:::i;:::-;:10;6134:56;;;;-1:-1:-1;;;6134:56:0;;7412:2:1;6134:56:0;;;7394:21:1;7451:2;7431:18;;;7424:30;7490:34;7470:18;;;7463:62;-1:-1:-1;;;7541:18:1;;;7534:31;7582:19;;6134:56:0;7210:397:1;7366:278:0;7452:7;7487:12;7480:5;7472:28;;;;-1:-1:-1;;;7472:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7511:9:0;7523:5;7527:1;7523;:5;:::i;37342:469::-;37421:19;37444:10;:8;:10::i;:::-;37421:33;-1:-1:-1;37465:18:0;37486:27;:10;37421:33;37486:14;:27::i;:::-;37565:4;37549:22;;;;:7;:22;;;;;;37465:48;;-1:-1:-1;37549:38:0;;37465:48;37549:26;:38::i;:::-;37540:4;37524:22;;;;:7;:22;;;;;;;;:63;;;;37601:11;:26;;;;;;37598:107;;;37683:4;37667:22;;;;:7;:22;;;;;;:38;;37694:10;37667:26;:38::i;:::-;37658:4;37642:22;;;;:7;:22;;;;;:63;37598:107;37721:43;;9753:25:1;;;37746:4:0;;-1:-1:-1;;;;;37721:43:0;;;;;9741:2:1;9726:18;37721:43:0;;;;;;;;37410:401;;37342:469;;:::o;37182:148::-;37261:7;;:17;;37273:4;37261:11;:17::i;:::-;37251:7;:27;37302:10;;:20;;37317:4;37302:14;:20::i;:::-;37289:10;:33;-1:-1:-1;;37182:148:0:o;37819:468::-;37896:19;37919:10;:8;:10::i;:::-;37896:33;-1:-1:-1;37940:17:0;37960:26;:9;37896:33;37960:13;:26::i;:::-;38031:14;;-1:-1:-1;;;;;38031:14:0;38023:23;;;;:7;:23;;;;;;37940:46;;-1:-1:-1;38023:38:0;;37940:46;38023:27;:38::i;:::-;38005:14;;;-1:-1:-1;;;;;38005:14:0;;;37997:23;;;;:7;:23;;;;;;;;:64;;;;38087:14;;;;;38075:27;;:11;:27;;;;;;;38072:109;;;38151:14;;-1:-1:-1;;;;;38151:14:0;38143:23;;;;:7;:23;;;;;;:38;;38171:9;38143:27;:38::i;:::-;38125:14;;-1:-1:-1;;;;;38125:14:0;38117:23;;;;:7;:23;;;;;:64;38072:109;38214:14;;38197:43;;9753:25:1;;;-1:-1:-1;;;;;38214:14:0;;;;38197:43;;;;;9741:2:1;9726:18;38197:43:0;9607:177:1;14:247;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:52;;;1521:1;1518;1511:12;1473:52;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1376:315:1:o;1696:273::-;1752:6;1805:2;1793:9;1784:7;1780:23;1776:32;1773:52;;;1821:1;1818;1811:12;1773:52;1860:9;1847:23;1913:5;1906:13;1899:21;1892:5;1889:32;1879:60;;1935:1;1932;1925:12;1974:180;2033:6;2086:2;2074:9;2065:7;2061:23;2057:32;2054:52;;;2102:1;2099;2092:12;2054:52;-1:-1:-1;2125:23:1;;1974:180;-1:-1:-1;1974:180:1:o;2159:248::-;2227:6;2235;2288:2;2276:9;2267:7;2263:23;2259:32;2256:52;;;2304:1;2301;2294:12;2256:52;-1:-1:-1;;2327:23:1;;;2397:2;2382:18;;;2369:32;;-1:-1:-1;2159:248:1:o;2412:306::-;2500:6;2508;2516;2569:2;2557:9;2548:7;2544:23;2540:32;2537:52;;;2585:1;2582;2575:12;2537:52;2614:9;2608:16;2598:26;;2664:2;2653:9;2649:18;2643:25;2633:35;;2708:2;2697:9;2693:18;2687:25;2677:35;;2412:306;;;;;:::o;4279:597::-;4391:4;4420:2;4449;4438:9;4431:21;4481:6;4475:13;4524:6;4519:2;4508:9;4504:18;4497:34;4549:1;4559:140;4573:6;4570:1;4567:13;4559:140;;;4668:14;;;4664:23;;4658:30;4634:17;;;4653:2;4630:26;4623:66;4588:10;;4559:140;;;4717:6;4714:1;4711:13;4708:91;;;4787:1;4782:2;4773:6;4762:9;4758:22;4754:31;4747:42;4708:91;-1:-1:-1;4860:2:1;4839:15;-1:-1:-1;;4835:29:1;4820:45;;;;4867:2;4816:54;;4279:597;-1:-1:-1;;;4279:597:1:o;7612:356::-;7814:2;7796:21;;;7833:18;;;7826:30;7892:34;7887:2;7872:18;;7865:62;7959:2;7944:18;;7612:356::o;9789:980::-;10051:4;10099:3;10088:9;10084:19;10130:6;10119:9;10112:25;10156:2;10194:6;10189:2;10178:9;10174:18;10167:34;10237:3;10232:2;10221:9;10217:18;10210:31;10261:6;10296;10290:13;10327:6;10319;10312:22;10365:3;10354:9;10350:19;10343:26;;10404:2;10396:6;10392:15;10378:29;;10425:1;10435:195;10449:6;10446:1;10443:13;10435:195;;;10514:13;;-1:-1:-1;;;;;10510:39:1;10498:52;;10605:15;;;;10570:12;;;;10546:1;10464:9;10435:195;;;-1:-1:-1;;;;;;;10686:32:1;;;;10681:2;10666:18;;10659:60;-1:-1:-1;;;10750:3:1;10735:19;10728:35;10647:3;9789:980;-1:-1:-1;;;9789:980:1:o;11287:128::-;11327:3;11358:1;11354:6;11351:1;11348:13;11345:39;;;11364:18;;:::i;:::-;-1:-1:-1;11400:9:1;;11287:128::o;11420:217::-;11460:1;11486;11476:132;;11530:10;11525:3;11521:20;11518:1;11511:31;11565:4;11562:1;11555:15;11593:4;11590:1;11583:15;11476:132;-1:-1:-1;11622:9:1;;11420:217::o;11642:168::-;11682:7;11748:1;11744;11740:6;11736:14;11733:1;11730:21;11725:1;11718:9;11711:17;11707:45;11704:71;;;11755:18;;:::i;:::-;-1:-1:-1;11795:9:1;;11642:168::o;11815:125::-;11855:4;11883:1;11880;11877:8;11874:34;;;11888:18;;:::i;:::-;-1:-1:-1;11925:9:1;;11815:125::o;11945:380::-;12024:1;12020:12;;;;12067;;;12088:61;;12142:4;12134:6;12130:17;12120:27;;12088:61;12195:2;12187:6;12184:14;12164:18;12161:38;12158:161;;;12241:10;12236:3;12232:20;12229:1;12222:31;12276:4;12273:1;12266:15;12304:4;12301:1;12294:15;12158:161;;11945:380;;;:::o;12330:135::-;12369:3;-1:-1:-1;;12390:17:1;;12387:43;;;12410:18;;:::i;:::-;-1:-1:-1;12457:1:1;12446:13;;12330:135::o;12470:127::-;12531:10;12526:3;12522:20;12519:1;12512:31;12562:4;12559:1;12552:15;12586:4;12583:1;12576:15;12602:127;12663:10;12658:3;12654:20;12651:1;12644:31;12694:4;12691:1;12684:15;12718:4;12715:1;12708:15;12866:131;-1:-1:-1;;;;;12941:31:1;;12931:42;;12921:70;;12987:1;12984;12977:12;12921:70;12866:131;:::o

Swarm Source

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