ETH Price: $2,639.41 (+2.36%)
Gas: 1.19 Gwei

Token

Butterfly Effect (EFFECT)
 

Overview

Max Total Supply

1,000,000 EFFECT

Holders

242

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000000001 EFFECT

Value
$0.00
0xd92a471c31daf876a3810add3c2dea8339898f93
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:
ButterflyEffect

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**

"What happens today will effect your tomorrow."

https://butterflyeffect-erc.vip/
https://t.me/ButterflyEffectCoin
https://twitter.com/Effect_ERC


*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;


library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
    function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b <= a, errorMessage); return a - b;}}

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b > 0, errorMessage); return a / b;}}

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b > 0, errorMessage); return a % b;}}}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function circulatingSupply() 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);}

abstract contract Ownable {
    address internal owner;
    constructor(address _owner) {owner = _owner;}
    modifier onlyOwner() {require(isOwner(msg.sender), "!OWNER"); _;}
    function isOwner(address account) public view returns (bool) {return account == owner;}
    function transferOwnership(address payable adr) public onlyOwner {owner = adr; emit OwnershipTransferred(adr);}
    event OwnershipTransferred(address owner);
}

interface stakeIntegration {
    function stakingWithdraw(address depositor, uint256 _amount) external;
    function stakingDeposit(address depositor, uint256 _amount) external;
    function stakingClaimToCompound(address sender, address recipient) external;
    function internalClaimRewards(address sender) external;
}

interface tokenStaking {
    function deposit(uint256 amount) external;
    function withdraw(uint256 amount) external;
    function compound() external;
}

interface IFactory{
        function createPair(address tokenA, address tokenB) external returns (address pair);
        function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

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

contract ButterflyEffect is IERC20, tokenStaking, Ownable {
    using SafeMath for uint256;
    string private constant _name = 'Butterfly Effect';
    string private constant _symbol = 'EFFECT';
    uint8 private constant _decimals = 9;
    uint256 private _totalSupply = 1000000 * (10 ** _decimals);
    uint256 public _maxTxAmount = ( _totalSupply * 100 ) / 10000;
    uint256 public _maxWalletToken = ( _totalSupply * 100 ) / 10000;
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) public isFeeExempt;
    mapping (address => bool) public isDividendExempt;
    IRouter router;
    address public pair;
    bool private swapEnabled = true;
    bool private tradingAllowed = false;
    bool public reflectionsEnabled = true;
    uint256 private liquidityFee = 0;
    uint256 private marketingFee = 900;
    uint256 private reflectionFee = 100;
    uint256 private developmentFee = 1000;
    uint256 private burnFee = 0;
    uint256 private tokenFee = 0;
    uint256 private totalFee = 2000;
    uint256 private sellFee = 4000;
    uint256 private transferFee = 4000;
    uint256 private denominator = 10000;
    uint256 private swapTimes;
    bool private swapping;
    bool private feeless;
    uint256 private swapAmount = 1;
    uint256 private swapThreshold = ( _totalSupply * 1000 ) / 100000;
    uint256 private minTokenAmount = ( _totalSupply * 10 ) / 100000;
    modifier feelessTransaction {feeless = true; _; feeless = false;}
    modifier lockTheSwap {swapping = true; _; swapping = false;}
    mapping(address => uint256) public amountStaked;
    uint256 public totalStaked;
    uint256 private staking = 0;
    stakeIntegration internal stakingContract;
    address internal token_receiver;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public currentDividends;
    uint256 public dividendsBeingDistributed;
    uint256 internal dividendsPerShare;
    uint256 internal dividendsPerShareAccuracyFactor = 10 ** 36;
    address[] shareholders; mapping (address => Share) public shares; 
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    struct Share {uint256 amount; uint256 totalExcluded; uint256 totalRealised; }
    uint256 public excessDividends;
    uint256 public eventFeesCollected;
    uint256 public reflectionEvent;
    bool public distributingReflections;
    uint256 internal disbursements;
    bool internal releaseDistributing;
    mapping (address => uint256) public buyMultiplier;
    uint256 internal currentIndex;
    uint256 public gasAmount = 500000;
    uint256 public distributionInterval = 12 hours;
    uint256 public distributionTime;
    uint256 private minBuyAmount = ( _totalSupply * 10 ) / 100000;
    uint256 private maxDropAmount = ( _totalSupply * 500 ) / 10000;
    address internal constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address internal utility_receiver = 0x6F623E84da9880138DF9362cB596e13291C3C4ae;
    address internal staking_receiver = 0x6F623E84da9880138DF9362cB596e13291C3C4ae; 
    address internal marketing_receiver = 0x3f20cB334FFd23D0Ec8eeFaFAe485728774Ea1b0;
    address internal liquidity_receiver = 0x6F623E84da9880138DF9362cB596e13291C3C4ae;
    mapping (uint256 => mapping (address => uint256)) internal userEventData;
    struct eventData {
        uint256 reflectionAmount;
        uint256 reflectionsDisbursed;
        uint256 eventTimestamp;
        uint256 totalFees;
        uint256 totalExcess;}
    mapping(uint256 => eventData) public eventStats;

