ETH Price: $2,907.20 (+2.96%)
 

Overview

Max Total Supply

100,000,000 TSUKAPE

Holders

64

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:
TSUKAPE

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
████████╗░██████╗██╗░░░██╗██╗░░██╗░█████╗░██████╗░███████╗
╚══██╔══╝██╔════╝██║░░░██║██║░██╔╝██╔══██╗██╔══██╗██╔════╝
░░░██║░░░╚█████╗░██║░░░██║█████═╝░███████║██████╔╝█████╗░░
░░░██║░░░░╚═══██╗██║░░░██║██╔═██╗░██╔══██║██╔═══╝░██╔══╝░░
░░░██║░░░██████╔╝╚██████╔╝██║░╚██╗██║░░██║██║░░░░░███████╗
░░░╚═╝░░░╚═════╝░░╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░░░░╚══════╝
 */

// pragma solidity ^0.8.13;
// 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 TSUKAPE 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 = "TSUKAPE";
    string private constant TOKEN_SYMBOL = "TSUKAPE";
    uint256 private constant TOTAL_SUPPLY = 100_000_000 * 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: 12,
        sellTax: 12,
        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: 0x8922eEd9277eAA9Cf85A3adF0d29BFEC27B4C889,
        marketing: 0x8922eEd9277eAA9Cf85A3adF0d29BFEC27B4C889
    });

    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 = 0xc5fB36dd2fb59d3B98dEfF88425a3F425Ee469eD;

    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"}]

