ETH Price: $2,443.27 (-1.27%)
 

Overview

Max Total Supply

21,000,000 RZRV

Holders

439 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
636.7966482 RZRV

Value
$0.00
0x7828111452c375dd5b23bf315322fa389ed8d0e7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Rezerve is a vault-backed stablecoin-based token with a rising price floor. The RZRV token maintains a price floor as a result of the associated "vault" contract. RZRV utilizes additional liquidity protocols to accelerate the vault's rate of growth.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Rezerve

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-21
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;




/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


interface IUniswapV2Router01 {
    function 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);
}



// pragma solidity >=0.6.2;

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

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


interface RezerveExchange {
     function exchangeReserve ( uint256 _amount ) external;
     function flush() external;
    
}





interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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



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

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


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



contract Rezerve is Context, IERC20, Ownable {
	using Address for address;

	mapping (address => mapping (address => uint256)) private _allowances;
	mapping (address => uint256) private balances;
	mapping (address => bool) private _isExcludedFromFee;

	uint256 private _totalSupply = 21000000 * 10**9;
	uint256 private _tFeeTotal;

	string private constant _name = "Rezerve";
	string private constant _symbol = "RZRV";
	uint8 private constant _decimals = 9;

	uint256 public _taxFeeOnSale = 0;
	uint256 private _previousSellFee = _taxFeeOnSale;

	uint256 public _taxFeeOnBuy = 10;
	uint256 private _previousBuyFee = _taxFeeOnBuy;

    uint256 public _burnFee = 2;
	uint256 private _previousBurnFee = _burnFee;
	
	uint256 public stakingSlice = 20;


	bool public saleTax = true;

	mapping (address => uint256) public lastTrade;
	mapping (address => uint256) public lastBlock;
	mapping (address => bool)    public blacklist;
	mapping (address => bool)    public whitelist;
	mapping (address => bool)    public rezerveEcosystem;
	address public reserveStaking;
	address payable public reserveVault;
	address public reserveExchange;
	address public ReserveStakingReceiver;
	address public DAI;

	IUniswapV2Router02 public immutable uniswapV2Router;
	address public uniswapV2RouterAddress;
	address public immutable uniswapV2Pair;

	uint8 public action;
	bool public daiShield;
	bool public AutoSwap = false;

	uint8 public lpPullPercentage = 70;
	bool public pauseContract = true;
	bool public stakingTax = true;

	address public burnAddress = 0x000000000000000000000000000000000000dEaD;  

	bool inSwapAndLiquify;
	bool public swapAndLiquifyEnabled = true;

	uint256 public _maxTxAmount = 21000000  * 10**9;
	uint256 public numTokensSellToAddToLiquidity = 21000 * 10**9;

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

	// ========== Modifiers ========== //
	modifier lockTheSwap {
		inSwapAndLiquify = true;
		_;
		inSwapAndLiquify = false;
	}

	constructor () {
		//DAI = 0x9A702Da2aCeA529dE15f75b69d69e0E94bEFB73B;
		// DAI = 0x6980FF5a3BF5E429F520746EFA697525e8EaFB5C; // @audit - make sure this address is correct
		//uniswapV2RouterAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
                balances[msg.sender] = _totalSupply;
		DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; // testnet DAI
		uniswapV2RouterAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // @audit - make sure this address is correct
		IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(uniswapV2RouterAddress);
		 // Create a uniswap pair for this new token
		address pairAddress = IUniswapV2Factory(_uniswapV2Router.factory())
			.createPair(address(this), DAI );
		uniswapV2Pair = pairAddress;
		// UNCOMMENT THESE FOR ETHEREUM MAINNET
		//DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

		// set the rest of the contract variables
		uniswapV2Router = _uniswapV2Router;

		addRezerveEcosystemAddress(owner());
		addRezerveEcosystemAddress(address(this));

		addToWhitelist(pairAddress);

		//exclude owner and this contract from fee
		_isExcludedFromFee[owner()] = true;
		_isExcludedFromFee[address(this)] = true;
		_isExcludedFromFee[0x397c2dBe7af135eA95561acdd9E558E630410a84] = true; // @audit - make sure this address is correct
		daiShield = true;
		emit Transfer(address(0), _msgSender(), _totalSupply);
	}

	// ========== View Functions ========== //

	function thresholdMet () public view returns (bool) {
		return reserveBalance() > numTokensSellToAddToLiquidity ;
	}
	
	function reserveBalance () public view returns (uint256) {
		return balanceOf( address(this) );
	}

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

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

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

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

	function balanceOf(address account) public view override returns (uint256) {
		return balances[account];
	}

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

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

	function getLPBalance() public view returns(uint256){
		IERC20 _lp = IERC20 ( uniswapV2Pair);
		return _lp.balanceOf(address(this));
	}

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

	function checkDaiOwnership( address _address ) public view returns(bool){
		IERC20 _dai = IERC20(DAI);
		uint256 _daibalance = _dai.balanceOf(_address );
		return ( _daibalance > 0 );
	}

	// ========== Mutative / Owner Functions ========== //

	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) {
		_approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount );
		_transfer(sender, recipient, amount);
		return true;
	}

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

	function setReserveExchange( address _address ) public onlyOwner {
		require(_address != address(0), "reserveExchange is zero address");
		reserveExchange = _address;
		excludeFromFee( _address );
		addRezerveEcosystemAddress(_address);
	}

	function contractPauser() public onlyOwner {
		pauseContract = !pauseContract;
		AutoSwap = !AutoSwap;
		_approve(address(this), reserveExchange, ~uint256(0));
		_approve(address(this), uniswapV2Pair ,  ~uint256(0));
		_approve(address(this), uniswapV2RouterAddress, ~uint256(0));
		 
		IERC20 _dai = IERC20 ( DAI );
		_dai.approve( uniswapV2Pair, ~uint256(0) );
		_dai.approve( uniswapV2RouterAddress ,  ~uint256(0) );
		_dai.approve( reserveExchange ,  ~uint256(0) );
	}

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

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

	function setSellFeePercent(uint256 sellFee) external onlyOwner() {
		require ( sellFee < 30 , "Tax too high" );
		_taxFeeOnSale = sellFee;
	}

	function setBuyFeePercent(uint256 buyFee) external onlyOwner() {
		require ( buyFee < 11 , "Tax too high" );
		_taxFeeOnBuy = buyFee;
	}
	
	function setBurnFeePercent(uint256 burnFee) external onlyOwner() {
		require ( burnFee < 11 , "Burn too high" );
		_burnFee = burnFee;
	}

	function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
		_maxTxAmount = (_totalSupply * maxTxPercent) / 10**6;
	}

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

	function setReserveStakingReceiver(address _address) public onlyOwner {
		require(_address != address(0), "ReserveStakingReceiver is zero address");
		ReserveStakingReceiver = _address;
		excludeFromFee( _address );
		addRezerveEcosystemAddress(_address);
	}
	
	function setReserveStaking ( address _address ) public onlyOwner {
		require(_address != address(0), "ReserveStaking is zero address");
		reserveStaking = _address;
		excludeFromFee( _address );
		addRezerveEcosystemAddress(_address);
	}

	function setMinimumNumber (uint256 _min) public onlyOwner {
		numTokensSellToAddToLiquidity = _min * 10** 9;
	}

	function daiShieldToggle () public onlyOwner {
		daiShield = !daiShield;
	}
	
	function AutoSwapToggle () public onlyOwner {
		AutoSwap = !AutoSwap;
	}

	function addToBlacklist(address account) public onlyOwner {
		whitelist[account] = false;
		blacklist[account] = true;
	}

	function removeFromBlacklist(address account) public onlyOwner {
		blacklist[account] = false;
	}
	
	// To be used for contracts that should never be blacklisted, but aren't part of the Rezerve ecosystem, such as the Uniswap pair
	function addToWhitelist(address account) public onlyOwner {
		blacklist[account] = false;
		whitelist[account] = true;
	}

	function removeFromWhitelist(address account) public onlyOwner {
		whitelist[account] = false;
	}

	// To be used if new contracts are added to the Rezerve ecosystem
	function addRezerveEcosystemAddress(address account) public onlyOwner {
		rezerveEcosystem[account] = true;
		addToWhitelist(account);
	}

	function removeRezerveEcosystemAddress(address account) public onlyOwner {
		rezerveEcosystem[account] = false;
	}

	function toggleStakingTax() public onlyOwner {
		stakingTax = !stakingTax;
	}

	function withdrawLPTokens () public onlyOwner {
		IERC20 _uniswapV2Pair = IERC20 ( uniswapV2Pair );
		uint256 _lpbalance = _uniswapV2Pair.balanceOf(address(this));
		_uniswapV2Pair.transfer( msg.sender, _lpbalance );
	}
	
	function setLPPullPercentage ( uint8 _perc ) public onlyOwner {
		require ( _perc >9 && _perc <71);
		lpPullPercentage = _perc;
	}

	function addToLP(uint256 tokenAmount, uint256 daiAmount) public onlyOwner {
		// approve token transfer to cover all possible scenarios
		_transfer ( msg.sender, address(this) , tokenAmount );
		_approve(address(this), address(uniswapV2Router), tokenAmount);
		
		IERC20 _dai = IERC20 ( DAI );
		_dai.approve(  address(uniswapV2Router), daiAmount);
		_dai.transferFrom ( msg.sender, address(this) , daiAmount );
		
		// add the liquidity
		uniswapV2Router.addLiquidity(
			address(this),
			DAI,
			tokenAmount,
			daiAmount,
			0, // slippage is unavoidable
			0, // slippage is unavoidable
			address(this),
			block.timestamp
		);
		contractPauser();
	}

	function removeLP () public onlyOwner {
		saleTax = false;  
		IERC20 _uniswapV2Pair = IERC20 ( uniswapV2Pair );
		uint256 _lpbalance = _uniswapV2Pair.balanceOf(address(this));
		uint256 _perc = (_lpbalance * lpPullPercentage ) / 100;
		
		_uniswapV2Pair.approve( address(uniswapV2Router), _perc );
		uniswapV2Router.removeLiquidity(
			address(this),
			DAI,
			_perc,
			0,
			0,
			reserveExchange,
			block.timestamp + 3 minutes
		); 
		RezerveExchange _reserveexchange = RezerveExchange ( reserveExchange );
		_reserveexchange.flush();
	}

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

	// ========== Private / Internal Functions ========== //

	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");
		require(!blacklist[from]);
		if (pauseContract) require (from == address(this) || from == owner());

		if (!rezerveEcosystem[from]) {
			if(to == uniswapV2Pair && daiShield) require ( !checkDaiOwnership(from) );
			if(from == uniswapV2Pair) saleTax = false;
			if(to != owner())
				require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

			if (!whitelist[from]) {
				if (lastBlock[from] == block.number) blacklist[from] = true;
				if (lastTrade[from] + 20 seconds > block.timestamp && !blacklist[from]) revert("Slowdown");
				lastBlock[from] = block.number;
				lastTrade[from] = block.timestamp;
			}
		}

		action = 0;

		if(from == uniswapV2Pair) action = 1;
		if(to == uniswapV2Pair) action = 2;
		// is the token balance of this contract address over the min number of
		// tokens that we need to initiate a swap + liquidity lock?
		// also, don't get caught in a circular liquidity event.
		// also, don't swap & liquify if sender is uniswap pair.
		
		uint256 contractTokenBalance = balanceOf(address(this));
		contractTokenBalance = Math.min(contractTokenBalance, numTokensSellToAddToLiquidity);
		bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
		if (
			overMinTokenBalance &&
			!inSwapAndLiquify &&
			from != uniswapV2Pair &&
			swapAndLiquifyEnabled &&
			AutoSwap
		) {
			swapIt(contractTokenBalance);
		}
		
		//indicates if fee should be deducted from transfer
		bool takeFee = true;
		
		//if any account belongs to _isExcludedFromFee account then remove the fee
		if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
			takeFee = false;
		}
		
		//transfer amount, it will take tax, burn, liquidity fee
		if (!blacklist[from])
			_tokenTransfer(from, to, amount, takeFee);
		else
			_tokenTransfer(from, to, 1, false);
	}

	function swapIt(uint256 contractTokenBalance) internal lockTheSwap {
		uint256 _exchangeshare = contractTokenBalance;
		if (stakingTax) {
			_exchangeshare = ( _exchangeshare * 4 ) / 5;
			uint256 _stakingshare = contractTokenBalance - _exchangeshare;
			_tokenTransfer(address(this), ReserveStakingReceiver, _stakingshare, false);
		}
		swapTokensForDai(_exchangeshare);
	}

	function swapTokensForDai(uint256 tokenAmount) internal {
		// generate the uniswap pair path of token -> DAI
		address[] memory path = new address[](2);

		path[0] = address(this);
		path[1] = DAI;
		uniswapV2Router.swapExactTokensForTokens(
			tokenAmount,
			0, // accept any amount of DAI
			path,
			reserveExchange,
			block.timestamp + 3 minutes
		);
	}
	
	function setStakingSlice ( uint256 _slice ) public onlyOwner {
	    stakingSlice = _slice;
	}
	
	//this method is responsible for taking all fee, if takeFee is true
	function _tokenTransfer(
		address sender,
		address recipient,
		uint256 amount,
		bool takeFee
	) private {
		if(!takeFee)
			removeAllFee();

		( uint256 transferAmount, uint256 sellFee, uint256 buyFee, uint256 burnFee ) = _getTxValues(amount);
		_tFeeTotal = _tFeeTotal + sellFee + buyFee + burnFee;
		uint256 stakingFee;
		if (stakingTax) {
		        uint256 stakingFeeB = (buyFee * stakingSlice )/100; 
		        uint256 stakingFeeS = (sellFee * stakingSlice )/100;
		        buyFee = buyFee - stakingFeeB; 
		        sellFee = sellFee - stakingFeeS;
		        stakingFee = stakingFeeB + stakingFeeS;
		
		}
		balances[sender] = balances[sender] - amount;
		balances[recipient] = balances[recipient] + transferAmount;
		balances[address(this)] = balances[address(this)] + sellFee + buyFee;
		balances[burnAddress] = balances[burnAddress] + burnFee;
		balances[ReserveStakingReceiver] = balances[ReserveStakingReceiver] + stakingFee;

		emit Transfer(sender, recipient, transferAmount);
		
		if(!takeFee)
			restoreAllFee();
	}

	function _getTxValues(uint256 tAmount) private returns (uint256, uint256, uint256, uint256) {
		uint256 sellFee = calculateSellFee(tAmount);
		uint256 buyFee = calculateBuyFee(tAmount);
		uint256 burnFee = calculateBurnFee(tAmount);
		uint256 tTransferAmount = tAmount - sellFee - buyFee - burnFee;
		return (tTransferAmount, sellFee, buyFee, burnFee);
	}

	function calculateSellFee(uint256 _amount) private returns (uint256) {
		if (!saleTax) {
			saleTax = true;
			return 0;
		}
		return( _amount * _taxFeeOnSale) / 10**2;
	}

	function calculateBuyFee(uint256 _amount) private view returns (uint256) {
		if(action == 1)
			return (_amount * _taxFeeOnBuy) / 10**2;

		return 0;
	}
	
	function calculateBurnFee(uint256 _amount) private view returns (uint256) {
		if ( _burnFee > 0 )
		return (_amount * _burnFee) / 10**2;
        return 0;
		
	}

	function removeAllFee() private {
		if(_taxFeeOnSale == 0 && _taxFeeOnBuy == 0  && _burnFee == 0 ) return;
		
		_previousSellFee = _taxFeeOnSale;
		_previousBuyFee = _taxFeeOnBuy;
		_previousBurnFee = _burnFee;
		
		_taxFeeOnSale = 0;
		_taxFeeOnBuy = 0;
		_burnFee = 0;
	}

	function restoreAllFee() private {
		_taxFeeOnSale = _previousSellFee;
		_taxFeeOnBuy = _previousBuyFee;
		_burnFee = _previousBurnFee;
	}
}

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":"AutoSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AutoSwapToggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ReserveStakingReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFeeOnSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"action","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addRezerveEcosystemAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"daiAmount","type":"uint256"}],"name":"addToLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"checkDaiOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daiShield","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiShieldToggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpPullPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeRezerveEcosystemAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveExchange","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveVault","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rezerveEcosystem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"}],"name":"setBuyFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_perc","type":"uint8"}],"name":"setLPPullPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"setMinimumNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setReserveExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setReserveStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setReserveStakingReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellFee","type":"uint256"}],"name":"setSellFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slice","type":"uint256"}],"name":"setStakingSlice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingSlice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"pure","type":"function"},{"inputs":[],"name":"thresholdMet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleStakingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2RouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawLPTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052664a9b6384488000600681905560006008819055600955600a808055600b556002600c819055600d556014600e55600f8054600160ff19909116179055601a805463ffffffff60b01b19166180a360b91b179055601b8054600161ff0160a01b031916750100000000000000000000000000000000000000dead179055601c55651319718a5000601d553480156200009b57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506006543360009081526004602081815260408084209490945560198054736b175474e89094c44da98b954eedeac495271d0f6001600160a01b031991821617909155601a8054737a250d5630b4cf539739df2c5dacb4c659f2488d921682179055845163c45a015560e01b815294519094859363c45a015593828201939092909190829003018186803b1580156200017457600080fd5b505afa15801562000189573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001af919062000499565b6019546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c6539690604401602060405180830381600087803b158015620001fc57600080fd5b505af115801562000211573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000237919062000499565b6001600160601b0319606082811b821660a05284901b166080529050620002706200026a6000546001600160a01b031690565b62000395565b6200027b3062000395565b620002868162000415565b6001600560006200029f6000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526005909252812080548316600190811790915573397c2dbe7af135ea95561acdd9e558e630410a849091527f5fd71a8497286acc5a28d81c611da566460630a362187f91eea65fe1d4a020538054909216179055601a805460ff60a81b1916600160a81b1790556200033d3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040516200038591815260200190565b60405180910390a35050620004cb565b6000546001600160a01b03163314620003e45760405162461bcd60e51b8152602060048201819052602482015260008051602062003a8283398151915260448201526064015b60405180910390fd5b6001600160a01b0381166000908152601460205260409020805460ff19166001179055620004128162000415565b50565b6000546001600160a01b03163314620004605760405162461bcd60e51b8152602060048201819052602482015260008051602062003a828339815191526044820152606401620003db565b6001600160a01b03166000908152601260209081526040808320805460ff19908116909155601390925290912080549091166001179055565b600060208284031215620004ac57600080fd5b81516001600160a01b0381168114620004c457600080fd5b9392505050565b60805160601c60a05160601c61351b620005676000396000818161073101528181610ea601528181610f01015281816112f801528181611773015281816121b3015281816127230152818161278501528181612960015281816129a90152612a3d01526000818161056a015281816113c00152818161146001528181611e0d01528181611e4c01528181611fb20152612e91015261351b6000f3fe60806040526004361061043f5760003560e01c8063950eb5d511610234578063cef062fc1161012e578063e43252d7116100b6578063eec7d8f91161007a578063eec7d8f914610d5d578063ef0645ac14610d7d578063f2fde38b14610d9d578063f9f92be414610dbd578063fb64339214610ded57600080fd5b8063e43252d714610cd2578063e6a97ac614610cf2578063ea2f0b3714610d12578063ec4e68a214610d32578063edf8bc1314610d4857600080fd5b8063d58e4605116100fd578063d58e460514610c0c578063d5cf7a9214610c2c578063dd46706414610c4c578063dd62ed3e14610c6c578063e0bab4c414610cb257600080fd5b8063cef062fc14610ba0578063d12a768814610bc0578063d20f197d14610bd6578063d543dbeb14610bec57600080fd5b8063a8ec4ffc116101bc578063bf5976d311610180578063bf5976d314610b07578063c0b0fda214610b1d578063c26d7be014610b33578063c49b9a8014610b60578063cea2695814610b8057600080fd5b8063a8ec4ffc14610a71578063a9059cbb14610a91578063a9d68b8614610ab1578063b46ae5c614610ad1578063b6c5232414610af257600080fd5b80639b19251a116102035780639b19251a146109ca578063a10954fe146109fa578063a2b8a94714610a1c578063a69df4b514610a3c578063a6c6e5f014610a5157600080fd5b8063950eb5d51461093b578063952ca92c1461095b57806395d89b4114610988578063961522ed146109b557600080fd5b8063439766ce116103455780635d9728c8116102cd578063715018a611610291578063715018a6146108b25780637d1db4a5146108c757806385bec3d7146108dd5780638ab1d681146108fd5780638da5cb5b1461091d57600080fd5b80635d9728c81461080d57806362f837ef1461082d5780636f43f17b1461084757806370a082311461085c57806370d5ae051461089257600080fd5b80634a377e1d116103145780634a377e1d146107535780634a74bb02146107735780634d431e5e146107945780635342acb4146107b4578063537df3b6146107ed57600080fd5b8063439766ce146106c957806344337ea1146106ea578063491e91ee1461070a57806349bd5a5e1461071f57600080fd5b80632103b6ad116103c857806331ce11ec1161039757806331ce11ec1461063e5780633ec20ab01461065f578063407893f11461067f57806342c5ddc414610694578063437823ec146106a957600080fd5b80632103b6ad146105b95780632130e348146105e957806323b872dd1461060a578063313ce5671461062a57600080fd5b80630a7a1c4d1161040f5780630a7a1c4d146104f15780630d88331a1461052457806313114a9d146105395780631694505e1461055857806318160ddd146105a457600080fd5b80627635b61461044b57806301a754a31461046257806306fdde0314610498578063095ea7b3146104d157600080fd5b3661044657005b600080fd5b34801561045757600080fd5b50610460610e0d565b005b34801561046e57600080fd5b50601a5461048390600160b01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156104a457600080fd5b5060408051808201909152600781526652657a6572766560c81b60208201525b60405161048f919061330a565b3480156104dd57600080fd5b506104836104ec366004613118565b6110a4565b3480156104fd57600080fd5b50601a5461051290600160a01b900460ff1681565b60405160ff909116815260200161048f565b34801561053057600080fd5b506104606110ba565b34801561054557600080fd5b506007545b60405190815260200161048f565b34801561056457600080fd5b5061058c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161048f565b3480156105b057600080fd5b5060065461054a565b3480156105c557600080fd5b506104836105d436600461308e565b60146020526000908152604090205460ff1681565b3480156105f557600080fd5b50601a5461048390600160a81b900460ff1681565b34801561061657600080fd5b506104836106253660046130dc565b611105565b34801561063657600080fd5b506009610512565b34801561064a57600080fd5b50601a5461048390600160c81b900460ff1681565b34801561066b57600080fd5b5061046061067a366004613241565b611154565b34801561068b57600080fd5b50610460611192565b3480156106a057600080fd5b506104836111dd565b3480156106b557600080fd5b506104606106c436600461308e565b6111fe565b3480156106d557600080fd5b50601a5461048390600160c01b900460ff1681565b3480156106f657600080fd5b5061046061070536600461308e565b61124c565b34801561071657600080fd5b506104606112af565b34801561072b57600080fd5b5061058c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561075f57600080fd5b50601a5461058c906001600160a01b031681565b34801561077f57600080fd5b50601b5461048390600160a81b900460ff1681565b3480156107a057600080fd5b506104606107af36600461308e565b6115ad565b3480156107c057600080fd5b506104836107cf36600461308e565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156107f957600080fd5b5061046061080836600461308e565b61166c565b34801561081957600080fd5b5061046061082836600461308e565b6116b7565b34801561083957600080fd5b50600f546104839060ff1681565b34801561085357600080fd5b5061054a61175b565b34801561086857600080fd5b5061054a61087736600461308e565b6001600160a01b031660009081526004602052604090205490565b34801561089e57600080fd5b50601b5461058c906001600160a01b031681565b3480156108be57600080fd5b506104606117fd565b3480156108d357600080fd5b5061054a601c5481565b3480156108e957600080fd5b506104606108f83660046132e7565b61185f565b34801561090957600080fd5b5061046061091836600461308e565b6118c8565b34801561092957600080fd5b506000546001600160a01b031661058c565b34801561094757600080fd5b50610460610956366004613241565b611913565b34801561096757600080fd5b5061054a61097636600461308e565b60116020526000908152604090205481565b34801561099457600080fd5b50604080518082019091526004815263292d292b60e11b60208201526104c4565b3480156109c157600080fd5b50610460611981565b3480156109d657600080fd5b506104836109e536600461308e565b60136020526000908152604090205460ff1681565b348015610a0657600080fd5b503060009081526004602052604090205461054a565b348015610a2857600080fd5b50610460610a37366004613241565b6119cc565b348015610a4857600080fd5b50610460611a3a565b348015610a5d57600080fd5b5060155461058c906001600160a01b031681565b348015610a7d57600080fd5b50610460610a8c36600461308e565b611b43565b348015610a9d57600080fd5b50610483610aac366004613118565b611b8e565b348015610abd57600080fd5b50610460610acc36600461308e565b611b9b565b348015610add57600080fd5b50601a5461051290600160b81b900460ff1681565b348015610afe57600080fd5b5060025461054a565b348015610b1357600080fd5b5061054a600a5481565b348015610b2957600080fd5b5061054a600c5481565b348015610b3f57600080fd5b5061054a610b4e36600461308e565b60106020526000908152604090205481565b348015610b6c57600080fd5b50610460610b7b366004613207565b611bf1565b348015610b8c57600080fd5b50610460610b9b366004613241565b611c73565b348015610bac57600080fd5b5060165461058c906001600160a01b031681565b348015610bcc57600080fd5b5061054a601d5481565b348015610be257600080fd5b5061054a600e5481565b348015610bf857600080fd5b50610460610c07366004613241565b611ce2565b348015610c1857600080fd5b50610460610c2736600461308e565b611d2e565b348015610c3857600080fd5b50610460610c47366004613273565b611dd2565b348015610c5857600080fd5b50610460610c67366004613241565b612041565b348015610c7857600080fd5b5061054a610c873660046130a9565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610cbe57600080fd5b5060195461058c906001600160a01b031681565b348015610cde57600080fd5b50610460610ced36600461308e565b6120c6565b348015610cfe57600080fd5b5060175461058c906001600160a01b031681565b348015610d1e57600080fd5b50610460610d2d36600461308e565b612129565b348015610d3e57600080fd5b5061054a60085481565b348015610d5457600080fd5b50610460612174565b348015610d6957600080fd5b50610460610d78366004613241565b6122bd565b348015610d8957600080fd5b5060185461058c906001600160a01b031681565b348015610da957600080fd5b50610460610db836600461308e565b6122ec565b348015610dc957600080fd5b50610483610dd836600461308e565b60126020526000908152604090205460ff1681565b348015610df957600080fd5b50610483610e0836600461308e565b6123c4565b6000546001600160a01b03163314610e405760405162461bcd60e51b8152600401610e379061335f565b60405180910390fd5b601a8054600160b01b60ff600160c01b8084048216150260ff60c01b19841681178390049091161590910260ff60b01b1990911662ff00ff60b01b1990921691909117179055601754610ea09030906001600160a01b0316600019612450565b610ecd307f0000000000000000000000000000000000000000000000000000000000000000600019612450565b601a54610ee79030906001600160a01b0316600019612450565b60195460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600019602483015290911690819063095ea7b390604401602060405180830381600087803b158015610f5857600080fd5b505af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190613224565b50601a5460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529082169063095ea7b390604401602060405180830381600087803b158015610fe057600080fd5b505af1158015610ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110189190613224565b5060175460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529082169063095ea7b390604401602060405180830381600087803b15801561106857600080fd5b505af115801561107c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a09190613224565b5050565b60006110b1338484612450565b50600192915050565b6000546001600160a01b031633146110e45760405162461bcd60e51b8152600401610e379061335f565b601a805460ff60c81b198116600160c81b9182900460ff1615909102179055565b6001600160a01b038316600090815260036020908152604080832033808552925282205461113f91869161113a90869061345e565b612450565b61114a848484612574565b5060019392505050565b6000546001600160a01b0316331461117e5760405162461bcd60e51b8152600401610e379061335f565b61118c81633b9aca0061343f565b601d5550565b6000546001600160a01b031633146111bc5760405162461bcd60e51b8152600401610e379061335f565b601a805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6000601d546111f83060009081526004602052604090205490565b11905090565b6000546001600160a01b031633146112285760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b6000546001600160a01b031633146112765760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601360209081526040808320805460ff19908116909155601290925290912080549091166001179055565b6000546001600160a01b031633146112d95760405162461bcd60e51b8152600401610e379061335f565b600f805460ff191690556040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561134757600080fd5b505afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f919061325a565b601a5490915060009060649061139f90600160b81b900460ff168461343f565b6113a9919061341d565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390529192509084169063095ea7b390604401602060405180830381600087803b15801561141757600080fd5b505af115801561142b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144f9190613224565b506019546017546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263baa2abde9230929182169186916000918291166114a14260b4613405565b60405160e089901b6001600160e01b03191681526001600160a01b039788166004820152958716602487015260448601949094526064850192909252608484015290921660a482015260c481019190915260e4016040805180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115469190613295565b5050601754604080516335cfcb7560e11b815290516001600160a01b03909216918291636b9f96ea91600480830192600092919082900301818387803b15801561158f57600080fd5b505af11580156115a3573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146115d75760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03811661163c5760405162461bcd60e51b815260206004820152602660248201527f526573657276655374616b696e675265636569766572206973207a65726f206160448201526564647265737360d01b6064820152608401610e37565b601880546001600160a01b0319166001600160a01b038316179055611660816111fe565b61166981611b9b565b50565b6000546001600160a01b031633146116965760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601260205260409020805460ff19169055565b6000546001600160a01b031633146116e15760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b0381166117375760405162461bcd60e51b815260206004820152601f60248201527f7265736572766545786368616e6765206973207a65726f2061646472657373006044820152606401610e37565b601780546001600160a01b0319166001600160a01b038316179055611660816111fe565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038216906370a082319060240160206040518083038186803b1580156117bf57600080fd5b505afa1580156117d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f7919061325a565b91505090565b6000546001600160a01b031633146118275760405162461bcd60e51b8152600401610e379061335f565b600080546040516001600160a01b03909116906000805160206134c6833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146118895760405162461bcd60e51b8152600401610e379061335f565b60098160ff1611801561189f575060478160ff16105b6118a857600080fd5b601a805460ff909216600160b81b0260ff60b81b19909216919091179055565b6000546001600160a01b031633146118f25760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6000546001600160a01b0316331461193d5760405162461bcd60e51b8152600401610e379061335f565b600b811061197c5760405162461bcd60e51b815260206004820152600c60248201526b0a8c2f040e8dede40d0d2ced60a31b6044820152606401610e37565b600a55565b6000546001600160a01b031633146119ab5760405162461bcd60e51b8152600401610e379061335f565b601a805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000546001600160a01b031633146119f65760405162461bcd60e51b8152600401610e379061335f565b601e8110611a355760405162461bcd60e51b815260206004820152600c60248201526b0a8c2f040e8dede40d0d2ced60a31b6044820152606401610e37565b600855565b6001546001600160a01b03163314611aa05760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610e37565b6002544211611af15760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610e37565b600154600080546040516001600160a01b0393841693909116916000805160206134c683398151915291a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314611b6d5760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601460205260409020805460ff19169055565b60006110b1338484612574565b6000546001600160a01b03163314611bc55760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b0381166000908152601460205260409020805460ff19166001179055611669816120c6565b6000546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401610e379061335f565b601b8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611c6890831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611c9d5760405162461bcd60e51b8152600401610e379061335f565b600b8110611cdd5760405162461bcd60e51b815260206004820152600d60248201526c084eae4dc40e8dede40d0d2ced609b1b6044820152606401610e37565b600c55565b6000546001600160a01b03163314611d0c5760405162461bcd60e51b8152600401610e379061335f565b620f424081600654611d1e919061343f565b611d28919061341d565b601c5550565b6000546001600160a01b03163314611d585760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b038116611dae5760405162461bcd60e51b815260206004820152601e60248201527f526573657276655374616b696e67206973207a65726f206164647265737300006044820152606401610e37565b601580546001600160a01b0319166001600160a01b038316179055611660816111fe565b6000546001600160a01b03163314611dfc5760405162461bcd60e51b8152600401610e379061335f565b611e07333084612574565b611e32307f000000000000000000000000000000000000000000000000000000000000000084612450565b60195460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820184905290911690819063095ea7b390604401602060405180830381600087803b158015611ea257600080fd5b505af1158015611eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eda9190613224565b506040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd90606401602060405180830381600087803b158015611f2957600080fd5b505af1158015611f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f619190613224565b5060195460405162e8e33760e81b815230600482018190526001600160a01b039283166024830152604482018690526064820185905260006084830181905260a483015260c48201524260e48201527f00000000000000000000000000000000000000000000000000000000000000009091169063e8e337009061010401606060405180830381600087803b158015611ff957600080fd5b505af115801561200d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203191906132b9565b50505061203c610e0d565b505050565b6000546001600160a01b0316331461206b5760405162461bcd60e51b8152600401610e379061335f565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561209a8142613405565b600255600080546040516001600160a01b03909116906000805160206134c6833981519152908390a350565b6000546001600160a01b031633146120f05760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601260209081526040808320805460ff19908116909155601390925290912080549091166001179055565b6000546001600160a01b031633146121535760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6000546001600160a01b0316331461219e5760405162461bcd60e51b8152600401610e379061335f565b6040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561220257600080fd5b505afa158015612216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223a919061325a565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b15801561228557600080fd5b505af1158015612299573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203c9190613224565b6000546001600160a01b031633146122e75760405162461bcd60e51b8152600401610e379061335f565b600e55565b6000546001600160a01b031633146123165760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03811661237b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e37565b600080546040516001600160a01b03808516939216916000805160206134c683398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6019546040516370a0823160e01b81526001600160a01b0383811660048301526000921690829082906370a082319060240160206040518083038186803b15801561240e57600080fd5b505afa158015612422573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612446919061325a565b1515949350505050565b6001600160a01b0383166124b25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e37565b6001600160a01b0382166125135760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e37565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166125d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e37565b6001600160a01b03821661263a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e37565b6000811161269c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e37565b6001600160a01b03831660009081526012602052604090205460ff16156126c257600080fd5b601a54600160c01b900460ff1615612701576001600160a01b0383163014806126f857506000546001600160a01b038481169116145b61270157600080fd5b6001600160a01b03831660009081526014602052604090205460ff16612951577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614801561276b5750601a54600160a81b900460ff165b1561278357612779836123c4565b1561278357600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156127c857600f805460ff191690555b6000546001600160a01b0383811691161461284057601c548111156128405760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610e37565b6001600160a01b03831660009081526013602052604090205460ff16612951576001600160a01b0383166000908152601160205260409020544314156128a4576001600160a01b0383166000908152601260205260409020805460ff191660011790555b6001600160a01b03831660009081526010602052604090205442906128ca906014613405565b1180156128f057506001600160a01b03831660009081526012602052604090205460ff16155b156129285760405162461bcd60e51b815260206004820152600860248201526729b637bbb237bbb760c11b6044820152606401610e37565b6001600160a01b0383166000908152601160209081526040808320439055601090915290204290555b601a805460ff60a01b191690557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811690841614156129a757601a805460ff60a01b1916600160a01b1790555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129f557601a805460ff60a01b1916600160a11b1790555b306000908152600460205260408120549050612a1381601d54612b3c565b601d5490915081108015908190612a345750601b54600160a01b900460ff16155b8015612a7257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015612a875750601b54600160a81b900460ff165b8015612a9c5750601a54600160b01b900460ff165b15612aaa57612aaa82612b54565b6001600160a01b03851660009081526005602052604090205460019060ff1680612aec57506001600160a01b03851660009081526005602052604090205460ff165b15612af5575060005b6001600160a01b03861660009081526012602052604090205460ff16612b2657612b2186868684612bd9565b612b34565b612b34868660016000612bd9565b505050505050565b6000818310612b4b5781612b4d565b825b9392505050565b601b805460ff60a01b1916600160a01b179055601a548190600160c81b900460ff1615612bbf576005612b8882600461343f565b612b92919061341d565b90506000612ba0828461345e565b601854909150612bbd9030906001600160a01b0316836000612bd9565b505b612bc881612e10565b5050601b805460ff60a01b19169055565b80612be657612be6612f42565b600080600080612bf586612f87565b9350935093509350808284600754612c0d9190613405565b612c179190613405565b612c219190613405565b600755601a54600090600160c81b900460ff1615612c9c5760006064600e5485612c4b919061343f565b612c55919061341d565b905060006064600e5487612c69919061343f565b612c73919061341d565b9050612c7f828661345e565b9450612c8b818761345e565b9550612c978183613405565b925050505b6001600160a01b038916600090815260046020526040902054612cc090889061345e565b6001600160a01b03808b1660009081526004602052604080822093909355908a1681522054612cf0908690613405565b6001600160a01b0389166000908152600460205260408082209290925530815220548390612d1f908690613405565b612d299190613405565b3060009081526004602052604080822092909255601b546001600160a01b031681522054612d58908390613405565b601b546001600160a01b039081166000908152600460205260408082209390935560185490911681522054612d8e908290613405565b6018546001600160a01b0390811660009081526004602090815260409182902093909355518781528a821692918c16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a385612e0557612e05600954600855600b54600a55600d54600c55565b505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e4557612e4561348b565b6001600160a01b039283166020918202929092010152601954825191169082906001908110612e7657612e7661348b565b6001600160a01b0392831660209182029290920101526017547f00000000000000000000000000000000000000000000000000000000000000008216916338ed1739918591600091869116612ecc4260b4613405565b6040518663ffffffff1660e01b8152600401612eec959493929190613394565b600060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261203c9190810190613142565b600854158015612f525750600a54155b8015612f5e5750600c54155b15612f6557565b60088054600955600a8054600b55600c8054600d556000928390559082905555565b6000806000806000612f9886612fe6565b90506000612fa587613027565b90506000612fb288613057565b905060008183612fc2868c61345e565b612fcc919061345e565b612fd6919061345e565b9993985091965094509092505050565b600f5460009060ff16613007575050600f805460ff19166001179055600090565b606460085483613017919061343f565b613021919061341d565b92915050565b601a54600090600160a01b900460ff166001141561304f576064600a5483613017919061343f565b506000919050565b600c546000901561304f576064600c5483613017919061343f565b80356001600160a01b038116811461308957600080fd5b919050565b6000602082840312156130a057600080fd5b612b4d82613072565b600080604083850312156130bc57600080fd5b6130c583613072565b91506130d360208401613072565b90509250929050565b6000806000606084860312156130f157600080fd5b6130fa84613072565b925061310860208501613072565b9150604084013590509250925092565b6000806040838503121561312b57600080fd5b61313483613072565b946020939093013593505050565b6000602080838503121561315557600080fd5b825167ffffffffffffffff8082111561316d57600080fd5b818501915085601f83011261318157600080fd5b815181811115613193576131936134a1565b8060051b604051601f19603f830116810181811085821117156131b8576131b86134a1565b604052828152858101935084860182860187018a10156131d757600080fd5b600095505b838610156131fa5780518552600195909501949386019386016131dc565b5098975050505050505050565b60006020828403121561321957600080fd5b8135612b4d816134b7565b60006020828403121561323657600080fd5b8151612b4d816134b7565b60006020828403121561325357600080fd5b5035919050565b60006020828403121561326c57600080fd5b5051919050565b6000806040838503121561328657600080fd5b50508035926020909101359150565b600080604083850312156132a857600080fd5b505080516020909101519092909150565b6000806000606084860312156132ce57600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156132f957600080fd5b813560ff81168114612b4d57600080fd5b600060208083528351808285015260005b818110156133375785810183015185820160400152820161331b565b81811115613349576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133e45784516001600160a01b0316835293830193918301916001016133bf565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561341857613418613475565b500190565b60008261343a57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561345957613459613475565b500290565b60008282101561347057613470613475565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461166957600080fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a2646970667358221220b029cdd7baafb6e8ac74698c2e11e9326d030586401ae58394d228f3caeaf16164736f6c634300080600334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x60806040526004361061043f5760003560e01c8063950eb5d511610234578063cef062fc1161012e578063e43252d7116100b6578063eec7d8f91161007a578063eec7d8f914610d5d578063ef0645ac14610d7d578063f2fde38b14610d9d578063f9f92be414610dbd578063fb64339214610ded57600080fd5b8063e43252d714610cd2578063e6a97ac614610cf2578063ea2f0b3714610d12578063ec4e68a214610d32578063edf8bc1314610d4857600080fd5b8063d58e4605116100fd578063d58e460514610c0c578063d5cf7a9214610c2c578063dd46706414610c4c578063dd62ed3e14610c6c578063e0bab4c414610cb257600080fd5b8063cef062fc14610ba0578063d12a768814610bc0578063d20f197d14610bd6578063d543dbeb14610bec57600080fd5b8063a8ec4ffc116101bc578063bf5976d311610180578063bf5976d314610b07578063c0b0fda214610b1d578063c26d7be014610b33578063c49b9a8014610b60578063cea2695814610b8057600080fd5b8063a8ec4ffc14610a71578063a9059cbb14610a91578063a9d68b8614610ab1578063b46ae5c614610ad1578063b6c5232414610af257600080fd5b80639b19251a116102035780639b19251a146109ca578063a10954fe146109fa578063a2b8a94714610a1c578063a69df4b514610a3c578063a6c6e5f014610a5157600080fd5b8063950eb5d51461093b578063952ca92c1461095b57806395d89b4114610988578063961522ed146109b557600080fd5b8063439766ce116103455780635d9728c8116102cd578063715018a611610291578063715018a6146108b25780637d1db4a5146108c757806385bec3d7146108dd5780638ab1d681146108fd5780638da5cb5b1461091d57600080fd5b80635d9728c81461080d57806362f837ef1461082d5780636f43f17b1461084757806370a082311461085c57806370d5ae051461089257600080fd5b80634a377e1d116103145780634a377e1d146107535780634a74bb02146107735780634d431e5e146107945780635342acb4146107b4578063537df3b6146107ed57600080fd5b8063439766ce146106c957806344337ea1146106ea578063491e91ee1461070a57806349bd5a5e1461071f57600080fd5b80632103b6ad116103c857806331ce11ec1161039757806331ce11ec1461063e5780633ec20ab01461065f578063407893f11461067f57806342c5ddc414610694578063437823ec146106a957600080fd5b80632103b6ad146105b95780632130e348146105e957806323b872dd1461060a578063313ce5671461062a57600080fd5b80630a7a1c4d1161040f5780630a7a1c4d146104f15780630d88331a1461052457806313114a9d146105395780631694505e1461055857806318160ddd146105a457600080fd5b80627635b61461044b57806301a754a31461046257806306fdde0314610498578063095ea7b3146104d157600080fd5b3661044657005b600080fd5b34801561045757600080fd5b50610460610e0d565b005b34801561046e57600080fd5b50601a5461048390600160b01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156104a457600080fd5b5060408051808201909152600781526652657a6572766560c81b60208201525b60405161048f919061330a565b3480156104dd57600080fd5b506104836104ec366004613118565b6110a4565b3480156104fd57600080fd5b50601a5461051290600160a01b900460ff1681565b60405160ff909116815260200161048f565b34801561053057600080fd5b506104606110ba565b34801561054557600080fd5b506007545b60405190815260200161048f565b34801561056457600080fd5b5061058c7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161048f565b3480156105b057600080fd5b5060065461054a565b3480156105c557600080fd5b506104836105d436600461308e565b60146020526000908152604090205460ff1681565b3480156105f557600080fd5b50601a5461048390600160a81b900460ff1681565b34801561061657600080fd5b506104836106253660046130dc565b611105565b34801561063657600080fd5b506009610512565b34801561064a57600080fd5b50601a5461048390600160c81b900460ff1681565b34801561066b57600080fd5b5061046061067a366004613241565b611154565b34801561068b57600080fd5b50610460611192565b3480156106a057600080fd5b506104836111dd565b3480156106b557600080fd5b506104606106c436600461308e565b6111fe565b3480156106d557600080fd5b50601a5461048390600160c01b900460ff1681565b3480156106f657600080fd5b5061046061070536600461308e565b61124c565b34801561071657600080fd5b506104606112af565b34801561072b57600080fd5b5061058c7f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c81565b34801561075f57600080fd5b50601a5461058c906001600160a01b031681565b34801561077f57600080fd5b50601b5461048390600160a81b900460ff1681565b3480156107a057600080fd5b506104606107af36600461308e565b6115ad565b3480156107c057600080fd5b506104836107cf36600461308e565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156107f957600080fd5b5061046061080836600461308e565b61166c565b34801561081957600080fd5b5061046061082836600461308e565b6116b7565b34801561083957600080fd5b50600f546104839060ff1681565b34801561085357600080fd5b5061054a61175b565b34801561086857600080fd5b5061054a61087736600461308e565b6001600160a01b031660009081526004602052604090205490565b34801561089e57600080fd5b50601b5461058c906001600160a01b031681565b3480156108be57600080fd5b506104606117fd565b3480156108d357600080fd5b5061054a601c5481565b3480156108e957600080fd5b506104606108f83660046132e7565b61185f565b34801561090957600080fd5b5061046061091836600461308e565b6118c8565b34801561092957600080fd5b506000546001600160a01b031661058c565b34801561094757600080fd5b50610460610956366004613241565b611913565b34801561096757600080fd5b5061054a61097636600461308e565b60116020526000908152604090205481565b34801561099457600080fd5b50604080518082019091526004815263292d292b60e11b60208201526104c4565b3480156109c157600080fd5b50610460611981565b3480156109d657600080fd5b506104836109e536600461308e565b60136020526000908152604090205460ff1681565b348015610a0657600080fd5b503060009081526004602052604090205461054a565b348015610a2857600080fd5b50610460610a37366004613241565b6119cc565b348015610a4857600080fd5b50610460611a3a565b348015610a5d57600080fd5b5060155461058c906001600160a01b031681565b348015610a7d57600080fd5b50610460610a8c36600461308e565b611b43565b348015610a9d57600080fd5b50610483610aac366004613118565b611b8e565b348015610abd57600080fd5b50610460610acc36600461308e565b611b9b565b348015610add57600080fd5b50601a5461051290600160b81b900460ff1681565b348015610afe57600080fd5b5060025461054a565b348015610b1357600080fd5b5061054a600a5481565b348015610b2957600080fd5b5061054a600c5481565b348015610b3f57600080fd5b5061054a610b4e36600461308e565b60106020526000908152604090205481565b348015610b6c57600080fd5b50610460610b7b366004613207565b611bf1565b348015610b8c57600080fd5b50610460610b9b366004613241565b611c73565b348015610bac57600080fd5b5060165461058c906001600160a01b031681565b348015610bcc57600080fd5b5061054a601d5481565b348015610be257600080fd5b5061054a600e5481565b348015610bf857600080fd5b50610460610c07366004613241565b611ce2565b348015610c1857600080fd5b50610460610c2736600461308e565b611d2e565b348015610c3857600080fd5b50610460610c47366004613273565b611dd2565b348015610c5857600080fd5b50610460610c67366004613241565b612041565b348015610c7857600080fd5b5061054a610c873660046130a9565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610cbe57600080fd5b5060195461058c906001600160a01b031681565b348015610cde57600080fd5b50610460610ced36600461308e565b6120c6565b348015610cfe57600080fd5b5060175461058c906001600160a01b031681565b348015610d1e57600080fd5b50610460610d2d36600461308e565b612129565b348015610d3e57600080fd5b5061054a60085481565b348015610d5457600080fd5b50610460612174565b348015610d6957600080fd5b50610460610d78366004613241565b6122bd565b348015610d8957600080fd5b5060185461058c906001600160a01b031681565b348015610da957600080fd5b50610460610db836600461308e565b6122ec565b348015610dc957600080fd5b50610483610dd836600461308e565b60126020526000908152604090205460ff1681565b348015610df957600080fd5b50610483610e0836600461308e565b6123c4565b6000546001600160a01b03163314610e405760405162461bcd60e51b8152600401610e379061335f565b60405180910390fd5b601a8054600160b01b60ff600160c01b8084048216150260ff60c01b19841681178390049091161590910260ff60b01b1990911662ff00ff60b01b1990921691909117179055601754610ea09030906001600160a01b0316600019612450565b610ecd307f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c600019612450565b601a54610ee79030906001600160a01b0316600019612450565b60195460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c81166004830152600019602483015290911690819063095ea7b390604401602060405180830381600087803b158015610f5857600080fd5b505af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190613224565b50601a5460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529082169063095ea7b390604401602060405180830381600087803b158015610fe057600080fd5b505af1158015610ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110189190613224565b5060175460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529082169063095ea7b390604401602060405180830381600087803b15801561106857600080fd5b505af115801561107c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a09190613224565b5050565b60006110b1338484612450565b50600192915050565b6000546001600160a01b031633146110e45760405162461bcd60e51b8152600401610e379061335f565b601a805460ff60c81b198116600160c81b9182900460ff1615909102179055565b6001600160a01b038316600090815260036020908152604080832033808552925282205461113f91869161113a90869061345e565b612450565b61114a848484612574565b5060019392505050565b6000546001600160a01b0316331461117e5760405162461bcd60e51b8152600401610e379061335f565b61118c81633b9aca0061343f565b601d5550565b6000546001600160a01b031633146111bc5760405162461bcd60e51b8152600401610e379061335f565b601a805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6000601d546111f83060009081526004602052604090205490565b11905090565b6000546001600160a01b031633146112285760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b6000546001600160a01b031633146112765760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601360209081526040808320805460ff19908116909155601290925290912080549091166001179055565b6000546001600160a01b031633146112d95760405162461bcd60e51b8152600401610e379061335f565b600f805460ff191690556040516370a0823160e01b81523060048201527f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561134757600080fd5b505afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f919061325a565b601a5490915060009060649061139f90600160b81b900460ff168461343f565b6113a9919061341d565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81166004830152602482018390529192509084169063095ea7b390604401602060405180830381600087803b15801561141757600080fd5b505af115801561142b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144f9190613224565b506019546017546001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263baa2abde9230929182169186916000918291166114a14260b4613405565b60405160e089901b6001600160e01b03191681526001600160a01b039788166004820152958716602487015260448601949094526064850192909252608484015290921660a482015260c481019190915260e4016040805180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115469190613295565b5050601754604080516335cfcb7560e11b815290516001600160a01b03909216918291636b9f96ea91600480830192600092919082900301818387803b15801561158f57600080fd5b505af11580156115a3573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633146115d75760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03811661163c5760405162461bcd60e51b815260206004820152602660248201527f526573657276655374616b696e675265636569766572206973207a65726f206160448201526564647265737360d01b6064820152608401610e37565b601880546001600160a01b0319166001600160a01b038316179055611660816111fe565b61166981611b9b565b50565b6000546001600160a01b031633146116965760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601260205260409020805460ff19169055565b6000546001600160a01b031633146116e15760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b0381166117375760405162461bcd60e51b815260206004820152601f60248201527f7265736572766545786368616e6765206973207a65726f2061646472657373006044820152606401610e37565b601780546001600160a01b0319166001600160a01b038316179055611660816111fe565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c906001600160a01b038216906370a082319060240160206040518083038186803b1580156117bf57600080fd5b505afa1580156117d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f7919061325a565b91505090565b6000546001600160a01b031633146118275760405162461bcd60e51b8152600401610e379061335f565b600080546040516001600160a01b03909116906000805160206134c6833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146118895760405162461bcd60e51b8152600401610e379061335f565b60098160ff1611801561189f575060478160ff16105b6118a857600080fd5b601a805460ff909216600160b81b0260ff60b81b19909216919091179055565b6000546001600160a01b031633146118f25760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6000546001600160a01b0316331461193d5760405162461bcd60e51b8152600401610e379061335f565b600b811061197c5760405162461bcd60e51b815260206004820152600c60248201526b0a8c2f040e8dede40d0d2ced60a31b6044820152606401610e37565b600a55565b6000546001600160a01b031633146119ab5760405162461bcd60e51b8152600401610e379061335f565b601a805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000546001600160a01b031633146119f65760405162461bcd60e51b8152600401610e379061335f565b601e8110611a355760405162461bcd60e51b815260206004820152600c60248201526b0a8c2f040e8dede40d0d2ced60a31b6044820152606401610e37565b600855565b6001546001600160a01b03163314611aa05760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610e37565b6002544211611af15760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610e37565b600154600080546040516001600160a01b0393841693909116916000805160206134c683398151915291a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314611b6d5760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601460205260409020805460ff19169055565b60006110b1338484612574565b6000546001600160a01b03163314611bc55760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b0381166000908152601460205260409020805460ff19166001179055611669816120c6565b6000546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401610e379061335f565b601b8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611c6890831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611c9d5760405162461bcd60e51b8152600401610e379061335f565b600b8110611cdd5760405162461bcd60e51b815260206004820152600d60248201526c084eae4dc40e8dede40d0d2ced609b1b6044820152606401610e37565b600c55565b6000546001600160a01b03163314611d0c5760405162461bcd60e51b8152600401610e379061335f565b620f424081600654611d1e919061343f565b611d28919061341d565b601c5550565b6000546001600160a01b03163314611d585760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b038116611dae5760405162461bcd60e51b815260206004820152601e60248201527f526573657276655374616b696e67206973207a65726f206164647265737300006044820152606401610e37565b601580546001600160a01b0319166001600160a01b038316179055611660816111fe565b6000546001600160a01b03163314611dfc5760405162461bcd60e51b8152600401610e379061335f565b611e07333084612574565b611e32307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612450565b60195460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d811660048301526024820184905290911690819063095ea7b390604401602060405180830381600087803b158015611ea257600080fd5b505af1158015611eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eda9190613224565b506040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd90606401602060405180830381600087803b158015611f2957600080fd5b505af1158015611f3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f619190613224565b5060195460405162e8e33760e81b815230600482018190526001600160a01b039283166024830152604482018690526064820185905260006084830181905260a483015260c48201524260e48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063e8e337009061010401606060405180830381600087803b158015611ff957600080fd5b505af115801561200d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203191906132b9565b50505061203c610e0d565b505050565b6000546001600160a01b0316331461206b5760405162461bcd60e51b8152600401610e379061335f565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561209a8142613405565b600255600080546040516001600160a01b03909116906000805160206134c6833981519152908390a350565b6000546001600160a01b031633146120f05760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152601260209081526040808320805460ff19908116909155601390925290912080549091166001179055565b6000546001600160a01b031633146121535760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6000546001600160a01b0316331461219e5760405162461bcd60e51b8152600401610e379061335f565b6040516370a0823160e01b81523060048201527f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561220257600080fd5b505afa158015612216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223a919061325a565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401602060405180830381600087803b15801561228557600080fd5b505af1158015612299573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203c9190613224565b6000546001600160a01b031633146122e75760405162461bcd60e51b8152600401610e379061335f565b600e55565b6000546001600160a01b031633146123165760405162461bcd60e51b8152600401610e379061335f565b6001600160a01b03811661237b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e37565b600080546040516001600160a01b03808516939216916000805160206134c683398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6019546040516370a0823160e01b81526001600160a01b0383811660048301526000921690829082906370a082319060240160206040518083038186803b15801561240e57600080fd5b505afa158015612422573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612446919061325a565b1515949350505050565b6001600160a01b0383166124b25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e37565b6001600160a01b0382166125135760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e37565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166125d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e37565b6001600160a01b03821661263a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e37565b6000811161269c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e37565b6001600160a01b03831660009081526012602052604090205460ff16156126c257600080fd5b601a54600160c01b900460ff1615612701576001600160a01b0383163014806126f857506000546001600160a01b038481169116145b61270157600080fd5b6001600160a01b03831660009081526014602052604090205460ff16612951577f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c6001600160a01b0316826001600160a01b031614801561276b5750601a54600160a81b900460ff165b1561278357612779836123c4565b1561278357600080fd5b7f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c6001600160a01b0316836001600160a01b031614156127c857600f805460ff191690555b6000546001600160a01b0383811691161461284057601c548111156128405760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610e37565b6001600160a01b03831660009081526013602052604090205460ff16612951576001600160a01b0383166000908152601160205260409020544314156128a4576001600160a01b0383166000908152601260205260409020805460ff191660011790555b6001600160a01b03831660009081526010602052604090205442906128ca906014613405565b1180156128f057506001600160a01b03831660009081526012602052604090205460ff16155b156129285760405162461bcd60e51b815260206004820152600860248201526729b637bbb237bbb760c11b6044820152606401610e37565b6001600160a01b0383166000908152601160209081526040808320439055601090915290204290555b601a805460ff60a01b191690557f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c6001600160a01b0390811690841614156129a757601a805460ff60a01b1916600160a01b1790555b7f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c6001600160a01b0316826001600160a01b031614156129f557601a805460ff60a01b1916600160a11b1790555b306000908152600460205260408120549050612a1381601d54612b3c565b601d5490915081108015908190612a345750601b54600160a01b900460ff16155b8015612a7257507f000000000000000000000000778439499111b12a2d91cd09ecf7bc68dcef614c6001600160a01b0316856001600160a01b031614155b8015612a875750601b54600160a81b900460ff165b8015612a9c5750601a54600160b01b900460ff165b15612aaa57612aaa82612b54565b6001600160a01b03851660009081526005602052604090205460019060ff1680612aec57506001600160a01b03851660009081526005602052604090205460ff165b15612af5575060005b6001600160a01b03861660009081526012602052604090205460ff16612b2657612b2186868684612bd9565b612b34565b612b34868660016000612bd9565b505050505050565b6000818310612b4b5781612b4d565b825b9392505050565b601b805460ff60a01b1916600160a01b179055601a548190600160c81b900460ff1615612bbf576005612b8882600461343f565b612b92919061341d565b90506000612ba0828461345e565b601854909150612bbd9030906001600160a01b0316836000612bd9565b505b612bc881612e10565b5050601b805460ff60a01b19169055565b80612be657612be6612f42565b600080600080612bf586612f87565b9350935093509350808284600754612c0d9190613405565b612c179190613405565b612c219190613405565b600755601a54600090600160c81b900460ff1615612c9c5760006064600e5485612c4b919061343f565b612c55919061341d565b905060006064600e5487612c69919061343f565b612c73919061341d565b9050612c7f828661345e565b9450612c8b818761345e565b9550612c978183613405565b925050505b6001600160a01b038916600090815260046020526040902054612cc090889061345e565b6001600160a01b03808b1660009081526004602052604080822093909355908a1681522054612cf0908690613405565b6001600160a01b0389166000908152600460205260408082209290925530815220548390612d1f908690613405565b612d299190613405565b3060009081526004602052604080822092909255601b546001600160a01b031681522054612d58908390613405565b601b546001600160a01b039081166000908152600460205260408082209390935560185490911681522054612d8e908290613405565b6018546001600160a01b0390811660009081526004602090815260409182902093909355518781528a821692918c16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a385612e0557612e05600954600855600b54600a55600d54600c55565b505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e4557612e4561348b565b6001600160a01b039283166020918202929092010152601954825191169082906001908110612e7657612e7661348b565b6001600160a01b0392831660209182029290920101526017547f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8216916338ed1739918591600091869116612ecc4260b4613405565b6040518663ffffffff1660e01b8152600401612eec959493929190613394565b600060405180830381600087803b158015612f0657600080fd5b505af1158015612f1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261203c9190810190613142565b600854158015612f525750600a54155b8015612f5e5750600c54155b15612f6557565b60088054600955600a8054600b55600c8054600d556000928390559082905555565b6000806000806000612f9886612fe6565b90506000612fa587613027565b90506000612fb288613057565b905060008183612fc2868c61345e565b612fcc919061345e565b612fd6919061345e565b9993985091965094509092505050565b600f5460009060ff16613007575050600f805460ff19166001179055600090565b606460085483613017919061343f565b613021919061341d565b92915050565b601a54600090600160a01b900460ff166001141561304f576064600a5483613017919061343f565b506000919050565b600c546000901561304f576064600c5483613017919061343f565b80356001600160a01b038116811461308957600080fd5b919050565b6000602082840312156130a057600080fd5b612b4d82613072565b600080604083850312156130bc57600080fd5b6130c583613072565b91506130d360208401613072565b90509250929050565b6000806000606084860312156130f157600080fd5b6130fa84613072565b925061310860208501613072565b9150604084013590509250925092565b6000806040838503121561312b57600080fd5b61313483613072565b946020939093013593505050565b6000602080838503121561315557600080fd5b825167ffffffffffffffff8082111561316d57600080fd5b818501915085601f83011261318157600080fd5b815181811115613193576131936134a1565b8060051b604051601f19603f830116810181811085821117156131b8576131b86134a1565b604052828152858101935084860182860187018a10156131d757600080fd5b600095505b838610156131fa5780518552600195909501949386019386016131dc565b5098975050505050505050565b60006020828403121561321957600080fd5b8135612b4d816134b7565b60006020828403121561323657600080fd5b8151612b4d816134b7565b60006020828403121561325357600080fd5b5035919050565b60006020828403121561326c57600080fd5b5051919050565b6000806040838503121561328657600080fd5b50508035926020909101359150565b600080604083850312156132a857600080fd5b505080516020909101519092909150565b6000806000606084860312156132ce57600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156132f957600080fd5b813560ff81168114612b4d57600080fd5b600060208083528351808285015260005b818110156133375785810183015185820160400152820161331b565b81811115613349576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133e45784516001600160a01b0316835293830193918301916001016133bf565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561341857613418613475565b500190565b60008261343a57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561345957613459613475565b500290565b60008282101561347057613470613475565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461166957600080fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a2646970667358221220b029cdd7baafb6e8ac74698c2e11e9326d030586401ae58394d228f3caeaf16164736f6c63430008060033

Deployed Bytecode Sourcemap

19118:16675:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25076:483;;;;;;;;;;;;;:::i;:::-;;20537:28;;;;;;;;;;-1:-1:-1;20537:28:0;;;;-1:-1:-1;;;20537:28:0;;;;;;;;;7033:14:1;;7026:22;7008:41;;6996:2;6981:18;20537:28:0;;;;;;;;22992:74;;;;;;;;;;-1:-1:-1;23056:5:0;;;;;;;;;;;;-1:-1:-1;;;23056:5:0;;;;22992:74;;;;;;;:::i;24338:146::-;;;;;;;;;;-1:-1:-1;24338:146:0;;;;;:::i;:::-;;:::i;20489:19::-;;;;;;;;;;-1:-1:-1;20489:19:0;;;;-1:-1:-1;;;20489:19:0;;;;;;;;;15349:4:1;15337:17;;;15319:36;;15307:2;15292:18;20489:19:0;15274:87:1;28240:79:0;;;;;;;;;;;;;:::i;23582:78::-;;;;;;;;;;-1:-1:-1;23645:10:0;;23582:78;;;14156:25:1;;;14144:2;14129:18;23582:78:0;14111:76:1;20349:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4483:32:1;;;4465:51;;4453:2;4438:18;20349:51:0;4420:102:1;23233:91:0;;;;;;;;;;-1:-1:-1;23307:12:0;;23233:91;;20122:52;;;;;;;;;;-1:-1:-1;20122:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20512:21;;;;;;;;;;-1:-1:-1;20512:21:0;;;;-1:-1:-1;;;20512:21:0;;;;;;24489:246;;;;;;;;;;-1:-1:-1;24489:246:0;;;;;:::i;:::-;;:::i;23154:74::-;;;;;;;;;;-1:-1:-1;19585:1:0;23154:74;;20645:29;;;;;;;;;;-1:-1:-1;20645:29:0;;;;-1:-1:-1;;;20645:29:0;;;;;;27028:113;;;;;;;;;;-1:-1:-1;27028:113:0;;;;;:::i;:::-;;:::i;27229:74::-;;;;;;;;;;;;;:::i;22763:118::-;;;;;;;;;;;;;:::i;25564:102::-;;;;;;;;;;-1:-1:-1;25564:102:0;;;;;:::i;:::-;;:::i;20609:32::-;;;;;;;;;;-1:-1:-1;20609:32:0;;;;-1:-1:-1;;;20609:32:0;;;;;;27308:124;;;;;;;;;;-1:-1:-1;27308:124:0;;;;;:::i;:::-;;:::i;29373:561::-;;;;;;;;;;;;;:::i;20445:38::-;;;;;;;;;;;;;;;20404:37;;;;;;;;;;-1:-1:-1;20404:37:0;;;;-1:-1:-1;;;;;20404:37:0;;;20784:40;;;;;;;;;;-1:-1:-1;20784:40:0;;;;-1:-1:-1;;;20784:40:0;;;;;;26512:263;;;;;;;;;;-1:-1:-1;26512:263:0;;;;;:::i;:::-;;:::i;23808:114::-;;;;;;;;;;-1:-1:-1;23808:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;23890:27:0;23872:4;23890:27;;;:18;:27;;;;;;;;;23808:114;27437:99;;;;;;;;;;-1:-1:-1;27437:99:0;;;;;:::i;:::-;;:::i;24827:244::-;;;;;;;;;;-1:-1:-1;24827:244:0;;;;;:::i;:::-;;:::i;19894:26::-;;;;;;;;;;-1:-1:-1;19894:26:0;;;;;;;;23665:138;;;;;;;;;;;;;:::i;23329:109::-;;;;;;;;;;-1:-1:-1;23329:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;23416:17:0;23395:7;23416:17;;;:8;:17;;;;;;;23329:109;20680:71;;;;;;;;;;-1:-1:-1;20680:71:0;;;;-1:-1:-1;;;;;20680:71:0;;;17741:148;;;;;;;;;;;;;:::i;20830:47::-;;;;;;;;;;;;;;;;28553:133;;;;;;;;;;-1:-1:-1;28553:133:0;;;;;:::i;:::-;;:::i;27802:99::-;;;;;;;;;;-1:-1:-1;27802:99:0;;;;;:::i;:::-;;:::i;17098:79::-;;;;;;;;;;-1:-1:-1;17136:7:0;17163:6;-1:-1:-1;;;;;17163:6:0;17098:79;;25926:139;;;;;;;;;;-1:-1:-1;25926:139:0;;;;;:::i;:::-;;:::i;19975:45::-;;;;;;;;;;-1:-1:-1;19975:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;23071:78;;;;;;;;;;-1:-1:-1;23137:7:0;;;;;;;;;;;;-1:-1:-1;;;23137:7:0;;;;23071:78;;27146:77;;;;;;;;;;;;;:::i;20073:45::-;;;;;;;;;;-1:-1:-1;20073:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22887:100;;;;;;;;;;-1:-1:-1;22975:4:0;22935:7;23416:17;;;:8;:17;;;;;;22887:100;;25777:144;;;;;;;;;;-1:-1:-1;25777:144:0;;;;;:::i;:::-;;:::i;18763:344::-;;;;;;;;;;;;;:::i;20178:29::-;;;;;;;;;;-1:-1:-1;20178:29:0;;;;-1:-1:-1;;;;;20178:29:0;;;28119:116;;;;;;;;;;-1:-1:-1;28119:116:0;;;;;:::i;:::-;;:::i;24181:152::-;;;;;;;;;;-1:-1:-1;24181:152:0;;;;;:::i;:::-;;:::i;27974:140::-;;;;;;;;;;-1:-1:-1;27974:140:0;;;;;:::i;:::-;;:::i;20571:34::-;;;;;;;;;;-1:-1:-1;20571:34:0;;;;-1:-1:-1;;;20571:34:0;;;;;;18296:89;;;;;;;;;;-1:-1:-1;18368:9:0;;18296:89;;19682:32;;;;;;;;;;;;;;;;19773:27;;;;;;;;;;;;;;;;19926:45;;;;;;;;;;-1:-1:-1;19926:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;26351:156;;;;;;;;;;-1:-1:-1;26351:156:0;;;;;:::i;:::-;;:::i;26071:140::-;;;;;;;;;;-1:-1:-1;26071:140:0;;;;;:::i;:::-;;:::i;20211:35::-;;;;;;;;;;-1:-1:-1;20211:35:0;;;;-1:-1:-1;;;;;20211:35:0;;;20881:60;;;;;;;;;;;;;;;;19854:32;;;;;;;;;;;;;;;;26216:130;;;;;;;;;;-1:-1:-1;26216:130:0;;;;;:::i;:::-;;:::i;26781:242::-;;;;;;;;;;-1:-1:-1;26781:242:0;;;;;:::i;:::-;;:::i;28691:677::-;;;;;;;;;;-1:-1:-1;28691:677:0;;;;;:::i;:::-;;:::i;18461:226::-;;;;;;;;;;-1:-1:-1;18461:226:0;;;;;:::i;:::-;;:::i;23443:134::-;;;;;;;;;;-1:-1:-1;23443:134:0;;;;;:::i;:::-;-1:-1:-1;;;;;23545:18:0;;;23524:7;23545:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23443:134;20325:18;;;;;;;;;;-1:-1:-1;20325:18:0;;;;-1:-1:-1;;;;;20325:18:0;;;27673:124;;;;;;;;;;-1:-1:-1;27673:124:0;;;;;:::i;:::-;;:::i;20250:30::-;;;;;;;;;;-1:-1:-1;20250:30:0;;;;-1:-1:-1;;;;;20250:30:0;;;25671:101;;;;;;;;;;-1:-1:-1;25671:101:0;;;;;:::i;:::-;;:::i;19592:32::-;;;;;;;;;;;;;;;;28324:223;;;;;;;;;;;;;:::i;33241:95::-;;;;;;;;;;-1:-1:-1;33241:95:0;;;;;:::i;:::-;;:::i;20284:37::-;;;;;;;;;;-1:-1:-1;20284:37:0;;;;-1:-1:-1;;;;;20284:37:0;;;18044:244;;;;;;;;;;-1:-1:-1;18044:244:0;;;;;:::i;:::-;;:::i;20024:45::-;;;;;;;;;;-1:-1:-1;20024:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23927:190;;;;;;;;;;-1:-1:-1;23927:190:0;;;;;:::i;:::-;;:::i;25076:483::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;;;;;;;;;25141:13:::1;::::0;;-1:-1:-1;;;25141:13:0::1;-1:-1:-1::0;;;25141:13:0;;::::1;::::0;::::1;25140:14;25124:30;-1:-1:-1::0;;;;25124:30:0;::::1;::::0;::::1;25171:8:::0;;::::1;::::0;;::::1;25170:9;25159:20:::0;;::::1;-1:-1:-1::0;;;;25159:20:0;;;-1:-1:-1;;;;25159:20:0;;;;;;;::::1;::::0;;25208:15:::1;::::0;25184:53:::1;::::0;25201:4:::1;::::0;-1:-1:-1;;;;;25208:15:0::1;-1:-1:-1::0;;25184:8:0::1;:53::i;:::-;25242;25259:4;25266:13;-1:-1:-1::0;;25242:8:0::1;:53::i;:::-;25324:22;::::0;25300:60:::1;::::0;25317:4:::1;::::0;-1:-1:-1;;;;;25324:22:0::1;-1:-1:-1::0;;25300:8:0::1;:60::i;:::-;25393:3;::::0;25403:42:::1;::::0;-1:-1:-1;;;25403:42:0;;-1:-1:-1;;;;;25417:13:0::1;6781:32:1::0;;25403:42:0::1;::::0;::::1;6763:51:1::0;-1:-1:-1;;6830:18:1;;;6823:34;25393:3:0;;::::1;::::0;;;25403:12:::1;::::0;6736:18:1;;25403:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25464:22:0::1;::::0;25450:53:::1;::::0;-1:-1:-1;;;25450:53:0;;-1:-1:-1;;;;;25464:22:0;;::::1;25450:53;::::0;::::1;6763:51:1::0;-1:-1:-1;;6830:18:1;;;6823:34;25450:12:0;;::::1;::::0;::::1;::::0;6736:18:1;;25450:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25522:15:0::1;::::0;25508:46:::1;::::0;-1:-1:-1;;;25508:46:0;;-1:-1:-1;;;;;25522:15:0;;::::1;25508:46;::::0;::::1;6763:51:1::0;-1:-1:-1;;6830:18:1;;;6823:34;25508:12:0;;::::1;::::0;::::1;::::0;6736:18:1;;25508:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25119:440;25076:483::o:0;24338:146::-;24413:4;24424:39;9600:10;24447:7;24456:6;24424:8;:39::i;:::-;-1:-1:-1;24475:4:0;24338:146;;;;:::o;28240:79::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;28304:10:::1;::::0;;-1:-1:-1;;;;28290:24:0;::::1;-1:-1:-1::0;;;28304:10:0;;;::::1;;;28303:11;28290:24:::0;;::::1;;::::0;;28240:79::o;24489:246::-;-1:-1:-1;;;;;24629:19:0;;24587:4;24629:19;;;:11;:19;;;;;;;;9600:10;24629:33;;;;;;;;24598:75;;24607:6;;24629:42;;24665:6;;24629:42;:::i;:::-;24598:8;:75::i;:::-;24678:36;24688:6;24696:9;24707:6;24678:9;:36::i;:::-;-1:-1:-1;24726:4:0;24489:246;;;;;:::o;27028:113::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;27123:13:::1;:4:::0;27130:6:::1;27123:13;:::i;:::-;27091:29;:45:::0;-1:-1:-1;27028:113:0:o;27229:74::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;27290:8:::1;::::0;;-1:-1:-1;;;;27278:20:0;::::1;-1:-1:-1::0;;;27290:8:0;;;::::1;;;27289:9;27278:20:::0;;::::1;;::::0;;27229:74::o;22763:118::-;22809:4;22846:29;;22827:16;22975:4;22935:7;23416:17;;;:8;:17;;;;;;;22887:100;22827:16;:48;22820:55;;22763:118;:::o;25564:102::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25627:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;25627:34:0::1;25657:4;25627:34;::::0;;25564:102::o;27308:124::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27371:18:0::1;27392:5;27371:18:::0;;;:9:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;27371:26:0;;::::1;::::0;;;27402:9:::1;:18:::0;;;;;;:25;;;;::::1;27371:26:::0;27402:25:::1;::::0;;27308:124::o;29373:561::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;29416:7:::1;:15:::0;;-1:-1:-1;;29416:15:0::1;::::0;;29512:39:::1;::::0;-1:-1:-1;;;29512:39:0;;29545:4:::1;29512:39;::::0;::::1;4465:51:1::0;29471:13:0::1;::::0;-1:-1:-1;;;;;;;29512:24:0;::::1;::::0;::::1;::::0;4438:18:1;;29512:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29586:16;::::0;29491:60;;-1:-1:-1;29556:13:0::1;::::0;29607:3:::1;::::0;29573:29:::1;::::0;-1:-1:-1;;;29586:16:0;::::1;;;29491:60:::0;29573:29:::1;:::i;:::-;29572:38;;;;:::i;:::-;29619:57;::::0;-1:-1:-1;;;29619:57:0;;-1:-1:-1;;;;;29651:15:0::1;6781:32:1::0;;29619:57:0::1;::::0;::::1;6763:51:1::0;6830:18;;;6823:34;;;;;-1:-1:-1;29619:22:0;;::::1;::::0;::::1;::::0;6736:18:1;;29619:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;29737:3:0::1;::::0;29771:15:::1;::::0;-1:-1:-1;;;;;29681:15:0::1;:31:::0;::::1;::::0;::::1;::::0;29726:4:::1;::::0;29737:3;;::::1;::::0;29746:5;;29737:3:::1;::::0;;;29771:15:::1;29792:27;:15;29810:9;29792:27;:::i;:::-;29681:143;::::0;::::1;::::0;;;-1:-1:-1;;;;;;29681:143:0;;;-1:-1:-1;;;;;5518:15:1;;;29681:143:0::1;::::0;::::1;5500:34:1::0;5570:15;;;5550:18;;;5543:43;5602:18;;;5595:34;;;;5645:18;;;5638:34;;;;5688:19;;;5681:35;5753:15;;;5732:19;;;5725:44;5785:19;;;5778:35;;;;5434:19;;29681:143:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;29883:15:0::1;::::0;29905:24:::1;::::0;;-1:-1:-1;;;29905:24:0;;;;-1:-1:-1;;;;;29883:15:0;;::::1;::::0;;;29905:22:::1;::::0;:24:::1;::::0;;::::1;::::0;29830:32:::1;::::0;29905:24;;;;;;;29830:32;29883:15;29905:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29411:523;;;;29373:561::o:0;26512:263::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26595:22:0;::::1;26587:73;;;::::0;-1:-1:-1;;;26587:73:0;;8502:2:1;26587:73:0::1;::::0;::::1;8484:21:1::0;8541:2;8521:18;;;8514:30;8580:34;8560:18;;;8553:62;-1:-1:-1;;;8631:18:1;;;8624:36;8677:19;;26587:73:0::1;8474:228:1::0;26587:73:0::1;26665:22;:33:::0;;-1:-1:-1;;;;;;26665:33:0::1;-1:-1:-1::0;;;;;26665:33:0;::::1;;::::0;;26703:26:::1;26665:33:::0;26703:14:::1;:26::i;:::-;26734:36;26761:8;26734:26;:36::i;:::-;26512:263:::0;:::o;27437:99::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27505:18:0::1;27526:5;27505:18:::0;;;:9:::1;:18;::::0;;;;:26;;-1:-1:-1;;27505:26:0::1;::::0;;27437:99::o;24827:244::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24905:22:0;::::1;24897:66;;;::::0;-1:-1:-1;;;24897:66:0;;11600:2:1;24897:66:0::1;::::0;::::1;11582:21:1::0;11639:2;11619:18;;;11612:30;11678:33;11658:18;;;11651:61;11729:18;;24897:66:0::1;11572:181:1::0;24897:66:0::1;24968:15;:26:::0;;-1:-1:-1;;;;;;24968:26:0::1;-1:-1:-1::0;;;;;24968:26:0;::::1;;::::0;;24999::::1;24968::::0;24999:14:::1;:26::i;23665:138::-:0;23770:28;;-1:-1:-1;;;23770:28:0;;23792:4;23770:28;;;4465:51:1;23709:7:0;;23744:13;;-1:-1:-1;;;;;23770:13:0;;;;;4438:18:1;;23770:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23763:35;;;23665:138;:::o;17741:148::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;17848:1:::1;17832:6:::0;;17811:40:::1;::::0;-1:-1:-1;;;;;17832:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;17811:40:0;17848:1;;17811:40:::1;17879:1;17862:19:::0;;-1:-1:-1;;;;;;17862:19:0::1;::::0;;17741:148::o;28553:133::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;28637:1:::1;28630:5;:8;;;:21;;;;;28649:2;28642:5;:9;;;28630:21;28620:32;;;::::0;::::1;;28657:16;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;28657:24:0::1;-1:-1:-1::0;;;;28657:24:0;;::::1;::::0;;;::::1;::::0;;28553:133::o;27802:99::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27870:18:0::1;27891:5;27870:18:::0;;;:9:::1;:18;::::0;;;;:26;;-1:-1:-1;;27870:26:0::1;::::0;;27802:99::o;25926:139::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;26013:2:::1;26004:6;:11;25994:40;;;::::0;-1:-1:-1;;;25994:40:0;;12771:2:1;25994:40:0::1;::::0;::::1;12753:21:1::0;12810:2;12790:18;;;12783:30;-1:-1:-1;;;12829:18:1;;;12822:42;12881:18;;25994:40:0::1;12743:162:1::0;25994:40:0::1;26039:12;:21:::0;25926:139::o;27146:77::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;27209:9:::1;::::0;;-1:-1:-1;;;;27196:22:0;::::1;-1:-1:-1::0;;;27209:9:0;;;::::1;;;27208:10;27196:22:::0;;::::1;;::::0;;27146:77::o;25777:144::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;25867:2:::1;25857:7;:12;25847:41;;;::::0;-1:-1:-1;;;25847:41:0;;12771:2:1;25847:41:0::1;::::0;::::1;12753:21:1::0;12810:2;12790:18;;;12783:30;-1:-1:-1;;;12829:18:1;;;12822:42;12881:18;;25847:41:0::1;12743:162:1::0;25847:41:0::1;25893:13;:23:::0;25777:144::o;18763:344::-;18815:14;;-1:-1:-1;;;;;18815:14:0;18833:10;18815:28;18807:76;;;;-1:-1:-1;;;18807:76:0;;13808:2:1;18807:76:0;;;13790:21:1;13847:2;13827:18;;;13820:30;13886:34;13866:18;;;13859:62;-1:-1:-1;;;13937:18:1;;;13930:33;13980:19;;18807:76:0;13780:225:1;18807:76:0;18921:9;;18903:15;:27;18894:73;;;;-1:-1:-1;;;18894:73:0;;13112:2:1;18894:73:0;;;13094:21:1;13151:2;13131:18;;;13124:30;13190:33;13170:18;;;13163:61;13241:18;;18894:73:0;13084:181:1;18894:73:0;19012:14;;;19004:6;;18983:44;;-1:-1:-1;;;;;19012:14:0;;;;19004:6;;;;-1:-1:-1;;;;;;;;;;;18983:44:0;;19047:14;;;;19038:23;;-1:-1:-1;;;;;;19038:23:0;;;-1:-1:-1;;;;;19047:14:0;;19038:23;;;;19072:27;;;18763:344::o;28119:116::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28197:25:0::1;28225:5;28197:25:::0;;;:16:::1;:25;::::0;;;;:33;;-1:-1:-1;;28197:33:0::1;::::0;;28119:116::o;24181:152::-;24259:4;24270:42;9600:10;24294:9;24305:6;24270:9;:42::i;27974:140::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28049:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;:32;;-1:-1:-1;;28049:32:0::1;28077:4;28049:32;::::0;;28086:23:::1;28066:7:::0;28086:14:::1;:23::i;26351:156::-:0;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;26422:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;26422:32:0::1;-1:-1:-1::0;;;;26422:32:0;;::::1;;::::0;;26464:38:::1;::::0;::::1;::::0;::::1;::::0;26446:8;7033:14:1;7026:22;7008:41;;6996:2;6981:18;;6963:92;26464:38:0::1;;;;;;;;26351:156:::0;:::o;26071:140::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;26161:2:::1;26151:7;:12;26141:42;;;::::0;-1:-1:-1;;;26141:42:0;;9719:2:1;26141:42:0::1;::::0;::::1;9701:21:1::0;9758:2;9738:18;;;9731:30;-1:-1:-1;;;9777:18:1;;;9770:43;9830:18;;26141:42:0::1;9691:163:1::0;26141:42:0::1;26188:8;:18:::0;26071:140::o;26216:130::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;26336:5:::1;26320:12;26305;;:27;;;;:::i;:::-;26304:37;;;;:::i;:::-;26289:12;:52:::0;-1:-1:-1;26216:130:0:o;26781:242::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26859:22:0;::::1;26851:65;;;::::0;-1:-1:-1;;;26851:65:0;;10470:2:1;26851:65:0::1;::::0;::::1;10452:21:1::0;10509:2;10489:18;;;10482:30;10548:32;10528:18;;;10521:60;10598:18;;26851:65:0::1;10442:180:1::0;26851:65:0::1;26921:14;:25:::0;;-1:-1:-1;;;;;;26921:25:0::1;-1:-1:-1::0;;;;;26921:25:0;::::1;;::::0;;26951:26:::1;26921:25:::0;26951:14:::1;:26::i;28691:677::-:0;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;28831:53:::1;28843:10;28863:4;28871:11;28831:9;:53::i;:::-;28889:62;28906:4;28921:15;28939:11;28889:8;:62::i;:::-;28983:3;::::0;28993:51:::1;::::0;-1:-1:-1;;;28993:51:0;;-1:-1:-1;;;;;29016:15:0::1;6781:32:1::0;;28993:51:0::1;::::0;::::1;6763::1::0;6830:18;;;6823:34;;;28983:3:0;;::::1;::::0;;;28993:12:::1;::::0;6736:18:1;;28993:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;29049:59:0::1;::::0;-1:-1:-1;;;29049:59:0;;29069:10:::1;29049:59;::::0;::::1;4991:34:1::0;29089:4:0::1;5041:18:1::0;;;5034:43;5093:18;;;5086:34;;;-1:-1:-1;;;;;29049:17:0;::::1;::::0;::::1;::::0;4926:18:1;;29049:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;29194:3:0::1;::::0;29141:201:::1;::::0;-1:-1:-1;;;29141:201:0;;29183:4:::1;29141:201;::::0;::::1;6221:34:1::0;;;-1:-1:-1;;;;;29194:3:0;;::::1;6271:18:1::0;;;6264:43;6323:18;;;6316:34;;;6366:18;;;6359:34;;;29194:3:0::1;6409:19:1::0;;;6402:35;;;6453:19;;;6446:35;6497:19;;;6490:44;29322:15:0::1;6550:19:1::0;;;6543:35;29141:15:0::1;:28:::0;;::::1;::::0;::::1;::::0;6155:19:1;;29141:201:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29347:16;:14;:16::i;:::-;28765:603;28691:677:::0;;:::o;18461:226::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;18542:6:::1;::::0;;;18525:23;;-1:-1:-1;;;;;;18525:23:0;;::::1;-1:-1:-1::0;;;;;18542:6:0;::::1;18525:23;::::0;;;18559:19:::1;::::0;;18601:22:::1;18619:4:::0;18601:15:::1;:22;:::i;:::-;18589:9;:34:::0;18676:1:::1;18660:6:::0;;18639:40:::1;::::0;-1:-1:-1;;;;;18660:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;18639:40:0;18676:1;;18639:40:::1;18461:226:::0;:::o;27673:124::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27736:18:0::1;27757:5;27736:18:::0;;;:9:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;27736:26:0;;::::1;::::0;;;27767:9:::1;:18:::0;;;;;;:25;;;;::::1;27736:26:::0;27767:25:::1;::::0;;27673:124::o;25671:101::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25732:27:0::1;25762:5;25732:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;25732:35:0::1;::::0;;25671:101::o;28324:223::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;28449:39:::1;::::0;-1:-1:-1;;;28449:39:0;;28482:4:::1;28449:39;::::0;::::1;4465:51:1::0;28408:13:0::1;::::0;28375:21:::1;::::0;-1:-1:-1;;;;;28449:24:0;::::1;::::0;::::1;::::0;4438:18:1;;28449:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28493:49;::::0;-1:-1:-1;;;28493:49:0;;28518:10:::1;28493:49;::::0;::::1;6763:51:1::0;6830:18;;;6823:34;;;28428:60:0;;-1:-1:-1;;;;;;28493:23:0;::::1;::::0;::::1;::::0;6736:18:1;;28493:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33241:95::-:0;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;33310:12:::1;:21:::0;33241:95::o;18044:244::-;17310:6;;-1:-1:-1;;;;;17310:6:0;9600:10;17310:22;17302:67;;;;-1:-1:-1;;;17302:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18133:22:0;::::1;18125:73;;;::::0;-1:-1:-1;;;18125:73:0;;8909:2:1;18125:73:0::1;::::0;::::1;8891:21:1::0;8948:2;8928:18;;;8921:30;8987:34;8967:18;;;8960:62;-1:-1:-1;;;9038:18:1;;;9031:36;9084:19;;18125:73:0::1;8881:228:1::0;18125:73:0::1;18235:6;::::0;;18214:38:::1;::::0;-1:-1:-1;;;;;18214:38:0;;::::1;::::0;18235:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;18214:38:0;::::1;18263:6;:17:::0;;-1:-1:-1;;;;;;18263:17:0::1;-1:-1:-1::0;;;;;18263:17:0;;;::::1;::::0;;;::::1;::::0;;18044:244::o;23927:190::-;24025:3;;24056:25;;-1:-1:-1;;;24056:25:0;;-1:-1:-1;;;;;4483:32:1;;;24056:25:0;;;4465:51:1;23994:4:0;;24025:3;;23994:4;;24025:3;;24056:14;;4438:18:1;;24056:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24095:15;;;23927:190;-1:-1:-1;;;;23927:190:0:o;29939:310::-;-1:-1:-1;;;;;30026:19:0;;30018:68;;;;-1:-1:-1;;;30018:68:0;;12366:2:1;30018:68:0;;;12348:21:1;12405:2;12385:18;;;12378:30;12444:34;12424:18;;;12417:62;-1:-1:-1;;;12495:18:1;;;12488:34;12539:19;;30018:68:0;12338:226:1;30018:68:0;-1:-1:-1;;;;;30099:21:0;;30091:68;;;;-1:-1:-1;;;30091:68:0;;9316:2:1;30091:68:0;;;9298:21:1;9355:2;9335:18;;;9328:30;9394:34;9374:18;;;9367:62;-1:-1:-1;;;9445:18:1;;;9438:32;9487:19;;30091:68:0;9288:224:1;30091:68:0;-1:-1:-1;;;;;30166:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30212:32;;14156:25:1;;;30212:32:0;;14129:18:1;30212:32:0;;;;;;;29939:310;;;:::o;30315:2155::-;-1:-1:-1;;;;;30410:18:0;;30402:68;;;;-1:-1:-1;;;30402:68:0;;11960:2:1;30402:68:0;;;11942:21:1;11999:2;11979:18;;;11972:30;12038:34;12018:18;;;12011:62;-1:-1:-1;;;12089:18:1;;;12082:35;12134:19;;30402:68:0;11932:227:1;30402:68:0;-1:-1:-1;;;;;30483:16:0;;30475:64;;;;-1:-1:-1;;;30475:64:0;;8098:2:1;30475:64:0;;;8080:21:1;8137:2;8117:18;;;8110:30;8176:34;8156:18;;;8149:62;-1:-1:-1;;;8227:18:1;;;8220:33;8270:19;;30475:64:0;8070:225:1;30475:64:0;30561:1;30552:6;:10;30544:64;;;;-1:-1:-1;;;30544:64:0;;11190:2:1;30544:64:0;;;11172:21:1;11229:2;11209:18;;;11202:30;11268:34;11248:18;;;11241:62;-1:-1:-1;;;11319:18:1;;;11312:39;11368:19;;30544:64:0;11162:231:1;30544:64:0;-1:-1:-1;;;;;30622:15:0;;;;;;:9;:15;;;;;;;;30621:16;30613:25;;;;;;30647:13;;-1:-1:-1;;;30647:13:0;;;;30643:69;;;-1:-1:-1;;;;;30671:21:0;;30687:4;30671:21;;:40;;-1:-1:-1;17136:7:0;17163:6;-1:-1:-1;;;;;30696:15:0;;;17163:6;;30696:15;30671:40;30662:50;;;;;;-1:-1:-1;;;;;30724:22:0;;;;;;:16;:22;;;;;;;;30719:541;;30763:13;-1:-1:-1;;;;;30757:19:0;:2;-1:-1:-1;;;;;30757:19:0;;:32;;;;-1:-1:-1;30780:9:0;;-1:-1:-1;;;30780:9:0;;;;30757:32;30754:73;;;30802:23;30820:4;30802:17;:23::i;:::-;30801:24;30791:36;;;;;;30844:13;-1:-1:-1;;;;;30836:21:0;:4;-1:-1:-1;;;;;30836:21:0;;30833:41;;;30859:7;:15;;-1:-1:-1;;30859:15:0;;;30833:41;17136:7;17163:6;-1:-1:-1;;;;;30883:13:0;;;17163:6;;30883:13;30880:98;;30921:12;;30911:6;:22;;30903:75;;;;-1:-1:-1;;;30903:75:0;;10061:2:1;30903:75:0;;;10043:21:1;10100:2;10080:18;;;10073:30;10139:34;10119:18;;;10112:62;-1:-1:-1;;;10190:18:1;;;10183:38;10238:19;;30903:75:0;10033:230:1;30903:75:0;-1:-1:-1;;;;;30991:15:0;;;;;;:9;:15;;;;;;;;30986:269;;-1:-1:-1;;;;;31019:15:0;;;;;;:9;:15;;;;;;31038:12;31019:31;31015:59;;;-1:-1:-1;;;;;31052:15:0;;;;;;:9;:15;;;;;:22;;-1:-1:-1;;31052:22:0;31070:4;31052:22;;;31015:59;-1:-1:-1;;;;;31085:15:0;;;;;;:9;:15;;;;;;31116;;31085:28;;31103:10;31085:28;:::i;:::-;:46;:66;;;;-1:-1:-1;;;;;;31136:15:0;;;;;;:9;:15;;;;;;;;31135:16;31085:66;31081:90;;;31153:18;;-1:-1:-1;;;31153:18:0;;13472:2:1;31153:18:0;;;13454:21:1;13511:1;13491:18;;;13484:29;-1:-1:-1;;;13529:18:1;;;13522:38;13577:18;;31153::0;13444:157:1;31081:90:0;-1:-1:-1;;;;;31178:15:0;;;;;;:9;:15;;;;;;;;31196:12;31178:30;;31215:9;:15;;;;;31233;31215:33;;30986:269;31266:6;:10;;-1:-1:-1;;;;31266:10:0;;;31294:13;-1:-1:-1;;;;;31286:21:0;;;;;;;31283:36;;;31309:6;:10;;-1:-1:-1;;;;31309:10:0;-1:-1:-1;;;31309:10:0;;;31283:36;31333:13;-1:-1:-1;;;;;31327:19:0;:2;-1:-1:-1;;;;;31327:19:0;;31324:34;;;31348:6;:10;;-1:-1:-1;;;;31348:10:0;-1:-1:-1;;;31348:10:0;;;31324:34;31674:4;31625:28;23416:17;;;:8;:17;;;;;;31625:55;;31708:61;31717:20;31739:29;;31708:8;:61::i;:::-;31825:29;;31685:84;;-1:-1:-1;31801:53:0;;;;;;;31868:44;;-1:-1:-1;31896:16:0;;-1:-1:-1;;;31896:16:0;;;;31895:17;31868:44;:73;;;;;31928:13;-1:-1:-1;;;;;31920:21:0;:4;-1:-1:-1;;;;;31920:21:0;;;31868:73;:102;;;;-1:-1:-1;31949:21:0;;-1:-1:-1;;;31949:21:0;;;;31868:102;:118;;;;-1:-1:-1;31978:8:0;;-1:-1:-1;;;31978:8:0;;;;31868:118;31859:173;;;31998:28;32005:20;31998:6;:28::i;:::-;-1:-1:-1;;;;;32204:24:0;;32095:12;32204:24;;;:18;:24;;;;;;32110:4;;32204:24;;;:50;;-1:-1:-1;;;;;;32232:22:0;;;;;;:18;:22;;;;;;;;32204:50;32201:81;;;-1:-1:-1;32271:5:0;32201:81;-1:-1:-1;;;;;32355:15:0;;;;;;:9;:15;;;;;;;;32350:115;;32376:41;32391:4;32397:2;32401:6;32409:7;32376:14;:41::i;:::-;32350:115;;;32431:34;32446:4;32452:2;32456:1;32459:5;32431:14;:34::i;:::-;30397:2073;;;30315:2155;;;:::o;413:106::-;471:7;502:1;498;:5;:13;;510:1;498:13;;;506:1;498:13;491:20;413:106;-1:-1:-1;;;413:106:0:o;32475:382::-;21241:16;:23;;-1:-1:-1;;;;21241:23:0;-1:-1:-1;;;21241:23:0;;;32601:10:::1;::::0;32572:20;;-1:-1:-1;;;32601:10:0;::::1;21241:23:::0;32601:10:::1;32597:219;;;32661:1;32638:18;:14:::0;32655:1:::1;32638:18;:::i;:::-;32636:26;;;;:::i;:::-;32619:43:::0;-1:-1:-1;32668:21:0::1;32692:37;32619:43:::0;32692:20;:37:::1;:::i;:::-;32765:22;::::0;32668:61;;-1:-1:-1;32735:75:0::1;::::0;32758:4:::1;::::0;-1:-1:-1;;;;;32765:22:0::1;32668:61:::0;32765:22:::1;32735:14;:75::i;:::-;32613:203;32597:219;32820:32;32837:14;32820:16;:32::i;:::-;-1:-1:-1::0;;21275:16:0;:24;;-1:-1:-1;;;;21275:24:0;;;32475:382::o;33412:1062::-;33534:7;33530:31;;33547:14;:12;:14::i;:::-;33570:22;33594:15;33611:14;33627:15;33647:20;33660:6;33647:12;:20::i;:::-;33568:99;;;;;;;;33717:7;33708:6;33698:7;33685:10;;:20;;;;:::i;:::-;:29;;;;:::i;:::-;:39;;;;:::i;:::-;33672:10;:52;33756:10;;33729:18;;-1:-1:-1;;;33756:10:0;;;;33752:292;;;33781:19;33828:3;33813:12;;33804:6;:21;;;;:::i;:::-;33803:28;;;;:::i;:::-;33781:50;;33845:19;33893:3;33878:12;;33868:7;:22;;;;:::i;:::-;33867:29;;;;:::i;:::-;33845:51;-1:-1:-1;33918:20:0;33927:11;33918:6;:20;:::i;:::-;33909:29;-1:-1:-1;33962:21:0;33972:11;33962:7;:21;:::i;:::-;33952:31;-1:-1:-1;34009:25:0;34023:11;34009;:25;:::i;:::-;33996:38;;33768:276;;33752:292;-1:-1:-1;;;;;34067:16:0;;;;;;:8;:16;;;;;;:25;;34086:6;;34067:25;:::i;:::-;-1:-1:-1;;;;;34048:16:0;;;;;;;:8;:16;;;;;;:44;;;;34119:19;;;;;;;:36;;34141:14;;34119:36;:::i;:::-;-1:-1:-1;;;;;34097:19:0;;;;;;:8;:19;;;;;;:58;;;;34203:4;34186:23;;;;34222:6;;34186:33;;34212:7;;34186:33;:::i;:::-;:42;;;;:::i;:::-;34177:4;34160:23;;;;:8;:23;;;;;;:68;;;;34266:11;;-1:-1:-1;;;;;34266:11:0;34257:21;;;;:31;;34281:7;;34257:31;:::i;:::-;34242:11;;-1:-1:-1;;;;;34242:11:0;;;34233:21;;;;:8;:21;;;;;;:55;;;;34337:22;;;;;34328:32;;;;:45;;34363:10;;34328:45;:::i;:::-;34302:22;;-1:-1:-1;;;;;34302:22:0;;;34293:32;;;;:8;:32;;;;;;;;;:80;;;;34385:43;14156:25:1;;;34385:43:0;;;;;;;;;;14129:18:1;34385:43:0;;;;;;;34441:7;34437:32;;34454:15;35702:16;;35686:13;:32;35738:15;;35723:12;:30;35769:16;;35758:8;:27;35648:142;34454:15;33525:949;;;;;33412:1062;;;;:::o;32862:373::-;33000:16;;;33014:1;33000:16;;;;;;;;32976:21;;33000:16;;;;;;;;;;-1:-1:-1;33000:16:0;32976:40;;33041:4;33023;33028:1;33023:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33023:23:0;;;:7;;;;;;;;;:23;33061:3;;33051:7;;33061:3;;;33051:4;;33061:3;;33051:7;;;;;;:::i;:::-;-1:-1:-1;;;;;33051:13:0;;;:7;;;;;;;;;:13;33177:15;;33069;:40;;;;;33115:11;;33132:1;;33167:4;;33177:15;33198:27;:15;33216:9;33198:27;:::i;:::-;33069:161;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33069:161:0;;;;;;;;;;;;:::i;35360:283::-;35400:13;;:18;:39;;;;-1:-1:-1;35422:12:0;;:17;35400:39;:57;;;;-1:-1:-1;35444:8:0;;:13;35400:57;35397:70;;;35360:283::o;35397:70::-;35494:13;;;35475:16;:32;35530:12;;;35512:15;:30;35566:8;;;35547:16;:27;-1:-1:-1;35583:17:0;;;;35605:16;;;;35626:12;35360:283::o;34479:361::-;34535:7;34544;34553;34562;34576:15;34594:25;34611:7;34594:16;:25::i;:::-;34576:43;;34624:14;34641:24;34657:7;34641:15;:24::i;:::-;34624:41;;34670:15;34688:25;34705:7;34688:16;:25::i;:::-;34670:43;-1:-1:-1;34718:23:0;34670:43;34764:6;34744:17;34754:7;34744;:17;:::i;:::-;:26;;;;:::i;:::-;:36;;;;:::i;:::-;34718:62;34810:7;;-1:-1:-1;34819:6:0;;-1:-1:-1;34819:6:0;-1:-1:-1;34479:361:0;;-1:-1:-1;;;34479:361:0:o;34845:177::-;34924:7;;34905;;34924;;34919:54;;-1:-1:-1;;34939:7:0;:14;;-1:-1:-1;;34939:14:0;34949:4;34939:14;;;:7;;34845:177::o;34919:54::-;35012:5;34995:13;;34985:7;:23;;;;:::i;:::-;34983:34;;;;:::i;:::-;34977:40;34845:177;-1:-1:-1;;34845:177:0:o;35027:157::-;35108:6;;35091:7;;-1:-1:-1;;;35108:6:0;;;;35118:1;35108:11;35105:59;;;35159:5;35143:12;;35133:7;:22;;;;:::i;35105:59::-;-1:-1:-1;35178:1:0;;35027:157;-1:-1:-1;35027:157:0:o;35190:165::-;35274:8;;35255:7;;35274:12;35269:58;;35322:5;35310:8;;35300:7;:18;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:254::-;1049:6;1057;1110:2;1098:9;1089:7;1085:23;1081:32;1078:2;;;1126:1;1123;1116:12;1078:2;1149:29;1168:9;1149:29;:::i;:::-;1139:39;1225:2;1210:18;;;;1197:32;;-1:-1:-1;;;1068:167:1:o;1240:1116::-;1335:6;1366:2;1409;1397:9;1388:7;1384:23;1380:32;1377:2;;;1425:1;1422;1415:12;1377:2;1458:9;1452:16;1487:18;1528:2;1520:6;1517:14;1514:2;;;1544:1;1541;1534:12;1514:2;1582:6;1571:9;1567:22;1557:32;;1627:7;1620:4;1616:2;1612:13;1608:27;1598:2;;1649:1;1646;1639:12;1598:2;1678;1672:9;1700:2;1696;1693:10;1690:2;;;1706:18;;:::i;:::-;1752:2;1749:1;1745:10;1784:2;1778:9;1847:2;1843:7;1838:2;1834;1830:11;1826:25;1818:6;1814:38;1902:6;1890:10;1887:22;1882:2;1870:10;1867:18;1864:46;1861:2;;;1913:18;;:::i;:::-;1949:2;1942:22;1999:18;;;2033:15;;;;-1:-1:-1;2068:11:1;;;2098;;;2094:20;;2091:33;-1:-1:-1;2088:2:1;;;2137:1;2134;2127:12;2088:2;2159:1;2150:10;;2169:156;2183:2;2180:1;2177:9;2169:156;;;2240:10;;2228:23;;2201:1;2194:9;;;;;2271:12;;;;2303;;2169:156;;;-1:-1:-1;2344:6:1;1346:1010;-1:-1:-1;;;;;;;;1346:1010:1:o;2361:241::-;2417:6;2470:2;2458:9;2449:7;2445:23;2441:32;2438:2;;;2486:1;2483;2476:12;2438:2;2525:9;2512:23;2544:28;2566:5;2544:28;:::i;2607:245::-;2674:6;2727:2;2715:9;2706:7;2702:23;2698:32;2695:2;;;2743:1;2740;2733:12;2695:2;2775:9;2769:16;2794:28;2816:5;2794:28;:::i;2857:180::-;2916:6;2969:2;2957:9;2948:7;2944:23;2940:32;2937:2;;;2985:1;2982;2975:12;2937:2;-1:-1:-1;3008:23:1;;2927:110;-1:-1:-1;2927:110:1:o;3042:184::-;3112:6;3165:2;3153:9;3144:7;3140:23;3136:32;3133:2;;;3181:1;3178;3171:12;3133:2;-1:-1:-1;3204:16:1;;3123:103;-1:-1:-1;3123:103:1:o;3231:248::-;3299:6;3307;3360:2;3348:9;3339:7;3335:23;3331:32;3328:2;;;3376:1;3373;3366:12;3328:2;-1:-1:-1;;3399:23:1;;;3469:2;3454:18;;;3441:32;;-1:-1:-1;3318:161:1:o;3484:245::-;3563:6;3571;3624:2;3612:9;3603:7;3599:23;3595:32;3592:2;;;3640:1;3637;3630:12;3592:2;-1:-1:-1;;3663:16:1;;3719:2;3704:18;;;3698:25;3663:16;;3698:25;;-1:-1:-1;3582:147:1:o;3734:306::-;3822:6;3830;3838;3891:2;3879:9;3870:7;3866:23;3862:32;3859:2;;;3907:1;3904;3897:12;3859:2;3936:9;3930:16;3920:26;;3986:2;3975:9;3971:18;3965:25;3955:35;;4030:2;4019:9;4015:18;4009:25;3999:35;;3849:191;;;;;:::o;4045:269::-;4102:6;4155:2;4143:9;4134:7;4130:23;4126:32;4123:2;;;4171:1;4168;4161:12;4123:2;4210:9;4197:23;4260:4;4253:5;4249:16;4242:5;4239:27;4229:2;;4280:1;4277;4270:12;7294:597;7406:4;7435:2;7464;7453:9;7446:21;7496:6;7490:13;7539:6;7534:2;7523:9;7519:18;7512:34;7564:1;7574:140;7588:6;7585:1;7582:13;7574:140;;;7683:14;;;7679:23;;7673:30;7649:17;;;7668:2;7645:26;7638:66;7603:10;;7574:140;;;7732:6;7729:1;7726:13;7723:2;;;7802:1;7797:2;7788:6;7777:9;7773:22;7769:31;7762:42;7723:2;-1:-1:-1;7875:2:1;7854:15;-1:-1:-1;;7850:29:1;7835:45;;;;7882:2;7831:54;;7415:476;-1:-1:-1;;;7415:476:1:o;10627:356::-;10829:2;10811:21;;;10848:18;;;10841:30;10907:34;10902:2;10887:18;;10880:62;10974:2;10959:18;;10801:182::o;14192:980::-;14454:4;14502:3;14491:9;14487:19;14533:6;14522:9;14515:25;14559:2;14597:6;14592:2;14581:9;14577:18;14570:34;14640:3;14635:2;14624:9;14620:18;14613:31;14664:6;14699;14693:13;14730:6;14722;14715:22;14768:3;14757:9;14753:19;14746:26;;14807:2;14799:6;14795:15;14781:29;;14828:1;14838:195;14852:6;14849:1;14846:13;14838:195;;;14917:13;;-1:-1:-1;;;;;14913:39:1;14901:52;;15008:15;;;;14973:12;;;;14949:1;14867:9;14838:195;;;-1:-1:-1;;;;;;;15089:32:1;;;;15084:2;15069:18;;15062:60;-1:-1:-1;;;15153:3:1;15138:19;15131:35;15050:3;14463:709;-1:-1:-1;;;14463:709:1:o;15366:128::-;15406:3;15437:1;15433:6;15430:1;15427:13;15424:2;;;15443:18;;:::i;:::-;-1:-1:-1;15479:9:1;;15414:80::o;15499:217::-;15539:1;15565;15555:2;;15609:10;15604:3;15600:20;15597:1;15590:31;15644:4;15641:1;15634:15;15672:4;15669:1;15662:15;15555:2;-1:-1:-1;15701:9:1;;15545:171::o;15721:168::-;15761:7;15827:1;15823;15819:6;15815:14;15812:1;15809:21;15804:1;15797:9;15790:17;15786:45;15783:2;;;15834:18;;:::i;:::-;-1:-1:-1;15874:9:1;;15773:116::o;15894:125::-;15934:4;15962:1;15959;15956:8;15953:2;;;15967:18;;:::i;:::-;-1:-1:-1;16004:9:1;;15943:76::o;16024:127::-;16085:10;16080:3;16076:20;16073:1;16066:31;16116:4;16113:1;16106:15;16140:4;16137:1;16130:15;16156:127;16217:10;16212:3;16208:20;16205:1;16198:31;16248:4;16245:1;16238:15;16272:4;16269:1;16262:15;16288:127;16349:10;16344:3;16340:20;16337:1;16330:31;16380:4;16377:1;16370:15;16404:4;16401:1;16394:15;16420:118;16506:5;16499:13;16492:21;16485:5;16482:32;16472:2;;16528:1;16525;16518:12

Swarm Source

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