    constructor() Ownable(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;
        token_receiver = msg.sender;
        isFeeExempt[address(this)] = true;
        isFeeExempt[liquidity_receiver] = true;
        isFeeExempt[marketing_receiver] = true;
        isFeeExempt[token_receiver] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(stakingContract)] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(pair)] = true;
        isDividendExempt[address(DEAD)] = true;
        isDividendExempt[address(0)] = true;
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}
    function name() public pure returns (string memory) {return _name;}
    function symbol() public pure returns (string memory) {return _symbol;}
    function decimals() public pure returns (uint8) {return _decimals;}
    function getOwner() external view override returns (address) { return owner; }
    function totalSupply() public view override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view override returns (uint256) {return _balances[account];}
    function transfer(address recipient, uint256 amount) public override returns (bool) {_transfer(msg.sender, recipient, amount);return true;}
    function allowance(address owner, address spender) public view override returns (uint256) {return _allowances[owner][spender];}
    function approve(address spender, uint256 amount) public override returns (bool) {_approve(msg.sender, spender, amount);return true;}
    function availableBalance(address wallet) public view returns (uint256) {return _balances[wallet].sub(amountStaked[wallet]);}
    function circulatingSupply() public view override returns (uint256) {return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(address(0)));}

    function preTxCheck(address sender, address recipient, uint256 amount) internal view {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount <= balanceOf(sender),"You are trying to transfer more than your balance");
    }

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

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        return true;
    }

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

    function _transfer(address sender, address recipient, uint256 amount) private {
        preTxCheck(sender, recipient, amount);
        checkTradingAllowed(sender, recipient);
        checkMaxWallet(sender, recipient, amount); 
        checkTxLimit(sender, recipient, amount);
        transactionCounters(sender, recipient);
        setBuyMultiplier(sender, recipient, amount);
        swapBack(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount);
        uint256 amountReceived = shouldTakeFee(sender, recipient) ? takeFee(sender, recipient, amount) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
        processRewards(sender, recipient);
    }

    function setStructure(uint256 _liquidity, uint256 _marketing, uint256 _reflections, uint256 _burn, 
        uint256 _token, uint256 _staking, uint256 _development, uint256 _total, uint256 _sell, uint256 _trans) external onlyOwner {
        liquidityFee = _liquidity; marketingFee = _marketing; reflectionFee = _reflections; staking = _staking; developmentFee = _development;
        burnFee = _burn; totalFee = _total; sellFee = _sell; transferFee = _trans; tokenFee = _token;
        require(totalFee <= denominator && sellFee <= denominator && burnFee <= denominator && tokenFee <= denominator 
            && transferFee <= denominator, "totalFee and sellFee cannot be more than 20%");
    }

    function setParameters(uint256 _buy, uint256 _wallet) external onlyOwner {
        uint256 newTx = totalSupply().mul(_buy).div(uint256(10000));
        uint256 newWallet = totalSupply().mul(_wallet).div(uint256(10000)); uint256 limit = totalSupply().mul(5).div(1000);
        require(newTx >= limit && newWallet >= limit, "ERC20: max TXs and max Wallet cannot be less than .5%");
        _maxTxAmount = newTx; _maxWalletToken = newWallet;
    }

    function internalDeposit(address sender, uint256 amount) internal {
        require(amount <= _balances[sender].sub(amountStaked[sender]), "ERC20: Cannot stake more than available balance");
        stakingContract.stakingDeposit(sender, amount);
        amountStaked[sender] = amountStaked[sender].add(amount);
        totalStaked = totalStaked.add(amount);
    }

    function deposit(uint256 amount) override external {
        internalDeposit(msg.sender, amount);
    }

    function withdraw(uint256 amount) override external {
        require(amount <= amountStaked[msg.sender], "ERC20: Cannot unstake more than amount staked");
        stakingContract.stakingWithdraw(msg.sender, amount);
        amountStaked[msg.sender] = amountStaked[msg.sender].sub(amount);
        totalStaked = totalStaked.sub(amount);
    }

    function compound() override external feelessTransaction {
        uint256 initialToken = balanceOf(msg.sender);
        stakingContract.stakingClaimToCompound(msg.sender, msg.sender);
        uint256 afterToken = balanceOf(msg.sender).sub(initialToken);
        internalDeposit(msg.sender, afterToken);
    }

    function setStakingAddress(address _staking) external onlyOwner {
        stakingContract = stakeIntegration(_staking); isFeeExempt[_staking] = true;
    }

    function checkTradingAllowed(address sender, address recipient) internal view {
        if(!isFeeExempt[sender] && !isFeeExempt[recipient]){require(tradingAllowed, "tradingAllowed");}
    }
    
    function checkMaxWallet(address sender, address recipient, uint256 amount) internal view {
        if(!isFeeExempt[sender] && !isFeeExempt[recipient] && recipient != address(pair) && recipient != address(DEAD)){
            require((_balances[recipient].add(amount)) <= _maxWalletToken, "Exceeds maximum wallet amount.");}
    }

    function transactionCounters(address sender, address recipient) internal {
        if(recipient == pair && !isFeeExempt[sender] && !swapping){swapTimes += uint256(1);}
    }

    function setBuyMultiplier(address sender, address recipient, uint256 amount) internal {
        if(sender == pair && amount >= minBuyAmount){buyMultiplier[recipient] = buyMultiplier[recipient].add(uint256(1));}
        if(sender == pair && amount < minBuyAmount){buyMultiplier[recipient] = uint256(1);}
        if(recipient == pair){buyMultiplier[sender] = uint256(0);}
    }

    function checkTxLimit(address sender, address recipient, uint256 amount) internal view {
        if(amountStaked[sender] > uint256(0)){require((amount.add(amountStaked[sender])) <= balanceOf(sender), "ERC20: Exceeds maximum allowed not currently staked.");}
        require(amount <= _maxTxAmount || isFeeExempt[sender] || isFeeExempt[recipient], "TX Limit Exceeded");
    }

    function startTrading() external onlyOwner {
        tradingAllowed = true;
        distributionTime = block.timestamp;
    }

    function setSwapbackSettings(uint256 _swapAmount, uint256 _swapThreshold, uint256 _minTokenAmount) external onlyOwner {
        swapAmount = _swapAmount; swapThreshold = totalSupply().mul(_swapThreshold).div(uint256(100000)); minTokenAmount = totalSupply().mul(_minTokenAmount).div(uint256(100000));
    }

    function setUserMultiplier(address user, uint256 multiplier) external onlyOwner {
        buyMultiplier[user] = multiplier;
    }

    function setInternalAddresses(address _marketing, address _liquidity, address _utility, address _token, address _staking) external onlyOwner {
        marketing_receiver = _marketing; liquidity_receiver = _liquidity; utility_receiver = _utility; token_receiver = _token; staking_receiver = _staking;
        isFeeExempt[_marketing] = true; isFeeExempt[_liquidity] = true; isFeeExempt[_utility] = true; isFeeExempt[_token] = true; isFeeExempt[_staking] = true;
    }

    function setisExempt(address _address, bool _enabled) external onlyOwner {
        isFeeExempt[_address] = _enabled;
    }

    function setDividendInfo(uint256 excess, uint256 current, uint256 distributing) external onlyOwner {
        excessDividends = excess; currentDividends = current; dividendsBeingDistributed = distributing;
    }

    function setMinBuyAmount(uint256 amount) external onlyOwner {
        minBuyAmount = _totalSupply.mul(amount).div(100000);
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 _denominator = totalFee.add(1).mul(2);
        if(totalFee == uint256(0)){_denominator = liquidityFee.add(
            marketingFee).add(staking).add(developmentFee).add(1).mul(2);}
        uint256 tokensToAddLiquidityWith = tokens.mul(liquidityFee).div(_denominator);
        uint256 toSwap = tokens.sub(tokensToAddLiquidityWith);
        uint256 initialBalance = address(this).balance;
        swapTokensForETH(toSwap);
        uint256 deltaBalance = address(this).balance.sub(initialBalance);
        uint256 unitBalance= deltaBalance.div(_denominator.sub(liquidityFee));
        uint256 ETHToAddLiquidityWith = unitBalance.mul(liquidityFee);
        if(ETHToAddLiquidityWith > uint256(0)){addLiquidity(
            tokensToAddLiquidityWith, ETHToAddLiquidityWith, liquidity_receiver); }
        uint256 stakingAmount = unitBalance.mul(2).mul(staking);
        if(stakingAmount > 0){payable(staking_receiver).transfer(stakingAmount);}
        uint256 marketingAmount = unitBalance.mul(2).mul(marketingFee);
        if(marketingAmount > 0){payable(marketing_receiver).transfer(marketingAmount);}
        uint256 excessAmount = address(this).balance;
        if(excessAmount > uint256(0)){payable(utility_receiver).transfer(excessAmount);}
    }

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount, address receiver) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ETHAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            address(receiver),
            block.timestamp);
    }

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

    function shouldSwapBack(address sender, address recipient, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= minTokenAmount;
        bool aboveThreshold = viewAvailableBalance() >= swapThreshold;
        return !swapping && swapEnabled && tradingAllowed && aboveMin && !isFeeExempt[sender] 
            && recipient == pair && swapTimes >= swapAmount && aboveThreshold;
    }

    function swapBack(address sender, address recipient, uint256 amount) internal {
        if(shouldSwapBack(sender, recipient, amount)){swapAndLiquify(swapThreshold); swapTimes = uint256(0);}
    }

    function shouldTakeFee(address sender, address recipient) internal view returns (bool) {
        return !isFeeExempt[sender] && !isFeeExempt[recipient];
    }

    function getTotalFee(address sender, address recipient) internal view returns (uint256) {
        if(recipient == pair && sellFee > uint256(0)){return sellFee;}
        if(sender == pair && totalFee > uint256(0)){return totalFee;}
        return transferFee;
    }

    function takeFee(address sender, address recipient, uint256 amount) internal returns (uint256) {
        if(getTotalFee(sender, recipient) > 0 && !swapping){
        uint256 feeAmount = amount.div(denominator).mul(getTotalFee(sender, recipient));
        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);
        if(reflectionFee > uint256(0) && reflectionFee <= getTotalFee(sender, recipient)){
            currentDividends = currentDividends.add((amount.div(denominator).mul(reflectionFee)));
            eventFeesCollected = eventFeesCollected.add((amount.div(denominator).mul(reflectionFee)));}
        if(burnFee > uint256(0) && burnFee <= getTotalFee(sender, recipient)){
            _transfer(address(this), address(DEAD), amount.div(denominator).mul(burnFee));}
        if(tokenFee > uint256(0) && tokenFee <= getTotalFee(sender, recipient)){
            _transfer(address(this), address(token_receiver), amount.div(denominator).mul(tokenFee));}
        return amount.sub(feeAmount);} return amount;
    }

    function setisDividendExempt(address holder, bool exempt) external onlyOwner {
        isDividendExempt[holder] = exempt;
        if(exempt){setShare(holder, 0);}
        if(buyMultiplier[holder] > 0){setShare(holder, balanceOf(holder).mul(buyMultiplier[holder]));}
        else{setShare(holder, balanceOf(holder));}
    }

    function processRewards(address sender, address recipient) internal {
        if(releaseDistributing){dividendsBeingDistributed = uint256(0);}
        if(shares[recipient].amount > uint256(0)){distributeDividend(recipient);}
        if(shares[sender].amount > uint256(0) && recipient != pair){distributeDividend(sender);}
        if(recipient == pair && shares[sender].amount > uint256(0)){excessDividends = excessDividends.add(getUnpaidEarnings(sender));}
        if(!isDividendExempt[sender]){setShare(sender, balanceOf(sender));}
        if(!isDividendExempt[recipient]){setShare(recipient, balanceOf(recipient));}
        if(!isDividendExempt[recipient] && sender == pair && buyMultiplier[recipient] >= uint256(1)){
            setShare(recipient, balanceOf(recipient).mul(buyMultiplier[recipient]));}
        if(distributionTime.add(distributionInterval) <= block.timestamp && tradingAllowed && 
            currentDividends > uint256(0) && !swapping && reflectionsEnabled){
            createReflectionEvent();}
        processReflections(gasAmount);
        if(shares[recipient].amount > uint256(0)){distributeDividend(recipient);}
    }

    function createReflectionEvent() internal {
            distributingReflections = true;
            eventStats[reflectionEvent].totalExcess = excessDividends;
            excessDividends = uint256(0);
            reflectionEvent = reflectionEvent.add(uint256(1));
            eventStats[reflectionEvent].totalFees = eventFeesCollected;
            eventStats[reflectionEvent].reflectionAmount = currentDividends;
            eventStats[reflectionEvent].eventTimestamp = block.timestamp;
            if(currentDividends > maxDropAmount){currentDividends = maxDropAmount;}
            depositRewards(currentDividends);
            currentDividends = uint256(0);
            eventFeesCollected = uint256(0);
            distributionTime = block.timestamp;
            processReflections(gasAmount);
    }

    function manualReflectionEvent() external onlyOwner {
        createReflectionEvent();
    }

    function rescueERC20(address _address) external onlyOwner {
        uint256 _amount = IERC20(_address).balanceOf(address(this));
        IERC20(_address).transfer(utility_receiver, _amount);
    }

    function setMaxDropAmount(uint256 amount) external onlyOwner {
        maxDropAmount = _totalSupply.mul(amount).div(100000);
    }

    function setDistributionInterval(uint256 interval) external onlyOwner {
        distributionInterval = interval;
    }

    function setReleaseDistributing(bool enable) external onlyOwner {
        releaseDistributing = enable;
    }

    function enableReflections(bool enable) external onlyOwner {
        reflectionsEnabled = enable;
    }

    function setGasAmount(uint256 gas) external onlyOwner {
        gasAmount = gas;
    }

    function closeReflectionEvent() external onlyOwner {
        dividendsBeingDistributed = uint256(0);
    }

    function setShare(address shareholder, uint256 amount) internal {
        if(amount > 0 && shares[shareholder].amount == 0){addShareholder(shareholder);}
        else if(amount == 0 && shares[shareholder].amount > 0){removeShareholder(shareholder); }
        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function depositRewards(uint256 amount) internal {
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
        dividendsBeingDistributed = amount;
    }

    function rescueETH(uint256 _amount) external {
        payable(utility_receiver).transfer(_amount);
    }

    function setTokenAddress(address _address) external onlyOwner {
        token_receiver = _address;
    }

    function totalReflectionsDistributed(address _wallet) external view returns (uint256) {
        address shareholder = _wallet;
        return uint256(shares[shareholder].totalRealised);
    }

    function claimReflections() external {
        distributeDividend(msg.sender);
    }

    function viewRemainingBeingDisbursed() external view returns (uint256 distributing, uint256 distributed) {
        return(dividendsBeingDistributed, eventStats[reflectionEvent].reflectionsDisbursed);
    }

    function viewDisbursementShareholders() external view returns (uint256 disbursementsAmt, uint256 shareholdersAmt) {
        return(disbursements, shareholders.length);
    }

    function manualProcessReflections(uint256 gas) external onlyOwner {
        processReflections(gas);
    }

    function processReflections(uint256 gas) internal {
        uint256 currentAmount = totalDistributed;
        uint256 shareholderCount = shareholders.length;
        if(shareholderCount == uint256(0)) { return; }
        uint256 gasUsed = uint256(0);
        uint256 gasLeft = gasleft();
        uint256 iterations = uint256(0);
        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = uint256(0);}
                distributeDividend(shareholders[currentIndex]);
            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
            disbursements++;}
        if(disbursements >= shareholderCount && totalDistributed > currentAmount){
            distributingReflections = false;
            dividendsBeingDistributed = uint256(0);
            disbursements = uint256(0);}
    }

    function distributeDividend(address shareholder) internal {
        uint256 amount = getUnpaidEarnings(shareholder);
        if(shares[shareholder].amount == 0 || amount > balanceOf(address(this))){ return; }
        if(amount > uint256(0)){
            totalDistributed = totalDistributed.add(amount);
            eventStats[reflectionEvent].reflectionsDisbursed = eventStats[reflectionEvent].reflectionsDisbursed.add(amount);
            _basicTransfer(address(this), shareholder, amount);
            userEventData[reflectionEvent][shareholder] = amount;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            buyMultiplier[shareholder] = uint256(0);
            setShare(shareholder, balanceOf(shareholder));}
    }

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }
        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

    function balanceInformation() external view returns (uint256 balance, uint256 available, uint256 current, uint256 distributing, uint256 excess) {
        return(balanceOf(address(this)), balanceOf(address(this)).sub(currentDividends).sub(dividendsBeingDistributed), currentDividends, dividendsBeingDistributed, excessDividends);
    }

    function viewAvailableBalance() public view returns (uint256 contractBalance) {
        return balanceOf(address(this)).sub(currentDividends).sub(dividendsBeingDistributed);
    }

    function viewLastFiveReflectionEvents() external view returns (uint256, uint256, uint256, uint256, uint256) {
        return(eventStats[reflectionEvent].reflectionAmount, eventStats[reflectionEvent.sub(1)].reflectionAmount, eventStats[reflectionEvent.sub(2)].reflectionAmount,
            eventStats[reflectionEvent.sub(3)].reflectionAmount, eventStats[reflectionEvent.sub(4)].reflectionAmount);
    }

    function viewUserReflectionStats(uint256 eventNumber, address wallet) external view returns (uint256) {
        return userEventData[eventNumber][wallet];
    }

    function viewMyReflectionStats(uint256 eventNumber) external view returns (uint256) {
        return userEventData[eventNumber][msg.sender];
    }
}

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":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletToken","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":"","type":"address"}],"name":"amountStaked","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":"wallet","type":"address"}],"name":"availableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceInformation","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"distributing","type":"uint256"},{"internalType":"uint256","name":"excess","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeReflectionEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDividends","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":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributingReflections","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendsBeingDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eventFeesCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eventStats","outputs":[{"internalType":"uint256","name":"reflectionAmount","type":"uint256"},{"internalType":"uint256","name":"reflectionsDisbursed","type":"uint256"},{"internalType":"uint256","name":"eventTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalFees","type":"uint256"},{"internalType":"uint256","name":"totalExcess","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"excessDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getUnpaidEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"manualProcessReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualReflectionEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setDistributionInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"excess","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"distributing","type":"uint256"}],"name":"setDividendInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setGasAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_utility","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"setInternalAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxDropAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buy","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"setParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setReleaseDistributing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_reflections","type":"uint256"},{"internalType":"uint256","name":"_burn","type":"uint256"},{"internalType":"uint256","name":"_token","type":"uint256"},{"internalType":"uint256","name":"_staking","type":"uint256"},{"internalType":"uint256","name":"_development","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_sell","type":"uint256"},{"internalType":"uint256","name":"_trans","type":"uint256"}],"name":"setStructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapAmount","type":"uint256"},{"internalType":"uint256","name":"_swapThreshold","type":"uint256"},{"internalType":"uint256","name":"_minTokenAmount","type":"uint256"}],"name":"setSwapbackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"setUserMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setisDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setisExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalExcluded","type":"uint256"},{"internalType":"uint256","name":"totalRealised","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"totalReflectionsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewAvailableBalance","outputs":[{"internalType":"uint256","name":"contractBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewDisbursementShareholders","outputs":[{"internalType":"uint256","name":"disbursementsAmt","type":"uint256"},{"internalType":"uint256","name":"shareholdersAmt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewLastFiveReflectionEvents","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"}],"name":"viewMyReflectionStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewRemainingBeingDisbursed","outputs":[{"internalType":"uint256","name":"distributing","type":"uint256"},{"internalType":"uint256","name":"distributed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventNumber","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"viewUserReflectionStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a620005e0565b6200002190620f4240620005f8565b6001556127106001546064620000389190620005f8565b62000044919062000612565b60025561271060015460646200005b9190620005f8565b62000067919062000612565b6003556009805462ffffff60a01b19166201000160a01b1790556000600a819055610384600b556064600c556103e8600d819055600e829055600f919091556107d0601055610fa060118190556012556127106013556001601681905554620186a091620000d69190620005f8565b620000e2919062000612565b601755620186a0600154600a620000fa9190620005f8565b62000106919062000612565b6018556000601b556ec097ce7bc90715b34b9f10000000006024556207a12060315561a8c0603255620186a0600154600a620001439190620005f8565b6200014f919062000612565b6034556127106001546101f4620001679190620005f8565b62000173919062000612565b603555603680546001600160a01b0319908116736f623e84da9880138df9362cb596e13291c3c4ae90811790925560378054821683179055603880548216733f20cb334ffd23d0ec8eefafae485728774ea1b0179055603980549091169091179055348015620001e257600080fd5b50600080546001600160a01b031916331781556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9291839163c45a0155916004808201926020929091908290030181865afa1580156200024a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000270919062000635565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e4919062000635565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000332573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000358919062000635565b600880546001600160a01b038581166001600160a01b03199283161790925560098054848416908316178155601d8054909216339081178355306000818152600660209081526040808320805460ff1990811660019081179092556039548a16855282852080548216831790556038548a168552828520805482168317905597548916845281842080548916821790558584528184208054891682179055601c548916845281842080548916821790559383526007825280832080548816851790559454909616815283812080548616831790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80548616831790557f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805490951682179094555481845260048552828420819055915191825293945090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505062000660565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000522578160001904821115620005065762000506620004cb565b808516156200051457918102915b93841c9390800290620004e6565b509250929050565b6000826200053b57506001620005da565b816200054a57506000620005da565b81600181146200056357600281146200056e576200058e565b6001915050620005da565b60ff841115620005825762000582620004cb565b50506001821b620005da565b5060208310610133831016604e8410600b8410161715620005b3575081810a620005da565b620005bf8383620004e1565b8060001904821115620005d657620005d6620004cb565b0290505b92915050565b6000620005f160ff8416836200052a565b9392505050565b8082028115828204841417620005da57620005da620004cb565b6000826200063057634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200064857600080fd5b81516001600160a01b0381168114620005f157600080fd5b613a4d80620006706000396000f3fe60806040526004361061041f5760003560e01c8063893d20e81161021e578063ccec371611610123578063e2910950116100ab578063efca2eed1161007a578063efca2eed14610d6c578063f2fde38b14610d82578063f4e0d9ac14610da2578063f69e204614610dc2578063feb3040214610dd757600080fd5b8063e291095014610cbc578063e94dd17c14610cff578063ef40a67014610d1f578063ef43b02b14610d4c57600080fd5b8063d494c388116100f2578063d494c38814610bf5578063d9c47ade14610c15578063dbb108b714610c35578063dd62ed3e14610c56578063dee5434b14610c9c57600080fd5b8063ccec371614610b4e578063ce7c2ac214610b6e578063d156875014610bc5578063d4348de014610bdb57600080fd5b8063a61fba42116101a6578063b7e5595c11610175578063b7e5595c14610a9d578063bbc3f06914610aca578063c0c4939414610adf578063c61ca2b714610af5578063caa2344414610b2e57600080fd5b8063a61fba4214610a05578063a8aa1b3114610a3d578063a9059cbb14610a5d578063b6b55f2514610a7d57600080fd5b806395d89b41116101ed57806395d89b4114610960578063997664d71461098f5780639e252f00146109a55780639fb05d37146109c5578063a0821be3146109e557600080fd5b8063893d20e8146108d95780638c7d13021461090b57806392a65e001461092b5780639358928b1461094b57600080fd5b80633850f6871161032457806371201a0e116102ac5780637d1db4a51161027b5780637d1db4a514610863578063817b1cd214610879578063822628081461088f5780638331c106146108a4578063884870c7146108b957600080fd5b806371201a0e1461080257806375a729441461081857806378109e541461082d5780637a16a49e1461084357600080fd5b806348ff2b8b116102f357806348ff2b8b1461078157806349c1cf6e146107a15780636570e4eb146107b757806367b50af9146107cc57806370a08231146107e257600080fd5b80633850f687146106f55780633a98ef391461070b5780633f4218e0146107215780634355855a1461075157600080fd5b8063234353aa116103a7578063293230b811610376578063293230b8146106555780632b37e0cc1461066a5780632e1a7d4d1461068a5780632f54bf6e146106aa578063313ce567146106d957600080fd5b8063234353aa146105ab57806323b872dd146105f557806326a4e8d21461061557806328fd31981461063557600080fd5b80630c8f78fb116103ee5780630c8f78fb146104dc5780630dc6e50e146104fe57806312f02ffe1461051e57806318160ddd1461055957806319e4574d1461056e57600080fd5b80630122690f1461042b57806306fdde031461045457806308e20e1f14610496578063095ea7b3146104ac57600080fd5b3661042657005b600080fd5b34801561043757600080fd5b5061044160225481565b6040519081526020015b60405180910390f35b34801561046057600080fd5b5060408051808201909152601081526f109d5d1d195c999b1e481159999958dd60821b60208201525b60405161044b919061353f565b3480156104a257600080fd5b5061044160215481565b3480156104b857600080fd5b506104cc6104c73660046135a2565b610def565b604051901515815260200161044b565b3480156104e857600080fd5b506104fc6104f73660046135ce565b610e06565b005b34801561050a57600080fd5b506104fc6105193660046135e7565b610e3e565b34801561052a57600080fd5b50602254602b546000908152603b60205260409020600101545b6040805192835260208301919091520161044b565b34801561056557600080fd5b50600154610441565b34801561057a57600080fd5b50610583610f4d565b604080519586526020860194909452928401919091526060830152608082015260a00161044b565b3480156105b757600080fd5b506105836105c63660046135ce565b603b60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b34801561060157600080fd5b506104cc61061036600461364f565b61102f565b34801561062157600080fd5b506104fc610630366004613690565b611099565b34801561064157600080fd5b50610441610650366004613690565b6110e5565b34801561066157600080fd5b506104fc611170565b34801561067657600080fd5b506104fc6106853660046135a2565b6111b3565b34801561069657600080fd5b506104fc6106a53660046135ce565b6111f9565b3480156106b657600080fd5b506104cc6106c5366004613690565b6000546001600160a01b0391821691161490565b3480156106e557600080fd5b506040516009815260200161044b565b34801561070157600080fd5b50610441602b5481565b34801561071757600080fd5b50610441601e5481565b34801561072d57600080fd5b506104cc61073c366004613690565b60066020526000908152604090205460ff1681565b34801561075d57600080fd5b506104cc61076c366004613690565b60076020526000908152604090205460ff1681565b34801561078d57600080fd5b506104fc61079c3660046136bb565b611310565b3480156107ad57600080fd5b5061044160335481565b3480156107c357600080fd5b50610441611365565b3480156107d857600080fd5b5061044160315481565b3480156107ee57600080fd5b506104416107fd366004613690565b611387565b34801561080e57600080fd5b5061044160325481565b34801561082457600080fd5b506105836113a2565b34801561083957600080fd5b5061044160035481565b34801561084f57600080fd5b506104fc61085e3660046135ce565b6113e2565b34801561086f57600080fd5b5061044160025481565b34801561088557600080fd5b50610441601a5481565b34801561089b57600080fd5b506104fc611411565b3480156108b057600080fd5b506104fc61141c565b3480156108c557600080fd5b506104fc6108d43660046136f4565b61144d565b3480156108e557600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161044b565b34801561091757600080fd5b506104fc6109263660046135ce565b611551565b34801561093757600080fd5b506104fc610946366004613716565b61159d565b34801561095757600080fd5b506104416115e5565b34801561096c57600080fd5b506040805180820190915260068152651151919150d560d21b6020820152610489565b34801561099b57600080fd5b50610441601f5481565b3480156109b157600080fd5b506104fc6109c03660046135ce565b61160b565b3480156109d157600080fd5b506104fc6109e0366004613733565b611649565b3480156109f157600080fd5b50610441610a00366004613690565b611726565b348015610a1157600080fd5b50610441610a203660046135ce565b6000908152603a6020908152604080832033845290915290205490565b348015610a4957600080fd5b506009546108f3906001600160a01b031681565b348015610a6957600080fd5b506104cc610a783660046135a2565b611753565b348015610a8957600080fd5b506104fc610a983660046135ce565b611760565b348015610aa957600080fd5b50610441610ab8366004613690565b602f6020526000908152604090205481565b348015610ad657600080fd5b506104fc61176d565b348015610aeb57600080fd5b5061044160295481565b348015610b0157600080fd5b50610441610b10366004613690565b6001600160a01b031660009081526026602052604090206002015490565b348015610b3a57600080fd5b506104fc610b49366004613716565b61179f565b348015610b5a57600080fd5b506104fc610b69366004613690565b6117dc565b348015610b7a57600080fd5b50610baa610b89366004613690565b60266020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161044b565b348015610bd157600080fd5b50610441602a5481565b348015610be757600080fd5b50602c546104cc9060ff1681565b348015610c0157600080fd5b506104fc610c103660046135ce565b6118ef565b348015610c2157600080fd5b506104fc610c303660046135ce565b61193b565b348015610c4157600080fd5b506009546104cc90600160b01b900460ff1681565b348015610c6257600080fd5b50610441610c713660046137a4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610ca857600080fd5b506104fc610cb73660046137d2565b61196e565b348015610cc857600080fd5b50610441610cd73660046137fe565b6000918252603a602090815260408084206001600160a01b0393909316845291905290205490565b348015610d0b57600080fd5b506104fc610d1a3660046137d2565b6119a6565b348015610d2b57600080fd5b50610441610d3a366004613690565b60196020526000908152604090205481565b348015610d5857600080fd5b506104fc610d673660046136bb565b611a08565b348015610d7857600080fd5b5061044160205481565b348015610d8e57600080fd5b506104fc610d9d366004613690565b611ac6565b348015610dae57600080fd5b506104fc610dbd366004613690565b611b44565b348015610dce57600080fd5b506104fc611ba8565b348015610de357600080fd5b50602d54602554610544565b6000610dfc338484611c51565b5060015b92915050565b6000546001600160a01b03163314610e395760405162461bcd60e51b8152600401610e3090613823565b60405180910390fd5b603155565b6000546001600160a01b03163314610e685760405162461bcd60e51b8152600401610e3090613823565b600a8a9055600b899055600c889055601b859055600d849055600e879055601083905560118290556012819055600f8690556013548311801590610eb0575060135460115411155b8015610ec05750601354600e5411155b8015610ed05750601354600f5411155b8015610ee0575060135460125411155b610f415760405162461bcd60e51b815260206004820152602c60248201527f746f74616c46656520616e642073656c6c4665652063616e6e6f74206265206d60448201526b6f7265207468616e2032302560a01b6064820152608401610e30565b50505050505050505050565b6000806000806000603b6000602b54815260200190815260200160002060000154603b6000610f886001602b54611d7590919063ffffffff16565b815260200190815260200160002060000154603b6000610fb46002602b54611d7590919063ffffffff16565b815260200190815260200160002060000154603b6000610fe06003602b54611d7590919063ffffffff16565b815260200190815260200160002060000154603b600061100c6004602b54611d7590919063ffffffff16565b815260200190815260200160002060000154945094509450945094509091929394565b600061103c848484611d81565b61108e8433611089856040518060600160405280602881526020016139f0602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611ebc565b611c51565b5060015b9392505050565b6000546001600160a01b031633146110c35760405162461bcd60e51b8152600401610e3090613823565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260266020526040812054810361110c57506000919050565b6001600160a01b03821660009081526026602052604081205461112e90611ee8565b6001600160a01b03841660009081526026602052604090206001015490915080821161115e575060009392505050565b6111688282611d75565b949350505050565b6000546001600160a01b0316331461119a5760405162461bcd60e51b8152600401610e3090613823565b6009805460ff60a81b1916600160a81b17905542603355565b6000546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610e3090613823565b6001600160a01b039091166000908152602f6020526040902055565b3360009081526019602052604090205481111561126e5760405162461bcd60e51b815260206004820152602d60248201527f45524332303a2043616e6e6f7420756e7374616b65206d6f7265207468616e2060448201526c185b5bdd5b9d081cdd185ad959609a1b6064820152608401610e30565b601c5460405163d8a9bf2960e01b8152336004820152602481018390526001600160a01b039091169063d8a9bf2990604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050336000908152601960205260409020546112ed9250905082611d75565b33600090815260196020526040902055601a5461130a9082611d75565b601a5550565b6000546001600160a01b0316331461133a5760405162461bcd60e51b8152600401610e3090613823565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600061138260225461137c60215461137c30611387565b90611d75565b905090565b6001600160a01b031660009081526004602052604090205490565b60008060008060006113b330611387565b6113c860225461137c60215461137c30611387565b602154602254602954945094509450945094509091929394565b6000546001600160a01b0316331461140c5760405162461bcd60e51b8152600401610e3090613823565b603255565b61141a33611f05565b565b6000546001600160a01b031633146114465760405162461bcd60e51b8152600401610e3090613823565b6000602255565b6000546001600160a01b031633146114775760405162461bcd60e51b8152600401610e3090613823565b60006114986127106114928561148c60015490565b90612048565b90612054565b905060006114af6127106114928561148c60015490565b905060006114c76103e8611492600561148c60015490565b90508083101580156114d95750808210155b6115435760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b6064820152608401610e30565b506002919091556003555050565b6000546001600160a01b0316331461157b5760405162461bcd60e51b8152600401610e3090613823565b611597620186a06114928360015461204890919063ffffffff16565b60355550565b6000546001600160a01b031633146115c75760405162461bcd60e51b8152600401610e3090613823565b60098054911515600160b01b0260ff60b01b19909216919091179055565b60006113826115f46000611387565b61137c61160261dead611387565b60015490611d75565b6036546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611645573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146116735760405162461bcd60e51b8152600401610e3090613823565b603880546001600160a01b039687166001600160a01b0319918216811790925560398054968816968216871790556036805495881695821686179055601d805494881694821685179055603780549390971692168217909555600094855260066020526040808620805460ff199081166001908117909255958752818720805487168217905593865280862080548616851790559185528185208054851684179055845290922080549091169091179055565b6001600160a01b0381166000908152601960209081526040808320546004909252822054610e0091611d75565b6000610dfc338484611d81565b61176a3382612060565b50565b6000546001600160a01b031633146117975760405162461bcd60e51b8152600401610e3090613823565b61141a6121ab565b6000546001600160a01b031633146117c95760405162461bcd60e51b8152600401610e3090613823565b602e805460ff1916911515919091179055565b6000546001600160a01b031633146118065760405162461bcd60e51b8152600401610e3090613823565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561184d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118719190613843565b60365460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea919061385c565b505050565b6000546001600160a01b031633146119195760405162461bcd60e51b8152600401610e3090613823565b611935620186a06114928360015461204890919063ffffffff16565b60345550565b6000546001600160a01b031633146119655760405162461bcd60e51b8152600401610e3090613823565b61176a8161224f565b6000546001600160a01b031633146119985760405162461bcd60e51b8152600401610e3090613823565b602992909255602155602255565b6000546001600160a01b031633146119d05760405162461bcd60e51b8152600401610e3090613823565b60168390556119e9620186a06114928461148c60015490565b601755611a00620186a06114928361148c60015490565b601855505050565b6000546001600160a01b03163314611a325760405162461bcd60e51b8152600401610e3090613823565b6001600160a01b0382166000908152600760205260409020805460ff19168215801591909117909155611a6a57611a6a82600061234a565b6001600160a01b0382166000908152602f602052604090205415611ab9576001600160a01b0382166000908152602f6020526040902054611645908390611ab49061148c83611387565b61234a565b61164582611ab484611387565b6000546001600160a01b03163314611af05760405162461bcd60e51b8152600401610e3090613823565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6000546001600160a01b03163314611b6e5760405162461bcd60e51b8152600401610e3090613823565b601c80546001600160a01b039092166001600160a01b0319909216821790556000908152600660205260409020805460ff19166001179055565b6015805461ff0019166101001790556000611bc233611387565b601c546040516334c5cbab60e11b8152336004820181905260248201529192506001600160a01b03169063698b975690604401600060405180830381600087803b158015611c0f57600080fd5b505af1158015611c23573d6000803e3d6000fd5b505050506000611c368261137c33611387565b9050611c423382612060565b50506015805461ff0019169055565b6001600160a01b038316611cb35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e30565b6001600160a01b038216611d145760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e30565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611092828461388f565b611d8c838383612484565b611d9683836125bc565b611da183838361264d565b611dac838383612739565b611db6838361287b565b611dc18383836128e1565b611dcc8383836129b5565b6001600160a01b038316600090815260046020526040902054611def9082611d75565b6001600160a01b038416600090815260046020526040812091909155611e1584846129da565b611e1f5781611e2a565b611e2a848484612a20565b6001600160a01b038416600090815260046020526040902054909150611e509082612bf6565b6001600160a01b0380851660008181526004602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611ea49085815260200190565b60405180910390a3611eb68484612c02565b50505050565b60008184841115611ee05760405162461bcd60e51b8152600401610e30919061353f565b505050900390565b6000610e006024546114926023548561204890919063ffffffff16565b6000611f10826110e5565b6001600160a01b0383166000908152602660205260409020549091501580611f3f5750611f3c30611387565b81115b15611f48575050565b801561164557602054611f5b9082612bf6565b6020908155602b546000908152603b9091526040902060010154611f7f9082612bf6565b602b546000908152603b6020526040902060010155611f9f308383612e55565b50602b546000908152603a602090815260408083206001600160a01b03861684528252808320849055602882528083204290556026909152902060020154611fe79082612bf6565b6001600160a01b038316600090815260266020526040902060028101919091555461201190611ee8565b6001600160a01b038316600090815260266020908152604080832060010193909355602f90529081205561164582611ab481611387565b600061109282846138a2565b600061109282846138b9565b6001600160a01b03821660009081526019602090815260408083205460049092529091205461208e91611d75565b8111156120f55760405162461bcd60e51b815260206004820152602f60248201527f45524332303a2043616e6e6f74207374616b65206d6f7265207468616e20617660448201526e61696c61626c652062616c616e636560881b6064820152608401610e30565b601c5460405163773a0f0960e01b81526001600160a01b038481166004830152602482018490529091169063773a0f0990604401600060405180830381600087803b15801561214357600080fd5b505af1158015612157573d6000803e3d6000fd5b5050506001600160a01b03831660009081526019602052604090205461217e915082612bf6565b6001600160a01b038316600090815260196020526040902055601a546121a49082612bf6565b601a555050565b602c805460ff1916600190811790915560298054602b80546000908152603b60205260408120600401929092559155546121e491612bf6565b602b818155602a546000928352603b60205260408084206003019190915560218054835485528285205591548352909120426002909101556035549054111561222e576035546021555b612239602154612eca565b60006021819055602a554260335560315461141a905b6020546025548061225f57505050565b6000805a905060005b858310801561227657508381105b1561231557836030541061228a5760006030555b6122bc6025603054815481106122a2576122a26138db565b6000918252602090912001546001600160a01b0316611f05565b6122d16122ca5a8490611d75565b8490612bf6565b92505a6030805491935060006122e6836138f1565b919050555080806122f6906138f1565b602d8054919350909150600061230b836138f1565b9190505550612268565b83602d5410158015612328575084602054115b1561234257602c805460ff1916905560006022819055602d555b505050505050565b60008111801561237057506001600160a01b038216600090815260266020526040902054155b156123d657602580546001600160a01b0384166000818152602760205260408120839055600183018455929092527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b0319169091179055612409565b801580156123fb57506001600160a01b03821660009081526026602052604090205415155b156124095761240982612f03565b6001600160a01b038216600090815260266020526040902054601e5461243a91839161243491611d75565b90612bf6565b601e556001600160a01b038216600090815260266020526040902081905561246181611ee8565b6001600160a01b0390921660009081526026602052604090206001019190915550565b6001600160a01b0383166124e85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e30565b6001600160a01b03821661254a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e30565b61255383611387565b8111156118ea5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610e30565b6001600160a01b03821660009081526006602052604090205460ff161580156125fe57506001600160a01b03811660009081526006602052604090205460ff16155b1561164557600954600160a81b900460ff166116455760405162461bcd60e51b815260206004820152600e60248201526d1d1c98591a5b99d05b1b1bddd95960921b6044820152606401610e30565b6001600160a01b03831660009081526006602052604090205460ff1615801561268f57506001600160a01b03821660009081526006602052604090205460ff16155b80156126a957506009546001600160a01b03838116911614155b80156126c057506001600160a01b03821661dead14155b156118ea576003546001600160a01b0383166000908152600460205260409020546126eb9083612bf6565b11156118ea5760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e00006044820152606401610e30565b6001600160a01b038316600090815260196020526040902054156127ef5761276083611387565b6001600160a01b038416600090815260196020526040902054612784908390612bf6565b11156127ef5760405162461bcd60e51b815260206004820152603460248201527f45524332303a2045786365656473206d6178696d756d20616c6c6f776564206e60448201527337ba1031bab93932b73a363c9039ba30b5b2b21760611b6064820152608401610e30565b6002548111158061281857506001600160a01b03831660009081526006602052604090205460ff165b8061283b57506001600160a01b03821660009081526006602052604090205460ff165b6118ea5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610e30565b6009546001600160a01b0382811691161480156128b157506001600160a01b03821660009081526006602052604090205460ff16155b80156128c0575060155460ff16155b15611645576001601460008282546128d8919061390a565b90915550505050565b6009546001600160a01b03848116911614801561290057506034548110155b15612943576001600160a01b0382166000908152602f6020526040902054612929906001612bf6565b6001600160a01b0383166000908152602f60205260409020555b6009546001600160a01b038481169116148015612961575060345481105b15612983576001600160a01b0382166000908152602f60205260409020600190555b6009546001600160a01b03908116908316036118ea5750506001600160a01b03166000908152602f6020526040812055565b6129c0838383613018565b156118ea576129d06017546130d0565b6000601455505050565b6001600160a01b03821660009081526006602052604081205460ff161580156110925750506001600160a01b031660009081526006602052604090205460ff1615919050565b600080612a2d85856132db565b118015612a3d575060155460ff16155b15612bef576000612a5f612a5186866132db565b60135461148c908690612054565b30600090815260046020526040902054909150612a7c9082612bf6565b30600081815260046020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612acd9085815260200190565b60405180910390a36000600c54118015612af25750612aec85856132db565b600c5411155b15612b4757612b1e612b15600c5461148c6013548761205490919063ffffffff16565b60215490612bf6565b602155600c54601354612b4391612b3a9161148c908790612054565b602a5490612bf6565b602a555b6000600e54118015612b645750612b5e85856132db565b600e5411155b15612b9057612b903061dead612b8b600e5461148c6013548961205490919063ffffffff16565b611d81565b6000600f54118015612bad5750612ba785856132db565b600f5411155b15612bdd57601d54600f54601354612bdd9230926001600160a01b0390911691612b8b919061148c908990612054565b612be78382611d75565b915050611092565b5092915050565b6000611092828461390a565b602e5460ff1615612c135760006022555b6001600160a01b03811660009081526026602052604090205415612c3a57612c3a81611f05565b6001600160a01b03821660009081526026602052604090205415801590612c6f57506009546001600160a01b03828116911614155b15612c7d57612c7d82611f05565b6009546001600160a01b038281169116148015612cb157506001600160a01b03821660009081526026602052604090205415155b15612ccf57612ccb612cc2836110e5565b60295490612bf6565b6029555b6001600160a01b03821660009081526007602052604090205460ff16612cfc57612cfc82611ab484611387565b6001600160a01b03811660009081526007602052604090205460ff16612d2957612d2981611ab483611387565b6001600160a01b03811660009081526007602052604090205460ff16158015612d5f57506009546001600160a01b038381169116145b8015612d8457506001600160a01b0381166000908152602f6020526040902054600111155b15612db5576001600160a01b0381166000908152602f6020526040902054612db5908290611ab49061148c83611387565b42612dcd603254603354612bf690919063ffffffff16565b11158015612de45750600954600160a81b900460ff165b8015612df257506000602154115b8015612e01575060155460ff16155b8015612e165750600954600160b01b900460ff165b15612e2357612e236121ab565b612e2e60315461224f565b6001600160a01b038116600090815260266020526040902054156116455761164581611f05565b6001600160a01b038316600090815260046020526040812054612e789083611d75565b6001600160a01b038086166000908152600460205260408082209390935590851681522054612ea79083612bf6565b6001600160a01b0384166000908152600460205260409020555060019392505050565b601f54612ed79082612bf6565b601f55601e54602454612efb91612ef2916114929085612048565b60235490612bf6565b602355602255565b60258054612f139060019061388f565b81548110612f2357612f236138db565b60009182526020808320909101546001600160a01b0384811684526027909252604090922054602580549290931692918110612f6157612f616138db565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260279182905260408120546025805491939291612fad9060019061388f565b81548110612fbd57612fbd6138db565b60009182526020808320909101546001600160a01b031683528201929092526040019020556025805480612ff357612ff361391d565b600082815260209020810160001990810180546001600160a01b031916905501905550565b60008060185483101590506000601754613030611365565b601554911115915060ff161580156130515750600954600160a01b900460ff165b80156130665750600954600160a81b900460ff165b801561306f5750815b801561309457506001600160a01b03861660009081526006602052604090205460ff16155b80156130ad57506009546001600160a01b038681169116145b80156130bd575060165460145410155b80156130c65750805b9695505050505050565b6015805460ff191660019081179091556010546000916130f79160029161148c9190612bf6565b6010549091506131315761312e600261148c6001612434600d54612434601b54612434600b54600a54612bf690919063ffffffff16565b90505b600061314c82611492600a548661204890919063ffffffff16565b9050600061315a8483611d75565b90504761316682613342565b60006131724783611d75565b9050600061319561318e600a5488611d7590919063ffffffff16565b8390612054565b905060006131ae600a548361204890919063ffffffff16565b905080156131cf576039546131cf90879083906001600160a01b0316613494565b601b546000906131e49061148c856002612048565b90508015613228576037546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613226573d6000803e3d6000fd5b505b600b5460009061323d9061148c866002612048565b90508015613281576038546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561327f573d6000803e3d6000fd5b505b4780156132c4576036546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156132c2573d6000803e3d6000fd5b505b50506015805460ff19169055505050505050505050565b6009546000906001600160a01b0383811691161480156132fd57506000601154115b1561330b5750601154610e00565b6009546001600160a01b03848116911614801561332a57506000601054115b156133385750601054610e00565b5060125492915050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613377576133776138db565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f49190613933565b81600181518110613407576134076138db565b6001600160a01b03928316602091820292909201015260085461342d9130911684611c51565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac94790613466908590600090869030904290600401613950565b600060405180830381600087803b15801561348057600080fd5b505af1158015612342573d6000803e3d6000fd5b6008546134ac9030906001600160a01b031685611c51565b60085460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0383811660848301524260a48301529091169063f305d71990849060c40160606040518083038185885af115801561351a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061234291906139c1565b600060208083528351808285015260005b8181101561356c57858101830151858201604001528201613550565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461176a57600080fd5b600080604083850312156135b557600080fd5b82356135c08161358d565b946020939093013593505050565b6000602082840312156135e057600080fd5b5035919050565b6000806000806000806000806000806101408b8d03121561360757600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b60008060006060848603121561366457600080fd5b833561366f8161358d565b9250602084013561367f8161358d565b929592945050506040919091013590565b6000602082840312156136a257600080fd5b81356110928161358d565b801515811461176a57600080fd5b600080604083850312156136ce57600080fd5b82356136d98161358d565b915060208301356136e9816136ad565b809150509250929050565b6000806040838503121561370757600080fd5b50508035926020909101359150565b60006020828403121561372857600080fd5b8135611092816136ad565b600080600080600060a0868803121561374b57600080fd5b85356137568161358d565b945060208601356137668161358d565b935060408601356137768161358d565b925060608601356137868161358d565b915060808601356137968161358d565b809150509295509295909350565b600080604083850312156137b757600080fd5b82356137c28161358d565b915060208301356136e98161358d565b6000806000606084860312156137e757600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561381157600080fd5b8235915060208301356136e98161358d565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60006020828403121561385557600080fd5b5051919050565b60006020828403121561386e57600080fd5b8151611092816136ad565b634e487b7160e01b600052601160045260246000fd5b81810381811115610e0057610e00613879565b8082028115828204841417610e0057610e00613879565b6000826138d657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006001820161390357613903613879565b5060010190565b80820180821115610e0057610e00613879565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561394557600080fd5b81516110928161358d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156139a05784516001600160a01b03168352938301939183019160010161397b565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156139d657600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212202a502d07ee857a601fcd87eefb5e6acb014ed1e37b75aeaf99042f5342a1f1a164736f6c63430008130033

Deployed Bytecode

0x60806040526004361061041f5760003560e01c8063893d20e81161021e578063ccec371611610123578063e2910950116100ab578063efca2eed1161007a578063efca2eed14610d6c578063f2fde38b14610d82578063f4e0d9ac14610da2578063f69e204614610dc2578063feb3040214610dd757600080fd5b8063e291095014610cbc578063e94dd17c14610cff578063ef40a67014610d1f578063ef43b02b14610d4c57600080fd5b8063d494c388116100f2578063d494c38814610bf5578063d9c47ade14610c15578063dbb108b714610c35578063dd62ed3e14610c56578063dee5434b14610c9c57600080fd5b8063ccec371614610b4e578063ce7c2ac214610b6e578063d156875014610bc5578063d4348de014610bdb57600080fd5b8063a61fba42116101a6578063b7e5595c11610175578063b7e5595c14610a9d578063bbc3f06914610aca578063c0c4939414610adf578063c61ca2b714610af5578063caa2344414610b2e57600080fd5b8063a61fba4214610a05578063a8aa1b3114610a3d578063a9059cbb14610a5d578063b6b55f2514610a7d57600080fd5b806395d89b41116101ed57806395d89b4114610960578063997664d71461098f5780639e252f00146109a55780639fb05d37146109c5578063a0821be3146109e557600080fd5b8063893d20e8146108d95780638c7d13021461090b57806392a65e001461092b5780639358928b1461094b57600080fd5b80633850f6871161032457806371201a0e116102ac5780637d1db4a51161027b5780637d1db4a514610863578063817b1cd214610879578063822628081461088f5780638331c106146108a4578063884870c7146108b957600080fd5b806371201a0e1461080257806375a729441461081857806378109e541461082d5780637a16a49e1461084357600080fd5b806348ff2b8b116102f357806348ff2b8b1461078157806349c1cf6e146107a15780636570e4eb146107b757806367b50af9146107cc57806370a08231146107e257600080fd5b80633850f687146106f55780633a98ef391461070b5780633f4218e0146107215780634355855a1461075157600080fd5b8063234353aa116103a7578063293230b811610376578063293230b8146106555780632b37e0cc1461066a5780632e1a7d4d1461068a5780632f54bf6e146106aa578063313ce567146106d957600080fd5b8063234353aa146105ab57806323b872dd146105f557806326a4e8d21461061557806328fd31981461063557600080fd5b80630c8f78fb116103ee5780630c8f78fb146104dc5780630dc6e50e146104fe57806312f02ffe1461051e57806318160ddd1461055957806319e4574d1461056e57600080fd5b80630122690f1461042b57806306fdde031461045457806308e20e1f14610496578063095ea7b3146104ac57600080fd5b3661042657005b600080fd5b34801561043757600080fd5b5061044160225481565b6040519081526020015b60405180910390f35b34801561046057600080fd5b5060408051808201909152601081526f109d5d1d195c999b1e481159999958dd60821b60208201525b60405161044b919061353f565b3480156104a257600080fd5b5061044160215481565b3480156104b857600080fd5b506104cc6104c73660046135a2565b610def565b604051901515815260200161044b565b3480156104e857600080fd5b506104fc6104f73660046135ce565b610e06565b005b34801561050a57600080fd5b506104fc6105193660046135e7565b610e3e565b34801561052a57600080fd5b50602254602b546000908152603b60205260409020600101545b6040805192835260208301919091520161044b565b34801561056557600080fd5b50600154610441565b34801561057a57600080fd5b50610583610f4d565b604080519586526020860194909452928401919091526060830152608082015260a00161044b565b3480156105b757600080fd5b506105836105c63660046135ce565b603b60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b34801561060157600080fd5b506104cc61061036600461364f565b61102f565b34801561062157600080fd5b506104fc610630366004613690565b611099565b34801561064157600080fd5b50610441610650366004613690565b6110e5565b34801561066157600080fd5b506104fc611170565b34801561067657600080fd5b506104fc6106853660046135a2565b6111b3565b34801561069657600080fd5b506104fc6106a53660046135ce565b6111f9565b3480156106b657600080fd5b506104cc6106c5366004613690565b6000546001600160a01b0391821691161490565b3480156106e557600080fd5b506040516009815260200161044b565b34801561070157600080fd5b50610441602b5481565b34801561071757600080fd5b50610441601e5481565b34801561072d57600080fd5b506104cc61073c366004613690565b60066020526000908152604090205460ff1681565b34801561075d57600080fd5b506104cc61076c366004613690565b60076020526000908152604090205460ff1681565b34801561078d57600080fd5b506104fc61079c3660046136bb565b611310565b3480156107ad57600080fd5b5061044160335481565b3480156107c357600080fd5b50610441611365565b3480156107d857600080fd5b5061044160315481565b3480156107ee57600080fd5b506104416107fd366004613690565b611387565b34801561080e57600080fd5b5061044160325481565b34801561082457600080fd5b506105836113a2565b34801561083957600080fd5b5061044160035481565b34801561084f57600080fd5b506104fc61085e3660046135ce565b6113e2565b34801561086f57600080fd5b5061044160025481565b34801561088557600080fd5b50610441601a5481565b34801561089b57600080fd5b506104fc611411565b3480156108b057600080fd5b506104fc61141c565b3480156108c557600080fd5b506104fc6108d43660046136f4565b61144d565b3480156108e557600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161044b565b34801561091757600080fd5b506104fc6109263660046135ce565b611551565b34801561093757600080fd5b506104fc610946366004613716565b61159d565b34801561095757600080fd5b506104416115e5565b34801561096c57600080fd5b506040805180820190915260068152651151919150d560d21b6020820152610489565b34801561099b57600080fd5b50610441601f5481565b3480156109b157600080fd5b506104fc6109c03660046135ce565b61160b565b3480156109d157600080fd5b506104fc6109e0366004613733565b611649565b3480156109f157600080fd5b50610441610a00366004613690565b611726565b348015610a1157600080fd5b50610441610a203660046135ce565b6000908152603a6020908152604080832033845290915290205490565b348015610a4957600080fd5b506009546108f3906001600160a01b031681565b348015610a6957600080fd5b506104cc610a783660046135a2565b611753565b348015610a8957600080fd5b506104fc610a983660046135ce565b611760565b348015610aa957600080fd5b50610441610ab8366004613690565b602f6020526000908152604090205481565b348015610ad657600080fd5b506104fc61176d565b348015610aeb57600080fd5b5061044160295481565b348015610b0157600080fd5b50610441610b10366004613690565b6001600160a01b031660009081526026602052604090206002015490565b348015610b3a57600080fd5b506104fc610b49366004613716565b61179f565b348015610b5a57600080fd5b506104fc610b69366004613690565b6117dc565b348015610b7a57600080fd5b50610baa610b89366004613690565b60266020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161044b565b348015610bd157600080fd5b50610441602a5481565b348015610be757600080fd5b50602c546104cc9060ff1681565b348015610c0157600080fd5b506104fc610c103660046135ce565b6118ef565b348015610c2157600080fd5b506104fc610c303660046135ce565b61193b565b348015610c4157600080fd5b506009546104cc90600160b01b900460ff1681565b348015610c6257600080fd5b50610441610c713660046137a4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610ca857600080fd5b506104fc610cb73660046137d2565b61196e565b348015610cc857600080fd5b50610441610cd73660046137fe565b6000918252603a602090815260408084206001600160a01b0393909316845291905290205490565b348015610d0b57600080fd5b506104fc610d1a3660046137d2565b6119a6565b348015610d2b57600080fd5b50610441610d3a366004613690565b60196020526000908152604090205481565b348015610d5857600080fd5b506104fc610d673660046136bb565b611a08565b348015610d7857600080fd5b5061044160205481565b348015610d8e57600080fd5b506104fc610d9d366004613690565b611ac6565b348015610dae57600080fd5b506104fc610dbd366004613690565b611b44565b348015610dce57600080fd5b506104fc611ba8565b348015610de357600080fd5b50602d54602554610544565b6000610dfc338484611c51565b5060015b92915050565b6000546001600160a01b03163314610e395760405162461bcd60e51b8152600401610e3090613823565b60405180910390fd5b603155565b6000546001600160a01b03163314610e685760405162461bcd60e51b8152600401610e3090613823565b600a8a9055600b899055600c889055601b859055600d849055600e879055601083905560118290556012819055600f8690556013548311801590610eb0575060135460115411155b8015610ec05750601354600e5411155b8015610ed05750601354600f5411155b8015610ee0575060135460125411155b610f415760405162461bcd60e51b815260206004820152602c60248201527f746f74616c46656520616e642073656c6c4665652063616e6e6f74206265206d60448201526b6f7265207468616e2032302560a01b6064820152608401610e30565b50505050505050505050565b6000806000806000603b6000602b54815260200190815260200160002060000154603b6000610f886001602b54611d7590919063ffffffff16565b815260200190815260200160002060000154603b6000610fb46002602b54611d7590919063ffffffff16565b815260200190815260200160002060000154603b6000610fe06003602b54611d7590919063ffffffff16565b815260200190815260200160002060000154603b600061100c6004602b54611d7590919063ffffffff16565b815260200190815260200160002060000154945094509450945094509091929394565b600061103c848484611d81565b61108e8433611089856040518060600160405280602881526020016139f0602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611ebc565b611c51565b5060015b9392505050565b6000546001600160a01b031633146110c35760405162461bcd60e51b8152600401610e3090613823565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260266020526040812054810361110c57506000919050565b6001600160a01b03821660009081526026602052604081205461112e90611ee8565b6001600160a01b03841660009081526026602052604090206001015490915080821161115e575060009392505050565b6111688282611d75565b949350505050565b6000546001600160a01b0316331461119a5760405162461bcd60e51b8152600401610e3090613823565b6009805460ff60a81b1916600160a81b17905542603355565b6000546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610e3090613823565b6001600160a01b039091166000908152602f6020526040902055565b3360009081526019602052604090205481111561126e5760405162461bcd60e51b815260206004820152602d60248201527f45524332303a2043616e6e6f7420756e7374616b65206d6f7265207468616e2060448201526c185b5bdd5b9d081cdd185ad959609a1b6064820152608401610e30565b601c5460405163d8a9bf2960e01b8152336004820152602481018390526001600160a01b039091169063d8a9bf2990604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050336000908152601960205260409020546112ed9250905082611d75565b33600090815260196020526040902055601a5461130a9082611d75565b601a5550565b6000546001600160a01b0316331461133a5760405162461bcd60e51b8152600401610e3090613823565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600061138260225461137c60215461137c30611387565b90611d75565b905090565b6001600160a01b031660009081526004602052604090205490565b60008060008060006113b330611387565b6113c860225461137c60215461137c30611387565b602154602254602954945094509450945094509091929394565b6000546001600160a01b0316331461140c5760405162461bcd60e51b8152600401610e3090613823565b603255565b61141a33611f05565b565b6000546001600160a01b031633146114465760405162461bcd60e51b8152600401610e3090613823565b6000602255565b6000546001600160a01b031633146114775760405162461bcd60e51b8152600401610e3090613823565b60006114986127106114928561148c60015490565b90612048565b90612054565b905060006114af6127106114928561148c60015490565b905060006114c76103e8611492600561148c60015490565b90508083101580156114d95750808210155b6115435760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b6064820152608401610e30565b506002919091556003555050565b6000546001600160a01b0316331461157b5760405162461bcd60e51b8152600401610e3090613823565b611597620186a06114928360015461204890919063ffffffff16565b60355550565b6000546001600160a01b031633146115c75760405162461bcd60e51b8152600401610e3090613823565b60098054911515600160b01b0260ff60b01b19909216919091179055565b60006113826115f46000611387565b61137c61160261dead611387565b60015490611d75565b6036546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611645573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146116735760405162461bcd60e51b8152600401610e3090613823565b603880546001600160a01b039687166001600160a01b0319918216811790925560398054968816968216871790556036805495881695821686179055601d805494881694821685179055603780549390971692168217909555600094855260066020526040808620805460ff199081166001908117909255958752818720805487168217905593865280862080548616851790559185528185208054851684179055845290922080549091169091179055565b6001600160a01b0381166000908152601960209081526040808320546004909252822054610e0091611d75565b6000610dfc338484611d81565b61176a3382612060565b50565b6000546001600160a01b031633146117975760405162461bcd60e51b8152600401610e3090613823565b61141a6121ab565b6000546001600160a01b031633146117c95760405162461bcd60e51b8152600401610e3090613823565b602e805460ff1916911515919091179055565b6000546001600160a01b031633146118065760405162461bcd60e51b8152600401610e3090613823565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561184d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118719190613843565b60365460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156118c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ea919061385c565b505050565b6000546001600160a01b031633146119195760405162461bcd60e51b8152600401610e3090613823565b611935620186a06114928360015461204890919063ffffffff16565b60345550565b6000546001600160a01b031633146119655760405162461bcd60e51b8152600401610e3090613823565b61176a8161224f565b6000546001600160a01b031633146119985760405162461bcd60e51b8152600401610e3090613823565b602992909255602155602255565b6000546001600160a01b031633146119d05760405162461bcd60e51b8152600401610e3090613823565b60168390556119e9620186a06114928461148c60015490565b601755611a00620186a06114928361148c60015490565b601855505050565b6000546001600160a01b03163314611a325760405162461bcd60e51b8152600401610e3090613823565b6001600160a01b0382166000908152600760205260409020805460ff19168215801591909117909155611a6a57611a6a82600061234a565b6001600160a01b0382166000908152602f602052604090205415611ab9576001600160a01b0382166000908152602f6020526040902054611645908390611ab49061148c83611387565b61234a565b61164582611ab484611387565b6000546001600160a01b03163314611af05760405162461bcd60e51b8152600401610e3090613823565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6000546001600160a01b03163314611b6e5760405162461bcd60e51b8152600401610e3090613823565b601c80546001600160a01b039092166001600160a01b0319909216821790556000908152600660205260409020805460ff19166001179055565b6015805461ff0019166101001790556000611bc233611387565b601c546040516334c5cbab60e11b8152336004820181905260248201529192506001600160a01b03169063698b975690604401600060405180830381600087803b158015611c0f57600080fd5b505af1158015611c23573d6000803e3d6000fd5b505050506000611c368261137c33611387565b9050611c423382612060565b50506015805461ff0019169055565b6001600160a01b038316611cb35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e30565b6001600160a01b038216611d145760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e30565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611092828461388f565b611d8c838383612484565b611d9683836125bc565b611da183838361264d565b611dac838383612739565b611db6838361287b565b611dc18383836128e1565b611dcc8383836129b5565b6001600160a01b038316600090815260046020526040902054611def9082611d75565b6001600160a01b038416600090815260046020526040812091909155611e1584846129da565b611e1f5781611e2a565b611e2a848484612a20565b6001600160a01b038416600090815260046020526040902054909150611e509082612bf6565b6001600160a01b0380851660008181526004602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611ea49085815260200190565b60405180910390a3611eb68484612c02565b50505050565b60008184841115611ee05760405162461bcd60e51b8152600401610e30919061353f565b505050900390565b6000610e006024546114926023548561204890919063ffffffff16565b6000611f10826110e5565b6001600160a01b0383166000908152602660205260409020549091501580611f3f5750611f3c30611387565b81115b15611f48575050565b801561164557602054611f5b9082612bf6565b6020908155602b546000908152603b9091526040902060010154611f7f9082612bf6565b602b546000908152603b6020526040902060010155611f9f308383612e55565b50602b546000908152603a602090815260408083206001600160a01b03861684528252808320849055602882528083204290556026909152902060020154611fe79082612bf6565b6001600160a01b038316600090815260266020526040902060028101919091555461201190611ee8565b6001600160a01b038316600090815260266020908152604080832060010193909355602f90529081205561164582611ab481611387565b600061109282846138a2565b600061109282846138b9565b6001600160a01b03821660009081526019602090815260408083205460049092529091205461208e91611d75565b8111156120f55760405162461bcd60e51b815260206004820152602f60248201527f45524332303a2043616e6e6f74207374616b65206d6f7265207468616e20617660448201526e61696c61626c652062616c616e636560881b6064820152608401610e30565b601c5460405163773a0f0960e01b81526001600160a01b038481166004830152602482018490529091169063773a0f0990604401600060405180830381600087803b15801561214357600080fd5b505af1158015612157573d6000803e3d6000fd5b5050506001600160a01b03831660009081526019602052604090205461217e915082612bf6565b6001600160a01b038316600090815260196020526040902055601a546121a49082612bf6565b601a555050565b602c805460ff1916600190811790915560298054602b80546000908152603b60205260408120600401929092559155546121e491612bf6565b602b818155602a546000928352603b60205260408084206003019190915560218054835485528285205591548352909120426002909101556035549054111561222e576035546021555b612239602154612eca565b60006021819055602a554260335560315461141a905b6020546025548061225f57505050565b6000805a905060005b858310801561227657508381105b1561231557836030541061228a5760006030555b6122bc6025603054815481106122a2576122a26138db565b6000918252602090912001546001600160a01b0316611f05565b6122d16122ca5a8490611d75565b8490612bf6565b92505a6030805491935060006122e6836138f1565b919050555080806122f6906138f1565b602d8054919350909150600061230b836138f1565b9190505550612268565b83602d5410158015612328575084602054115b1561234257602c805460ff1916905560006022819055602d555b505050505050565b60008111801561237057506001600160a01b038216600090815260266020526040902054155b156123d657602580546001600160a01b0384166000818152602760205260408120839055600183018455929092527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b0319169091179055612409565b801580156123fb57506001600160a01b03821660009081526026602052604090205415155b156124095761240982612f03565b6001600160a01b038216600090815260266020526040902054601e5461243a91839161243491611d75565b90612bf6565b601e556001600160a01b038216600090815260266020526040902081905561246181611ee8565b6001600160a01b0390921660009081526026602052604090206001019190915550565b6001600160a01b0383166124e85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e30565b6001600160a01b03821661254a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e30565b61255383611387565b8111156118ea5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610e30565b6001600160a01b03821660009081526006602052604090205460ff161580156125fe57506001600160a01b03811660009081526006602052604090205460ff16155b1561164557600954600160a81b900460ff166116455760405162461bcd60e51b815260206004820152600e60248201526d1d1c98591a5b99d05b1b1bddd95960921b6044820152606401610e30565b6001600160a01b03831660009081526006602052604090205460ff1615801561268f57506001600160a01b03821660009081526006602052604090205460ff16155b80156126a957506009546001600160a01b03838116911614155b80156126c057506001600160a01b03821661dead14155b156118ea576003546001600160a01b0383166000908152600460205260409020546126eb9083612bf6565b11156118ea5760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e00006044820152606401610e30565b6001600160a01b038316600090815260196020526040902054156127ef5761276083611387565b6001600160a01b038416600090815260196020526040902054612784908390612bf6565b11156127ef5760405162461bcd60e51b815260206004820152603460248201527f45524332303a2045786365656473206d6178696d756d20616c6c6f776564206e60448201527337ba1031bab93932b73a363c9039ba30b5b2b21760611b6064820152608401610e30565b6002548111158061281857506001600160a01b03831660009081526006602052604090205460ff165b8061283b57506001600160a01b03821660009081526006602052604090205460ff165b6118ea5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610e30565b6009546001600160a01b0382811691161480156128b157506001600160a01b03821660009081526006602052604090205460ff16155b80156128c0575060155460ff16155b15611645576001601460008282546128d8919061390a565b90915550505050565b6009546001600160a01b03848116911614801561290057506034548110155b15612943576001600160a01b0382166000908152602f6020526040902054612929906001612bf6565b6001600160a01b0383166000908152602f60205260409020555b6009546001600160a01b038481169116148015612961575060345481105b15612983576001600160a01b0382166000908152602f60205260409020600190555b6009546001600160a01b03908116908316036118ea5750506001600160a01b03166000908152602f6020526040812055565b6129c0838383613018565b156118ea576129d06017546130d0565b6000601455505050565b6001600160a01b03821660009081526006602052604081205460ff161580156110925750506001600160a01b031660009081526006602052604090205460ff1615919050565b600080612a2d85856132db565b118015612a3d575060155460ff16155b15612bef576000612a5f612a5186866132db565b60135461148c908690612054565b30600090815260046020526040902054909150612a7c9082612bf6565b30600081815260046020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612acd9085815260200190565b60405180910390a36000600c54118015612af25750612aec85856132db565b600c5411155b15612b4757612b1e612b15600c5461148c6013548761205490919063ffffffff16565b60215490612bf6565b602155600c54601354612b4391612b3a9161148c908790612054565b602a5490612bf6565b602a555b6000600e54118015612b645750612b5e85856132db565b600e5411155b15612b9057612b903061dead612b8b600e5461148c6013548961205490919063ffffffff16565b611d81565b6000600f54118015612bad5750612ba785856132db565b600f5411155b15612bdd57601d54600f54601354612bdd9230926001600160a01b0390911691612b8b919061148c908990612054565b612be78382611d75565b915050611092565b5092915050565b6000611092828461390a565b602e5460ff1615612c135760006022555b6001600160a01b03811660009081526026602052604090205415612c3a57612c3a81611f05565b6001600160a01b03821660009081526026602052604090205415801590612c6f57506009546001600160a01b03828116911614155b15612c7d57612c7d82611f05565b6009546001600160a01b038281169116148015612cb157506001600160a01b03821660009081526026602052604090205415155b15612ccf57612ccb612cc2836110e5565b60295490612bf6565b6029555b6001600160a01b03821660009081526007602052604090205460ff16612cfc57612cfc82611ab484611387565b6001600160a01b03811660009081526007602052604090205460ff16612d2957612d2981611ab483611387565b6001600160a01b03811660009081526007602052604090205460ff16158015612d5f57506009546001600160a01b038381169116145b8015612d8457506001600160a01b0381166000908152602f6020526040902054600111155b15612db5576001600160a01b0381166000908152602f6020526040902054612db5908290611ab49061148c83611387565b42612dcd603254603354612bf690919063ffffffff16565b11158015612de45750600954600160a81b900460ff165b8015612df257506000602154115b8015612e01575060155460ff16155b8015612e165750600954600160b01b900460ff165b15612e2357612e236121ab565b612e2e60315461224f565b6001600160a01b038116600090815260266020526040902054156116455761164581611f05565b6001600160a01b038316600090815260046020526040812054612e789083611d75565b6001600160a01b038086166000908152600460205260408082209390935590851681522054612ea79083612bf6565b6001600160a01b0384166000908152600460205260409020555060019392505050565b601f54612ed79082612bf6565b601f55601e54602454612efb91612ef2916114929085612048565b60235490612bf6565b602355602255565b60258054612f139060019061388f565b81548110612f2357612f236138db565b60009182526020808320909101546001600160a01b0384811684526027909252604090922054602580549290931692918110612f6157612f616138db565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260279182905260408120546025805491939291612fad9060019061388f565b81548110612fbd57612fbd6138db565b60009182526020808320909101546001600160a01b031683528201929092526040019020556025805480612ff357612ff361391d565b600082815260209020810160001990810180546001600160a01b031916905501905550565b60008060185483101590506000601754613030611365565b601554911115915060ff161580156130515750600954600160a01b900460ff165b80156130665750600954600160a81b900460ff165b801561306f5750815b801561309457506001600160a01b03861660009081526006602052604090205460ff16155b80156130ad57506009546001600160a01b038681169116145b80156130bd575060165460145410155b80156130c65750805b9695505050505050565b6015805460ff191660019081179091556010546000916130f79160029161148c9190612bf6565b6010549091506131315761312e600261148c6001612434600d54612434601b54612434600b54600a54612bf690919063ffffffff16565b90505b600061314c82611492600a548661204890919063ffffffff16565b9050600061315a8483611d75565b90504761316682613342565b60006131724783611d75565b9050600061319561318e600a5488611d7590919063ffffffff16565b8390612054565b905060006131ae600a548361204890919063ffffffff16565b905080156131cf576039546131cf90879083906001600160a01b0316613494565b601b546000906131e49061148c856002612048565b90508015613228576037546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613226573d6000803e3d6000fd5b505b600b5460009061323d9061148c866002612048565b90508015613281576038546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561327f573d6000803e3d6000fd5b505b4780156132c4576036546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156132c2573d6000803e3d6000fd5b505b50506015805460ff19169055505050505050505050565b6009546000906001600160a01b0383811691161480156132fd57506000601154115b1561330b5750601154610e00565b6009546001600160a01b03848116911614801561332a57506000601054115b156133385750601054610e00565b5060125492915050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613377576133776138db565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f49190613933565b81600181518110613407576134076138db565b6001600160a01b03928316602091820292909201015260085461342d9130911684611c51565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac94790613466908590600090869030904290600401613950565b600060405180830381600087803b15801561348057600080fd5b505af1158015612342573d6000803e3d6000fd5b6008546134ac9030906001600160a01b031685611c51565b60085460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0383811660848301524260a48301529091169063f305d71990849060c40160606040518083038185885af115801561351a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061234291906139c1565b600060208083528351808285015260005b8181101561356c57858101830151858201604001528201613550565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461176a57600080fd5b600080604083850312156135b557600080fd5b82356135c08161358d565b946020939093013593505050565b6000602082840312156135e057600080fd5b5035919050565b6000806000806000806000806000806101408b8d03121561360757600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b60008060006060848603121561366457600080fd5b833561366f8161358d565b9250602084013561367f8161358d565b929592945050506040919091013590565b6000602082840312156136a257600080fd5b81356110928161358d565b801515811461176a57600080fd5b600080604083850312156136ce57600080fd5b82356136d98161358d565b915060208301356136e9816136ad565b809150509250929050565b6000806040838503121561370757600080fd5b50508035926020909101359150565b60006020828403121561372857600080fd5b8135611092816136ad565b600080600080600060a0868803121561374b57600080fd5b85356137568161358d565b945060208601356137668161358d565b935060408601356137768161358d565b925060608601356137868161358d565b915060808601356137968161358d565b809150509295509295909350565b600080604083850312156137b757600080fd5b82356137c28161358d565b915060208301356136e98161358d565b6000806000606084860312156137e757600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561381157600080fd5b8235915060208301356136e98161358d565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60006020828403121561385557600080fd5b5051919050565b60006020828403121561386e57600080fd5b8151611092816136ad565b634e487b7160e01b600052601160045260246000fd5b81810381811115610e0057610e00613879565b8082028115828204841417610e0057610e00613879565b6000826138d657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006001820161390357613903613879565b5060010190565b80820180821115610e0057610e00613879565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561394557600080fd5b81516110928161358d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156139a05784516001600160a01b03168352938301939183019160010161397b565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156139d657600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212202a502d07ee857a601fcd87eefb5e6acb014ed1e37b75aeaf99042f5342a1f1a164736f6c63430008130033

Deployed Bytecode Sourcemap

4478:27341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6473:40;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;6473:40:0;;;;;;;;9168:67;;;;;;;;;;-1:-1:-1;9228:5:0;;;;;;;;;;;;-1:-1:-1;;;9228:5:0;;;;9168:67;;;;;;;:::i;6435:31::-;;;;;;;;;;;;;;;;9952:133;;;;;;;;;;-1:-1:-1;9952:133:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;9952:133:0;1205:187:1;25469:88:0;;;;;;;;;;-1:-1:-1;25469:88:0;;;;;:::i;:::-;;:::i;:::-;;12448:700;;;;;;;;;;-1:-1:-1;12448:700:0;;;;;:::i;:::-;;:::i;26974:207::-;;;;;;;;;;-1:-1:-1;27097:25:0;;27135:15;;27036:20;27124:27;;;:10;:27;;;;;:48;;;26974:207;;;;2560:25:1;;;2616:2;2601:18;;2594:34;;;;2533:18;26974:207:0;2386:248:1;9475:84:0;;;;;;;;;;-1:-1:-1;9545:12:0;;9475:84;;31086:404;;;;;;;;;;;;;:::i;:::-;;;;2898:25:1;;;2954:2;2939:18;;2932:34;;;;2982:18;;;2975:34;;;;3040:2;3025:18;;3018:34;3083:3;3068:19;;3061:35;2885:3;2870:19;31086:404:0;2639:463:1;8178:47:0;;;;;;;;;;-1:-1:-1;8178:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10731:309;;;;;;;;;;-1:-1:-1;10731:309:0;;;;;:::i;:::-;;:::i;26564:106::-;;;;;;;;;;-1:-1:-1;26564:106:0;;;;;:::i;:::-;;:::i;29423:473::-;;;;;;;;;;-1:-1:-1;29423:473:0;;;;;:::i;:::-;;:::i;16442:128::-;;;;;;;;;;;;;:::i;16893:131::-;;;;;;;;;;-1:-1:-1;16893:131:0;;;;;:::i;:::-;;:::i;14103:347::-;;;;;;;;;;-1:-1:-1;14103:347:0;;;;;:::i;:::-;;:::i;2366:87::-;;;;;;;;;;-1:-1:-1;2366:87:0;;;;;:::i;:::-;2421:4;2446:5;-1:-1:-1;;;;;2435:16:0;;;2446:5;;2435:16;;2366:87;9318:67;;;;;;;;;;-1:-1:-1;9318:67:0;;4717:1;3962:36:1;;3950:2;3935:18;9318:67:0;3820:184:1;6966:30:0;;;;;;;;;;;;;;;;6328:26;;;;;;;;;;;;;;;;5048:44;;;;;;;;;;-1:-1:-1;5048:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5099:49;;;;;;;;;;-1:-1:-1;5099:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17508:124;;;;;;;;;;-1:-1:-1;17508:124:0;;;;;:::i;:::-;;:::i;7307:31::-;;;;;;;;;;;;;;;;30897:181;;;;;;;;;;;;;:::i;7214:33::-;;;;;;;;;;;;;;;;9565:103;;;;;;;;;;-1:-1:-1;9565:103:0;;;;;:::i;:::-;;:::i;7254:46::-;;;;;;;;;;;;;;;;30553:336;;;;;;;;;;;;;:::i;4857:63::-;;;;;;;;;;;;;;;;25109:120;;;;;;;;;;-1:-1:-1;25109:120:0;;;;;:::i;:::-;;:::i;4790:60::-;;;;;;;;;;;;;;;;6175:26;;;;;;;;;;;;;;;;26880:86;;;;;;;;;;;;;:::i;25565:108::-;;;;;;;;;;;;;:::i;13156:449::-;;;;;;;;;;-1:-1:-1;13156:449:0;;;;;:::i;:::-;;:::i;9391:78::-;;;;;;;;;;-1:-1:-1;9443:7:0;9461:5;-1:-1:-1;;;;;9461:5:0;9391:78;;;-1:-1:-1;;;;;4936:32:1;;;4918:51;;4906:2;4891:18;9391:78:0;4772:203:1;24969:132:0;;;;;;;;;;-1:-1:-1;24969:132:0;;;;;:::i;:::-;;:::i;25356:105::-;;;;;;;;;;-1:-1:-1;25356:105:0;;;;;:::i;:::-;;:::i;10222:138::-;;;;;;;;;;;;;:::i;9241:71::-;;;;;;;;;;-1:-1:-1;9303:7:0;;;;;;;;;;;;-1:-1:-1;;;9303:7:0;;;;9241:71;;6361:29;;;;;;;;;;;;;;;;26449:107;;;;;;;;;;-1:-1:-1;26449:107:0;;;;;:::i;:::-;;:::i;17032:468::-;;;;;;;;;;-1:-1:-1;17032:468:0;;;;;:::i;:::-;;:::i;10091:125::-;;;;;;;;;;-1:-1:-1;10091:125:0;;;;;:::i;:::-;;:::i;31668:148::-;;;;;;;;;;-1:-1:-1;31668:148:0;;;;;:::i;:::-;31743:7;31770:26;;;:13;:26;;;;;;;;31797:10;31770:38;;;;;;;;;31668:148;5176:19;;;;;;;;;;-1:-1:-1;5176:19:0;;;;-1:-1:-1;;;;;5176:19:0;;;9674:139;;;;;;;;;;-1:-1:-1;9674:139:0;;;;;:::i;:::-;;:::i;13990:105::-;;;;;;;;;;-1:-1:-1;13990:105:0;;;;;:::i;:::-;;:::i;7122:49::-;;;;;;;;;;-1:-1:-1;7122:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;24660:94;;;;;;;;;;;;;:::i;6889:30::-;;;;;;;;;;;;;;;;26678:194;;;;;;;;;;-1:-1:-1;26678:194:0;;;;;:::i;:::-;-1:-1:-1;;;;;26830:19:0;26755:7;26830:19;;;:6;:19;;;;;:33;;;;26678:194;25237:111;;;;;;;;;;-1:-1:-1;25237:111:0;;;;;:::i;:::-;;:::i;24762:199::-;;;;;;;;;;-1:-1:-1;24762:199:0;;;;;:::i;:::-;;:::i;6651:40::-;;;;;;;;;;-1:-1:-1;6651:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6246:25:1;;;6302:2;6287:18;;6280:34;;;;6330:18;;;6323:34;6234:2;6219:18;6651:40:0;6044:319:1;6926:33:0;;;;;;;;;;;;;;;;7003:35;;;;;;;;;;-1:-1:-1;7003:35:0;;;;;;;;17860:130;;;;;;;;;;-1:-1:-1;17860:130:0;;;;;:::i;:::-;;:::i;27372:108::-;;;;;;;;;;-1:-1:-1;27372:108:0;;;;;:::i;:::-;;:::i;5282:37::-;;;;;;;;;;-1:-1:-1;5282:37:0;;;;-1:-1:-1;;;5282:37:0;;;;;;9819:127;;;;;;;;;;-1:-1:-1;9819:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;9917:18:0;;;9900:7;9917:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9819:127;17640:212;;;;;;;;;;-1:-1:-1;17640:212:0;;;;;:::i;:::-;;:::i;31498:162::-;;;;;;;;;;-1:-1:-1;31498:162:0;;;;;:::i;:::-;31591:7;31618:26;;;:13;:26;;;;;;;;-1:-1:-1;;;;;31618:34:0;;;;;;;;;;;;;31498:162;16578:307;;;;;;;;;;-1:-1:-1;16578:307:0;;;;;:::i;:::-;;:::i;6121:47::-;;;;;;;;;;-1:-1:-1;6121:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;22336:327;;;;;;;;;;-1:-1:-1;22336:327:0;;;;;:::i;:::-;;:::i;6397:31::-;;;;;;;;;;;;;;;;2459:111;;;;;;;;;;-1:-1:-1;2459:111:0;;;;;:::i;:::-;;:::i;14780:157::-;;;;;;;;;;-1:-1:-1;14780:157:0;;;;;:::i;:::-;;:::i;14458:314::-;;;;;;;;;;;;;:::i;27189:175::-;;;;;;;;;;-1:-1:-1;27321:13:0;;27336:12;:19;27189:175;;9952:133;10027:4;10034:37;10043:10;10055:7;10064:6;10034:8;:37::i;:::-;-1:-1:-1;10079:4:0;9952:133;;;;;:::o;25469:88::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;;;;;;;;;25534:9:::1;:15:::0;25469:88::o;12448:700::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;12690:12:::1;:25:::0;;;12717:12:::1;:25:::0;;;12744:13:::1;:28:::0;;;12774:7:::1;:18:::0;;;12794:14:::1;:29:::0;;;-1:-1:-1;12834:15:0;;;12851:8:::1;:17:::0;;;12870:7:::1;:15:::0;;;12887:11:::1;:20:::0;;;12909:8:::1;:17:::0;;;12957:11:::1;::::0;12945:23;::::1;::::0;::::1;::::0;:49:::1;;;12983:11;;12972:7;;:22;;12945:49;:75;;;;;13009:11;;12998:7;;:22;;12945:75;:102;;;;;13036:11;;13024:8;;:23;;12945:102;:146;;;;;13080:11;;13065;;:26;;12945:146;12937:203;;;::::0;-1:-1:-1;;;12937:203:0;;8198:2:1;12937:203:0::1;::::0;::::1;8180:21:1::0;8237:2;8217:18;;;8210:30;8276:34;8256:18;;;8249:62;-1:-1:-1;;;8327:18:1;;;8320:42;8379:19;;12937:203:0::1;7996:408:1::0;12937:203:0::1;12448:700:::0;;;;;;;;;;:::o;31086:404::-;31149:7;31158;31167;31176;31185;31212:10;:27;31223:15;;31212:27;;;;;;;;;;;:44;;;31258:10;:34;31269:22;31289:1;31269:15;;:19;;:22;;;;:::i;:::-;31258:34;;;;;;;;;;;:51;;;31311:10;:34;31322:22;31342:1;31322:15;;:19;;:22;;;;:::i;:::-;31311:34;;;;;;;;;;;:51;;;31377:10;:34;31388:22;31408:1;31388:15;;:19;;:22;;;;:::i;:::-;31377:34;;;;;;;;;;;:51;;;31430:10;:34;31441:22;31461:1;31441:15;;:19;;:22;;;;:::i;:::-;31430:34;;;;;;;;;;;:51;;;31205:277;;;;;;;;;;31086:404;;;;;:::o;10731:309::-;10829:4;10846:36;10856:6;10864:9;10875:6;10846:9;:36::i;:::-;10893:117;10902:6;10910:10;10922:87;10958:6;10922:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10922:19:0;;;;;;:11;:19;;;;;;;;10942:10;10922:31;;;;;;;;;:87;:35;:87::i;:::-;10893:8;:117::i;:::-;-1:-1:-1;11028:4:0;10731:309;;;;;;:::o;26564:106::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;26637:14:::1;:25:::0;;-1:-1:-1;;;;;;26637:25:0::1;-1:-1:-1::0;;;;;26637:25:0;;;::::1;::::0;;;::::1;::::0;;26564:106::o;29423:473::-;-1:-1:-1;;;;;29515:19:0;;29492:7;29515:19;;;:6;:19;;;;;:26;:31;;29512:48;;-1:-1:-1;29556:1:0;;29423:473;-1:-1:-1;29423:473:0:o;29512:48::-;-1:-1:-1;;;;;29629:19:0;;29570:33;29629:19;;;:6;:19;;;;;:26;29606:50;;:22;:50::i;:::-;-1:-1:-1;;;;;29702:19:0;;29667:32;29702:19;;;:6;:19;;;;;:33;;;29570:86;;-1:-1:-1;29749:53:0;;;29746:70;;-1:-1:-1;29812:1:0;;29423:473;-1:-1:-1;;;29423:473:0:o;29746:70::-;29833:55;:25;29863:24;29833:29;:55::i;:::-;29826:62;29423:473;-1:-1:-1;;;;29423:473:0:o;16442:128::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;16496:14:::1;:21:::0;;-1:-1:-1;;;;16496:21:0::1;-1:-1:-1::0;;;16496:21:0::1;::::0;;16547:15:::1;16528:16;:34:::0;16442:128::o;16893:131::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16984:19:0;;::::1;;::::0;;;:13:::1;:19;::::0;;;;:32;16893:131::o;14103:347::-;14197:10;14184:24;;;;:12;:24;;;;;;14174:34;;;14166:92;;;;-1:-1:-1;;;14166:92:0;;8611:2:1;14166:92:0;;;8593:21:1;8650:2;8630:18;;;8623:30;8689:34;8669:18;;;8662:62;-1:-1:-1;;;8740:18:1;;;8733:43;8793:19;;14166:92:0;8409:409:1;14166:92:0;14269:15;;:51;;-1:-1:-1;;;14269:51:0;;14301:10;14269:51;;;8997::1;9064:18;;;9057:34;;;-1:-1:-1;;;;;14269:15:0;;;;:31;;8970:18:1;;14269:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14371:10:0;14358:24;;;;:12;:24;;;;;;:36;;-1:-1:-1;14358:24:0;-1:-1:-1;14387:6:0;14358:28;:36::i;:::-;14344:10;14331:24;;;;:12;:24;;;;;:63;14419:11;;:23;;14435:6;14419:15;:23::i;:::-;14405:11;:37;-1:-1:-1;14103:347:0:o;17508:124::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17592:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:32;;-1:-1:-1;;17592:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17508:124::o;30897:181::-;30950:23;30993:77;31044:25;;30993:46;31022:16;;30993:24;31011:4;30993:9;:24::i;:::-;:28;;:46::i;:77::-;30986:84;;30897:181;:::o;9565:103::-;-1:-1:-1;;;;;9648:18:0;9631:7;9648:18;;;:9;:18;;;;;;;9565:103::o;30553:336::-;30606:15;30623:17;30642:15;30659:20;30681:14;30715:24;30733:4;30715:9;:24::i;:::-;30741:77;30792:25;;30741:46;30770:16;;30741:24;30759:4;30741:9;:24::i;:77::-;30820:16;;30838:25;;30865:15;;30708:173;;;;;;;;;;30553:336;;;;;:::o;25109:120::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;25190:20:::1;:31:::0;25109:120::o;26880:86::-;26928:30;26947:10;26928:18;:30::i;:::-;26880:86::o;25565:108::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;25663:1:::1;25627:25;:38:::0;25565:108::o;13156:449::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;13240:13:::1;13256:43;13292:5;13256:23;13274:4;13256:13;9545:12:::0;;;9475:84;13256:13:::1;:17:::0;::::1;:23::i;:::-;:27:::0;::::1;:43::i;:::-;13240:59;;13310:17;13330:46;13369:5;13330:26;13348:7;13330:13;9545:12:::0;;;9475:84;13330:46:::1;13310:66;;13378:13;13394:30;13419:4;13394:20;13412:1;13394:13;9545:12:::0;;;9475:84;13394:30:::1;13378:46;;13452:5;13443;:14;;:36;;;;;13474:5;13461:9;:18;;13443:36;13435:102;;;::::0;-1:-1:-1;;;13435:102:0;;9304:2:1;13435:102:0::1;::::0;::::1;9286:21:1::0;9343:2;9323:18;;;9316:30;9382:34;9362:18;;;9355:62;-1:-1:-1;;;9433:18:1;;;9426:51;9494:19;;13435:102:0::1;9102:417:1::0;13435:102:0::1;-1:-1:-1::0;13548:12:0::1;:20:::0;;;;13570:15:::1;:27:::0;-1:-1:-1;;13156:449:0:o;24969:132::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;25057:36:::1;25086:6;25057:24;25074:6;25057:12;;:16;;:24;;;;:::i;:36::-;25041:13;:52:::0;-1:-1:-1;24969:132:0:o;25356:105::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;25426:18:::1;:27:::0;;;::::1;;-1:-1:-1::0;;;25426:27:0::1;-1:-1:-1::0;;;;25426:27:0;;::::1;::::0;;;::::1;::::0;;25356:105::o;10222:138::-;10281:7;10298:60;10336:21;10354:1;10336:9;:21::i;:::-;10298:33;10315:15;7515:42;10315:9;:15::i;:::-;10298:12;;;:16;:33::i;26449:107::-;26513:16;;26505:43;;-1:-1:-1;;;;;26513:16:0;;;;26505:43;;;;;26540:7;;26513:16;26505:43;26513:16;26505:43;26540:7;26513:16;26505:43;;;;;;;;;;;;;;;;;;;;;26449:107;:::o;17032:468::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;17184:18:::1;:31:::0;;-1:-1:-1;;;;;17184:31:0;;::::1;-1:-1:-1::0;;;;;;17184:31:0;;::::1;::::0;::::1;::::0;;;17217:18:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;17250:16:::1;:27:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;17279:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;17304:16:::1;:27:::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;17184:18:::1;17342:23:::0;;;:11:::1;:23;::::0;;;;;:30;;-1:-1:-1;;17342:30:0;;::::1;17184:31:::0;17342:30;;::::1;::::0;;;17374:23;;;;;;:30;;;::::1;::::0;::::1;::::0;;17406:21;;;;;;:28;;;::::1;::::0;::::1;::::0;;17436:19;;;;;;:26;;;::::1;::::0;::::1;::::0;;17464:21;;;;;:28;;;;::::1;::::0;;::::1;::::0;;17032:468::o;10091:125::-;-1:-1:-1;;;;;10193:20:0;;10154:7;10193:20;;;:12;:20;;;;;;;;;10171:9;:17;;;;;;:43;;:21;:43::i;9674:139::-;9752:4;9759:40;9769:10;9781:9;9792:6;9759:9;:40::i;13990:105::-;14052:35;14068:10;14080:6;14052:15;:35::i;:::-;13990:105;:::o;24660:94::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;24723:23:::1;:21;:23::i;25237:111::-:0;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;25312:19:::1;:28:::0;;-1:-1:-1;;25312:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25237:111::o;24762:199::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;24849:41:::1;::::0;-1:-1:-1;;;24849:41:0;;24884:4:::1;24849:41;::::0;::::1;4918:51:1::0;24831:15:0::1;::::0;-1:-1:-1;;;;;24849:26:0;::::1;::::0;::::1;::::0;4891:18:1;;24849:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24927:16;::::0;24901:52:::1;::::0;-1:-1:-1;;;24901:52:0;;-1:-1:-1;;;;;24927:16:0;;::::1;24901:52;::::0;::::1;8997:51:1::0;9064:18;;;9057:34;;;24831:59:0;;-1:-1:-1;24901:25:0;::::1;::::0;::::1;::::0;8970:18:1;;24901:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24820:141;24762:199:::0;:::o;17860:130::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;17946:36:::1;17975:6;17946:24;17963:6;17946:12;;:16;;:24;;;;:::i;:36::-;17931:12;:51:::0;-1:-1:-1;17860:130:0:o;27372:108::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;27449:23:::1;27468:3;27449:18;:23::i;17640:212::-:0;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;17750:15:::1;:24:::0;;;;17776:16:::1;:26:::0;17804:25:::1;:40:::0;17640:212::o;16578:307::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;16707:10:::1;:24:::0;;;16749:54:::1;16795:6;16749:33;16767:14:::0;16749:13:::1;9545:12:::0;;;9475:84;16749:54:::1;16733:13;:70:::0;16822:55:::1;16869:6;16822:34;16840:15:::0;16822:13:::1;9545:12:::0;;;9475:84;16822:55:::1;16805:14;:72:::0;-1:-1:-1;;;16578:307:0:o;22336:327::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22424:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;22424:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;22468:32:::1;;22479:19;22488:6;22496:1;22479:8;:19::i;:::-;-1:-1:-1::0;;;;;22513:21:0;::::1;22537:1;22513:21:::0;;;:13:::1;:21;::::0;;;;;:25;22510:146:::1;;-1:-1:-1::0;;;;;22579:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;22540:62:::1;::::0;22549:6;;22557:44:::1;::::0;:17:::1;22549:6:::0;22557:9:::1;:17::i;:44::-;22540:8;:62::i;22510:146::-;22619:35;22628:6;22636:17;22646:6;22636:9;:17::i;2459:111::-:0;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;2525:5:::1;:11:::0;;-1:-1:-1;;;;;;2525:11:0::1;-1:-1:-1::0;;;;;2525:11:0;::::1;::::0;;::::1;::::0;;;2543:25:::1;::::0;4918:51:1;;;2543:25:0::1;::::0;4906:2:1;4891:18;2543:25:0::1;;;;;;;2459:111:::0;:::o;14780:157::-;2421:4;2446:5;-1:-1:-1;;;;;2446:5:0;2333:10;2435:16;2317:38;;;;-1:-1:-1;;;2317:38:0;;;;;;;:::i;:::-;14855:15:::1;:44:::0;;-1:-1:-1;;;;;14855:44:0;;::::1;-1:-1:-1::0;;;;;;14855:44:0;;::::1;::::0;::::1;::::0;;:15:::1;14901:21:::0;;;:11:::1;:21;::::0;;;;:28;;-1:-1:-1;;14901:28:0::1;14855:44:::0;14901:28:::1;::::0;;14780:157::o;14458:314::-;6013:7;:14;;-1:-1:-1;;6013:14:0;;;;;;14549:21:::1;14559:10;14549:9;:21::i;:::-;14581:15;::::0;:62:::1;::::0;-1:-1:-1;;;14581:62:0;;14620:10:::1;14581:62;::::0;::::1;10391:34:1::0;;;10441:18;;;10434:43;14526:44:0;;-1:-1:-1;;;;;;14581:15:0::1;::::0;:38:::1;::::0;10326:18:1;;14581:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14654:18;14675:39;14701:12;14675:21;14685:10;14675:9;:21::i;:39::-;14654:60;;14725:39;14741:10;14753;14725:15;:39::i;:::-;-1:-1:-1::0;;6032:7:0;:15;;-1:-1:-1;;6032:15:0;;;14458:314::o;11311:335::-;-1:-1:-1;;;;;11404:19:0;;11396:68;;;;-1:-1:-1;;;11396:68:0;;10690:2:1;11396:68:0;;;10672:21:1;10729:2;10709:18;;;10702:30;10768:34;10748:18;;;10741:62;-1:-1:-1;;;10819:18:1;;;10812:34;10863:19;;11396:68:0;10488:400:1;11396:68:0;-1:-1:-1;;;;;11483:21:0;;11475:68;;;;-1:-1:-1;;;11475:68:0;;11095:2:1;11475:68:0;;;11077:21:1;11134:2;11114:18;;;11107:30;11173:34;11153:18;;;11146:62;-1:-1:-1;;;11224:18:1;;;11217:32;11266:19;;11475:68:0;10893:398:1;11475:68:0;-1:-1:-1;;;;;11554:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11606:32;;160:25:1;;;11606:32:0;;133:18:1;11606:32:0;;;;;;;11311:335;;;:::o;344:82::-;402:7;419:5;423:1;419;:5;:::i;11654:786::-;11743:37;11754:6;11762:9;11773:6;11743:10;:37::i;:::-;11791:38;11811:6;11819:9;11791:19;:38::i;:::-;11840:41;11855:6;11863:9;11874:6;11840:14;:41::i;:::-;11893:39;11906:6;11914:9;11925:6;11893:12;:39::i;:::-;11943:38;11963:6;11971:9;11943:19;:38::i;:::-;11992:43;12009:6;12017:9;12028:6;11992:16;:43::i;:::-;12046:35;12055:6;12063:9;12074:6;12046:8;:35::i;:::-;-1:-1:-1;;;;;12112:17:0;;;;;;:9;:17;;;;;;:29;;12134:6;12112:21;:29::i;:::-;-1:-1:-1;;;;;12092:17:0;;;;;;:9;:17;;;;;:49;;;;12177:32;12102:6;12199:9;12177:13;:32::i;:::-;:78;;12249:6;12177:78;;;12212:34;12220:6;12228:9;12239:6;12212:7;:34::i;:::-;-1:-1:-1;;;;;12289:20:0;;;;;;:9;:20;;;;;;12152:103;;-1:-1:-1;12289:40:0;;12152:103;12289:24;:40::i;:::-;-1:-1:-1;;;;;12266:20:0;;;;;;;:9;:20;;;;;;;:63;;;;12345:43;;;;;;;;;;12373:14;160:25:1;;148:2;133:18;;14:177;12345:43:0;;;;;;;;12399:33;12414:6;12422:9;12399:14;:33::i;:::-;11732:708;11654:786;;;:::o;698:162::-;784:7;830:12;822:6;;;;814:29;;;;-1:-1:-1;;;814:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;852:5:0;;;698:162::o;29904:170::-;29974:7;30001:65;30034:31;;30001:28;30011:17;;30001:5;:9;;:28;;;;:::i;28469:946::-;28538:14;28555:30;28573:11;28555:17;:30::i;:::-;-1:-1:-1;;;;;28599:19:0;;;;;;:6;:19;;;;;:26;28538:47;;-1:-1:-1;28599:31:0;;:68;;;28643:24;28661:4;28643:9;:24::i;:::-;28634:6;:33;28599:68;28596:83;;;28670:7;28469:946;:::o;28596:83::-;28692:19;;28689:719;;28746:16;;:28;;28767:6;28746:20;:28::i;:::-;28727:16;:47;;;28851:15;;28840:27;;;;:10;:27;;;;;;:48;;;:60;;28893:6;28840:52;:60::i;:::-;28800:15;;28789:27;;;;:10;:27;;;;;:48;;:111;28915:50;28938:4;28945:11;28958:6;28915:14;:50::i;:::-;-1:-1:-1;28994:15:0;;28980:30;;;;:13;:30;;;;;;;;-1:-1:-1;;;;;28980:43:0;;;;;;;;;:52;;;29047:17;:30;;;;;29080:15;29047:48;;29146:6;:19;;;;;:33;;;:45;;29026:6;29146:37;:45::i;:::-;-1:-1:-1;;;;;29110:19:0;;;;;;:6;:19;;;;;:33;;;:81;;;;29265:26;29242:50;;:22;:50::i;:::-;-1:-1:-1;;;;;29206:19:0;;;;;;:6;:19;;;;;;;;:33;;:86;;;;29307:13;:26;;;;;:39;29361:45;29213:11;29383:22;29213:11;29383:9;:22::i;432:82::-;490:7;507:5;511:1;507;:5;:::i;520:82::-;578:7;595:5;599:1;595;:5;:::i;13613:369::-;-1:-1:-1;;;;;13730:20:0;;;;;;:12;:20;;;;;;;;;13708:9;:17;;;;;;;:43;;:21;:43::i;:::-;13698:6;:53;;13690:113;;;;-1:-1:-1;;;13690:113:0;;12158:2:1;13690:113:0;;;12140:21:1;12197:2;12177:18;;;12170:30;12236:34;12216:18;;;12209:62;-1:-1:-1;;;12287:18:1;;;12280:45;12342:19;;13690:113:0;11956:411:1;13690:113:0;13814:15;;:46;;-1:-1:-1;;;13814:46:0;;-1:-1:-1;;;;;9015:32:1;;;13814:46:0;;;8997:51:1;9064:18;;;9057:34;;;13814:15:0;;;;:30;;8970:18:1;;13814:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;13894:20:0;;;;;;:12;:20;;;;;;:32;;-1:-1:-1;13919:6:0;13894:24;:32::i;:::-;-1:-1:-1;;;;;13871:20:0;;;;;;:12;:20;;;;;:55;13951:11;;:23;;13967:6;13951:15;:23::i;:::-;13937:11;:37;-1:-1:-1;;13613:369:0:o;23837:815::-;23894:23;:30;;-1:-1:-1;;23894:30:0;23920:4;23894:30;;;;;;23981:15;;;23950;;;23894:23;23939:27;;;:10;:27;;;;;:39;;:57;;;;24011:28;;24072:15;:31;;:19;:31::i;:::-;24054:15;:49;;;24158:18;;24118:27;;;;:10;:27;;;;;;:37;;:58;;;;24238:16;;;24202:15;;24191:27;;;;;:63;24280:15;;24269:27;;;;;24314:15;24269:42;;;;:60;24366:13;;24347:16;;:32;24344:71;;;24400:13;;24381:16;:32;24344:71;24429:32;24444:16;;24429:14;:32::i;:::-;24503:1;24476:16;:29;;;24520:18;:31;24585:15;24566:16;:34;24634:9;;24615:29;;27488:973;27573:16;;27627:12;:19;;27657:46;;27694:7;;27488:973;:::o;27657:46::-;27713:15;27752;27770:9;27752:27;;27790:18;27832:397;27848:3;27838:7;:13;:46;;;;;27868:16;27855:10;:29;27838:46;27832:397;;;27920:16;27904:12;;:32;27901:82;;27979:1;27956:12;:25;27901:82;28001:46;28020:12;28033;;28020:26;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28020:26:0;28001:18;:46::i;:::-;28072:35;28084:22;28096:9;28084:7;;:11;:22::i;:::-;28072:7;;:11;:35::i;:::-;28062:45;;28132:9;28156:12;:14;;28122:19;;-1:-1:-1;28156:12:0;:14;;;:::i;:::-;;;;;;28185:12;;;;;:::i;:::-;28212:13;:15;;28185:12;;-1:-1:-1;28212:15:0;;-1:-1:-1;28212:13:0;:15;;;:::i;:::-;;;;;;27832:397;;;28259:16;28242:13;;:33;;:69;;;;;28298:13;28279:16;;:32;28242:69;28239:215;;;28327:23;:31;;-1:-1:-1;;28327:31:0;;;28353:5;28373:25;:38;;;28426:13;:26;28239:215;27538:923;;;;;27488:973;:::o;25681:482::-;25768:1;25759:6;:10;:45;;;;-1:-1:-1;;;;;;25773:19:0;;;;;;:6;:19;;;;;:26;:31;25759:45;25756:177;;;30181:12;:19;;-1:-1:-1;;;;;30147:31:0;;;;;;:18;:31;;;;;:53;;;30211:30;;;;;;;;;;;;;-1:-1:-1;;;;;;30211:30:0;;;;;;25756:177;;;25853:11;;:45;;;;-1:-1:-1;;;;;;25868:19:0;;25897:1;25868:19;;;:6;:19;;;;;:26;:30;;25853:45;25850:83;;;25900:30;25918:11;25900:17;:30::i;:::-;-1:-1:-1;;;;;25973:19:0;;;;;;:6;:19;;;;;:26;25957:11;;:55;;26005:6;;25957:43;;:15;:43::i;:::-;:47;;:55::i;:::-;25943:11;:69;-1:-1:-1;;;;;26023:19:0;;;;;;:6;:19;;;;;:35;;;26105:50;26052:6;26105:22;:50::i;:::-;-1:-1:-1;;;;;26069:19:0;;;;;;;:6;:19;;;;;:33;;:86;;;;-1:-1:-1;25681:482:0:o;10368:355::-;-1:-1:-1;;;;;10472:20:0;;10464:70;;;;-1:-1:-1;;;10464:70:0;;12846:2:1;10464:70:0;;;12828:21:1;12885:2;12865:18;;;12858:30;12924:34;12904:18;;;12897:62;-1:-1:-1;;;12975:18:1;;;12968:35;13020:19;;10464:70:0;12644:401:1;10464:70:0;-1:-1:-1;;;;;10553:23:0;;10545:71;;;;-1:-1:-1;;;10545:71:0;;13252:2:1;10545:71:0;;;13234:21:1;13291:2;13271:18;;;13264:30;13330:34;13310:18;;;13303:62;-1:-1:-1;;;13381:18:1;;;13374:33;13424:19;;10545:71:0;13050:399:1;10545:71:0;10645:17;10655:6;10645:9;:17::i;:::-;10635:6;:27;;10627:88;;;;-1:-1:-1;;;10627:88:0;;13656:2:1;10627:88:0;;;13638:21:1;13695:2;13675:18;;;13668:30;13734:34;13714:18;;;13707:62;-1:-1:-1;;;13785:18:1;;;13778:47;13842:19;;10627:88:0;13454:413:1;14945:191:0;-1:-1:-1;;;;;15038:19:0;;;;;;:11;:19;;;;;;;;15037:20;:47;;;;-1:-1:-1;;;;;;15062:22:0;;;;;;:11;:22;;;;;;;;15061:23;15037:47;15034:95;;;15094:14;;-1:-1:-1;;;15094:14:0;;;;15086:41;;;;-1:-1:-1;;;15086:41:0;;14074:2:1;15086:41:0;;;14056:21:1;14113:2;14093:18;;;14086:30;-1:-1:-1;;;14132:18:1;;;14125:44;14186:18;;15086:41:0;13872:338:1;15148:331:0;-1:-1:-1;;;;;15252:19:0;;;;;;:11;:19;;;;;;;;15251:20;:47;;;;-1:-1:-1;;;;;;15276:22:0;;;;;;:11;:22;;;;;;;;15275:23;15251:47;:77;;;;-1:-1:-1;15323:4:0;;-1:-1:-1;;;;;15302:26:0;;;15323:4;;15302:26;;15251:77;:107;;;;-1:-1:-1;;;;;;15332:26:0;;7515:42;15332:26;;15251:107;15248:224;;;15420:15;;-1:-1:-1;;;;;15383:20:0;;;;;;:9;:20;;;;;;:32;;15408:6;15383:24;:32::i;:::-;15382:53;;15374:96;;;;-1:-1:-1;;;15374:96:0;;14417:2:1;15374:96:0;;;14399:21:1;14456:2;14436:18;;;14429:30;14495:32;14475:18;;;14468:60;14545:18;;15374:96:0;14215:354:1;16057:377:0;-1:-1:-1;;;;;16158:20:0;;16189:1;16158:20;;;:12;:20;;;;;;:33;16155:160;;16239:17;16249:6;16239:9;:17::i;:::-;-1:-1:-1;;;;;16213:20:0;;;;;;:12;:20;;;;;;16202:32;;:6;;:10;:32::i;:::-;16201:55;;16193:120;;;;-1:-1:-1;;;16193:120:0;;14776:2:1;16193:120:0;;;14758:21:1;14815:2;14795:18;;;14788:30;14854:34;14834:18;;;14827:62;-1:-1:-1;;;14905:18:1;;;14898:50;14965:19;;16193:120:0;14574:416:1;16193:120:0;16343:12;;16333:6;:22;;:45;;;-1:-1:-1;;;;;;16359:19:0;;;;;;:11;:19;;;;;;;;16333:45;:71;;;-1:-1:-1;;;;;;16382:22:0;;;;;;:11;:22;;;;;;;;16333:71;16325:101;;;;-1:-1:-1;;;16325:101:0;;15197:2:1;16325:101:0;;;15179:21:1;15236:2;15216:18;;;15209:30;-1:-1:-1;;;15255:18:1;;;15248:47;15312:18;;16325:101:0;14995:341:1;15487:175:0;15587:4;;-1:-1:-1;;;;;15574:17:0;;;15587:4;;15574:17;:41;;;;-1:-1:-1;;;;;;15596:19:0;;;;;;:11;:19;;;;;;;;15595:20;15574:41;:54;;;;-1:-1:-1;15620:8:0;;;;15619:9;15574:54;15571:84;;;15651:1;15630:9;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;15487:175:0;;:::o;15670:379::-;15780:4;;-1:-1:-1;;;;;15770:14:0;;;15780:4;;15770:14;:40;;;;;15798:12;;15788:6;:22;;15770:40;15767:114;;;-1:-1:-1;;;;;15839:24:0;;;;;;:13;:24;;;;;;:40;;15876:1;15839:28;:40::i;:::-;-1:-1:-1;;;;;15812:24:0;;;;;;:13;:24;;;;;:67;15767:114;15904:4;;-1:-1:-1;;;;;15894:14:0;;;15904:4;;15894:14;:39;;;;;15921:12;;15912:6;:21;15894:39;15891:83;;;-1:-1:-1;;;;;15935:24:0;;;;;;:13;:24;;;;;15970:1;15935:37;;15891:83;16000:4;;-1:-1:-1;;;;;16000:4:0;;;15987:17;;;;15984:58;;-1:-1:-1;;;;;;;16006:21:0;16038:1;16006:21;;;:13;:21;;;;;:34;15670:379::o;20578:197::-;20670:41;20685:6;20693:9;20704:6;20670:14;:41::i;:::-;20667:101;;;20713:29;20728:13;;20713:14;:29::i;:::-;20764:1;20744:9;:22;20578:197;;;:::o;20783:160::-;-1:-1:-1;;;;;20889:19:0;;20864:4;20889:19;;;:11;:19;;;;;;;;20888:20;:47;;;;-1:-1:-1;;;;;;;20913:22:0;;;;;:11;:22;;;;;;;;20912:23;;20783:160;-1:-1:-1;20783:160:0:o;21227:1101::-;21313:7;21369:1;21336:30;21348:6;21356:9;21336:11;:30::i;:::-;:34;:47;;;;-1:-1:-1;21375:8:0;;;;21374:9;21336:47;21333:973;;;21395:17;21415:59;21443:30;21455:6;21463:9;21443:11;:30::i;:::-;21426:11;;21415:23;;:6;;:10;:23::i;:59::-;21530:4;21512:24;;;;:9;:24;;;;;;21395:79;;-1:-1:-1;21512:39:0;;21395:79;21512:28;:39::i;:::-;21503:4;21485:24;;;;:9;:24;;;;;;;:66;;;;21567:42;;-1:-1:-1;;;;;21567:42:0;;;;;;;21599:9;160:25:1;;148:2;133:18;;14:177;21567:42:0;;;;;;;;21647:1;21623:13;;:26;:77;;;;;21670:30;21682:6;21690:9;21670:11;:30::i;:::-;21653:13;;:47;;21623:77;21620:287;;;21735:66;21757:42;21785:13;;21757:23;21768:11;;21757:6;:10;;:23;;;;:::i;:42::-;21735:16;;;:20;:66::i;:::-;21716:16;:85;21889:13;;21872:11;;21837:68;;21861:42;;:23;;:6;;:10;:23::i;:42::-;21837:18;;;:22;:68::i;:::-;21816:18;:89;21620:287;21938:1;21920:7;;:20;:65;;;;;21955:30;21967:6;21975:9;21955:11;:30::i;:::-;21944:7;;:41;;21920:65;21917:163;;;22001:77;22019:4;7515:42;22041:36;22069:7;;22041:23;22052:11;;22041:6;:10;;:23;;;;:::i;:36::-;22001:9;:77::i;:::-;22112:1;22093:8;;:21;:67;;;;;22130:30;22142:6;22150:9;22130:11;:30::i;:::-;22118:8;;:42;;22093:67;22090:176;;;22209:14;;22254:8;;22237:11;;22176:88;;22194:4;;-1:-1:-1;;;;;22209:14:0;;;;22226:37;;22254:8;22226:23;;:6;;:10;:23::i;22176:88::-;22283:21;:6;22294:9;22283:10;:21::i;:::-;22276:28;;;;;21333:973;-1:-1:-1;22314:6:0;21227:1101;-1:-1:-1;;21227:1101:0:o;256:82::-;314:7;331:5;335:1;331;:5;:::i;22671:1158::-;22753:19;;;;22750:64;;;22810:1;22774:25;:38;22750:64;-1:-1:-1;;;;;22827:17:0;;22862:1;22827:17;;;:6;:17;;;;;:24;:37;22824:73;;22866:29;22885:9;22866:18;:29::i;:::-;-1:-1:-1;;;;;22910:14:0;;22942:1;22910:14;;;:6;:14;;;;;:21;:34;;;;:55;;-1:-1:-1;22961:4:0;;-1:-1:-1;;;;;22948:17:0;;;22961:4;;22948:17;;22910:55;22907:88;;;22967:26;22986:6;22967:18;:26::i;:::-;23021:4;;-1:-1:-1;;;;;23008:17:0;;;23021:4;;23008:17;:55;;;;-1:-1:-1;;;;;;23029:14:0;;23061:1;23029:14;;;:6;:14;;;;;:21;:34;;23008:55;23005:126;;;23083:46;23103:25;23121:6;23103:17;:25::i;:::-;23083:15;;;:19;:46::i;:::-;23065:15;:64;23005:126;-1:-1:-1;;;;;23145:24:0;;;;;;:16;:24;;;;;;;;23141:67;;23171:35;23180:6;23188:17;23198:6;23188:9;:17::i;23171:35::-;-1:-1:-1;;;;;23222:27:0;;;;;;:16;:27;;;;;;;;23218:76;;23251:41;23260:9;23271:20;23281:9;23271;:20::i;23251:41::-;-1:-1:-1;;;;;23308:27:0;;;;;;:16;:27;;;;;;;;23307:28;:46;;;;-1:-1:-1;23349:4:0;;-1:-1:-1;;;;;23339:14:0;;;23349:4;;23339:14;23307:46;:88;;;;-1:-1:-1;;;;;;23357:24:0;;;;;;:13;:24;;;;;;23393:1;-1:-1:-1;23357:38:0;23307:88;23304:180;;;-1:-1:-1;;;;;23456:24:0;;;;;;:13;:24;;;;;;23411:71;;23420:9;;23431:50;;:20;23420:9;23431;:20::i;23411:71::-;23543:15;23497:42;23518:20;;23497:16;;:20;;:42;;;;:::i;:::-;:61;;:79;;;;-1:-1:-1;23562:14:0;;-1:-1:-1;;;23562:14:0;;;;23497:79;:126;;;;;23621:1;23594:16;;:29;23497:126;:139;;;;-1:-1:-1;23628:8:0;;;;23627:9;23497:139;:161;;;;-1:-1:-1;23640:18:0;;-1:-1:-1;;;23640:18:0;;;;23497:161;23494:205;;;23674:23;:21;:23::i;:::-;23709:29;23728:9;;23709:18;:29::i;:::-;-1:-1:-1;;;;;23752:17:0;;23787:1;23752:17;;;:6;:17;;;;;:24;:37;23749:73;;23791:29;23810:9;23791:18;:29::i;11048:255::-;-1:-1:-1;;;;;11178:17:0;;11141:4;11178:17;;;:9;:17;;;;;;:29;;11200:6;11178:21;:29::i;:::-;-1:-1:-1;;;;;11158:17:0;;;;;;;:9;:17;;;;;;:49;;;;11241:20;;;;;;;:32;;11266:6;11241:24;:32::i;:::-;-1:-1:-1;;;;;11218:20:0;;;;;;:9;:20;;;;;:55;-1:-1:-1;11291:4:0;11048:255;;;;;:::o;26171:270::-;26248:14;;:26;;26267:6;26248:18;:26::i;:::-;26231:14;:43;26375:11;;26327:31;;26305:83;;26327:60;;:43;;26363:6;26327:35;:43::i;:60::-;26305:17;;;:21;:83::i;:::-;26285:17;:103;26399:25;:34;26171:270::o;30257:288::-;30373:12;30386:19;;:21;;30406:1;;30386:21;:::i;:::-;30373:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30338:31:0;;;;;:18;:31;;;;;;;;30325:12;:45;;30373:35;;;;;30325:12;:45;;;;;;:::i;:::-;;;;;;;;;;;;;:83;;-1:-1:-1;;;;;;30325:83:0;-1:-1:-1;;;;;30325:83:0;;;;;;30477:31;;;;;:18;:31;;;;;;;;30438:12;30451:19;;30477:31;;:18;30325:45;30451:21;;-1:-1:-1;;30451:21:0;:::i;:::-;30438:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30438:35:0;30419:55;;;;;;;;;;;;:89;30519:12;:18;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;30519:18:0;;;;;-1:-1:-1;;;;;;30519:18:0;;;;;;-1:-1:-1;30257:288:0:o;20159:411::-;20257:4;20274:13;20300:14;;20290:6;:24;;20274:40;;20325:19;20373:13;;20347:22;:20;:22::i;:::-;20405:8;;20347:39;-1:-1:-1;20347:39:0;;-1:-1:-1;20405:8:0;;20404:9;:24;;;;-1:-1:-1;20417:11:0;;-1:-1:-1;;;20417:11:0;;;;20404:24;:42;;;;-1:-1:-1;20432:14:0;;-1:-1:-1;;;20432:14:0;;;;20404:42;:54;;;;;20450:8;20404:54;:78;;;;-1:-1:-1;;;;;;20463:19:0;;;;;;:11;:19;;;;;;;;20462:20;20404:78;:113;;;;-1:-1:-1;20513:4:0;;-1:-1:-1;;;;;20500:17:0;;;20513:4;;20500:17;20404:113;:140;;;;;20534:10;;20521:9;;:23;;20404:140;:158;;;;;20548:14;20404:158;20397:165;20159:411;-1:-1:-1;;;;;;20159:411:0:o;17998:1343::-;6077:8;:15;;-1:-1:-1;;6077:15:0;6088:4;6077:15;;;;;;18092:8:::1;::::0;6077;;18092:22:::1;::::0;18112:1:::1;::::0;18092:15:::1;::::0;:8;:12:::1;:15::i;:22::-;18128:8;::::0;18069:45;;-1:-1:-1;18125:135:0::1;;18167:91;18256:1;18167:84;18249:1;18167:77;18229:14;;18167:57;18216:7;;18167:44;18198:12;;18167;;:16;;:44;;;;:::i;:91::-;18152:106;;18125:135;18270:32;18305:42;18334:12;18305:24;18316:12;;18305:6;:10;;:24;;;;:::i;:42::-;18270:77:::0;-1:-1:-1;18358:14:0::1;18375:36;:6:::0;18270:77;18375:10:::1;:36::i;:::-;18358:53:::0;-1:-1:-1;18447:21:0::1;18479:24;18358:53:::0;18479:16:::1;:24::i;:::-;18514:20;18537:41;:21;18563:14:::0;18537:25:::1;:41::i;:::-;18514:64;;18589:19;18610:48;18627:30;18644:12;;18627;:16;;:30;;;;:::i;:::-;18610:12:::0;;:16:::1;:48::i;:::-;18589:69;;18669:29;18701;18717:12;;18701:11;:15;;:29;;;;:::i;:::-;18669:61:::0;-1:-1:-1;18744:34:0;;18741:137:::1;;18856:18;::::0;18780:95:::1;::::0;18807:24;;18833:21;;-1:-1:-1;;;;;18856:18:0::1;18780:12;:95::i;:::-;18935:7;::::0;18888:21:::1;::::0;18912:31:::1;::::0;:18:::1;:11:::0;18928:1:::1;18912:15;:18::i;:31::-;18888:55:::0;-1:-1:-1;18957:17:0;;18954:73:::1;;18984:16;::::0;18976:49:::1;::::0;-1:-1:-1;;;;;18984:16:0;;::::1;::::0;18976:49;::::1;;;::::0;19011:13;;18984:16:::1;18976:49:::0;18984:16;18976:49;19011:13;18984:16;18976:49;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18954:73;19086:12;::::0;19037:23:::1;::::0;19063:36:::1;::::0;:18:::1;:11:::0;19079:1:::1;19063:15;:18::i;:36::-;19037:62:::0;-1:-1:-1;19113:19:0;;19110:79:::1;;19142:18;::::0;19134:53:::1;::::0;-1:-1:-1;;;;;19142:18:0;;::::1;::::0;19134:53;::::1;;;::::0;19171:15;;19142:18:::1;19134:53:::0;19142:18;19134:53;19171:15;19142:18;19134:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;19110:79;19222:21;19257:25:::0;;19254:80:::1;;19292:16;::::0;19284:48:::1;::::0;-1:-1:-1;;;;;19292:16:0;;::::1;::::0;19284:48;::::1;;;::::0;19319:12;;19292:16:::1;19284:48:::0;19292:16;19284:48;19319:12;19292:16;19284:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;19254:80;-1:-1:-1::0;;6097:8:0;:16;;-1:-1:-1;;6097:16:0;;;-1:-1:-1;;;;;;;;;17998:1343:0:o;20951:268::-;21066:4;;21030:7;;-1:-1:-1;;;;;21053:17:0;;;21066:4;;21053:17;:41;;;;;21092:1;21074:7;;:20;21053:41;21050:62;;;-1:-1:-1;21103:7:0;;21096:14;;21050:62;21135:4;;-1:-1:-1;;;;;21125:14:0;;;21135:4;;21125:14;:39;;;;;21162:1;21143:8;;:21;21125:39;21122:61;;;-1:-1:-1;21173:8:0;;21166:15;;21122:61;-1:-1:-1;21200:11:0;;20951:268;;;;:::o;19717:434::-;19807:16;;;19821:1;19807:16;;;;;;;;19783:21;;19807:16;;;;;;;;;;-1:-1:-1;19807:16:0;19783:40;;19852:4;19834;19839:1;19834:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19834:23:0;;;:7;;;;;;;;;;:23;;;;19878:6;;:13;;;-1:-1:-1;;;19878:13:0;;;;:6;;;;;:11;;:13;;;;;19834:7;;19878:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19868:4;19873:1;19868:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19868:23:0;;;:7;;;;;;;;;:23;19934:6;;19902:53;;19919:4;;19934:6;19943:11;19902:8;:53::i;:::-;19966:6;;:177;;-1:-1:-1;;;19966:177:0;;-1:-1:-1;;;;;19966:6:0;;;;:57;;:177;;20038:11;;19966:6;;20080:4;;20107;;20127:15;;19966:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19349:360;19480:6;;19448:53;;19465:4;;-1:-1:-1;;;;;19480:6:0;19489:11;19448:8;:53::i;:::-;19512:6;;:189;;-1:-1:-1;;;19512:189:0;;19575:4;19512:189;;;17317:34:1;17367:18;;;17360:34;;;19512:6:0;17410:18:1;;;17403:34;;;17453:18;;;17446:34;-1:-1:-1;;;;;17517:15:1;;;17496:19;;;17489:44;19685:15:0;17549:19:1;;;17542:35;19512:6:0;;;;:22;;19542:9;;17251:19:1;;19512:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:180::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;-1:-1:-1;1548:23:1;;1397:180;-1:-1:-1;1397:180:1:o;1582:799::-;1722:6;1730;1738;1746;1754;1762;1770;1778;1786;1794;1847:3;1835:9;1826:7;1822:23;1818:33;1815:53;;;1864:1;1861;1854:12;1815:53;-1:-1:-1;;1887:23:1;;;1957:2;1942:18;;1929:32;;-1:-1:-1;2008:2:1;1993:18;;1980:32;;2059:2;2044:18;;2031:32;;-1:-1:-1;2110:3:1;2095:19;;2082:33;;-1:-1:-1;2162:3:1;2147:19;;2134:33;;-1:-1:-1;2214:3:1;2199:19;;2186:33;;-1:-1:-1;2266:3:1;2251:19;;2238:33;;-1:-1:-1;2318:3:1;2303:19;;2290:33;;-1:-1:-1;2370:3:1;2355:19;2342:33;;-1:-1:-1;1582:799:1;-1:-1:-1;1582:799:1:o;3107:456::-;3184:6;3192;3200;3253:2;3241:9;3232:7;3228:23;3224:32;3221:52;;;3269:1;3266;3259:12;3221:52;3308:9;3295:23;3327:31;3352:5;3327:31;:::i;:::-;3377:5;-1:-1:-1;3434:2:1;3419:18;;3406:32;3447:33;3406:32;3447:33;:::i;:::-;3107:456;;3499:7;;-1:-1:-1;;;3553:2:1;3538:18;;;;3525:32;;3107:456::o;3568:247::-;3627:6;3680:2;3668:9;3659:7;3655:23;3651:32;3648:52;;;3696:1;3693;3686:12;3648:52;3735:9;3722:23;3754:31;3779:5;3754:31;:::i;4009:118::-;4095:5;4088:13;4081:21;4074:5;4071:32;4061:60;;4117:1;4114;4107:12;4132:382;4197:6;4205;4258:2;4246:9;4237:7;4233:23;4229:32;4226:52;;;4274:1;4271;4264:12;4226:52;4313:9;4300:23;4332:31;4357:5;4332:31;:::i;:::-;4382:5;-1:-1:-1;4439:2:1;4424:18;;4411:32;4452:30;4411:32;4452:30;:::i;:::-;4501:7;4491:17;;;4132:382;;;;;:::o;4519:248::-;4587:6;4595;4648:2;4636:9;4627:7;4623:23;4619:32;4616:52;;;4664:1;4661;4654:12;4616:52;-1:-1:-1;;4687:23:1;;;4757:2;4742:18;;;4729:32;;-1:-1:-1;4519:248:1:o;4980:241::-;5036:6;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;5144:9;5131:23;5163:28;5185:5;5163:28;:::i;5226:813::-;5321:6;5329;5337;5345;5353;5406:3;5394:9;5385:7;5381:23;5377:33;5374:53;;;5423:1;5420;5413:12;5374:53;5462:9;5449:23;5481:31;5506:5;5481:31;:::i;:::-;5531:5;-1:-1:-1;5588:2:1;5573:18;;5560:32;5601:33;5560:32;5601:33;:::i;:::-;5653:7;-1:-1:-1;5712:2:1;5697:18;;5684:32;5725:33;5684:32;5725:33;:::i;:::-;5777:7;-1:-1:-1;5836:2:1;5821:18;;5808:32;5849:33;5808:32;5849:33;:::i;:::-;5901:7;-1:-1:-1;5960:3:1;5945:19;;5932:33;5974;5932;5974;:::i;:::-;6026:7;6016:17;;;5226:813;;;;;;;;:::o;6368:388::-;6436:6;6444;6497:2;6485:9;6476:7;6472:23;6468:32;6465:52;;;6513:1;6510;6503:12;6465:52;6552:9;6539:23;6571:31;6596:5;6571:31;:::i;:::-;6621:5;-1:-1:-1;6678:2:1;6663:18;;6650:32;6691:33;6650:32;6691:33;:::i;6761:316::-;6838:6;6846;6854;6907:2;6895:9;6886:7;6882:23;6878:32;6875:52;;;6923:1;6920;6913:12;6875:52;-1:-1:-1;;6946:23:1;;;7016:2;7001:18;;6988:32;;-1:-1:-1;7067:2:1;7052:18;;;7039:32;;6761:316;-1:-1:-1;6761:316:1:o;7082:315::-;7150:6;7158;7211:2;7199:9;7190:7;7186:23;7182:32;7179:52;;;7227:1;7224;7217:12;7179:52;7263:9;7250:23;7240:33;;7323:2;7312:9;7308:18;7295:32;7336:31;7361:5;7336:31;:::i;7662:329::-;7864:2;7846:21;;;7903:1;7883:18;;;7876:29;-1:-1:-1;;;7936:2:1;7921:18;;7914:36;7982:2;7967:18;;7662:329::o;9524:184::-;9594:6;9647:2;9635:9;9626:7;9622:23;9618:32;9615:52;;;9663:1;9660;9653:12;9615:52;-1:-1:-1;9686:16:1;;9524:184;-1:-1:-1;9524:184:1:o;9713:245::-;9780:6;9833:2;9821:9;9812:7;9808:23;9804:32;9801:52;;;9849:1;9846;9839:12;9801:52;9881:9;9875:16;9900:28;9922:5;9900:28;:::i;11296:127::-;11357:10;11352:3;11348:20;11345:1;11338:31;11388:4;11385:1;11378:15;11412:4;11409:1;11402:15;11428:128;11495:9;;;11516:11;;;11513:37;;;11530:18;;:::i;11561:168::-;11634:9;;;11665;;11682:15;;;11676:22;;11662:37;11652:71;;11703:18;;:::i;11734:217::-;11774:1;11800;11790:132;;11844:10;11839:3;11835:20;11832:1;11825:31;11879:4;11876:1;11869:15;11907:4;11904:1;11897:15;11790:132;-1:-1:-1;11936:9:1;;11734:217::o;12372:127::-;12433:10;12428:3;12424:20;12421:1;12414:31;12464:4;12461:1;12454:15;12488:4;12485:1;12478:15;12504:135;12543:3;12564:17;;;12561:43;;12584:18;;:::i;:::-;-1:-1:-1;12631:1:1;12620:13;;12504:135::o;15341:125::-;15406:9;;;15427:10;;;15424:36;;;15440:18;;:::i;15471:127::-;15532:10;15527:3;15523:20;15520:1;15513:31;15563:4;15560:1;15553:15;15587:4;15584:1;15577:15;15735:251;15805:6;15858:2;15846:9;15837:7;15833:23;15829:32;15826:52;;;15874:1;15871;15864:12;15826:52;15906:9;15900:16;15925:31;15950:5;15925:31;:::i;15991:980::-;16253:4;16301:3;16290:9;16286:19;16332:6;16321:9;16314:25;16358:2;16396:6;16391:2;16380:9;16376:18;16369:34;16439:3;16434:2;16423:9;16419:18;16412:31;16463:6;16498;16492:13;16529:6;16521;16514:22;16567:3;16556:9;16552:19;16545:26;;16606:2;16598:6;16594:15;16580:29;;16627:1;16637:195;16651:6;16648:1;16645:13;16637:195;;;16716:13;;-1:-1:-1;;;;;16712:39:1;16700:52;;16807:15;;;;16772:12;;;;16748:1;16666:9;16637:195;;;-1:-1:-1;;;;;;;16888:32:1;;;;16883:2;16868:18;;16861:60;-1:-1:-1;;;16952:3:1;16937:19;16930:35;16849:3;15991:980;-1:-1:-1;;;15991:980:1:o;17588:306::-;17676:6;17684;17692;17745:2;17733:9;17724:7;17720:23;17716:32;17713:52;;;17761:1;17758;17751:12;17713:52;17790:9;17784:16;17774:26;;17840:2;17829:9;17825:18;17819:25;17809:35;;17884:2;17873:9;17869:18;17863:25;17853:35;;17588:306;;;;;:::o

Swarm Source

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