600c608081905260a052600060c081905260088054610c0c62ffffff19909116179055600660e081905261010091909152610120526005610140526009805463ffffffff19166305060006179055738922eed9277eaa9cf85a3adf0d29bfec27b4c889610160819052610180819052600a80546001600160a01b031990811683178255600b805490911690921790915561022060405260046101a05260016101c08190526101e05261019061020052600f80546001600160401b031916670190000100010004179055601380547fffffffffff0000000000000000000000000000000000000000ff000000ff00ff167ac5fb36dd2fb59d3b98deff88425a3f425ee469ed000014010001001790556200011b9060129062000b99565b6200012b906305f5e10062000baa565b601b553480156200013b57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35046600103620001b257601680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905562000221565b46603803620001e757601680546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e17905562000221565b466061036200021c57601680546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c317905562000221565b600080fd5b601654601580546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200027e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a4919062000bcc565b6001600160a01b031663c9c6539630601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000307573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032d919062000bcc565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200037b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a1919062000bcc565b601480546001600160a01b0319166001600160a01b0392909216919091179055620003ea33620003d46012600a62000b99565b620003e4906305f5e10062000baa565b6200075d565b3360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6200041c6012600a62000b99565b6200042c906305f5e10062000baa565b60405190815260200160405180910390a33060009081526002602090815260408083206015546001600160a01b031684529091529020600019905560095460ff63010000008204811691620100008104821691620004939161010081048216911662000bf7565b6200049f919062000bf7565b620004ab919062000bf7565b6010805460ff191660ff928316908117909155600954620004d492610100909104169062000c1f565b6010805460ff929092166101000261ff00199092169190911790556040805160608101909152600f54819061ffff66010000000000008204811691166200051e6012600a62000b99565b6200052e906305f5e10062000baa565b6200053a919062000baa565b62000546919062000c45565b8152600f5460209091019061ffff6601000000000000820481169162010000900416620005766012600a62000b99565b62000586906305f5e10062000baa565b62000592919062000baa565b6200059e919062000c45565b8152600f5460209091019061ffff66010000000000008204811691640100000000900416620005d06012600a62000b99565b620005e0906305f5e10062000baa565b620005ec919062000baa565b620005f8919062000c45565b90528051600c55602080820151600d55604090910151600e556200062a90600490339062001dbb6200085d821b17901c565b50600b5462000651906004906001600160a01b03166200085d602090811b62001dbb17901c565b50600a5462000678906004906001600160a01b03166200085d602090811b62001dbb17901c565b50620006943060046200085d60201b62001dbb1790919060201c565b50620006b261dead60046200085d60201b62001dbb1790919060201c565b50620006ce3060066200085d60201b62001dbb1790919060201c565b50620006ec61dead60066200085d60201b62001dbb1790919060201c565b5060155462000713906006906001600160a01b03166200085d602090811b62001dbb17901c565b506014546200073a906006906001600160a01b03166200085d602090811b62001dbb17901c565b50601554620007579030906001600160a01b03166000196200087d565b62000c9d565b6001600160a01b0382166000908152600160205260408120546200078390839062000c68565b9050620007a08360066200097860201b62001dd01790919060201c565b15620007c6576001600160a01b0390921660009081526001602052604090209190915550565b81601b6000828254620007da919062000c68565b9091555060009050620007ed846200099b565b905081601c54620007ff919062000baa565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906200083790849062000c68565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b600062000874836001600160a01b03841662000a34565b90505b92915050565b6001600160a01b038316620008cd5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b60448201526064015b60405180910390fd5b6001600160a01b038216620009175760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401620008c4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600183016020526040812054151562000874565b6001600160a01b038116600090815260016020526040812054601c548291620009c49162000baa565b6001600160a01b038416600090815260176020526040902054909150811015620009f15750600092915050565b6001600160a01b038316600090815260176020526040902054680100000000000000009062000a21908362000c83565b62000a2d919062000c45565b9392505050565b600081815260018301602052604081205462000a7d5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000877565b50600062000877565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000add57816000190482111562000ac15762000ac162000a86565b8085161562000acf57918102915b93841c939080029062000aa1565b509250929050565b60008262000af65750600162000877565b8162000b055750600062000877565b816001811462000b1e576002811462000b295762000b49565b600191505062000877565b60ff84111562000b3d5762000b3d62000a86565b50506001821b62000877565b5060208310610133831016604e8410600b841016171562000b6e575081810a62000877565b62000b7a838362000a9c565b806000190482111562000b915762000b9162000a86565b029392505050565b60006200087460ff84168362000ae5565b600081600019048311821515161562000bc75762000bc762000a86565b500290565b60006020828403121562000bdf57600080fd5b81516001600160a01b038116811462000a2d57600080fd5b600060ff821660ff84168060ff0382111562000c175762000c1762000a86565b019392505050565b600060ff821660ff84168082101562000c3c5762000c3c62000a86565b90039392505050565b60008262000c6357634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000c7e5762000c7e62000a86565b500190565b60008282101562000c985762000c9862000a86565b500390565b613f498062000cad6000396000f3fe6080604052600436106103395760003560e01c80636912897d116101ab57806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610a2b578063fab91b6814610a52578063fbcdba7614610aba578063fe575a8714610b0d57600080fd5b8063dd62ed3e146109a5578063edb49037146109eb578063f2fde38b14610a0b57600080fd5b8063a457c2d7116100d1578063a457c2d7146108ed578063a9059cbb1461090d578063aa761b1e1461092d578063b32785141461094257600080fd5b806395d89b41146103e85780639b5cfc98146108ad578063a30dc744146108cd57600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f251461085a5780638739f8ea1461086f578063893d20e81461088f5780638da5cb5b1461088f57600080fd5b8063715018a6146108105780637335307b1461082557806379372f9a1461084557600080fd5b80636912897d146106f75780636bb1702d146107175780636c3fb9321461072c5780636d330c10146107665780636f268a991461079357806370a08231146107da57600080fd5b8063313ce5671161028557806351bc3c8511610223578063562f194b116101fd578063562f194b146106775780635d098b38146106975780635e3ce1ab146106b757806362a9c64e146106d757600080fd5b806351bc3c851461062157806351e287c614610642578063533b3bfc1461066257600080fd5b80633efd929a1161025f5780633efd929a146105b65780634089b170146105d65780634846c14c146105ec578063491e91ee1461060c57600080fd5b8063313ce567146105545780633268cc5614610576578063395093511461059657600080fd5b806318160ddd116102f25780631f53ac02116102cc5780631f53ac02146104df57806323b872dd146104ff57806328771ca21461051f5780632aea52ab1461053457600080fd5b806318160ddd146104725780631a0e718c146104875780631b355427146104a757600080fd5b80630445b667146103455780630614117a14610380578063069d955f1461039757806306fdde03146103e8578063095ea7b31461041e5780630e15561a1461044e57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060135461036890640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561038c57600080fd5b50610395610b3d565b005b3480156103a357600080fd5b506008546103c49060ff808216916101008104821691620100009091041683565b6040805160ff94851681529284166020840152921691810191909152606001610377565b3480156103f457600080fd5b5060408051808201825260078152665453554b41504560c81b602082015290516103779190613837565b34801561042a57600080fd5b5061043e61043936600461387f565b610bb1565b6040519015158152602001610377565b34801561045a57600080fd5b50610464601e5481565b604051908152602001610377565b34801561047e57600080fd5b50610464610bc8565b34801561049357600080fd5b506103956104a23660046138c2565b610be9565b3480156104b357600080fd5b506014546104c7906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b3480156104eb57600080fd5b506103956104fa3660046138dd565b610d1a565b34801561050b57600080fd5b5061043e61051a3660046138fa565b610dd7565b34801561052b57600080fd5b50610464610e6e565b34801561054057600080fd5b5061039561054f366004613949565b610e8e565b34801561056057600080fd5b5060125b60405160ff9091168152602001610377565b34801561058257600080fd5b506016546104c7906001600160a01b031681565b3480156105a257600080fd5b5061043e6105b136600461387f565b610efc565b3480156105c257600080fd5b506103956105d1366004613949565b610f33565b3480156105e257600080fd5b50610464601d5481565b3480156105f857600080fd5b506103956106073660046138dd565b610fa8565b34801561061857600080fd5b50610395611149565b34801561062d57600080fd5b5060135461043e90600160301b900460ff1681565b34801561064e57600080fd5b5061039561065d366004613966565b611320565b34801561066e57600080fd5b5061046461139b565b34801561068357600080fd5b5061039561069236600461397f565b6113ae565b3480156106a357600080fd5b506103956106b23660046138dd565b611430565b3480156106c357600080fd5b506103956106d23660046139b8565b6114e5565b3480156106e357600080fd5b506103956106f2366004613a1d565b6116e9565b34801561070357600080fd5b50610395610712366004613a66565b61181d565b34801561072357600080fd5b5061039561184c565b34801561073857600080fd5b50600c54600d54600e5461074b92919083565b60408051938452602084019290925290820152606001610377565b34801561077257600080fd5b506104646107813660046138dd565b601a6020526000908152604090205481565b34801561079f57600080fd5b50600a54600b546107ba916001600160a01b03908116911682565b604080516001600160a01b03938416815292909116602083015201610377565b3480156107e657600080fd5b506104646107f53660046138dd565b6001600160a01b031660009081526001602052604090205490565b34801561081c57600080fd5b5061039561194e565b34801561083157600080fd5b5061043e6108403660046138dd565b6119d1565b34801561085157600080fd5b506103956119de565b34801561086657600080fd5b50610564601481565b34801561087b57600080fd5b5061039561088a36600461397f565b6119fe565b34801561089b57600080fd5b506000546001600160a01b03166104c7565b3480156108b957600080fd5b506103956108c8366004613a82565b611a8b565b3480156108d957600080fd5b506104646108e83660046138dd565b611bae565b3480156108f957600080fd5b5061043e61090836600461387f565b611bc1565b34801561091957600080fd5b5061043e61092836600461387f565b611c3d565b34801561093957600080fd5b50610395611c4a565b34801561094e57600080fd5b506009546109789060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610377565b3480156109b157600080fd5b506104646109c0366004613ac5565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109f757600080fd5b50610395610a06366004613949565b611c8e565b348015610a1757600080fd5b50610395610a263660046138dd565b611cd1565b348015610a3757600080fd5b506013546104c790600160381b90046001600160a01b031681565b348015610a5e57600080fd5b50600f54610a8c9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610377565b348015610ac657600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a001610377565b348015610b1957600080fd5b5061043e610b283660046138dd565b60036020526000908152604090205460ff1681565b33610b506000546001600160a01b031690565b6001600160a01b031614610b7f5760405162461bcd60e51b8152600401610b7690613af3565b60405180910390fd5b601154421015610ba15760405162461bcd60e51b8152600401610b7690613b21565b42601155610baf3347611df2565b565b6000610bbe338484611e87565b5060015b92915050565b6000610bd66012600a613c45565b610be4906305f5e100613c54565b905090565b610bf233611f7a565b610c0e5760405162461bcd60e51b8152600401610b7690613c73565b60008161ffff1611610c6c5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610b76565b60328161ffff161115610cc15760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610b76565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610d2d6000546001600160a01b031690565b6001600160a01b031614610d535760405162461bcd60e51b8152600401610b7690613af3565b600a546001600160a01b0316610d6a600482611fbf565b50600a80546001600160a01b0319166001600160a01b038416908117909155610d9590600490611dbb565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610de4848484611fd4565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e4f5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b76565b610e638533610e5e8685613ca2565b611e87565b506001949350505050565b6000601154421015610e885742601154610be49190613ca2565b50600090565b610e9733611f7a565b610eb35760405162461bcd60e51b8152600401610b7690613c73565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610d0f90831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bbe918590610e5e908690613cb9565b610f3c33611f7a565b610f585760405162461bcd60e51b8152600401610b7690613c73565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610d0f90831515815260200190565b33610fbb6000546001600160a01b031690565b6001600160a01b031614610fe15760405162461bcd60e51b8152600401610b7690613af3565b6014546001600160a01b0382811691161480159061100857506001600160a01b0381163014155b6110605760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610b76565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d49190613cd1565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111449190613cea565b505050565b3361115c6000546001600160a01b031690565b6001600160a01b0316146111825760405162461bcd60e51b8152600401610b7690613af3565b6011544210156111a45760405162461bcd60e51b8152600401610b7690613b21565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156111f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112199190613cd1565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af115801561126e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112929190613cea565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906112ce9030908590600090819084904290600401613d07565b6020604051808303816000875af11580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113119190613cd1565b5061131c3347611df2565b5050565b336113336000546001600160a01b031690565b6001600160a01b0316146113595760405162461bcd60e51b8152600401610b7690613af3565b61136b6113664283613cb9565b6121d7565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610d0f565b600080601d54601e54610bc29190613ca2565b6113b733611f7a565b6113d35760405162461bcd60e51b8152600401610b7690613c73565b80156113e7576113e2826121ea565b6113f0565b6113f0826122ab565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610dcb565b336114436000546001600160a01b031690565b6001600160a01b0316146114695760405162461bcd60e51b8152600401610b7690613af3565b600b546001600160a01b0316611480600482611fbf565b50600b80546001600160a01b0319166001600160a01b0384169081179091556114ab90600490611dbb565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610dcb565b6114ee33611f7a565b61150a5760405162461bcd60e51b8152600401610b7690613c73565b60006103e861151b6012600a613c45565b611529906305f5e100613c54565b6115339190613d42565b9050600061ffff80841690871661154c6012600a613c45565b61155a906305f5e100613c54565b6115649190613c54565b61156e9190613d42565b9050600061ffff8085169087166115876012600a613c45565b611595906305f5e100613c54565b61159f9190613c54565b6115a99190613d42565b9050600061ffff8086169087166115c26012600a613c45565b6115d0906305f5e100613c54565b6115da9190613c54565b6115e49190613d42565b90508383101580156115f65750838210155b6116425760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610b76565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b6116f233611f7a565b61170e5760405162461bcd60e51b8152600401610b7690613c73565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826117848587613d64565b61178e9190613d64565b6117989190613d64565b6010805460ff191660ff9290921691821790556117b6908490613d89565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61182633611f7a565b6118425760405162461bcd60e51b8152600401610b7690613c73565b61131c828261233f565b3361185f6000546001600160a01b031690565b6001600160a01b0316146118855760405162461bcd60e51b8152600401610b7690613af3565b6011544210156118a75760405162461bcd60e51b8152600401610b7690613b21565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156118f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119189190613cd1565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401611101565b336119616000546001600160a01b031690565b6001600160a01b0316146119875760405162461bcd60e51b8152600401610b7690613af3565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bc2600683611dd0565b601354610baf903390600160381b90046001600160a01b03166000612558565b611a0733611f7a565b611a235760405162461bcd60e51b8152600401610b7690613c73565b801515600103611a3e57611a38600483611dbb565b50611a4b565b611a49600483611fbf565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610dcb565b611a9433611f7a565b611ab05760405162461bcd60e51b8152600401610b7690613c73565b601460ff841611801590611ac85750601460ff831611155b8015611ad8575060328160ff1611155b611b245760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610b76565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611bba836128ea565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c245760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b76565b611c333385610e5e8685613ca2565b5060019392505050565b6000610bbe338484611fd4565b611c53336122ab565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611c9733611f7a565b611cb35760405162461bcd60e51b8152600401610b7690613c73565b6013805491151563010000000263ff00000019909216919091179055565b33611ce46000546001600160a01b031690565b6001600160a01b031614611d0a5760405162461bcd60e51b8152600401610b7690613af3565b6001600160a01b038116611d605760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610b76565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611bba836001600160a01b038416612944565b6001600160a01b03811660009081526001830160205260408120541515611bba565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e3f576040519150601f19603f3d011682016040523d82523d6000602084013e611e44565b606091505b50509050806111445760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610b76565b6001600160a01b038316611ed15760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b76565b6001600160a01b038216611f195760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b76565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480611fa45750600b546001600160a01b038381169116145b80610bc2575050600a546001600160a01b0390811691161490565b6000611bba836001600160a01b038416612993565b6001600160a01b03831661201f5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b76565b6001600160a01b0382166120685760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b76565b6000612075600485611dd0565b806120865750612086600484611dd0565b905060006001600160a01b0385163014806120a957506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156120e45750816001600160a01b0316866001600160a01b0316145b8061211857506014546001600160a01b0387811691161480156121185750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038881169116148061214b5750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061217e5750836001600160a01b0316896001600160a01b0316145b905084806121895750825b806121915750855b156121bf576121a1898989612a80565b60135462010000900460ff166121ba576121ba88612b4b565b6121cc565b6121cc8989898486612bd3565b505050505050505050565b60115481116121e557600080fd5b601155565b6121f5600682611dd0565b156121ff57600080fd5b6001600160a01b038116600090815260016020526040812054601b80549192909161222b908490613ca2565b909155506000905061223c8261309c565b601c546001600160a01b03841660009081526001602052604090205491925061226491613c54565b6001600160a01b03831660009081526017602090815260408083209390935560189052908120805483929061229a908490613cb9565b909155506111449050600683611dbb565b6122b6600682611dd0565b6122bf57600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916122eb908490613cb9565b909155506122fc9050600682611fbf565b50601c546001600160a01b0382166000908152600160205260409020546123239190613c54565b6001600160a01b03909116600090815260176020526040902055565b601f805460ff191660011790556101f461ffff8316111561235f57600080fd5b60105460ff161561254a5730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e8906123a39061ffff871690613c54565b6123ad9190613d42565b600d54909150811180156123bf575082155b156123c95750600d545b80821080156123e85783156123e0578291506123e8565b50505061254a565b3060009081526002602090815260408083206015546001600160a01b0316845290915290205482111561242f5760155461242f9030906001600160a01b0316600019611e87565b60105460095460009160ff9081169161244f916101009091041685613c54565b6124599190613d42565b905060006124678285613ca2565b90506000612476600284613d42565b905060006124848285613ca2565b905060006124928483613cb9565b90504761249e82613122565b60006124aa8247613ca2565b90506000836124b98684613c54565b6124c39190613d42565b905085156124d5576124d5868261327b565b6000600a6124e38547613ca2565b6124ed9190613d42565b9050612518604051806040016040528060078152602001667375636365737360c81b81525082613313565b6000816125258647613ca2565b61252f9190613ca2565b905061253c8160016134cb565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561256d57600080fd5b601f805461ff0019166101001790556000808361258b600687611dd0565b156125b4576001600160a01b038616600090815260186020526040812080549190559250612634565b60006125bf8761309c565b6001600160a01b038816600090815260016020526040902054601c549192506125e791613c54565b6001600160a01b038816600090815260176020908152604080832093909355601890522054612617908290613cb9565b6001600160a01b0388166000908152601860205260408120559350505b82158015612640575083155b15612658575050601f805461ff001916905550505050565b82601d600082825461266a9190613cb9565b90915550506001600160a01b0386166000908152601a602052604081208054859290612697908490613cb9565b909155506126a790508484613cb9565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190613dac565b8160008151811061274d5761274d613dc9565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061278157612781613dc9565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906127c79060009086908d904290600401613e23565b6000604051808303818588803b1580156127e057600080fd5b505af1935050505080156127f2575060015b6127ff5760009250612804565b600192505b8261288d576128138785611df2565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288a9190613dac565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b60006128f7600683611dd0565b1561291857506001600160a01b031660009081526018602052604090205490565b6001600160a01b03821660009081526018602052604090205461293a8361309c565b610bc29190613cb9565b600081815260018301602052604081205461298b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc2565b506000610bc2565b60008181526001830160205260408120548015612a765760006129b7600183613ca2565b85549091506000906129cb90600190613ca2565b905060008660000182815481106129e4576129e4613dc9565b9060005260206000200154905080876000018481548110612a0757612a07613dc9565b600091825260208083209091019290925582815260018901909152604090208490558654879080612a3a57612a3a613e58565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc2565b6000915050610bc2565b6001600160a01b03831660009081526001602052604090205481811015612ae45760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b76565b612aee8483613613565b612af883836136f9565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b3d91815260200190565b60405180910390a350505050565b60135462010000900460ff1615612ba45760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610b76565b6014546001600160a01b0390811690821603612bd057436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c415760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b76565b60008315612d1857601354610100900460ff1615612cb5576001600160a01b03881660009081526003602052604090205460ff1615612cb55760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b76565b600d54861115612d075760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610b76565b50600854610100900460ff16612f90565b8415612e8e5760125415612d8a57601254600290612d369043613ca2565b1015612d8a576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612d7083613e6e565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612ddd576001600160a01b038716600090815260196020526040902054439003612dc157600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612dea8785613cb9565b1115612e385760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610b76565b600e54861115612e825760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610b76565b5060085460ff16612f90565b601354610100900460ff1615612efa576001600160a01b03881660009081526003602052604090205460ff1615612efa5760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b76565b612f066012600a613c45565b8611612f3457601354612f2c903390600160381b90046001600160a01b03166000612558565b505050613095565b600c54612f418785613cb9565b1115612f825760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b76565b5060085462010000900460ff165b6014546001600160a01b03898116911614801590612fb85750601354600160301b900460ff16155b8015612fc75750601f5460ff16155b8015612fd05750835b15612fef57601354612fef90640100000000900461ffff16600061233f565b600060ff82161561301657606461300960ff841689613c54565b6130139190613d42565b90505b60006130228289613ca2565b905061302e8a89613613565b61303830836136f9565b61304289826136f9565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308791815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916130c391613c54565b6001600160a01b0384166000908152601760205260409020549091508110156130ef5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906131189083613ca2565b611bba9190613d42565b60155461313a9030906001600160a01b031683611e87565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316f5761316f613dc9565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ec9190613dac565b816001815181106131ff576131ff613dc9565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613245908590600090869030904290600401613e8d565b600060405180830381600087803b15801561325f57600080fd5b505af1158015613273573d6000803e3d6000fd5b505050505050565b6015546132939030906001600160a01b031684611e87565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906132d09030908790600090819084904290600401613d07565b60606040518083038185885af11580156132ee573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130959190613ec9565b804710156133635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b76565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a3890613396908490602001613ef7565b60405160208183030381529060405280519060200120146133f95760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610b76565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d806000811461344f576040519150601f19603f3d011682016040523d82523d6000602084013e613454565b606091505b50509050806111445760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b76565b60105460095460009160ff6101009091048116916134f191620100009091041685613c54565b6134fb9190613d42565b60105460095491925060009160ff61010090920482169161351d911686613c54565b6135279190613d42565b60105460095491925060009160ff61010090920482169161355091630100000090041687613c54565b61355a9190613d42565b600b54909150613573906001600160a01b031684611df2565b600a54613589906001600160a01b031683611df2565b80156130955783156135ad5780601e60008282546135a79190613cb9565b90915550505b60006135b76137de565b9050806000036135dc57600b546135d7906001600160a01b031683611df2565b613273565b806135eb600160401b84613c54565b6135f59190613d42565b601c60008282546136069190613cb9565b9091555050505050505050565b6001600160a01b038216600090815260016020526040812054613637908390613ca2565b9050613644600684611dd0565b15613669576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461367b9190613ca2565b909155506000905061368c8461309c565b6001600160a01b0385166000908152600160205260409020839055601c549091506136b8908390613c54565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906136ee908490613cb9565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461371d908390613cb9565b905061372a600684611dd0565b1561374f576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546137619190613cb9565b90915550600090506137728461309c565b905081601c546137829190613c54565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906137b8908490613cb9565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006137ec6012600a613c45565b6137fa906305f5e100613c54565b601b54610be49190613ca2565b60005b8381101561382257818101518382015260200161380a565b83811115613831576000848401525b50505050565b6020815260008251806020840152613856816040850160208701613807565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612bd057600080fd5b6000806040838503121561389257600080fd5b823561389d8161386a565b946020939093013593505050565b803561ffff811681146138bd57600080fd5b919050565b6000602082840312156138d457600080fd5b611bba826138ab565b6000602082840312156138ef57600080fd5b8135611bba8161386a565b60008060006060848603121561390f57600080fd5b833561391a8161386a565b9250602084013561392a8161386a565b929592945050506040919091013590565b8015158114612bd057600080fd5b60006020828403121561395b57600080fd5b8135611bba8161393b565b60006020828403121561397857600080fd5b5035919050565b6000806040838503121561399257600080fd5b823561399d8161386a565b915060208301356139ad8161393b565b809150509250929050565b600080600080608085870312156139ce57600080fd5b6139d7856138ab565b93506139e5602086016138ab565b92506139f3604086016138ab565b9150613a01606086016138ab565b905092959194509250565b803560ff811681146138bd57600080fd5b60008060008060808587031215613a3357600080fd5b613a3c85613a0c565b9350613a4a60208601613a0c565b9250613a5860408601613a0c565b9150613a0160608601613a0c565b60008060408385031215613a7957600080fd5b61399d836138ab565b600080600060608486031215613a9757600080fd5b613aa084613a0c565b9250613aae60208501613a0c565b9150613abc60408501613a0c565b90509250925092565b60008060408385031215613ad857600080fd5b8235613ae38161386a565b915060208301356139ad8161386a565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613b9c578160001904821115613b8257613b82613b4b565b80851615613b8f57918102915b93841c9390800290613b66565b509250929050565b600082613bb357506001610bc2565b81613bc057506000610bc2565b8160018114613bd65760028114613be057613bfc565b6001915050610bc2565b60ff841115613bf157613bf1613b4b565b50506001821b610bc2565b5060208310610133831016604e8410600b8410161715613c1f575081810a610bc2565b613c298383613b61565b8060001904821115613c3d57613c3d613b4b565b029392505050565b6000611bba60ff841683613ba4565b6000816000190483118215151615613c6e57613c6e613b4b565b500290565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b600082821015613cb457613cb4613b4b565b500390565b60008219821115613ccc57613ccc613b4b565b500190565b600060208284031215613ce357600080fd5b5051919050565b600060208284031215613cfc57600080fd5b8151611bba8161393b565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613d5f57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613d8157613d81613b4b565b019392505050565b600060ff821660ff841680821015613da357613da3613b4b565b90039392505050565b600060208284031215613dbe57600080fd5b8151611bba8161386a565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613e185781516001600160a01b031687529582019590820190600101613df3565b509495945050505050565b848152608060208201526000613e3c6080830186613ddf565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613e8457613e84613b4b565b60010192915050565b85815284602082015260a060408201526000613eac60a0830186613ddf565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613ede57600080fd5b8351925060208401519150604084015190509250925092565b60008251613f09818460208701613807565b919091019291505056fea2646970667358221220107f89d0b072eff835218646d8de6f09db036470a8ffd460f7798d198079811d64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106103395760003560e01c80636912897d116101ab57806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610a2b578063fab91b6814610a52578063fbcdba7614610aba578063fe575a8714610b0d57600080fd5b8063dd62ed3e146109a5578063edb49037146109eb578063f2fde38b14610a0b57600080fd5b8063a457c2d7116100d1578063a457c2d7146108ed578063a9059cbb1461090d578063aa761b1e1461092d578063b32785141461094257600080fd5b806395d89b41146103e85780639b5cfc98146108ad578063a30dc744146108cd57600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f251461085a5780638739f8ea1461086f578063893d20e81461088f5780638da5cb5b1461088f57600080fd5b8063715018a6146108105780637335307b1461082557806379372f9a1461084557600080fd5b80636912897d146106f75780636bb1702d146107175780636c3fb9321461072c5780636d330c10146107665780636f268a991461079357806370a08231146107da57600080fd5b8063313ce5671161028557806351bc3c8511610223578063562f194b116101fd578063562f194b146106775780635d098b38146106975780635e3ce1ab146106b757806362a9c64e146106d757600080fd5b806351bc3c851461062157806351e287c614610642578063533b3bfc1461066257600080fd5b80633efd929a1161025f5780633efd929a146105b65780634089b170146105d65780634846c14c146105ec578063491e91ee1461060c57600080fd5b8063313ce567146105545780633268cc5614610576578063395093511461059657600080fd5b806318160ddd116102f25780631f53ac02116102cc5780631f53ac02146104df57806323b872dd146104ff57806328771ca21461051f5780632aea52ab1461053457600080fd5b806318160ddd146104725780631a0e718c146104875780631b355427146104a757600080fd5b80630445b667146103455780630614117a14610380578063069d955f1461039757806306fdde03146103e8578063095ea7b31461041e5780630e15561a1461044e57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060135461036890640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561038c57600080fd5b50610395610b3d565b005b3480156103a357600080fd5b506008546103c49060ff808216916101008104821691620100009091041683565b6040805160ff94851681529284166020840152921691810191909152606001610377565b3480156103f457600080fd5b5060408051808201825260078152665453554b41504560c81b602082015290516103779190613837565b34801561042a57600080fd5b5061043e61043936600461387f565b610bb1565b6040519015158152602001610377565b34801561045a57600080fd5b50610464601e5481565b604051908152602001610377565b34801561047e57600080fd5b50610464610bc8565b34801561049357600080fd5b506103956104a23660046138c2565b610be9565b3480156104b357600080fd5b506014546104c7906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b3480156104eb57600080fd5b506103956104fa3660046138dd565b610d1a565b34801561050b57600080fd5b5061043e61051a3660046138fa565b610dd7565b34801561052b57600080fd5b50610464610e6e565b34801561054057600080fd5b5061039561054f366004613949565b610e8e565b34801561056057600080fd5b5060125b60405160ff9091168152602001610377565b34801561058257600080fd5b506016546104c7906001600160a01b031681565b3480156105a257600080fd5b5061043e6105b136600461387f565b610efc565b3480156105c257600080fd5b506103956105d1366004613949565b610f33565b3480156105e257600080fd5b50610464601d5481565b3480156105f857600080fd5b506103956106073660046138dd565b610fa8565b34801561061857600080fd5b50610395611149565b34801561062d57600080fd5b5060135461043e90600160301b900460ff1681565b34801561064e57600080fd5b5061039561065d366004613966565b611320565b34801561066e57600080fd5b5061046461139b565b34801561068357600080fd5b5061039561069236600461397f565b6113ae565b3480156106a357600080fd5b506103956106b23660046138dd565b611430565b3480156106c357600080fd5b506103956106d23660046139b8565b6114e5565b3480156106e357600080fd5b506103956106f2366004613a1d565b6116e9565b34801561070357600080fd5b50610395610712366004613a66565b61181d565b34801561072357600080fd5b5061039561184c565b34801561073857600080fd5b50600c54600d54600e5461074b92919083565b60408051938452602084019290925290820152606001610377565b34801561077257600080fd5b506104646107813660046138dd565b601a6020526000908152604090205481565b34801561079f57600080fd5b50600a54600b546107ba916001600160a01b03908116911682565b604080516001600160a01b03938416815292909116602083015201610377565b3480156107e657600080fd5b506104646107f53660046138dd565b6001600160a01b031660009081526001602052604090205490565b34801561081c57600080fd5b5061039561194e565b34801561083157600080fd5b5061043e6108403660046138dd565b6119d1565b34801561085157600080fd5b506103956119de565b34801561086657600080fd5b50610564601481565b34801561087b57600080fd5b5061039561088a36600461397f565b6119fe565b34801561089b57600080fd5b506000546001600160a01b03166104c7565b3480156108b957600080fd5b506103956108c8366004613a82565b611a8b565b3480156108d957600080fd5b506104646108e83660046138dd565b611bae565b3480156108f957600080fd5b5061043e61090836600461387f565b611bc1565b34801561091957600080fd5b5061043e61092836600461387f565b611c3d565b34801561093957600080fd5b50610395611c4a565b34801561094e57600080fd5b506009546109789060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610377565b3480156109b157600080fd5b506104646109c0366004613ac5565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109f757600080fd5b50610395610a06366004613949565b611c8e565b348015610a1757600080fd5b50610395610a263660046138dd565b611cd1565b348015610a3757600080fd5b506013546104c790600160381b90046001600160a01b031681565b348015610a5e57600080fd5b50600f54610a8c9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610377565b348015610ac657600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a001610377565b348015610b1957600080fd5b5061043e610b283660046138dd565b60036020526000908152604090205460ff1681565b33610b506000546001600160a01b031690565b6001600160a01b031614610b7f5760405162461bcd60e51b8152600401610b7690613af3565b60405180910390fd5b601154421015610ba15760405162461bcd60e51b8152600401610b7690613b21565b42601155610baf3347611df2565b565b6000610bbe338484611e87565b5060015b92915050565b6000610bd66012600a613c45565b610be4906305f5e100613c54565b905090565b610bf233611f7a565b610c0e5760405162461bcd60e51b8152600401610b7690613c73565b60008161ffff1611610c6c5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610b76565b60328161ffff161115610cc15760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610b76565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610d2d6000546001600160a01b031690565b6001600160a01b031614610d535760405162461bcd60e51b8152600401610b7690613af3565b600a546001600160a01b0316610d6a600482611fbf565b50600a80546001600160a01b0319166001600160a01b038416908117909155610d9590600490611dbb565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610de4848484611fd4565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e4f5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b76565b610e638533610e5e8685613ca2565b611e87565b506001949350505050565b6000601154421015610e885742601154610be49190613ca2565b50600090565b610e9733611f7a565b610eb35760405162461bcd60e51b8152600401610b7690613c73565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610d0f90831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bbe918590610e5e908690613cb9565b610f3c33611f7a565b610f585760405162461bcd60e51b8152600401610b7690613c73565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610d0f90831515815260200190565b33610fbb6000546001600160a01b031690565b6001600160a01b031614610fe15760405162461bcd60e51b8152600401610b7690613af3565b6014546001600160a01b0382811691161480159061100857506001600160a01b0381163014155b6110605760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610b76565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d49190613cd1565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111449190613cea565b505050565b3361115c6000546001600160a01b031690565b6001600160a01b0316146111825760405162461bcd60e51b8152600401610b7690613af3565b6011544210156111a45760405162461bcd60e51b8152600401610b7690613b21565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156111f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112199190613cd1565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af115801561126e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112929190613cea565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906112ce9030908590600090819084904290600401613d07565b6020604051808303816000875af11580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113119190613cd1565b5061131c3347611df2565b5050565b336113336000546001600160a01b031690565b6001600160a01b0316146113595760405162461bcd60e51b8152600401610b7690613af3565b61136b6113664283613cb9565b6121d7565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610d0f565b600080601d54601e54610bc29190613ca2565b6113b733611f7a565b6113d35760405162461bcd60e51b8152600401610b7690613c73565b80156113e7576113e2826121ea565b6113f0565b6113f0826122ab565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610dcb565b336114436000546001600160a01b031690565b6001600160a01b0316146114695760405162461bcd60e51b8152600401610b7690613af3565b600b546001600160a01b0316611480600482611fbf565b50600b80546001600160a01b0319166001600160a01b0384169081179091556114ab90600490611dbb565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610dcb565b6114ee33611f7a565b61150a5760405162461bcd60e51b8152600401610b7690613c73565b60006103e861151b6012600a613c45565b611529906305f5e100613c54565b6115339190613d42565b9050600061ffff80841690871661154c6012600a613c45565b61155a906305f5e100613c54565b6115649190613c54565b61156e9190613d42565b9050600061ffff8085169087166115876012600a613c45565b611595906305f5e100613c54565b61159f9190613c54565b6115a99190613d42565b9050600061ffff8086169087166115c26012600a613c45565b6115d0906305f5e100613c54565b6115da9190613c54565b6115e49190613d42565b90508383101580156115f65750838210155b6116425760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610b76565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b6116f233611f7a565b61170e5760405162461bcd60e51b8152600401610b7690613c73565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826117848587613d64565b61178e9190613d64565b6117989190613d64565b6010805460ff191660ff9290921691821790556117b6908490613d89565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61182633611f7a565b6118425760405162461bcd60e51b8152600401610b7690613c73565b61131c828261233f565b3361185f6000546001600160a01b031690565b6001600160a01b0316146118855760405162461bcd60e51b8152600401610b7690613af3565b6011544210156118a75760405162461bcd60e51b8152600401610b7690613b21565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156118f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119189190613cd1565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401611101565b336119616000546001600160a01b031690565b6001600160a01b0316146119875760405162461bcd60e51b8152600401610b7690613af3565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bc2600683611dd0565b601354610baf903390600160381b90046001600160a01b03166000612558565b611a0733611f7a565b611a235760405162461bcd60e51b8152600401610b7690613c73565b801515600103611a3e57611a38600483611dbb565b50611a4b565b611a49600483611fbf565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610dcb565b611a9433611f7a565b611ab05760405162461bcd60e51b8152600401610b7690613c73565b601460ff841611801590611ac85750601460ff831611155b8015611ad8575060328160ff1611155b611b245760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610b76565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611bba836128ea565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c245760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b76565b611c333385610e5e8685613ca2565b5060019392505050565b6000610bbe338484611fd4565b611c53336122ab565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611c9733611f7a565b611cb35760405162461bcd60e51b8152600401610b7690613c73565b6013805491151563010000000263ff00000019909216919091179055565b33611ce46000546001600160a01b031690565b6001600160a01b031614611d0a5760405162461bcd60e51b8152600401610b7690613af3565b6001600160a01b038116611d605760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610b76565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611bba836001600160a01b038416612944565b6001600160a01b03811660009081526001830160205260408120541515611bba565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e3f576040519150601f19603f3d011682016040523d82523d6000602084013e611e44565b606091505b50509050806111445760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610b76565b6001600160a01b038316611ed15760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b76565b6001600160a01b038216611f195760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b76565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480611fa45750600b546001600160a01b038381169116145b80610bc2575050600a546001600160a01b0390811691161490565b6000611bba836001600160a01b038416612993565b6001600160a01b03831661201f5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b76565b6001600160a01b0382166120685760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b76565b6000612075600485611dd0565b806120865750612086600484611dd0565b905060006001600160a01b0385163014806120a957506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156120e45750816001600160a01b0316866001600160a01b0316145b8061211857506014546001600160a01b0387811691161480156121185750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038881169116148061214b5750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061217e5750836001600160a01b0316896001600160a01b0316145b905084806121895750825b806121915750855b156121bf576121a1898989612a80565b60135462010000900460ff166121ba576121ba88612b4b565b6121cc565b6121cc8989898486612bd3565b505050505050505050565b60115481116121e557600080fd5b601155565b6121f5600682611dd0565b156121ff57600080fd5b6001600160a01b038116600090815260016020526040812054601b80549192909161222b908490613ca2565b909155506000905061223c8261309c565b601c546001600160a01b03841660009081526001602052604090205491925061226491613c54565b6001600160a01b03831660009081526017602090815260408083209390935560189052908120805483929061229a908490613cb9565b909155506111449050600683611dbb565b6122b6600682611dd0565b6122bf57600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916122eb908490613cb9565b909155506122fc9050600682611fbf565b50601c546001600160a01b0382166000908152600160205260409020546123239190613c54565b6001600160a01b03909116600090815260176020526040902055565b601f805460ff191660011790556101f461ffff8316111561235f57600080fd5b60105460ff161561254a5730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e8906123a39061ffff871690613c54565b6123ad9190613d42565b600d54909150811180156123bf575082155b156123c95750600d545b80821080156123e85783156123e0578291506123e8565b50505061254a565b3060009081526002602090815260408083206015546001600160a01b0316845290915290205482111561242f5760155461242f9030906001600160a01b0316600019611e87565b60105460095460009160ff9081169161244f916101009091041685613c54565b6124599190613d42565b905060006124678285613ca2565b90506000612476600284613d42565b905060006124848285613ca2565b905060006124928483613cb9565b90504761249e82613122565b60006124aa8247613ca2565b90506000836124b98684613c54565b6124c39190613d42565b905085156124d5576124d5868261327b565b6000600a6124e38547613ca2565b6124ed9190613d42565b9050612518604051806040016040528060078152602001667375636365737360c81b81525082613313565b6000816125258647613ca2565b61252f9190613ca2565b905061253c8160016134cb565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561256d57600080fd5b601f805461ff0019166101001790556000808361258b600687611dd0565b156125b4576001600160a01b038616600090815260186020526040812080549190559250612634565b60006125bf8761309c565b6001600160a01b038816600090815260016020526040902054601c549192506125e791613c54565b6001600160a01b038816600090815260176020908152604080832093909355601890522054612617908290613cb9565b6001600160a01b0388166000908152601860205260408120559350505b82158015612640575083155b15612658575050601f805461ff001916905550505050565b82601d600082825461266a9190613cb9565b90915550506001600160a01b0386166000908152601a602052604081208054859290612697908490613cb9565b909155506126a790508484613cb9565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273a9190613dac565b8160008151811061274d5761274d613dc9565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061278157612781613dc9565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906127c79060009086908d904290600401613e23565b6000604051808303818588803b1580156127e057600080fd5b505af1935050505080156127f2575060015b6127ff5760009250612804565b600192505b8261288d576128138785611df2565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288a9190613dac565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b60006128f7600683611dd0565b1561291857506001600160a01b031660009081526018602052604090205490565b6001600160a01b03821660009081526018602052604090205461293a8361309c565b610bc29190613cb9565b600081815260018301602052604081205461298b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc2565b506000610bc2565b60008181526001830160205260408120548015612a765760006129b7600183613ca2565b85549091506000906129cb90600190613ca2565b905060008660000182815481106129e4576129e4613dc9565b9060005260206000200154905080876000018481548110612a0757612a07613dc9565b600091825260208083209091019290925582815260018901909152604090208490558654879080612a3a57612a3a613e58565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc2565b6000915050610bc2565b6001600160a01b03831660009081526001602052604090205481811015612ae45760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b76565b612aee8483613613565b612af883836136f9565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b3d91815260200190565b60405180910390a350505050565b60135462010000900460ff1615612ba45760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610b76565b6014546001600160a01b0390811690821603612bd057436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c415760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b76565b60008315612d1857601354610100900460ff1615612cb5576001600160a01b03881660009081526003602052604090205460ff1615612cb55760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b76565b600d54861115612d075760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610b76565b50600854610100900460ff16612f90565b8415612e8e5760125415612d8a57601254600290612d369043613ca2565b1015612d8a576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612d7083613e6e565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612ddd576001600160a01b038716600090815260196020526040902054439003612dc157600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612dea8785613cb9565b1115612e385760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610b76565b600e54861115612e825760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610b76565b5060085460ff16612f90565b601354610100900460ff1615612efa576001600160a01b03881660009081526003602052604090205460ff1615612efa5760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b76565b612f066012600a613c45565b8611612f3457601354612f2c903390600160381b90046001600160a01b03166000612558565b505050613095565b600c54612f418785613cb9565b1115612f825760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b76565b5060085462010000900460ff165b6014546001600160a01b03898116911614801590612fb85750601354600160301b900460ff16155b8015612fc75750601f5460ff16155b8015612fd05750835b15612fef57601354612fef90640100000000900461ffff16600061233f565b600060ff82161561301657606461300960ff841689613c54565b6130139190613d42565b90505b60006130228289613ca2565b905061302e8a89613613565b61303830836136f9565b61304289826136f9565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308791815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916130c391613c54565b6001600160a01b0384166000908152601760205260409020549091508110156130ef5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906131189083613ca2565b611bba9190613d42565b60155461313a9030906001600160a01b031683611e87565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316f5761316f613dc9565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ec9190613dac565b816001815181106131ff576131ff613dc9565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613245908590600090869030904290600401613e8d565b600060405180830381600087803b15801561325f57600080fd5b505af1158015613273573d6000803e3d6000fd5b505050505050565b6015546132939030906001600160a01b031684611e87565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906132d09030908790600090819084904290600401613d07565b60606040518083038185885af11580156132ee573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130959190613ec9565b804710156133635760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b76565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a3890613396908490602001613ef7565b60405160208183030381529060405280519060200120146133f95760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610b76565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d806000811461344f576040519150601f19603f3d011682016040523d82523d6000602084013e613454565b606091505b50509050806111445760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b76565b60105460095460009160ff6101009091048116916134f191620100009091041685613c54565b6134fb9190613d42565b60105460095491925060009160ff61010090920482169161351d911686613c54565b6135279190613d42565b60105460095491925060009160ff61010090920482169161355091630100000090041687613c54565b61355a9190613d42565b600b54909150613573906001600160a01b031684611df2565b600a54613589906001600160a01b031683611df2565b80156130955783156135ad5780601e60008282546135a79190613cb9565b90915550505b60006135b76137de565b9050806000036135dc57600b546135d7906001600160a01b031683611df2565b613273565b806135eb600160401b84613c54565b6135f59190613d42565b601c60008282546136069190613cb9565b9091555050505050505050565b6001600160a01b038216600090815260016020526040812054613637908390613ca2565b9050613644600684611dd0565b15613669576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461367b9190613ca2565b909155506000905061368c8461309c565b6001600160a01b0385166000908152600160205260409020839055601c549091506136b8908390613c54565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906136ee908490613cb9565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461371d908390613cb9565b905061372a600684611dd0565b1561374f576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546137619190613cb9565b90915550600090506137728461309c565b905081601c546137829190613c54565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906137b8908490613cb9565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006137ec6012600a613c45565b6137fa906305f5e100613c54565b601b54610be49190613ca2565b60005b8381101561382257818101518382015260200161380a565b83811115613831576000848401525b50505050565b6020815260008251806020840152613856816040850160208701613807565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612bd057600080fd5b6000806040838503121561389257600080fd5b823561389d8161386a565b946020939093013593505050565b803561ffff811681146138bd57600080fd5b919050565b6000602082840312156138d457600080fd5b611bba826138ab565b6000602082840312156138ef57600080fd5b8135611bba8161386a565b60008060006060848603121561390f57600080fd5b833561391a8161386a565b9250602084013561392a8161386a565b929592945050506040919091013590565b8015158114612bd057600080fd5b60006020828403121561395b57600080fd5b8135611bba8161393b565b60006020828403121561397857600080fd5b5035919050565b6000806040838503121561399257600080fd5b823561399d8161386a565b915060208301356139ad8161393b565b809150509250929050565b600080600080608085870312156139ce57600080fd5b6139d7856138ab565b93506139e5602086016138ab565b92506139f3604086016138ab565b9150613a01606086016138ab565b905092959194509250565b803560ff811681146138bd57600080fd5b60008060008060808587031215613a3357600080fd5b613a3c85613a0c565b9350613a4a60208601613a0c565b9250613a5860408601613a0c565b9150613a0160608601613a0c565b60008060408385031215613a7957600080fd5b61399d836138ab565b600080600060608486031215613a9757600080fd5b613aa084613a0c565b9250613aae60208501613a0c565b9150613abc60408501613a0c565b90509250925092565b60008060408385031215613ad857600080fd5b8235613ae38161386a565b915060208301356139ad8161386a565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613b9c578160001904821115613b8257613b82613b4b565b80851615613b8f57918102915b93841c9390800290613b66565b509250929050565b600082613bb357506001610bc2565b81613bc057506000610bc2565b8160018114613bd65760028114613be057613bfc565b6001915050610bc2565b60ff841115613bf157613bf1613b4b565b50506001821b610bc2565b5060208310610133831016604e8410600b8410161715613c1f575081810a610bc2565b613c298383613b61565b8060001904821115613c3d57613c3d613b4b565b029392505050565b6000611bba60ff841683613ba4565b6000816000190483118215151615613c6e57613c6e613b4b565b500290565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b600082821015613cb457613cb4613b4b565b500390565b60008219821115613ccc57613ccc613b4b565b500190565b600060208284031215613ce357600080fd5b5051919050565b600060208284031215613cfc57600080fd5b8151611bba8161393b565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613d5f57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613d8157613d81613b4b565b019392505050565b600060ff821660ff841680821015613da357613da3613b4b565b90039392505050565b600060208284031215613dbe57600080fd5b8151611bba8161386a565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613e185781516001600160a01b031687529582019590820190600101613df3565b509495945050505050565b848152608060208201526000613e3c6080830186613ddf565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613e8457613e84613b4b565b60010192915050565b85815284602082015260a060408201526000613eac60a0830186613ddf565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613ede57600080fd5b8351925060208401519150604084015190509250925092565b60008251613f09818460208701613807565b919091019291505056fea2646970667358221220107f89d0b072eff835218646d8de6f09db036470a8ffd460f7798d198079811d64736f6c634300080d0033

Deployed Bytecode Sourcemap

17647:29629:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20354:32;;;;;;;;;;-1:-1:-1;20354:32:0;;;;;;;;;;;;;;188:6:1;176:19;;;158:38;;146:2;131:18;20354:32:0;;;;;;;;30917:229;;;;;;;;;;;;;:::i;:::-;;19079:107;;;;;;;;;;-1:-1:-1;19079:107: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;19079:107:0;207:340:1;24032:85:0;;;;;;;;;;-1:-1:-1;24104:10:0;;;;;;;;;;;-1:-1:-1;;;24104:10:0;;;;24032:85;;;;24104:10;24032:85;:::i;24640:161::-;;;;;;;;;;-1:-1:-1;24640:161:0;;;;;:::i;:::-;;:::i;:::-;;;1824:14:1;;1817:22;1799:41;;1787:2;1772:18;24640:161:0;1659:187:1;34888:27:0;;;;;;;;;;;;;;;;;;;1997:25:1;;;1985:2;1970:18;34888:27:0;1851:177:1;24218:88:0;;;;;;;;;;;;;:::i;29694:294::-;;;;;;;;;;-1:-1:-1;29694:294:0;;;;;:::i;:::-;;:::i;20604:27::-;;;;;;;;;;-1:-1:-1;20604:27:0;;;;-1:-1:-1;;;;;20604:27:0;;;;;;-1:-1:-1;;;;;2550:32:1;;;2532:51;;2520:2;2505:18;20604:27:0;2386:203:1;32735:259:0;;;;;;;;;;-1:-1:-1;32735:259:0;;;;;:::i;:::-;;:::i;25996:392::-;;;;;;;;;;-1:-1:-1;25996:392:0;;;;;:::i;:::-;;:::i;33684:223::-;;;;;;;;;;;;;:::i;27159:144::-;;;;;;;;;;-1:-1:-1;27159:144:0;;;;;:::i;:::-;;:::i;23855:85::-;;;;;;;;;;-1:-1:-1;18313:2:0;23855:85;;;3856:4:1;3844:17;;;3826:36;;3814:2;3799:18;23855:85:0;3684:184:1;20680:28:0;;;;;;;;;;-1:-1:-1;20680:28:0;;;;-1:-1:-1;;;;;20680:28:0;;;25596:205;;;;;;;;;;-1:-1:-1;25596:205:0;;;;;:::i;:::-;;:::i;28007:142::-;;;;;;;;;;-1:-1:-1;28007:142:0;;;;;:::i;:::-;;:::i;34854:27::-;;;;;;;;;;;;;;;;31304:319;;;;;;;;;;-1:-1:-1;31304:319:0;;;;;:::i;:::-;;:::i;32071:656::-;;;;;;;;;;;;;:::i;20442:22::-;;;;;;;;;;-1:-1:-1;20442:22:0;;;;-1:-1:-1;;;20442:22:0;;;;;;30606:198;;;;;;;;;;-1:-1:-1;30606:198:0;;;;;:::i;:::-;;:::i;34075:146::-;;;;;;;;;;;;;:::i;27709:251::-;;;;;;;;;;-1:-1:-1;27709:251:0;;;;;:::i;:::-;;:::i;33002:301::-;;;;;;;;;;-1:-1:-1;33002:301:0;;;;;:::i;:::-;;:::i;28382:801::-;;;;;;;;;;-1:-1:-1;28382:801:0;;;;;:::i;:::-;;:::i;29216:417::-;;;;;;;;;;-1:-1:-1;29216:417:0;;;;;:::i;:::-;;:::i;26969:145::-;;;;;;;;;;-1:-1:-1;26969:145:0;;;;;:::i;:::-;;:::i;31692:315::-;;;;;;;;;;;;;:::i;19595:24::-;;;;;;;;;;-1:-1:-1;19595:24:0;;;;;;;;;;;;;;;;6182:25:1;;;6238:2;6223:18;;6216:34;;;;6266:18;;;6259:34;6170:2;6155:18;19595:24:0;5980:319:1;34642:54:0;;;;;;;;;;-1:-1:-1;34642:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;19413:173;;;;;;;;;;-1:-1:-1;19413:173:0;;;;;;-1:-1:-1;;;;;19413:173:0;;;;;;;;;;;-1:-1:-1;;;;;6534:15:1;;;6516:34;;6586:15;;;;6581:2;6566:18;;6559:43;6451:18;19413:173:0;6304:304:1;25116:121:0;;;;;;;;;;-1:-1:-1;25116:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;25211:18:0;25184:7;25211:18;;;:9;:18;;;;;;;25116:121;9184:140;;;;;;;;;;;;;:::i;34229:135::-;;;;;;;;;;-1:-1:-1;34229:135:0;;;;;:::i;:::-;;:::i;26472:88::-;;;;;;;;;;;;;:::i;18322:34::-;;;;;;;;;;;;18354:2;18322:34;;27370:268;;;;;;;;;;-1:-1:-1;27370:268:0;;;;;:::i;:::-;;:::i;23946:80::-;;;;;;;;;;-1:-1:-1;23998:7:0;9048:6;-1:-1:-1;;;;;9048:6:0;23946:80;24218:88;29996:483;;;;;;;;;;-1:-1:-1;29996:483:0;;;;;:::i;:::-;;:::i;33915:152::-;;;;;;;;;;-1:-1:-1;33915:152:0;;;;;:::i;:::-;;:::i;25245:342::-;;;;;;;;;;-1:-1:-1;25245:342:0;;;;;:::i;:::-;;:::i;25817:167::-;;;;;;;;;;-1:-1:-1;25817:167:0;;;;;:::i;:::-;;:::i;26738:147::-;;;;;;;;;;;;;:::i;19195:209::-;;;;;;;;;;-1:-1:-1;19195:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7185:4:1;7173:17;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;;;;7335:17;;;7330:2;7315:18;;7308:45;7142:3;7127:19;19195:209:0;6940:419:1;24485:147:0;;;;;;;;;;-1:-1:-1;24485:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;24596:19:0;;;24569:7;24596:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;24485:147;28244:103;;;;;;;;;;-1:-1:-1;28244:103:0;;;;;:::i;:::-;;:::i;9336:223::-;;;;;;;;;;-1:-1:-1;9336:223:0;;;;;:::i;:::-;;:::i;20524:71::-;;;;;;;;;;-1:-1:-1;20524:71:0;;;;-1:-1:-1;;;20524:71:0;;-1:-1:-1;;;;;20524:71:0;;;19628:132;;;;;;;;;;-1:-1:-1;19628:132:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19628:132:0;;;;;;;;;7990:6:1;8023:15;;;8005:34;;8075:15;;;8070:2;8055:18;;8048:43;8127:15;;;8107:18;;;8100:43;;;;8179:15;;;8174:2;8159:18;;8152:43;7967:3;7952:19;19628:132:0;7757:444:1;33342:334:0;;;;;;;;;;-1:-1:-1;33587:14:0;;33621:11;;33342:334;;;8445:25:1;;;19990:1:0;8501:2:1;8486:18;;8479:45;33621:11:0;;;;8540:18:1;;;8533:45;;;;33621:11:0;33634:16;;;;8621:14:1;8614:22;8609:2;8594:18;;8587:50;33652:15:0;;;;;8681:14:1;8674:22;8668:3;8653:19;;8646:51;8432:3;8417:19;33342:334:0;8206:497:1;17906:45:0;;;;;;;;;;-1:-1:-1;17906:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30917:229;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;;;;;;;;;30996:20:::1;;30977:15;:39;;30969:68;;;;-1:-1:-1::0;;;30969:68:0::1;;;;;;;:::i;:::-;31069:15;31048:20;:36:::0;31095:43:::1;31104:10;31116:21;31095:8;:43::i;:::-;30917:229::o:0;24640:161::-;24717:4;24734:37;24743:10;24755:7;24764:6;24734:8;:37::i;:::-;-1:-1:-1;24789:4:0;24640:161;;;;;:::o;24218:88::-;24273:7;18241:18;18313:2;18241;:18;:::i;:::-;18227:32;;:11;:32;:::i;:::-;24284:19;;24218:88;:::o;29694:294::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;29792:1:::1;29780:9;:13;;;29772:58;;;::::0;-1:-1:-1;;;29772:58:0;;11642:2:1;29772:58:0::1;::::0;::::1;11624:21:1::0;11681:2;11661:18;;;11654:30;11720:34;11700:18;;;11693:62;-1:-1:-1;;;11771:18:1;;;11764:31;11812:19;;29772:58:0::1;11440:397:1::0;29772:58:0::1;29862:2;29849:9;:15;;;;29841:57;;;::::0;-1:-1:-1;;;29841:57:0;;12044:2:1;29841:57:0::1;::::0;::::1;12026:21:1::0;12083:2;12063:18;;;12056:30;12122:32;12102:18;;;12095:60;12172:18;;29841:57:0::1;11842:354:1::0;29841:57:0::1;29909:13;:25:::0;;-1:-1:-1;;29909:25:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;29950:30:::1;::::0;158:38:1;;;29950:30:0::1;::::0;146:2:1;131:18;29950:30:0::1;;;;;;;;29694:294:::0;:::o;32735:259::-;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;32827:10:::1;:14:::0;-1:-1:-1;;;;;32827:14:0::1;32852:25;:9;32827:14:::0;32852:16:::1;:25::i;:::-;-1:-1:-1::0;32888:10:0::1;:21:::0;;-1:-1:-1;;;;;;32888:21:0::1;-1:-1:-1::0;;;;;32888:21:0;::::1;::::0;;::::1;::::0;;;32920:29:::1;::::0;:9:::1;::::0;:13:::1;:29::i;:::-;-1:-1:-1::0;32965:21:0::1;::::0;-1:-1:-1;;;;;2550:32:1;;2532:51;;32965:21:0::1;::::0;2520:2:1;2505:18;32965:21:0::1;;;;;;;;32798:196;32735:259:::0;:::o;25996:392::-;26096:4;26113:36;26123:6;26131:9;26142:6;26113:9;:36::i;:::-;-1:-1:-1;;;;;26189:19:0;;26162:24;26189:19;;;:11;:19;;;;;;;;26209:10;26189:31;;;;;;;;26239:26;;;;26231:59;;;;-1:-1:-1;;;26231:59:0;;12619:2:1;26231:59:0;;;12601:21:1;12658:2;12638:18;;;12631:30;-1:-1:-1;;;12677:18:1;;;12670:50;12737:18;;26231:59:0;12417:344:1;26231:59:0;26303:55;26312:6;26320:10;26332:25;26351:6;26332:16;:25;:::i;:::-;26303:8;:55::i;:::-;-1:-1:-1;26376:4:0;;25996:392;-1:-1:-1;;;;25996:392:0:o;33684:223::-;33746:7;33788:20;;33770:15;:38;33766:115;;;33854:15;33831:20;;:38;;;;:::i;33766:115::-;-1:-1:-1;33898:1:0;;33684:223::o;27159:144::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;27229:16:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;27229:26:0;;::::1;;::::0;;27271:24:::1;::::0;::::1;::::0;::::1;::::0;27248:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;25596:205:0;25704:10;25678:4;25725:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;25725:32:0;;;;;;;;;;25678:4;;25695:76;;25716:7;;25725:45;;25760:10;;25725:45;:::i;28007:142::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;28079:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;28079:20:0::1;-1:-1:-1::0;;28079:20:0;;::::1;;::::0;;28116:25:::1;::::0;::::1;::::0;::::1;::::0;28092:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;31304:319:0;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;31406:12:::1;::::0;-1:-1:-1;;;;;31390:28:0;;::::1;31406:12:::0;::::1;31390:28;::::0;::::1;::::0;:61:::1;;-1:-1:-1::0;;;;;;31422:29:0;::::1;31446:4;31422:29;;31390:61;31382:119;;;::::0;-1:-1:-1;;;31382:119:0;;13231:2:1;31382:119:0::1;::::0;::::1;13213:21:1::0;13270:2;13250:18;;;13243:30;13309:34;13289:18;;;13282:62;-1:-1:-1;;;13360:18:1;;;13353:34;13404:19;;31382:119:0::1;13029:400:1::0;31382:119:0::1;31584:30;::::0;-1:-1:-1;;;31584:30:0;;31608:4:::1;31584:30;::::0;::::1;2532:51:1::0;31534:12:0;;-1:-1:-1;;;;;31558:14:0;::::1;::::0;::::1;::::0;31573:10:::1;::::0;31558:14;;31584:15:::1;::::0;2505:18:1;;31584:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31558:57;::::0;-1:-1:-1;;;;;;31558:57:0::1;::::0;;;;;;-1:-1:-1;;;;;13815:32:1;;;31558:57:0::1;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;13770:18;;31558:57:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31371:252;31304:319:::0;:::o;32071:656::-;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;32148:20:::1;;32129:15;:39;;32121:68;;;;-1:-1:-1::0;;;32121:68:0::1;;;;;;;:::i;:::-;32223:15;32200:20;:38:::0;32288:12:::1;::::0;32329:39:::1;::::0;-1:-1:-1;;;32329:39:0;;32362:4:::1;32329:39;::::0;::::1;2532:51:1::0;-1:-1:-1;;;;;32288:12:0;;::::1;::::0;32249:25:::1;::::0;32288:12;;32329:24:::1;::::0;2505:18:1;;32329:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32410:11;::::0;32379:51:::1;::::0;-1:-1:-1;;;32379:51:0;;-1:-1:-1;;;;;32410:11:0;;::::1;32379:51;::::0;::::1;13797::1::0;13864:18;;;13857:34;;;32312:56:0;;-1:-1:-1;32379:22:0;::::1;::::0;::::1;::::0;13770:18:1;;32379:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;32441:11:0::1;::::0;:213:::1;::::0;-1:-1:-1;;;32441:213:0;;-1:-1:-1;;;;;32441:11:0;;::::1;::::0;:59:::1;::::0;:213:::1;::::0;32523:4:::1;::::0;32543:6;;32441:11:::1;::::0;;;32523:4;;32624:15:::1;::::0;32441:213:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32665:43;32674:10;32686:21;32665:8;:43::i;:::-;32110:617;;32071:656::o:0;30606:198::-;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;30692:50:::1;30706:35;30726:15;30706:17:::0;:35:::1;:::i;:::-;30692:13;:50::i;:::-;30758:38;::::0;1997:25:1;;;30758:38:0::1;::::0;1985:2:1;1970:18;30758:38:0::1;1851:177:1::0;34075:146:0;34125:7;34145:14;34177:12;;34162;;:27;;;;:::i;27709:251::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;27806:7:::1;27803:100;;;27828:24;27847:4;27828:18;:24::i;:::-;27803:100;;;27881:22;27898:4;27881:16;:22::i;:::-;27919:33;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;27919:33:0::1;::::0;14905:18:1;27919:33:0::1;14764:284:1::0;33002:301:0;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;33106:20;;-1:-1:-1;;;;;33106:20:0::1;33137:31;:9;33106:20:::0;33137:16:::1;:31::i;:::-;-1:-1:-1::0;33179:20:0;:27;;-1:-1:-1;;;;;;33179:27:0::1;-1:-1:-1::0;;;;;33179:27:0;::::1;::::0;;::::1;::::0;;;33217:35:::1;::::0;:9:::1;::::0;:13:::1;:35::i;:::-;-1:-1:-1::0;33268:27:0::1;::::0;-1:-1:-1;;;;;2550:32:1;;2532:51;;33268:27:0::1;::::0;2520:2:1;2505:18;33268:27:0::1;2386:203:1::0;28382:801:0;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;28527:16:::1;28561:4;18241:18;18313:2;18241;:18;:::i;:::-;18227:32;::::0;:11:::1;:32;:::i;:::-;28546:19;;;;:::i;:::-;28527:38:::0;-1:-1:-1;28579:20:0::1;28602:45;::::0;;::::1;::::0;:32;::::1;18241:18;18313:2;18241;:18;:::i;:::-;18227:32;::::0;:11:::1;:32;:::i;:::-;28602;;;;:::i;:::-;:45;;;;:::i;:::-;28579:68:::0;-1:-1:-1;28658:18:0::1;28679:43;::::0;;::::1;::::0;:30;::::1;18241:18;18313:2;18241;:18;:::i;:::-;18227:32;::::0;:11:::1;:32;:::i;:::-;28679:30;;;;:::i;:::-;:43;;;;:::i;:::-;28658:64:::0;-1:-1:-1;28733:17:0::1;28753:42;::::0;;::::1;::::0;:29;::::1;18241:18;18313:2;18241;:18;:::i;:::-;18227:32;::::0;:11:::1;:32;:::i;:::-;28753:29;;;;:::i;:::-;:42;;;;:::i;:::-;28733:62;;28909:8;28893:12;:24;;:50;;;;;28935:8;28921:10;:22;;28893:50;28884:111;;;::::0;-1:-1:-1;;;28884:111:0;;15477:2:1;28884:111:0::1;::::0;::::1;15459:21:1::0;;;15496:18;;;15489:30;15555:34;15535:18;;;15528:62;15607:18;;28884:111:0::1;15275:356:1::0;28884:111:0::1;29018:46;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;29008:7:::1;:56:::0;;;;;;;;;;;;;;29100:75;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;29085:12:0::1;:90:::0;;-1:-1:-1;;29085:90:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;29085:90:0;;;;::::1;-1:-1:-1::0;;29085:90:0;;;;;-1:-1:-1;;;29085:90:0;;::::1;::::0;;;::::1;::::0;;28382:801::o;29216:417::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;29354::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;29341:10:::1;:70:::0;;-1:-1:-1;;29341:70:0;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;29341:70:0;;;;::::1;-1:-1:-1::0;;29341:70:0;;;;;;;;::::1;;::::0;;29354:57;;29440:21:::1;29354:57:::0;;29440:21:::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;29424:13;:65:::0;;-1:-1:-1;;29424:65:0::1;;::::0;;;::::1;::::0;;::::1;::::0;;29518:28:::1;::::0;29534:12;;29518:28:::1;:::i;:::-;29500:15;:46:::0;;-1:-1:-1;;29500:46:0::1;;;::::0;;::::1;;;::::0;;29564:61:::1;::::0;;7173:17:1;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;7335:17;;;7330:2;7315:18;;7308:45;29564:61:0;::::1;::::0;7142:3:1;29564:61:0;;;;;;::::1;29216:417:::0;;;;:::o;26969:145::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;27064:42:::1;27083:8;27093:12;27064:18;:42::i;31692:315::-:0;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;31770:20:::1;;31751:15;:39;;31743:68;;;;-1:-1:-1::0;;;31743:68:0::1;;;;;;;:::i;:::-;31861:12;::::0;31902:39:::1;::::0;-1:-1:-1;;;31902:39:0;;31935:4:::1;31902:39;::::0;::::1;2532:51:1::0;-1:-1:-1;;;;;31861:12:0;;::::1;::::0;31822:25:::1;::::0;31861:12;;31902:24:::1;::::0;2505:18:1;;31902:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31956:43;::::0;-1:-1:-1;;;31956:43:0;;31980:10:::1;31956:43;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;;;31885:56:0;;-1:-1:-1;;;;;;31956:23:0;::::1;::::0;::::1;::::0;13770:18:1;;31956:43:0::1;13623:274:1::0;9184:140:0;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;9283:1:::1;9267:6:::0;;9246:40:::1;::::0;-1:-1:-1;;;;;9267:6:0;;::::1;::::0;9246:40:::1;::::0;9283:1;;9246:40:::1;9314:1;9297:19:::0;;-1:-1:-1;;;;;;9297:19:0::1;::::0;;9184:140::o;34229:135::-;34297:4;34321:35;:20;34351:4;34321:29;:35::i;26472:88::-;26537:11;;26515:37;;26526:10;;-1:-1:-1;;;26537:11:0;;-1:-1:-1;;;;;26537:11:0;26550:1;26515:10;:37::i;27370:268::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;27467:15;::::1;;27478:4;27467:15:::0;27464:109:::1;;27497:22;:9;27511:7:::0;27497:13:::1;:22::i;:::-;;27464:109;;;27548:25;:9;27565:7:::0;27548:16:::1;:25::i;:::-;;27464:109;27589:41;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;27589:41:0::1;::::0;14905:18:1;27589:41:0::1;14764:284:1::0;29996:483:0;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;18354:2:::1;30266:17;::::0;::::1;;::::0;::::1;::::0;:39:::1;;-1:-1:-1::0;18354:2:0::1;30287:18;::::0;::::1;;;30266:39;:60;;;;;30324:2;30309:11;:17;;;;30266:60;30258:98;;;::::0;-1:-1:-1;;;30258:98:0;;16247:2:1;30258:98:0::1;::::0;::::1;16229:21:1::0;16286:2;16266:18;;;16259:30;16325:27;16305:18;;;16298:55;16370:18;;30258:98:0::1;16045:349:1::0;30258:98:0::1;30379:35;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;30367:9:::1;:47:::0;;-1:-1:-1;;30367:47:0;;;::::1;::::0;::::1;;-1:-1:-1::0;;30367:47:0::1;::::0;;::::1;;::::0;;30430:41;;397:36:1;;;449:18;;;442:45;;;;503:18;;;496:45;;;;30430:41:0::1;::::0;370:18:1;30430:41:0::1;;;;;;;29996:483:::0;;;:::o;33915:152::-;33977:7;33997:14;34014:21;34030:4;34014:15;:21::i;:::-;33997:38;33915:152;-1:-1:-1;;;33915:152:0:o;25245:342::-;25388:10;25332:4;25376:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;25376:32:0;;;;;;;;;;25427:35;;;;25419:60;;;;-1:-1:-1;;;25419:60:0;;16601:2:1;25419:60:0;;;16583:21:1;16640:2;16620:18;;;16613:30;-1:-1:-1;;;16659:18:1;;;16652:42;16711:18;;25419:60:0;16399:336:1;25419:60:0;25492:65;25501:10;25513:7;25522:34;25541:15;25522:16;:34;:::i;25492:65::-;-1:-1:-1;25575:4:0;;25245:342;-1:-1:-1;;;25245:342:0:o;25817:167::-;25897:4;25914:40;25924:10;25936:9;25947:6;25914:9;:40::i;26738:147::-;26788:28;26805:10;26788:16;:28::i;:::-;26832:37;;;26851:10;14932:51:1;;26863:5:0;15014:2:1;14999:18;;14992:50;26832:37:0;;14905:18:1;26832:37:0;;;;;;;26738:147::o;28244:103::-;21653:23;21665:10;21653:11;:23::i;:::-;21645:57;;;;-1:-1:-1;;;21645:57:0;;;;;;;:::i;:::-;28314:15:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;28314:25:0;;::::1;::::0;;;::::1;::::0;;28244:103::o;9336:223::-;9121:10;9110:7;9021;9048:6;-1:-1:-1;;;;;9048:6:0;;8983:79;9110:7;-1:-1:-1;;;;;9110:21:0;;9102:54;;;;-1:-1:-1;;;9102:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9417:22:0;::::1;9409:60;;;::::0;-1:-1:-1;;;9409:60:0;;16942:2:1;9409:60:0::1;::::0;::::1;16924:21:1::0;16981:2;16961:18;;;16954:30;17020:27;17000:18;;;16993:55;17065:18;;9409:60:0::1;16740:349:1::0;9409:60:0::1;9506:6;::::0;;9485:38:::1;::::0;-1:-1:-1;;;;;9485:38:0;;::::1;::::0;9506:6;::::1;::::0;9485:38:::1;::::0;::::1;9534:6;:17:::0;;-1:-1:-1;;;;;;9534:17:0::1;-1:-1:-1::0;;;;;9534:17:0;;;::::1;::::0;;;::::1;::::0;;9336:223::o;16097:152::-;16167:4;16191:50;16196:3;-1:-1:-1;;;;;16216:23:0;;16191:4;:50::i;16423:167::-;-1:-1:-1;;;;;16557:23:0;;16503:4;14934:19;;;:12;;;:19;;;;;;:24;;16527:55;14837:129;37543:177;37614:9;37628:7;-1:-1:-1;;;;;37628:12:0;37649:6;37628:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37613:48;;;37680:4;37672:32;;;;-1:-1:-1;;;37672:32:0;;17506:2:1;37672:32:0;;;17488:21:1;17545:2;17525:18;;;17518:30;-1:-1:-1;;;17564:18:1;;;17557:45;17619:18;;37672:32:0;17304:339:1;24809:299:0;-1:-1:-1;;;;;24902:19:0;;24894:49;;;;-1:-1:-1;;;24894:49:0;;17850:2:1;24894:49:0;;;17832:21:1;17889:2;17869:18;;;17862:30;-1:-1:-1;;;17908:18:1;;;17901:47;17965:18;;24894:49:0;17648:341:1;24894:49:0;-1:-1:-1;;;;;24962:21:0;;24954:49;;;;-1:-1:-1;;;24954:49:0;;18196:2:1;24954:49:0;;;18178:21:1;18235:2;18215:18;;;18208:30;-1:-1:-1;;;18254:18:1;;;18247:45;18309:18;;24954:49:0;17994:339:1;24954:49:0;-1:-1:-1;;;;;25016:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25068:32;;1997:25:1;;;25068:32:0;;1970:18:1;25068:32:0;;;;;;;24809:299;;;:::o;24314:163::-;24371:4;9048:6;;-1:-1:-1;;;;;24395:15:0;;;9048:6;;24395:15;;:47;;-1:-1:-1;24422:20:0;;-1:-1:-1;;;;;24414:28:0;;;24422:20;;24414:28;24395:47;:73;;;-1:-1:-1;;24454:10:0;:14;-1:-1:-1;;;;;24454:14:0;;;24446:22;;;;24314:163::o;16257:158::-;16330:4;16354:53;16362:3;-1:-1:-1;;;;;16382:23:0;;16354:7;:53::i;42203:1147::-;-1:-1:-1;;;;;42300:20:0;;42292:51;;;;-1:-1:-1;;;42292:51:0;;18540:2:1;42292:51:0;;;18522:21:1;18579:2;18559:18;;;18552:30;-1:-1:-1;;;18598:18:1;;;18591:48;18656:18;;42292:51:0;18338:342:1;42292:51:0;-1:-1:-1;;;;;42362:23:0;;42354:52;;;;-1:-1:-1;;;42354:52:0;;18887:2:1;42354:52:0;;;18869:21:1;18926:2;18906:18;;;18899:30;-1:-1:-1;;;18945:18:1;;;18938:46;19001:18;;42354:52:0;18685:340:1;42354:52:0;42419:15;42438:26;:9;42457:6;42438:18;:26::i;:::-;:59;;;-1:-1:-1;42468:29:0;:9;42487;42468:18;:29::i;:::-;42419:79;-1:-1:-1;42511:23:0;-1:-1:-1;;;;;42538:23:0;;42556:4;42538:23;;:53;;-1:-1:-1;;;;;;42565:26:0;;42586:4;42565:26;42538:53;42636:11;;42712:12;;42511:81;;-1:-1:-1;;;;;;42636:11:0;;;;42603:22;;42702;;;42712:12;;42702:22;:53;;;;;42741:14;-1:-1:-1;;;;;42728:27:0;:9;-1:-1:-1;;;;;42728:27:0;;42702:53;42701:128;;;-1:-1:-1;42788:12:0;;-1:-1:-1;;;;;42775:25:0;;;42788:12;;42775:25;:53;;;;;42814:14;-1:-1:-1;;;;;42804:24:0;:6;-1:-1:-1;;;;;42804:24:0;;42775:53;42880:12;;42659:181;;-1:-1:-1;42853:11:0;;-1:-1:-1;;;;;42867:25:0;;;42880:12;;42867:25;;:56;;;42909:14;-1:-1:-1;;;;;42896:27:0;:9;-1:-1:-1;;;;;42896:27:0;;42867:56;42953:12;;42853:70;;-1:-1:-1;42934:10:0;;-1:-1:-1;;;;;42945:20:0;;;42953:12;;42945:20;;:47;;;42978:14;-1:-1:-1;;;;;42968:24:0;:6;-1:-1:-1;;;;;42968:24:0;;42945:47;42934:58;;43009:18;:41;;;;43031:19;43009:41;:55;;;;43054:10;43009:55;43005:338;;;43081:43;43098:6;43106:9;43117:6;43081:16;:43::i;:::-;43146:14;;;;;;;43141:61;;43180:22;43192:9;43180:11;:22::i;:::-;43005:338;;;43257:56;43272:6;43280:9;43291:6;43299:5;43306:6;43257:14;:56::i;:::-;42281:1069;;;;;;42203:1147;;;:::o;46725:227::-;46876:20;;46860:13;:36;46852:45;;;;;;46908:20;:36;46725:227::o;45159:380::-;45229:35;:20;45259:4;45229:29;:35::i;:::-;45228:36;45220:45;;;;;;-1:-1:-1;;;;;45292:15:0;;;;;;:9;:15;;;;;;45276:12;:31;;45292:15;;45276:12;;:31;;45292:15;;45276:31;:::i;:::-;;;;-1:-1:-1;45318:20:0;;-1:-1:-1;45341:16:0;45352:4;45341:10;:16::i;:::-;45418:12;;-1:-1:-1;;;;;45400:15:0;;;;;;:9;:15;;;;;;45318:39;;-1:-1:-1;45400:30:0;;;:::i;:::-;-1:-1:-1;;;;;45374:23:0;;;;;;:17;:23;;;;;;;;:56;;;;45448:14;:20;;;;;:36;;45472:12;;45374:23;45448:36;;45472:12;;45448:36;:::i;:::-;;;;-1:-1:-1;45501:30:0;;-1:-1:-1;45501:20:0;45526:4;45501:24;:30::i;45547:264::-;45614:35;:20;45644:4;45614:29;:35::i;:::-;45606:44;;;;;;-1:-1:-1;;;;;45677:15:0;;;;;;:9;:15;;;;;;45661:12;:31;;45677:15;;45661:12;;:31;;45677:15;;45661:31;:::i;:::-;;;;-1:-1:-1;45703:33:0;;-1:-1:-1;45703:20:0;45731:4;45703:27;:33::i;:::-;-1:-1:-1;45791:12:0;;-1:-1:-1;;;;;45773:15:0;;;;;;:9;:15;;;;;;:30;;45791:12;45773:30;:::i;:::-;-1:-1:-1;;;;;45747:23:0;;;;;;;:17;:23;;;;;:56;45547:264::o;37728:1698::-;21762:27;:34;;-1:-1:-1;;21762:34:0;21792:4;21762:34;;;37843:3:::1;37831:15;::::0;::::1;;;37823:24;;;::::0;::::1;;37862:13;::::0;::::1;;37858:31:::0;37882:7:::1;37858:31;37943:4;37899:23;37925:24:::0;;;:9:::1;:24;::::0;;;;;;37996:12:::1;::::0;-1:-1:-1;;;;;37996:12:0::1;37986:23:::0;;;;;;37925:24;;37899:23;38023:4:::1;::::0;37986:34:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:41;;;;:::i;:::-;38056:15:::0;;37964:63;;-1:-1:-1;38042:29:0;::::1;:46:::0;::::1;;;;38076:12;38075:13;38042:46;38038:95;;;-1:-1:-1::0;38118:15:0;;38038:95:::1;38176:29:::0;;::::1;38216:155:::0;::::1;;;38255:12;38251:109;;;38300:15;38286:29;;38251:109;;;38353:7;;;;;38251:109;38405:4;38385:26;::::0;;;:11:::1;:26;::::0;;;;;;;38420:11:::1;::::0;-1:-1:-1;;;;;38420:11:0::1;38385:48:::0;;;;;;;;:62;-1:-1:-1;38381:145:0::1;;;38494:11;::::0;38462:64:::1;::::0;38479:4:::1;::::0;-1:-1:-1;;;;;38494:11:0::1;-1:-1:-1::0;;38462:8:0::1;:64::i;:::-;38604:13;::::0;38580:10:::1;:20:::0;38539:25:::1;::::0;38604:13:::1;::::0;;::::1;::::0;38568:32:::1;::::0;38604:13:::1;38580:20:::0;;::::1;;38568:11:::0;:32:::1;:::i;:::-;38567:50;;;;:::i;:::-;38539:78:::0;-1:-1:-1;38628:22:0::1;38653:31;38539:78:::0;38653:11;:31:::1;:::i;:::-;38628:56:::0;-1:-1:-1;38695:16:0::1;38714:21;38734:1;38714:17:::0;:21:::1;:::i;:::-;38695:40:::0;-1:-1:-1;38746:19:0::1;38768:28;38695:40:::0;38768:17;:28:::1;:::i;:::-;38746:50:::0;-1:-1:-1;38807:17:0::1;38827:28;38841:14:::0;38746:50;38827:28:::1;:::i;:::-;38807:48:::0;-1:-1:-1;38894:21:0::1;38926:27;38807:48:::0;38926:16:::1;:27::i;:::-;38964:14;38982:41;39006:17:::0;38982:21:::1;:41;:::i;:::-;38964:60:::0;-1:-1:-1;39035:14:0::1;39075:9:::0;39053:18:::1;39060:11:::0;38964:60;39053:18:::1;:::i;:::-;39052:32;;;;:::i;:::-;39035:49:::0;-1:-1:-1;39099:12:0;;39095:63:::1;;39127:31;39141:8;39151:6;39127:13;:31::i;:::-;39170:14;39231:2;39188:39;39210:17:::0;39188:21:::1;:39;:::i;:::-;39187:46;;;;:::i;:::-;39170:63;;39244:37;;;;;;;;;;;;;;-1:-1:-1::0;;;39244:37:0::1;;::::0;39274:6:::1;39244:18;:37::i;:::-;39295:21;39364:6:::0;39320:41:::1;39344:17:::0;39320:21:::1;:41;:::i;:::-;:50;;;;:::i;:::-;39295:76;;39382:36;39399:13;39413:4;39382:16;:36::i;:::-;37812:1614;;;;;;;;;;;;;21807:1;-1:-1:-1::0;;21819:27:0;:35;;-1:-1:-1;;21819:35:0;;;37728:1698::o;43623:1528::-;43723:14;;;;;;;43722:15;43714:24;;;;;;43749:14;:21;;-1:-1:-1;;43749:21:0;;;;;;;43856:5;43878:35;:20;43908:4;43878:29;:35::i;:::-;43874:389;;;-1:-1:-1;;;;;43938:20:0;;;;;;:14;:20;;;;;;;43973:24;;;43938:20;-1:-1:-1;43874:389:0;;;44039:17;44059:16;44070:4;44059:10;:16::i;:::-;-1:-1:-1;;;;;44143:15:0;;;;;;:9;:15;;;;;;44128:12;;44039:36;;-1:-1:-1;44128:30:0;;;:::i;:::-;-1:-1:-1;;;;;44102:23:0;;;;;;:17;:23;;;;;;;;:56;;;;44182:14;:20;;;;:30;;44203:9;;44182:30;:::i;:::-;-1:-1:-1;;;;;44227:20:0;;44250:1;44227:20;;;:14;:20;;;;;:24;44173:39;-1:-1:-1;;43874:389:0;44287:11;;:33;;;;-1:-1:-1;44302:18:0;;44287:33;44283:108;;;-1:-1:-1;;44336:14:0;:22;;-1:-1:-1;;44336:22:0;;;-1:-1:-1;;;;43623:1528:0:o;44283:108::-;44419:6;44403:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;44436:25:0;;;;;;:19;:25;;;;;:35;;44465:6;;44436:25;:35;;44465:6;;44436:35;:::i;:::-;;;;-1:-1:-1;44482:23:0;;-1:-1:-1;44492:13:0;44482:23;;:::i;:::-;44542:16;;;44556:1;44542:16;;;;;;;;44482:23;;-1:-1:-1;44518:21:0;;44542:16;;;;;;;;;;-1:-1:-1;;44579:11:0;;:18;;;-1:-1:-1;;;44579:18:0;;;;44518:40;;-1:-1:-1;;;;;;44579:11:0;;;;:16;;-1:-1:-1;44579:18:0;;;;;;;;;;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44569:4;44574:1;44569:7;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;44569:28:0;;;-1:-1:-1;;;;;44569:28:0;;;;;44618:5;44608:4;44613:1;44608:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44608:15:0;;;:7;;;;;;;;;:15;44640:11;;:162;;-1:-1:-1;;;44640:162:0;;:11;;;:62;;44710:6;;44640:162;;:11;;44748:4;;44767;;44786:15;;44640:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44636:287;;44906:5;44892:19;;44636:287;;;44845:4;44831:18;;44636:287;44947:11;44943:114;;44975:22;44984:4;44990:6;44975:8;:22::i;:::-;45027:11;;;;;;;;;-1:-1:-1;;;;;45027:11:0;-1:-1:-1;;;;;45027:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45012:33;;44943:114;45072:38;;;20733:25:1;;;-1:-1:-1;;;;;20832:15:1;;;20827:2;20812:18;;20805:43;20884:15;;20864:18;;;20857:43;45072:38:0;;;;;;;20721:2:1;45072:38:0;;;-1:-1:-1;;45121:14:0;:22;;-1:-1:-1;;45121:22:0;;;-1:-1:-1;;;;;43623:1528:0:o;46366:228::-;46427:7;46451:35;:20;46481:4;46451:29;:35::i;:::-;46447:82;;;-1:-1:-1;;;;;;46509:20:0;;;;;:14;:20;;;;;;;46366:228::o;46447:82::-;-1:-1:-1;;;;;46566:20:0;;;;;;:14;:20;;;;;;46547:16;46581:4;46547:10;:16::i;:::-;:39;;;;:::i;13941:291::-;14004:4;14934:19;;;:12;;;:19;;;;;;14021:204;;-1:-1:-1;14064:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;14124:18;;14102:19;;;:12;;;:19;;;;;;:40;;;;14157:11;;14021:204;-1:-1:-1;14208:5:0;14201:12;;14240:589;14306:4;14344:19;;;:12;;;:19;;;;;;14378:15;;14374:448;;14410:21;14434:14;14447:1;14434:10;:14;:::i;:::-;14483:18;;14410:38;;-1:-1:-1;14463:17:0;;14483:22;;14504:1;;14483:22;:::i;:::-;14463:42;;14520:17;14540:3;:11;;14552:9;14540:22;;;;;;;;:::i;:::-;;;;;;;;;14520:42;;14606:9;14577:3;:11;;14589:13;14577:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;14630:23;;;:12;;;:23;;;;;;:36;;;14681:17;;14630:3;;14681:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;14720:3;:12;;:19;14733:5;14720:19;;;;;;;;;;;14713:26;;;14761:4;14754:11;;;;;;;;14374:448;14805:5;14798:12;;;;;36701:343;-1:-1:-1;;;;;36820:17:0;;36796:21;36820:17;;;:9;:17;;;;;;36856:23;;;;36848:60;;;;-1:-1:-1;;;36848:60:0;;21245:2:1;36848:60:0;;;21227:21:1;21284:2;21264:18;;;21257:30;-1:-1:-1;;;21303:18:1;;;21296:54;21367:18;;36848:60:0;21043:348:1;36848:60:0;36919:27;36932:6;36939;36919:12;:27::i;:::-;36957:28;36967:9;36978:6;36957:9;:28::i;:::-;37018:9;-1:-1:-1;;;;;37001:35:0;37010:6;-1:-1:-1;;;;;37001:35:0;;37029:6;37001:35;;;;1997:25:1;;1985:2;1970:18;;1851:177;37001:35:0;;;;;;;;36785:259;36701:343;;;:::o;43358:257::-;43433:14;;;;;;;43432:15;43424:51;;;;-1:-1:-1;;;43424:51:0;;21598:2:1;43424:51:0;;;21580:21:1;21637:2;21617:18;;;21610:30;21676:25;21656:18;;;21649:53;21719:18;;43424:51:0;21396:347:1;43424:51:0;43502:12;;-1:-1:-1;;;;;43502:12:0;;;43490:24;;;;43486:122;;43548:12;43531:14;:29;43575:14;:21;;-1:-1:-1;;43575:21:0;;;;;43486:122;43358:257;:::o;39887:2304::-;-1:-1:-1;;;;;40030:20:0;;;40003:24;40030:20;;;:9;:20;;;;;;;40085:17;;;;;;;;40121:23;;;;40113:60;;;;-1:-1:-1;;;40113:60:0;;21245:2:1;40113:60:0;;;21227:21:1;21284:2;21264:18;;;21257:30;-1:-1:-1;;;21303:18:1;;;21296:54;21367:18;;40113:60:0;21043:348:1;40113:60:0;40186:9;40210:6;40206:1450;;;40237:16;;;;;;;40233:124;;;-1:-1:-1;;;;;40283:21:0;;;;;;:13;:21;;;;;;;;40282:22;40274:51;;;;-1:-1:-1;;;40274:51:0;;21950:2:1;40274:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;40274:51:0;21748:340:1;40274:51:0;40397:15;;40387:25;;;40379:61;;;;-1:-1:-1;;;40379:61:0;;22295:2:1;40379:61:0;;;22277:21:1;22334:2;22314:18;;;22307:30;22373:25;22353:18;;;22346:53;22416:18;;40379:61:0;22093:347:1;40379:61:0;-1:-1:-1;40461:9:0;:17;;;;;;40206:1450;;;40502:5;40498:1158;;;40528:14;;:18;40524:221;;40584:14;;19990:1;;40571:27;;:12;:27;:::i;:::-;:46;40567:163;;;-1:-1:-1;;;;;40642:24:0;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;40642:31:0;40669:4;40642:31;;;40696:11;:14;;40642:31;40696:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;40567:163;40765:15;;;;;;;40761:157;;;-1:-1:-1;;;;;40809:21:0;;;;;;:10;:21;;;;;;40834:12;40809:37;;40801:46;;;;;;-1:-1:-1;;;;;40866:21:0;;;;;;:10;:21;;;;;40890:12;40866:36;;40761:157;40976:7;:17;40949:23;40966:6;40949:16;:23;:::i;:::-;:44;;40941:86;;;;-1:-1:-1;;;40941:86:0;;22827:2:1;40941:86:0;;;22809:21:1;22866:2;22846:18;;;22839:30;22905:31;22885:18;;;22878:59;22954:18;;40941:86:0;22625:353:1;40941:86:0;41060:14;;41050:24;;;41042:58;;;;-1:-1:-1;;;41042:58:0;;23185:2:1;41042:58:0;;;23167:21:1;23224:2;23204:18;;;23197:30;-1:-1:-1;;;23243:18:1;;;23236:51;23304:18;;41042:58:0;22983:345:1;41042:58:0;-1:-1:-1;41121:9:0;:16;;;40498:1158;;;41176:16;;;;;;;41172:124;;;-1:-1:-1;;;;;41222:21:0;;;;;;:13;:21;;;;;;;;41221:22;41213:51;;;;-1:-1:-1;;;41213:51:0;;21950:2:1;41213:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;41213:51:0;21748:340:1;41213:51:0;41326:20;18313:2;41326;:20;:::i;:::-;41316:6;:30;41312:187;;41443:11;;41420:38;;41431:10;;-1:-1:-1;;;41443:11:0;;-1:-1:-1;;;;;41443:11:0;41456:1;41420:10;:38::i;:::-;41477:7;;;;;41312:187;41552:7;:17;41523:25;41542:6;41523:16;:25;:::i;:::-;:46;;41515:75;;;;-1:-1:-1;;;41515:75:0;;23535:2:1;41515:75:0;;;23517:21:1;23574:2;23554:18;;;23547:30;-1:-1:-1;;;23593:18:1;;;23586:46;23649:18;;41515:75:0;23333:340:1;41515:75:0;-1:-1:-1;41623:9:0;:21;;;;;;40498:1158;41687:12;;-1:-1:-1;;;;;41677:22:0;;;41687:12;;41677:22;;;;41676:41;;-1:-1:-1;41706:10:0;;-1:-1:-1;;;41706:10:0;;;;41705:11;41676:41;:75;;;;-1:-1:-1;41723:27:0;;;;41722:28;41676:75;:85;;;;;41755:6;41676:85;41672:143;;;41795:13;;41776:39;;41795:13;;;;;41809:5;41776:18;:39::i;:::-;41828:19;41863:7;;;;41860:77;;41912:3;41897:12;;;;:6;:12;:::i;:::-;:18;;;;:::i;:::-;41883:32;;41860:77;41949:21;41973:20;41982:11;41973:6;:20;:::i;:::-;41949:44;;42004:27;42017:6;42024;42004:12;:27::i;:::-;42042:37;42060:4;42067:11;42042:9;:37::i;:::-;42090:35;42100:9;42111:13;42090:9;:35::i;:::-;42158:9;-1:-1:-1;;;;;42141:42:0;42150:6;-1:-1:-1;;;;;42141:42:0;;42169:13;42141:42;;;;1997:25:1;;1985:2;1970:18;;1851:177;42141:42:0;;;;;;;;39992:2199;;;;;39887:2304;;;;;;:::o;46960:313::-;-1:-1:-1;;;;;47078:17:0;;47018:7;47078:17;;;:9;:17;;;;;;47063:12;;47018:7;;47063:32;;;:::i;:::-;-1:-1:-1;;;;;47127:25:0;;;;;;:17;:25;;;;;;47042:53;;-1:-1:-1;47114:38:0;;47110:70;;;-1:-1:-1;47179:1:0;;46960:313;-1:-1:-1;;46960:313:0:o;47110:70::-;-1:-1:-1;;;;;47214:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;34754:5:0;47203:36;;:10;:36;:::i;:::-;47202:59;;;;:::i;39434:444::-;39527:11;;39495:53;;39512:4;;-1:-1:-1;;;;;39527:11:0;39541:6;39495:8;:53::i;:::-;39583:16;;;39597:1;39583:16;;;;;;;;39559:21;;39583:16;;;;;;;;;;-1:-1:-1;39583:16:0;39559:40;;39628:4;39610;39615:1;39610:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39610:23:0;;;:7;;;;;;;;;;:23;;;;39654:11;;:18;;;-1:-1:-1;;;39654:18:0;;;;:11;;;;;:16;;:18;;;;;39610:7;;39654:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39644:4;39649:1;39644:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39644:28:0;;;:7;;;;;;;;;:28;39683:11;;:187;;-1:-1:-1;;;39683:187:0;;:11;;;:62;;:187;;39760:6;;39683:11;;39797:4;;39824;;39844:15;;39683:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39484:394;39434:444;:::o;35011:367::-;35125:11;;35093:58;;35110:4;;-1:-1:-1;;;;;35125:11:0;35139;35093:8;:58::i;:::-;35170:11;;:200;;-1:-1:-1;;;35170:200:0;;-1:-1:-1;;;;;35170:11:0;;;;:27;;35205:9;;35170:200;;35238:4;;35258:11;;35170;;;;35238:4;;35344:15;;35170:200;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10238:468::-;10355:6;10330:21;:31;;10322:73;;;;-1:-1:-1;;;10322:73:0;;24778:2:1;10322:73:0;;;24760:21:1;24817:2;24797:18;;;24790:30;24856:31;24836:18;;;24829:59;24905:18;;10322:73:0;24576:353:1;10322:73:0;10424:30;;9731:66;;10424:30;;10441:12;;10424:30;;;:::i;:::-;;;;;;;;;;;;;10414:41;;;;;;:58;10406:98;;;;-1:-1:-1;;;10406:98:0;;25417:2:1;10406:98:0;;;25399:21:1;25456:2;25436:18;;;25429:30;25495:29;25475:18;;;25468:57;25542:18;;10406:98:0;25215:351:1;10406:98:0;10544:51;;10526:12;;9635:48;;10583:6;;10526:12;10544:51;10526:12;10544:51;10583:6;9635:48;10544:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10525:70;;;10614:7;10606:78;;;;-1:-1:-1;;;10606:78:0;;25773:2:1;10606:78:0;;;25755:21:1;25812:2;25792:18;;;25785:30;25851:34;25831:18;;;25824:62;25922:28;25902:18;;;25895:56;25968:19;;10606:78:0;25571:422:1;35868:825:0;36015:15;;35991:10;:20;35955:22;;36015:15;;;;;;;;35981:30;;35991:20;;;;;35981:9;:30;:::i;:::-;35980:50;;;;:::i;:::-;36089:15;;36071:10;:14;35955:75;;-1:-1:-1;36041:16:0;;36089:15;;;;;;;;36061:24;;36071:14;36061:9;:24;:::i;:::-;36060:44;;;;:::i;:::-;36172:15;;36150:10;:18;36041:63;;-1:-1:-1;36116:20:0;;36172:15;;;;;;;;36140:28;;36150:18;;;;36140:9;:28;:::i;:::-;36139:48;;;;:::i;:::-;36207:20;;36116:71;;-1:-1:-1;36198:46:0;;-1:-1:-1;;;;;36207:20:0;36229:14;36198:8;:46::i;:::-;36264:10;:14;36255:34;;-1:-1:-1;;;;;36264:14:0;36280:8;36255;:34::i;:::-;36304:16;;36300:386;;36341:16;36337:67;;;36392:12;36376;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;36337:67:0;36419:19;36441:16;:14;:16::i;:::-;36419:38;;36476:11;36491:1;36476:16;36472:203;;36520:20;;36511:44;;-1:-1:-1;;;;;36520:20:0;36542:12;36511:8;:44::i;:::-;36472:203;;;36647:11;36612:31;-1:-1:-1;;;36612:12:0;:31;:::i;:::-;36611:47;;;;:::i;:::-;36594:12;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;36322:364:0;35944:749;;;35868:825;;:::o;37057:478::-;-1:-1:-1;;;;;37148:15:0;;37128:17;37148:15;;;:9;:15;;;;;;:24;;37166:6;;37148:24;:::i;:::-;37128:44;-1:-1:-1;37197:35:0;:20;37227:4;37197:29;:35::i;:::-;37193:116;;;-1:-1:-1;;;;;37249:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;37057:478:0:o;37193:116::-;37335:6;37319:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;37352:15:0;;-1:-1:-1;37370:16:0;37381:4;37370:10;:16::i;:::-;-1:-1:-1;;;;;37397:15:0;;;;;;:9;:15;;;;;:27;;;37461:12;;37352:34;;-1:-1:-1;37461:24:0;;37415:9;;37461:24;:::i;:::-;-1:-1:-1;;;;;37435:23:0;;;;;;:17;:23;;;;;;;;:50;;;;37496:14;:20;;;;;:31;;37520:7;;37435:23;37496:31;;37520:7;;37496:31;:::i;:::-;;;;-1:-1:-1;;;;;;37057:478:0:o;35387:473::-;-1:-1:-1;;;;;35475:15:0;;35455:17;35475:15;;;:9;:15;;;;;;:24;;35493:6;;35475:24;:::i;:::-;35455:44;-1:-1:-1;35524:35:0;:20;35554:4;35524:29;:35::i;:::-;35520:114;;;-1:-1:-1;;;;;35575:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;35387:473:0:o;35520:114::-;35660:6;35644:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;35677:15:0;;-1:-1:-1;35695:16:0;35706:4;35695:10;:16::i;:::-;35677:34;;35763:9;35748:12;;:24;;;;:::i;:::-;-1:-1:-1;;;;;35722:23:0;;;;;;:17;:23;;;;;;;;:50;;;;35783:14;:20;;;;;:31;;35807:7;;35722:23;35783:31;;35807:7;;35783:31;:::i;:::-;;;;-1:-1:-1;;;;;;;;35825:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;35387:473:0:o;46606:110::-;46654:7;18241:18;18313:2;18241;:18;:::i;:::-;18227:32;;:11;:32;:::i;:::-;46681:12;;:27;;;;:::i;552:258:1:-;624:1;634:113;648:6;645:1;642:13;634:113;;;724:11;;;718:18;705:11;;;698:39;670:2;663:10;634:113;;;765:6;762:1;759:13;756:48;;;800:1;791:6;786:3;782:16;775:27;756:48;;552:258;;;:::o;815:383::-;964:2;953:9;946:21;927:4;996:6;990:13;1039:6;1034:2;1023:9;1019:18;1012:34;1055:66;1114:6;1109:2;1098:9;1094:18;1089:2;1081:6;1077:15;1055:66;:::i;:::-;1182:2;1161:15;-1:-1:-1;;1157:29:1;1142:45;;;;1189:2;1138:54;;815:383;-1:-1:-1;;815:383:1:o;1203:131::-;-1:-1:-1;;;;;1278:31:1;;1268:42;;1258:70;;1324:1;1321;1314:12;1339:315;1407:6;1415;1468:2;1456:9;1447:7;1443:23;1439:32;1436:52;;;1484:1;1481;1474:12;1436:52;1523:9;1510:23;1542:31;1567:5;1542:31;:::i;:::-;1592:5;1644:2;1629:18;;;;1616:32;;-1:-1:-1;;;1339:315:1:o;2033:159::-;2100:20;;2160:6;2149:18;;2139:29;;2129:57;;2182:1;2179;2172:12;2129:57;2033:159;;;:::o;2197:184::-;2255:6;2308:2;2296:9;2287:7;2283:23;2279:32;2276:52;;;2324:1;2321;2314:12;2276:52;2347:28;2365:9;2347:28;:::i;2594:255::-;2661:6;2714:2;2702:9;2693:7;2689:23;2685:32;2682:52;;;2730:1;2727;2720:12;2682:52;2769:9;2756:23;2788:31;2813:5;2788:31;:::i;2854:456::-;2931:6;2939;2947;3000:2;2988:9;2979:7;2975:23;2971:32;2968:52;;;3016:1;3013;3006:12;2968:52;3055:9;3042:23;3074:31;3099:5;3074:31;:::i;:::-;3124:5;-1:-1:-1;3181:2:1;3166:18;;3153:32;3194:33;3153:32;3194:33;:::i;:::-;2854:456;;3246:7;;-1:-1:-1;;;3300:2:1;3285:18;;;;3272:32;;2854:456::o;3315:118::-;3401:5;3394:13;3387:21;3380:5;3377:32;3367:60;;3423:1;3420;3413:12;3438:241;3494:6;3547:2;3535:9;3526:7;3522:23;3518:32;3515:52;;;3563:1;3560;3553:12;3515:52;3602:9;3589:23;3621:28;3643:5;3621:28;:::i;4125:180::-;4184:6;4237:2;4225:9;4216:7;4212:23;4208:32;4205:52;;;4253:1;4250;4243:12;4205:52;-1:-1:-1;4276:23:1;;4125:180;-1:-1:-1;4125:180:1:o;4310:382::-;4375:6;4383;4436:2;4424:9;4415:7;4411:23;4407:32;4404:52;;;4452:1;4449;4442:12;4404:52;4491:9;4478:23;4510:31;4535:5;4510:31;:::i;:::-;4560:5;-1:-1:-1;4617:2:1;4602:18;;4589:32;4630:30;4589:32;4630:30;:::i;:::-;4679:7;4669:17;;;4310:382;;;;;:::o;4697:401::-;4779:6;4787;4795;4803;4856:3;4844:9;4835:7;4831:23;4827:33;4824:53;;;4873:1;4870;4863:12;4824:53;4896:28;4914:9;4896:28;:::i;:::-;4886:38;;4943:37;4976:2;4965:9;4961:18;4943:37;:::i;:::-;4933:47;;4999:37;5032:2;5021:9;5017:18;4999:37;:::i;:::-;4989:47;;5055:37;5088:2;5077:9;5073:18;5055:37;:::i;:::-;5045:47;;4697:401;;;;;;;:::o;5103:156::-;5169:20;;5229:4;5218:16;;5208:27;;5198:55;;5249:1;5246;5239:12;5264:393;5342:6;5350;5358;5366;5419:3;5407:9;5398:7;5394:23;5390:33;5387:53;;;5436:1;5433;5426:12;5387:53;5459:27;5476:9;5459:27;:::i;:::-;5449:37;;5505:36;5537:2;5526:9;5522:18;5505:36;:::i;:::-;5495:46;;5560:36;5592:2;5581:9;5577:18;5560:36;:::i;:::-;5550:46;;5615:36;5647:2;5636:9;5632:18;5615:36;:::i;5662:313::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5826:28;5844:9;5826:28;:::i;6613:322::-;6684:6;6692;6700;6753:2;6741:9;6732:7;6728:23;6724:32;6721:52;;;6769:1;6766;6759:12;6721:52;6792:27;6809:9;6792:27;:::i;:::-;6782:37;;6838:36;6870:2;6859:9;6855:18;6838:36;:::i;:::-;6828:46;;6893:36;6925:2;6914:9;6910:18;6893:36;:::i;:::-;6883:46;;6613:322;;;;;:::o;7364:388::-;7432:6;7440;7493:2;7481:9;7472:7;7468:23;7464:32;7461:52;;;7509:1;7506;7499:12;7461:52;7548:9;7535:23;7567:31;7592:5;7567:31;:::i;:::-;7617:5;-1:-1:-1;7674:2:1;7659:18;;7646:32;7687:33;7646:32;7687:33;:::i;8708:344::-;8910:2;8892:21;;;8949:2;8929:18;;;8922:30;-1:-1:-1;;;8983:2:1;8968:18;;8961:50;9043:2;9028:18;;8708:344::o;9057:340::-;9259:2;9241:21;;;9298:2;9278:18;;;9271:30;-1:-1:-1;;;9332:2:1;9317:18;;9310:46;9388:2;9373:18;;9057:340::o;9402:127::-;9463:10;9458:3;9454:20;9451:1;9444:31;9494:4;9491:1;9484:15;9518:4;9515:1;9508:15;9534:422;9623:1;9666:5;9623:1;9680:270;9701:7;9691:8;9688:21;9680:270;;;9760:4;9756:1;9752:6;9748:17;9742:4;9739:27;9736:53;;;9769:18;;:::i;:::-;9819:7;9809:8;9805:22;9802:55;;;9839:16;;;;9802:55;9918:22;;;;9878:15;;;;9680:270;;;9684:3;9534:422;;;;;:::o;9961:806::-;10010:5;10040:8;10030:80;;-1:-1:-1;10081:1:1;10095:5;;10030:80;10129:4;10119:76;;-1:-1:-1;10166:1:1;10180:5;;10119:76;10211:4;10229:1;10224:59;;;;10297:1;10292:130;;;;10204:218;;10224:59;10254:1;10245:10;;10268:5;;;10292:130;10329:3;10319:8;10316:17;10313:43;;;10336:18;;:::i;:::-;-1:-1:-1;;10392:1:1;10378:16;;10407:5;;10204:218;;10506:2;10496:8;10493:16;10487:3;10481:4;10478:13;10474:36;10468:2;10458:8;10455:16;10450:2;10444:4;10441:12;10437:35;10434:77;10431:159;;;-1:-1:-1;10543:19:1;;;10575:5;;10431:159;10622:34;10647:8;10641:4;10622:34;:::i;:::-;10692:6;10688:1;10684:6;10680:19;10671:7;10668:32;10665:58;;;10703:18;;:::i;:::-;10741:20;;9961:806;-1:-1:-1;;;9961:806:1:o;10772:140::-;10830:5;10859:47;10900:4;10890:8;10886:19;10880:4;10859:47;:::i;10917:168::-;10957:7;11023:1;11019;11015:6;11011:14;11008:1;11005:21;11000:1;10993:9;10986:17;10982:45;10979:71;;;11030:18;;:::i;:::-;-1:-1:-1;11070:9:1;;10917:168::o;11090:345::-;11292:2;11274:21;;;11331:2;11311:18;;;11304:30;-1:-1:-1;;;11365:2:1;11350:18;;11343:51;11426:2;11411:18;;11090:345::o;12766:125::-;12806:4;12834:1;12831;12828:8;12825:34;;;12839:18;;:::i;:::-;-1:-1:-1;12876:9:1;;12766:125::o;12896:128::-;12936:3;12967:1;12963:6;12960:1;12957:13;12954:39;;;12973:18;;:::i;:::-;-1:-1:-1;13009:9:1;;12896:128::o;13434:184::-;13504:6;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;-1:-1:-1;13596:16:1;;13434:184;-1:-1:-1;13434:184:1:o;13902:245::-;13969:6;14022:2;14010:9;14001:7;13997:23;13993:32;13990:52;;;14038:1;14035;14028:12;13990:52;14070:9;14064:16;14089:28;14111:5;14089:28;:::i;14152:607::-;-1:-1:-1;;;;;14511:15:1;;;14493:34;;14558:2;14543:18;;14536:34;;;;14601:2;14586:18;;14579:34;;;;14644:2;14629:18;;14622:34;;;;14693:15;;;14687:3;14672:19;;14665:44;14473:3;14725:19;;14718:35;;;;14442:3;14427:19;;14152:607::o;15053:217::-;15093:1;15119;15109:132;;15163:10;15158:3;15154:20;15151:1;15144:31;15198:4;15195:1;15188:15;15226:4;15223:1;15216:15;15109:132;-1:-1:-1;15255:9:1;;15053:217::o;15636:204::-;15674:3;15710:4;15707:1;15703:12;15742:4;15739:1;15735:12;15777:3;15771:4;15767:14;15762:3;15759:23;15756:49;;;15785:18;;:::i;:::-;15821:13;;15636:204;-1:-1:-1;;;15636:204:1:o;15845:195::-;15883:4;15920;15917:1;15913:12;15952:4;15949:1;15945:12;15977:3;15972;15969:12;15966:38;;;15984:18;;:::i;:::-;16021:13;;;15845:195;-1:-1:-1;;;15845:195:1:o;19162:251::-;19232:6;19285:2;19273:9;19264:7;19260:23;19256:32;19253:52;;;19301:1;19298;19291:12;19253:52;19333:9;19327:16;19352:31;19377:5;19352:31;:::i;19418:127::-;19479:10;19474:3;19470:20;19467:1;19460:31;19510:4;19507:1;19500:15;19534:4;19531:1;19524:15;19550:461;19603:3;19641:5;19635:12;19668:6;19663:3;19656:19;19694:4;19723:2;19718:3;19714:12;19707:19;;19760:2;19753:5;19749:14;19781:1;19791:195;19805:6;19802:1;19799:13;19791:195;;;19870:13;;-1:-1:-1;;;;;19866:39:1;19854:52;;19926:12;;;;19961:15;;;;19902:1;19820:9;19791:195;;;-1:-1:-1;20002:3:1;;19550:461;-1:-1:-1;;;;;19550:461:1:o;20016:510::-;20287:6;20276:9;20269:25;20330:3;20325:2;20314:9;20310:18;20303:31;20250:4;20351:57;20403:3;20392:9;20388:19;20380:6;20351:57;:::i;:::-;-1:-1:-1;;;;;20444:32:1;;;;20439:2;20424:18;;20417:60;-1:-1:-1;20508:2:1;20493:18;20486:34;20343:65;20016:510;-1:-1:-1;;20016:510:1:o;20911:127::-;20972:10;20967:3;20963:20;20960:1;20953:31;21003:4;21000:1;20993:15;21027:4;21024:1;21017:15;22445:175;22482:3;22526:4;22519:5;22515:16;22555:4;22546:7;22543:17;22540:43;;22563:18;;:::i;:::-;22612:1;22599:15;;22445:175;-1:-1:-1;;22445:175:1:o;23678:582::-;23977:6;23966:9;23959:25;24020:6;24015:2;24004:9;24000:18;23993:34;24063:3;24058:2;24047:9;24043:18;24036:31;23940:4;24084:57;24136:3;24125:9;24121:19;24113:6;24084:57;:::i;:::-;-1:-1:-1;;;;;24177:32:1;;;;24172:2;24157:18;;24150:60;-1:-1:-1;24241:3:1;24226:19;24219:35;24076:65;23678:582;-1:-1:-1;;;23678:582:1:o;24265:306::-;24353:6;24361;24369;24422:2;24410:9;24401:7;24397:23;24393:32;24390:52;;;24438:1;24435;24428:12;24390:52;24467:9;24461:16;24451:26;;24517:2;24506:9;24502:18;24496:25;24486:35;;24561:2;24550:9;24546:18;24540:25;24530:35;;24265:306;;;;;:::o;24934:276::-;25065:3;25103:6;25097:13;25119:53;25165:6;25160:3;25153:4;25145:6;25141:17;25119:53;:::i;:::-;25188:16;;;;;24934:276;-1:-1:-1;;24934:276:1:o

Swarm Source

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