ETH Price: $3,644.73 (+1.24%)
 

Overview

Max Total Supply

972,096,367.836838819686140713 BURNS

Holders

51

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,399,055.937174230272599402 BURNS

Value
$0.00
0xc8fe34f6d68fc53b3fa9b64309e03b8a6dd00a45
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:
BURNS

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 11: Contract.sol
/*
   
 ⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡤⠤⠶⠦⣤⣄⣀⣀⡤⠶⢶⣶⠤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⡤⠞⠋⠁⠀⠀⠀⠀⠀⠀⠀⠃⠉⠛⢾⣏⠀⠀⠀⣈⣹⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⢀⡶⡫⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠙⢷⡴⠛⠉⠀⠀⠙⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⣰⠋⡼⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣶⡆⢀⠀⠀⢷⣄⡀⠀⠀⠀⠎⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢠⠏⢸⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⣶⣦⠀⣼⠁⠉⠙⠳⣤⠀⢹⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣼⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣦⡄⠀⠀⠀⣼⠷⣄⠀⠀⠀⠈⢷⣾⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢿⠀⢹⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠋⠀⠀⣠⠞⢁⣀⡿⠟⢲⣦⡀⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠸⣄⠘⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡄⠘⢿⡠⢲⣿⢋⡷⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠹⣦⡹⣤⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⢶⡏⠀⠀⠀⢳⡀⠘⢷⣈⣩⡾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⡏⠙⠿⠲⡶⠶⣶⠒⠒⠋⠙⠏⠀⡼⠁⠀⠀⠀⠀⢿⣤⠞⢹⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⢹⡶⢤⡾⠁⠀⠈⠳⠦⣄⡠⠴⠊⠁⠀⠀⠀⠀⠀⠀⠁⠀⡜⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣹⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡷⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⡼⠁⣤⠖⢲⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡖⣶⡄⠉⢳⣤⣤⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢠⡟⠀⠀⠀⣠⡾⠃⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⢚⣥⠟⠁⠀⠀⠀⠹⣷⣶⣍⠛⢶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀
⣾⠀⠀⣠⠞⣿⠀⠀⠀⠀⠀⣀⣀⣴⣖⣿⣿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠈⢻⡝⣧⠀⢻⡟⢷⡄⠀⠀⠀⠀⠀⠀
⢿⣷⠟⠁⠀⠙⠓⠒⠒⠿⠯⠿⠶⠛⠉⠙⠛⠛⢦⡀⠀⠀⠀⠀⠀⠀⠀⢠⡇⢸⣧⠈⣿⡄⠙⣆⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣶⣤⣀⠀⠀⠀⣠⡞⠀⢸⣿⠀⠈⣷⠀⠸⣧⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⡾⢸⡟⠉⡿⠒⢺⡍⠀⠀⣸⡟⠀⠀⢹⡇⠀⠹⣆⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⢸⣿⣸⣇⠀⣸⣷⣀⡴⡏⠀⣠⡶⠟⠁⠀⠀⢻⡆⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣯⡿⠸⣿⠈⠙⡷⣟⠉⠉⢠⠇⠻⣯⠀⠀⠀⠀⠀⠈⢳⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡟⣼⠀⠀⢻⠀⢸⠁⣿⠀⠀⣾⡟⠀⢸⡿⣧⠀⠀⠀⠀⠸⡆⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡇⠹⣆⠀⠸⡇⡿⠀⢿⠀⢰⠃⠀⢀⣾⠁⢹⡄⠀⠀⠀⠀⣿⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡶⣒⠚⢓⣶⣯⠍⠛⠛⠻⣦⠀⣿⡇⠀⠸⣦⡏⠄⢀⣾⠃⠀⢸⡇⠀⠀⠀⠀⢹⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣤⣿⣿⣉⣿⣭⣿⣷⣦⡄⠺⣇⢹⡇⠀⠀⡿⠀⢀⣾⠋⠀⠀⢸⡇⠀⠀⠀⠀⢹⡇
⠀⠀⠀⠀⠀⠀⠀⢀⡞⢁⣀⣠⣿⣧⣥⣦⣀⡈⠻⠇⠰⣿⡌⣿⠀⣼⠁⢀⣾⠃⠀⠀⠀⢸⡇⠀⠀⠀⠀⢸⡇
⠀⠀⠀⠀⠀⠀⠀⠈⢷⣤⠶⠴⣄⣽⠿⠿⠿⢿⣇⠀⠀⢹⣿⣾⣷⡇⣰⠟⠁⠀⠀⠀⢀⣾⡇⠀⠀⠀⠀⣸⠁
⠀⠀⠀⠀⠀⠀⠀⢠⡏⠀⣤⣴⡾⢧⣴⣶⣤⣄⡉⠀⠀⠀⢻⠛⠛⢻⡟⠒⠒⠒⠒⠒⠛⠉⠀⠀⠀⠀⢀⣿⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠻⣆⠀⠀⠀⠀⣴⡇⢸⣿⢷⣄⠀⠀⢸⡇⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠓⠦⣀⣠⡟⢀⣼⣫⣬⠿⠦⣤⡞⠀⠀⢠⡟⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⡾⠏⣿⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠁⠀⠀⠀⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠷⠶⠶⠿⠇

    Website  - https://www.GaryBurnsETH.com/
    Telegram - https://t.me/BURNSportal
    Twitter  - https://twitter.com/GaryBurnsETH

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Ownable.sol";
import "./SafeMath.sol";

import "./IUniswapV2Pair.sol";
import "./IUniswapV2Router02.sol";
import "./IUniswapV2Factory.sol";

contract BURNS is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    mapping (address => bool) private _isBlacklisted;
    bool private _swapping;
    uint256 private _launchTime;

    address private feeWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
        
    bool public limitsInEffect = true;
    bool public tradingActive = false;
    
    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _devFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForDev;
    
    uint256 private _burnFee;

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private automatedMarketMakerPairs;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event feeWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);

    constructor() ERC20("Gary Burns", "BURNS") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 marketingFee = 20;
        uint256 liquidityFee = 0;
        uint256 devFee = 0;
        uint256 burnFee = 1;
        
        uint256 totalSupply = 1e9 * 1e18;
        
        maxTransactionAmount = totalSupply * 20 / 1000; //  2%
        maxWallet = totalSupply * 20 / 1000; //  2%
        swapTokensAtAmount = totalSupply * 15 / 10000;  //  1.5%

        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _devFee = devFee;
        totalFees = _marketingFee + _liquidityFee + _devFee;
        
        _burnFee = burnFee;

        feeWallet = address(owner()); // set as fee wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        _launchTime = block.timestamp.add(0);
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * 1e18;
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * 1e18;
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 devFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _devFee = devFee;
        totalFees = _marketingFee + _liquidityFee + _devFee;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    
    function updateFeeWallet(address newWallet) external onlyOwner {
        emit feeWalletUpdated(newWallet, feeWallet);
        feeWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function setBlacklisted(address[] memory blacklisted_) public onlyOwner {
        for (uint i = 0; i < blacklisted_.length; i++) {
            if (blacklisted_[i] != uniswapV2Pair && blacklisted_[i] != address(uniswapV2Router)) {
                _isBlacklisted[blacklisted_[i]] = true;
            }
        }
    }
    
    function delBlacklisted(address[] memory blacklisted_) public onlyOwner {
        for (uint i = 0; i < blacklisted_.length; i++) {
            _isBlacklisted[blacklisted_[i]] = false;
        }
    }
    
    function isSniper(address addr) public view returns (bool) {
        return _isBlacklisted[addr];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!_isBlacklisted[from], "Your address has been marked as a sniper, you are unable to transfer or swap.");
        
         if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // Burn baby burn! 🔥
        if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            uint256 burnAmount = amount.div(100);
            _burn(from, burnAmount);
            amount -= burnAmount;
        }

        if (block.timestamp <= _launchTime) _isBlacklisted[to] = true;
        
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (!tradingActive) {
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                // when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                // when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        if (
            canSwap &&
            !_swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForDev += fees * _devFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForDev;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensAtAmount) {
          contractBalance = swapTokensAtAmount;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForDev = ethBalance.mul(_tokensForDev).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForDev = 0;

        payable(feeWallet).transfer(ethForMarketing.add(ethForDev));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, _tokensForLiquidity);
        }
    }

    function forceSwap() external onlyOwner {
        _swapTokensForEth(address(this).balance);
        payable(feeWallet).transfer(address(this).balance);
    }

    function forceSend() external onlyOwner {
        payable(feeWallet).transfer(address(this).balance);
    }

    receive() external payable {}
}

File 1 of 11: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 11: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 4 of 11: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 5 of 11: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 6 of 11: IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

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

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

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

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

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

File 7 of 11: IUniswapV2Pair.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 8 of 11: IUniswapV2Router01.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 9 of 11: IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 10 of 11: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 11 of 11: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"feeWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"delBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506001601160006101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040518060400160405280600a81526020017f47617279204275726e73000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4255524e530000000000000000000000000000000000000000000000000000008152508160039081620000e0919062000d1b565b508060049081620000f2919062000d1b565b50505062000115620001096200056260201b60201c565b6200056a60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050620001418160016200063060201b60201c565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f4919062000e6c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200025c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000282919062000e6c565b6040518363ffffffff1660e01b8152600401620002a192919062000eaf565b6020604051808303816000875af1158015620002c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e7919062000e6c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200035c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200063060201b60201c565b62000391600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200071a60201b60201c565b60006014905060008060006001905060006b033b2e3c9fd0803ce800000090506103e8601482620003c3919062000f0b565b620003cf919062000f85565b600c819055506103e8601482620003e7919062000f0b565b620003f3919062000f85565b600e81905550612710600f826200040b919062000f0b565b62000417919062000f85565b600d8190555084601381905550836014819055508260158190555060155460145460135462000447919062000fbd565b62000453919062000fbd565b6012819055508160198190555062000470620007bb60201b60201c565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004d2620004c4620007bb60201b60201c565b6001620007e560201b60201c565b620004e5306001620007e560201b60201c565b620004fa61dead6001620007e560201b60201c565b6200051c6200050e620007bb60201b60201c565b60016200063060201b60201c565b6200052f3060016200063060201b60201c565b6200054461dead60016200063060201b60201c565b6200055633826200091f60201b60201c565b50505050505062001155565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620006406200056260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000666620007bb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620006bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006b69062001059565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007f56200056260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200081b620007bb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200086b9062001059565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000913919062001098565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000991576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009889062001105565b60405180910390fd5b620009a56000838362000a9760201b60201c565b8060026000828254620009b9919062000fbd565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a10919062000fbd565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a77919062001138565b60405180910390a362000a936000838362000a9c60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b2357607f821691505b60208210810362000b395762000b3862000adb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000ba37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b64565b62000baf868362000b64565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000bfc62000bf662000bf08462000bc7565b62000bd1565b62000bc7565b9050919050565b6000819050919050565b62000c188362000bdb565b62000c3062000c278262000c03565b84845462000b71565b825550505050565b600090565b62000c4762000c38565b62000c5481848462000c0d565b505050565b5b8181101562000c7c5762000c7060008262000c3d565b60018101905062000c5a565b5050565b601f82111562000ccb5762000c958162000b3f565b62000ca08462000b54565b8101602085101562000cb0578190505b62000cc862000cbf8562000b54565b83018262000c59565b50505b505050565b600082821c905092915050565b600062000cf06000198460080262000cd0565b1980831691505092915050565b600062000d0b838362000cdd565b9150826002028217905092915050565b62000d268262000aa1565b67ffffffffffffffff81111562000d425762000d4162000aac565b5b62000d4e825462000b0a565b62000d5b82828562000c80565b600060209050601f83116001811462000d93576000841562000d7e578287015190505b62000d8a858262000cfd565b86555062000dfa565b601f19841662000da38662000b3f565b60005b8281101562000dcd5784890151825560018201915060208501945060208101905062000da6565b8683101562000ded578489015162000de9601f89168262000cdd565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000e348262000e07565b9050919050565b62000e468162000e27565b811462000e5257600080fd5b50565b60008151905062000e668162000e3b565b92915050565b60006020828403121562000e855762000e8462000e02565b5b600062000e958482850162000e55565b91505092915050565b62000ea98162000e27565b82525050565b600060408201905062000ec6600083018562000e9e565b62000ed5602083018462000e9e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f188262000bc7565b915062000f258362000bc7565b925082820262000f358162000bc7565b9150828204841483151762000f4f5762000f4e62000edc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000f928262000bc7565b915062000f9f8362000bc7565b92508262000fb25762000fb162000f56565b5b828204905092915050565b600062000fca8262000bc7565b915062000fd78362000bc7565b925082820190508082111562000ff25762000ff162000edc565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200104160208362000ff8565b91506200104e8262001009565b602082019050919050565b60006020820190508181036000830152620010748162001032565b9050919050565b60008115159050919050565b62001092816200107b565b82525050565b6000602082019050620010af600083018462001087565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620010ed601f8362000ff8565b9150620010fa82620010b5565b602082019050919050565b600060208201905081810360008301526200112081620010de565b9050919050565b620011328162000bc7565b82525050565b60006020820190506200114f600083018462001127565b92915050565b61503a80620011656000396000f3fe6080604052600436106102295760003560e01c80638a8c523c11610123578063c8125e45116100ab578063df778d261161006f578063df778d2614610826578063e2f456051461083d578063e884f26014610868578063f2fde38b14610893578063f8b45b05146108bc57610230565b8063c8125e451461072d578063c876d0b914610756578063c8c8ebe414610781578063d257b34f146107ac578063dd62ed3e146107e957610230565b8063a457c2d7116100f2578063a457c2d714610636578063a9059cbb14610673578063bbc0c742146106b0578063c0246668146106db578063c18bc1951461070457610230565b80638a8c523c146105a05780638da5cb5b146105b757806395d89b41146105e25780639a7a23d61461060d57610230565b806323b872dd116101b1578063667185241161017557806366718524146104cf57806370a08231146104f8578063715018a614610535578063751039fc1461054c5780637571336a1461057757610230565b806323b872dd146103c2578063313ce567146103ff578063395093511461042a5780634a62bb65146104675780634fbee1931461049257610230565b806312b77e8a116101f857806312b77e8a1461030357806313114a9d1461031a57806318160ddd14610345578063203e727e14610370578063224290851461039957610230565b806306fdde0314610235578063095ea7b3146102605780630b559c6f1461029d5780630f3a325f146102c657610230565b3661023057005b600080fd5b34801561024157600080fd5b5061024a6108e7565b6040516102579190613a0d565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613ad7565b610979565b6040516102949190613b32565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613c95565b61099c565b005b3480156102d257600080fd5b506102ed60048036038101906102e89190613cde565b610b93565b6040516102fa9190613b32565b60405180910390f35b34801561030f57600080fd5b50610318610be9565b005b34801561032657600080fd5b5061032f610cd0565b60405161033c9190613d1a565b60405180910390f35b34801561035157600080fd5b5061035a610cd6565b6040516103679190613d1a565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190613d35565b610ce0565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613d62565b610def565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613db5565b610ea8565b6040516103f69190613b32565b60405180910390f35b34801561040b57600080fd5b50610414610ed7565b6040516104219190613e24565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613ad7565b610ee0565b60405161045e9190613b32565b60405180910390f35b34801561047357600080fd5b5061047c610f8a565b6040516104899190613b32565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613cde565b610f9d565b6040516104c69190613b32565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613cde565b610ff3565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613cde565b61112f565b60405161052c9190613d1a565b60405180910390f35b34801561054157600080fd5b5061054a611177565b005b34801561055857600080fd5b506105616111ff565b60405161056e9190613b32565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613e6b565b61129f565b005b3480156105ac57600080fd5b506105b5611376565b005b3480156105c357600080fd5b506105cc611429565b6040516105d99190613eba565b60405180910390f35b3480156105ee57600080fd5b506105f7611453565b6040516106049190613a0d565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613e6b565b6114e5565b005b34801561064257600080fd5b5061065d60048036038101906106589190613ad7565b6115ff565b60405161066a9190613b32565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190613ad7565b6116e9565b6040516106a79190613b32565b60405180910390f35b3480156106bc57600080fd5b506106c561170c565b6040516106d29190613b32565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190613e6b565b61171f565b005b34801561071057600080fd5b5061072b60048036038101906107269190613d35565b611844565b005b34801561073957600080fd5b50610754600480360381019061074f9190613c95565b611953565b005b34801561076257600080fd5b5061076b611a64565b6040516107789190613b32565b60405180910390f35b34801561078d57600080fd5b50610796611a77565b6040516107a39190613d1a565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613d35565b611a7d565b6040516107e09190613b32565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613ed5565b611bd2565b60405161081d9190613d1a565b60405180910390f35b34801561083257600080fd5b5061083b611c59565b005b34801561084957600080fd5b50610852611d49565b60405161085f9190613d1a565b60405180910390f35b34801561087457600080fd5b5061087d611d4f565b60405161088a9190613b32565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613cde565b611def565b005b3480156108c857600080fd5b506108d1611ee6565b6040516108de9190613d1a565b60405180910390f35b6060600380546108f690613f44565b80601f016020809104026020016040519081016040528092919081815260200182805461092290613f44565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600080610984611eec565b9050610991818585611ef4565b600191505092915050565b6109a4611eec565b73ffffffffffffffffffffffffffffffffffffffff166109c2611429565b73ffffffffffffffffffffffffffffffffffffffff1614610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90613fc1565b60405180910390fd5b60005b8151811015610b8f57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610a7057610a6f613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614158015610b045750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610ae357610ae2613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610b7c57600160086000848481518110610b2257610b21613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080610b879061403f565b915050610a1b565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610bf1611eec565b73ffffffffffffffffffffffffffffffffffffffff16610c0f611429565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613fc1565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ccd573d6000803e3d6000fd5b50565b60125481565b6000600254905090565b610ce8611eec565b73ffffffffffffffffffffffffffffffffffffffff16610d06611429565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390613fc1565b60405180910390fd5b670de0b6b3a76400006103e86001610d72610cd6565b610d7c9190614087565b610d8691906140f8565b610d9091906140f8565b811015610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc99061419b565b60405180910390fd5b670de0b6b3a764000081610de69190614087565b600c8190555050565b610df7611eec565b73ffffffffffffffffffffffffffffffffffffffff16610e15611429565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613fc1565b60405180910390fd5b826013819055508160148190555080601581905550601554601454601354610e9391906141bb565b610e9d91906141bb565b601281905550505050565b600080610eb3611eec565b9050610ec08582856120bd565b610ecb858585612149565b60019150509392505050565b60006012905090565b600080610eeb611eec565b9050610f7f818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f7a91906141bb565b611ef4565b600191505092915050565b600f60009054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610ffb611eec565b73ffffffffffffffffffffffffffffffffffffffff16611019611429565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690613fc1565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492860405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117f611eec565b73ffffffffffffffffffffffffffffffffffffffff1661119d611429565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90613fc1565b60405180910390fd5b6111fd6000612e0c565b565b6000611209611eec565b73ffffffffffffffffffffffffffffffffffffffff16611227611429565b73ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490613fc1565b60405180910390fd5b6000600f60006101000a81548160ff0219169083151502179055506001905090565b6112a7611eec565b73ffffffffffffffffffffffffffffffffffffffff166112c5611429565b73ffffffffffffffffffffffffffffffffffffffff161461131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290613fc1565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61137e611eec565b73ffffffffffffffffffffffffffffffffffffffff1661139c611429565b73ffffffffffffffffffffffffffffffffffffffff16146113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990613fc1565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550611421600042612ed290919063ffffffff16565b600a81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461146290613f44565b80601f016020809104026020016040519081016040528092919081815260200182805461148e90613f44565b80156114db5780601f106114b0576101008083540402835291602001916114db565b820191906000526020600020905b8154815290600101906020018083116114be57829003601f168201915b5050505050905090565b6114ed611eec565b73ffffffffffffffffffffffffffffffffffffffff1661150b611429565b73ffffffffffffffffffffffffffffffffffffffff1614611561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155890613fc1565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890614261565b60405180910390fd5b6115fb8282612ee8565b5050565b60008061160a611eec565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c7906142f3565b60405180910390fd5b6116dd8286868403611ef4565b60019250505092915050565b6000806116f4611eec565b9050611701818585612149565b600191505092915050565b600f60019054906101000a900460ff1681565b611727611eec565b73ffffffffffffffffffffffffffffffffffffffff16611745611429565b73ffffffffffffffffffffffffffffffffffffffff161461179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179290613fc1565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516118389190613b32565b60405180910390a25050565b61184c611eec565b73ffffffffffffffffffffffffffffffffffffffff1661186a611429565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613fc1565b60405180910390fd5b670de0b6b3a76400006103e860056118d6610cd6565b6118e09190614087565b6118ea91906140f8565b6118f491906140f8565b811015611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90614385565b60405180910390fd5b670de0b6b3a76400008161194a9190614087565b600e8190555050565b61195b611eec565b73ffffffffffffffffffffffffffffffffffffffff16611979611429565b73ffffffffffffffffffffffffffffffffffffffff16146119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690613fc1565b60405180910390fd5b60005b8151811015611a60576000600860008484815181106119f4576119f3613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a589061403f565b9150506119d2565b5050565b601160009054906101000a900460ff1681565b600c5481565b6000611a87611eec565b73ffffffffffffffffffffffffffffffffffffffff16611aa5611429565b73ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af290613fc1565b60405180910390fd5b620186a06001611b09610cd6565b611b139190614087565b611b1d91906140f8565b821015611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690614417565b60405180910390fd5b6103e86005611b6c610cd6565b611b769190614087565b611b8091906140f8565b821115611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb9906144a9565b60405180910390fd5b81600d8190555060019050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c61611eec565b73ffffffffffffffffffffffffffffffffffffffff16611c7f611429565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613fc1565b60405180910390fd5b611cde47612f89565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d46573d6000803e3d6000fd5b50565b600d5481565b6000611d59611eec565b73ffffffffffffffffffffffffffffffffffffffff16611d77611429565b73ffffffffffffffffffffffffffffffffffffffff1614611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613fc1565b60405180910390fd5b6000601160006101000a81548160ff0219169083151502179055506001905090565b611df7611eec565b73ffffffffffffffffffffffffffffffffffffffff16611e15611429565b73ffffffffffffffffffffffffffffffffffffffff1614611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290613fc1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed19061453b565b60405180910390fd5b611ee381612e0c565b50565b600e5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a906145cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061465f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120b09190613d1a565b60405180910390a3505050565b60006120c98484611bd2565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121435781811015612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c906146cb565b60405180910390fd5b6121428484848403611ef4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af9061475d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e906147ef565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab906148a7565b60405180910390fd5b600081036122cd576122c8838360006131cc565b612e07565b601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123715750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123a857600061238c60648361344b90919063ffffffff16565b90506123988482613461565b80826123a491906148c7565b9150505b600a54421161240a576001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600f60009054906101000a900460ff1615612ad157612427611429565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124955750612465611429565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156124ce5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612508575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156125215750600960009054906101000a900460ff16155b15612ad057600f60019054906101000a900460ff1661261b57601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806125db5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190614947565b60405180910390fd5b5b601160009054906101000a900460ff16156127e757612638611429565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156126c15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561271b5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156127e65743601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106127a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612798906149ff565b60405180910390fd5b43601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561288a5750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561293157600c548111156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb90614a91565b60405180910390fd5b600e546128e08361112f565b826128eb91906141bb565b111561292c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292390614afd565b60405180910390fd5b612acf565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129d45750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a2357600c54811115612a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1590614b8f565b60405180910390fd5b612ace565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612acd57600e54612a808361112f565b82612a8b91906141bb565b1115612acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac390614afd565b60405180910390fd5b5b5b5b5b5b6000612adc3061112f565b90506000600d548210159050808015612b025750600960009054906101000a900460ff16155b8015612b585750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612bae5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c045750601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c48576001600960006101000a81548160ff021916908315150217905550612c2c613637565b6000600960006101000a81548160ff0219169083151502179055505b6000600960009054906101000a900460ff16159050601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612cfe5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612d0857600090505b60008115612df757612d386064612d2a6012548861386290919063ffffffff16565b61344b90919063ffffffff16565b905060125460145482612d4b9190614087565b612d5591906140f8565b60176000828254612d6691906141bb565b9250508190555060125460155482612d7e9190614087565b612d8891906140f8565b60186000828254612d9991906141bb565b9250508190555060125460135482612db19190614087565b612dbb91906140f8565b60166000828254612dcc91906141bb565b925050819055506000811115612de857612de78730836131cc565b5b8085612df491906148c7565b94505b612e028787876131cc565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612ee091906141bb565b905092915050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600267ffffffffffffffff811115612fa657612fa5613b52565b5b604051908082528060200260200182016040528015612fd45781602001602082028036833780820191505090505b5090503081600081518110612fec57612feb613fe1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b79190614bc4565b816001815181106130cb576130ca613fe1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061313230600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ef4565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613196959493929190614cf4565b600060405180830381600087803b1580156131b057600080fd5b505af11580156131c4573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361323b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132329061475d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a1906147ef565b60405180910390fd5b6132b5838383613878565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561333b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333290614dc0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133ce91906141bb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134329190613d1a565b60405180910390a361344584848461387d565b50505050565b6000818361345991906140f8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790614e52565b60405180910390fd5b6134dc82600083613878565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355990614ee4565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546135b991906148c7565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161361e9190613d1a565b60405180910390a36136328360008461387d565b505050565b60006136423061112f565b9050600060185460165460175461365991906141bb565b61366391906141bb565b905060008214806136745750600081145b15613680575050613860565b600d5482111561369057600d5491505b6000600282601754856136a39190614087565b6136ad91906140f8565b6136b791906140f8565b905060006136ce828561388290919063ffffffff16565b905060004790506136de82612f89565b60006136f3824761388290919063ffffffff16565b9050600061371e866137106016548561386290919063ffffffff16565b61344b90919063ffffffff16565b905060006137498761373b6018548661386290919063ffffffff16565b61344b90919063ffffffff16565b9050600081838561375a91906148c7565b61376491906148c7565b9050600060178190555060006016819055506000601881905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6137cd8486612ed290919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156137f8573d6000803e3d6000fd5b506000871180156138095750600081115b15613856576138188782613898565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561868260175460405161384d93929190614f04565b60405180910390a15b5050505050505050505b565b600081836138709190614087565b905092915050565b505050565b505050565b6000818361389091906148c7565b905092915050565b6138c530600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ef4565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613911611429565b426040518863ffffffff1660e01b815260040161393396959493929190614f3b565b60606040518083038185885af1158015613951573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906139769190614fb1565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139b757808201518184015260208101905061399c565b60008484015250505050565b6000601f19601f8301169050919050565b60006139df8261397d565b6139e98185613988565b93506139f9818560208601613999565b613a02816139c3565b840191505092915050565b60006020820190508181036000830152613a2781846139d4565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a6e82613a43565b9050919050565b613a7e81613a63565b8114613a8957600080fd5b50565b600081359050613a9b81613a75565b92915050565b6000819050919050565b613ab481613aa1565b8114613abf57600080fd5b50565b600081359050613ad181613aab565b92915050565b60008060408385031215613aee57613aed613a39565b5b6000613afc85828601613a8c565b9250506020613b0d85828601613ac2565b9150509250929050565b60008115159050919050565b613b2c81613b17565b82525050565b6000602082019050613b476000830184613b23565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b8a826139c3565b810181811067ffffffffffffffff82111715613ba957613ba8613b52565b5b80604052505050565b6000613bbc613a2f565b9050613bc88282613b81565b919050565b600067ffffffffffffffff821115613be857613be7613b52565b5b602082029050602081019050919050565b600080fd5b6000613c11613c0c84613bcd565b613bb2565b90508083825260208201905060208402830185811115613c3457613c33613bf9565b5b835b81811015613c5d5780613c498882613a8c565b845260208401935050602081019050613c36565b5050509392505050565b600082601f830112613c7c57613c7b613b4d565b5b8135613c8c848260208601613bfe565b91505092915050565b600060208284031215613cab57613caa613a39565b5b600082013567ffffffffffffffff811115613cc957613cc8613a3e565b5b613cd584828501613c67565b91505092915050565b600060208284031215613cf457613cf3613a39565b5b6000613d0284828501613a8c565b91505092915050565b613d1481613aa1565b82525050565b6000602082019050613d2f6000830184613d0b565b92915050565b600060208284031215613d4b57613d4a613a39565b5b6000613d5984828501613ac2565b91505092915050565b600080600060608486031215613d7b57613d7a613a39565b5b6000613d8986828701613ac2565b9350506020613d9a86828701613ac2565b9250506040613dab86828701613ac2565b9150509250925092565b600080600060608486031215613dce57613dcd613a39565b5b6000613ddc86828701613a8c565b9350506020613ded86828701613a8c565b9250506040613dfe86828701613ac2565b9150509250925092565b600060ff82169050919050565b613e1e81613e08565b82525050565b6000602082019050613e396000830184613e15565b92915050565b613e4881613b17565b8114613e5357600080fd5b50565b600081359050613e6581613e3f565b92915050565b60008060408385031215613e8257613e81613a39565b5b6000613e9085828601613a8c565b9250506020613ea185828601613e56565b9150509250929050565b613eb481613a63565b82525050565b6000602082019050613ecf6000830184613eab565b92915050565b60008060408385031215613eec57613eeb613a39565b5b6000613efa85828601613a8c565b9250506020613f0b85828601613a8c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f5c57607f821691505b602082108103613f6f57613f6e613f15565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fab602083613988565b9150613fb682613f75565b602082019050919050565b60006020820190508181036000830152613fda81613f9e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061404a82613aa1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361407c5761407b614010565b5b600182019050919050565b600061409282613aa1565b915061409d83613aa1565b92508282026140ab81613aa1565b915082820484148315176140c2576140c1614010565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061410382613aa1565b915061410e83613aa1565b92508261411e5761411d6140c9565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614185602f83613988565b915061419082614129565b604082019050919050565b600060208201905081810360008301526141b481614178565b9050919050565b60006141c682613aa1565b91506141d183613aa1565b92508282019050808211156141e9576141e8614010565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b600061424b603983613988565b9150614256826141ef565b604082019050919050565b6000602082019050818103600083015261427a8161423e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006142dd602583613988565b91506142e882614281565b604082019050919050565b6000602082019050818103600083015261430c816142d0565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b600061436f602483613988565b915061437a82614313565b604082019050919050565b6000602082019050818103600083015261439e81614362565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000614401603583613988565b915061440c826143a5565b604082019050919050565b60006020820190508181036000830152614430816143f4565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000614493603483613988565b915061449e82614437565b604082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614525602683613988565b9150614530826144c9565b604082019050919050565b6000602082019050818103600083015261455481614518565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145b7602483613988565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614649602283613988565b9150614654826145ed565b604082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006146b5601d83613988565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614747602583613988565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006147d9602383613988565b91506147e48261477d565b604082019050919050565b60006020820190508181036000830152614808816147cc565b9050919050565b7f596f7572206164647265737320686173206265656e206d61726b65642061732060008201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60208201527f73666572206f7220737761702e00000000000000000000000000000000000000604082015250565b6000614891604d83613988565b915061489c8261480f565b606082019050919050565b600060208201905081810360008301526148c081614884565b9050919050565b60006148d282613aa1565b91506148dd83613aa1565b92508282039050818111156148f5576148f4614010565b5b92915050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614931601683613988565b915061493c826148fb565b602082019050919050565b6000602082019050818103600083015261496081614924565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b60006149e9604983613988565b91506149f482614967565b606082019050919050565b60006020820190508181036000830152614a18816149dc565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614a7b603583613988565b9150614a8682614a1f565b604082019050919050565b60006020820190508181036000830152614aaa81614a6e565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614ae7601383613988565b9150614af282614ab1565b602082019050919050565b60006020820190508181036000830152614b1681614ada565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000614b79603683613988565b9150614b8482614b1d565b604082019050919050565b60006020820190508181036000830152614ba881614b6c565b9050919050565b600081519050614bbe81613a75565b92915050565b600060208284031215614bda57614bd9613a39565b5b6000614be884828501614baf565b91505092915050565b6000819050919050565b6000819050919050565b6000614c20614c1b614c1684614bf1565b614bfb565b613aa1565b9050919050565b614c3081614c05565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614c6b81613a63565b82525050565b6000614c7d8383614c62565b60208301905092915050565b6000602082019050919050565b6000614ca182614c36565b614cab8185614c41565b9350614cb683614c52565b8060005b83811015614ce7578151614cce8882614c71565b9750614cd983614c89565b925050600181019050614cba565b5085935050505092915050565b600060a082019050614d096000830188613d0b565b614d166020830187614c27565b8181036040830152614d288186614c96565b9050614d376060830185613eab565b614d446080830184613d0b565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614daa602683613988565b9150614db582614d4e565b604082019050919050565b60006020820190508181036000830152614dd981614d9d565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e3c602183613988565b9150614e4782614de0565b604082019050919050565b60006020820190508181036000830152614e6b81614e2f565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ece602283613988565b9150614ed982614e72565b604082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b6000606082019050614f196000830186613d0b565b614f266020830185613d0b565b614f336040830184613d0b565b949350505050565b600060c082019050614f506000830189613eab565b614f5d6020830188613d0b565b614f6a6040830187614c27565b614f776060830186614c27565b614f846080830185613eab565b614f9160a0830184613d0b565b979650505050505050565b600081519050614fab81613aab565b92915050565b600080600060608486031215614fca57614fc9613a39565b5b6000614fd886828701614f9c565b9350506020614fe986828701614f9c565b9250506040614ffa86828701614f9c565b915050925092509256fea26469706673582212201ba1ef1983e596d2c0a4d53bb167ab2e10b5f74c712a51738ce196ef73d4a95264736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102295760003560e01c80638a8c523c11610123578063c8125e45116100ab578063df778d261161006f578063df778d2614610826578063e2f456051461083d578063e884f26014610868578063f2fde38b14610893578063f8b45b05146108bc57610230565b8063c8125e451461072d578063c876d0b914610756578063c8c8ebe414610781578063d257b34f146107ac578063dd62ed3e146107e957610230565b8063a457c2d7116100f2578063a457c2d714610636578063a9059cbb14610673578063bbc0c742146106b0578063c0246668146106db578063c18bc1951461070457610230565b80638a8c523c146105a05780638da5cb5b146105b757806395d89b41146105e25780639a7a23d61461060d57610230565b806323b872dd116101b1578063667185241161017557806366718524146104cf57806370a08231146104f8578063715018a614610535578063751039fc1461054c5780637571336a1461057757610230565b806323b872dd146103c2578063313ce567146103ff578063395093511461042a5780634a62bb65146104675780634fbee1931461049257610230565b806312b77e8a116101f857806312b77e8a1461030357806313114a9d1461031a57806318160ddd14610345578063203e727e14610370578063224290851461039957610230565b806306fdde0314610235578063095ea7b3146102605780630b559c6f1461029d5780630f3a325f146102c657610230565b3661023057005b600080fd5b34801561024157600080fd5b5061024a6108e7565b6040516102579190613a0d565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613ad7565b610979565b6040516102949190613b32565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613c95565b61099c565b005b3480156102d257600080fd5b506102ed60048036038101906102e89190613cde565b610b93565b6040516102fa9190613b32565b60405180910390f35b34801561030f57600080fd5b50610318610be9565b005b34801561032657600080fd5b5061032f610cd0565b60405161033c9190613d1a565b60405180910390f35b34801561035157600080fd5b5061035a610cd6565b6040516103679190613d1a565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190613d35565b610ce0565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613d62565b610def565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613db5565b610ea8565b6040516103f69190613b32565b60405180910390f35b34801561040b57600080fd5b50610414610ed7565b6040516104219190613e24565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c9190613ad7565b610ee0565b60405161045e9190613b32565b60405180910390f35b34801561047357600080fd5b5061047c610f8a565b6040516104899190613b32565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613cde565b610f9d565b6040516104c69190613b32565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613cde565b610ff3565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613cde565b61112f565b60405161052c9190613d1a565b60405180910390f35b34801561054157600080fd5b5061054a611177565b005b34801561055857600080fd5b506105616111ff565b60405161056e9190613b32565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613e6b565b61129f565b005b3480156105ac57600080fd5b506105b5611376565b005b3480156105c357600080fd5b506105cc611429565b6040516105d99190613eba565b60405180910390f35b3480156105ee57600080fd5b506105f7611453565b6040516106049190613a0d565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613e6b565b6114e5565b005b34801561064257600080fd5b5061065d60048036038101906106589190613ad7565b6115ff565b60405161066a9190613b32565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190613ad7565b6116e9565b6040516106a79190613b32565b60405180910390f35b3480156106bc57600080fd5b506106c561170c565b6040516106d29190613b32565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190613e6b565b61171f565b005b34801561071057600080fd5b5061072b60048036038101906107269190613d35565b611844565b005b34801561073957600080fd5b50610754600480360381019061074f9190613c95565b611953565b005b34801561076257600080fd5b5061076b611a64565b6040516107789190613b32565b60405180910390f35b34801561078d57600080fd5b50610796611a77565b6040516107a39190613d1a565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613d35565b611a7d565b6040516107e09190613b32565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613ed5565b611bd2565b60405161081d9190613d1a565b60405180910390f35b34801561083257600080fd5b5061083b611c59565b005b34801561084957600080fd5b50610852611d49565b60405161085f9190613d1a565b60405180910390f35b34801561087457600080fd5b5061087d611d4f565b60405161088a9190613b32565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613cde565b611def565b005b3480156108c857600080fd5b506108d1611ee6565b6040516108de9190613d1a565b60405180910390f35b6060600380546108f690613f44565b80601f016020809104026020016040519081016040528092919081815260200182805461092290613f44565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600080610984611eec565b9050610991818585611ef4565b600191505092915050565b6109a4611eec565b73ffffffffffffffffffffffffffffffffffffffff166109c2611429565b73ffffffffffffffffffffffffffffffffffffffff1614610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90613fc1565b60405180910390fd5b60005b8151811015610b8f57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610a7057610a6f613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614158015610b045750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828281518110610ae357610ae2613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610b7c57600160086000848481518110610b2257610b21613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080610b879061403f565b915050610a1b565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610bf1611eec565b73ffffffffffffffffffffffffffffffffffffffff16610c0f611429565b73ffffffffffffffffffffffffffffffffffffffff1614610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c90613fc1565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ccd573d6000803e3d6000fd5b50565b60125481565b6000600254905090565b610ce8611eec565b73ffffffffffffffffffffffffffffffffffffffff16610d06611429565b73ffffffffffffffffffffffffffffffffffffffff1614610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390613fc1565b60405180910390fd5b670de0b6b3a76400006103e86001610d72610cd6565b610d7c9190614087565b610d8691906140f8565b610d9091906140f8565b811015610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc99061419b565b60405180910390fd5b670de0b6b3a764000081610de69190614087565b600c8190555050565b610df7611eec565b73ffffffffffffffffffffffffffffffffffffffff16610e15611429565b73ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613fc1565b60405180910390fd5b826013819055508160148190555080601581905550601554601454601354610e9391906141bb565b610e9d91906141bb565b601281905550505050565b600080610eb3611eec565b9050610ec08582856120bd565b610ecb858585612149565b60019150509392505050565b60006012905090565b600080610eeb611eec565b9050610f7f818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f7a91906141bb565b611ef4565b600191505092915050565b600f60009054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610ffb611eec565b73ffffffffffffffffffffffffffffffffffffffff16611019611429565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690613fc1565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492860405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117f611eec565b73ffffffffffffffffffffffffffffffffffffffff1661119d611429565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90613fc1565b60405180910390fd5b6111fd6000612e0c565b565b6000611209611eec565b73ffffffffffffffffffffffffffffffffffffffff16611227611429565b73ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490613fc1565b60405180910390fd5b6000600f60006101000a81548160ff0219169083151502179055506001905090565b6112a7611eec565b73ffffffffffffffffffffffffffffffffffffffff166112c5611429565b73ffffffffffffffffffffffffffffffffffffffff161461131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290613fc1565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61137e611eec565b73ffffffffffffffffffffffffffffffffffffffff1661139c611429565b73ffffffffffffffffffffffffffffffffffffffff16146113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990613fc1565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550611421600042612ed290919063ffffffff16565b600a81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461146290613f44565b80601f016020809104026020016040519081016040528092919081815260200182805461148e90613f44565b80156114db5780601f106114b0576101008083540402835291602001916114db565b820191906000526020600020905b8154815290600101906020018083116114be57829003601f168201915b5050505050905090565b6114ed611eec565b73ffffffffffffffffffffffffffffffffffffffff1661150b611429565b73ffffffffffffffffffffffffffffffffffffffff1614611561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155890613fc1565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890614261565b60405180910390fd5b6115fb8282612ee8565b5050565b60008061160a611eec565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c7906142f3565b60405180910390fd5b6116dd8286868403611ef4565b60019250505092915050565b6000806116f4611eec565b9050611701818585612149565b600191505092915050565b600f60019054906101000a900460ff1681565b611727611eec565b73ffffffffffffffffffffffffffffffffffffffff16611745611429565b73ffffffffffffffffffffffffffffffffffffffff161461179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179290613fc1565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516118389190613b32565b60405180910390a25050565b61184c611eec565b73ffffffffffffffffffffffffffffffffffffffff1661186a611429565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613fc1565b60405180910390fd5b670de0b6b3a76400006103e860056118d6610cd6565b6118e09190614087565b6118ea91906140f8565b6118f491906140f8565b811015611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90614385565b60405180910390fd5b670de0b6b3a76400008161194a9190614087565b600e8190555050565b61195b611eec565b73ffffffffffffffffffffffffffffffffffffffff16611979611429565b73ffffffffffffffffffffffffffffffffffffffff16146119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690613fc1565b60405180910390fd5b60005b8151811015611a60576000600860008484815181106119f4576119f3613fe1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a589061403f565b9150506119d2565b5050565b601160009054906101000a900460ff1681565b600c5481565b6000611a87611eec565b73ffffffffffffffffffffffffffffffffffffffff16611aa5611429565b73ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af290613fc1565b60405180910390fd5b620186a06001611b09610cd6565b611b139190614087565b611b1d91906140f8565b821015611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690614417565b60405180910390fd5b6103e86005611b6c610cd6565b611b769190614087565b611b8091906140f8565b821115611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb9906144a9565b60405180910390fd5b81600d8190555060019050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c61611eec565b73ffffffffffffffffffffffffffffffffffffffff16611c7f611429565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613fc1565b60405180910390fd5b611cde47612f89565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611d46573d6000803e3d6000fd5b50565b600d5481565b6000611d59611eec565b73ffffffffffffffffffffffffffffffffffffffff16611d77611429565b73ffffffffffffffffffffffffffffffffffffffff1614611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613fc1565b60405180910390fd5b6000601160006101000a81548160ff0219169083151502179055506001905090565b611df7611eec565b73ffffffffffffffffffffffffffffffffffffffff16611e15611429565b73ffffffffffffffffffffffffffffffffffffffff1614611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290613fc1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed19061453b565b60405180910390fd5b611ee381612e0c565b50565b600e5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a906145cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc99061465f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120b09190613d1a565b60405180910390a3505050565b60006120c98484611bd2565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121435781811015612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c906146cb565b60405180910390fd5b6121428484848403611ef4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af9061475d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e906147ef565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab906148a7565b60405180910390fd5b600081036122cd576122c8838360006131cc565b612e07565b601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123715750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123a857600061238c60648361344b90919063ffffffff16565b90506123988482613461565b80826123a491906148c7565b9150505b600a54421161240a576001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600f60009054906101000a900460ff1615612ad157612427611429565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124955750612465611429565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156124ce5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612508575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156125215750600960009054906101000a900460ff16155b15612ad057600f60019054906101000a900460ff1661261b57601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806125db5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61261a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261190614947565b60405180910390fd5b5b601160009054906101000a900460ff16156127e757612638611429565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156126c15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561271b5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156127e65743601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106127a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612798906149ff565b60405180910390fd5b43601060003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561288a5750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561293157600c548111156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb90614a91565b60405180910390fd5b600e546128e08361112f565b826128eb91906141bb565b111561292c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292390614afd565b60405180910390fd5b612acf565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129d45750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a2357600c54811115612a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1590614b8f565b60405180910390fd5b612ace565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612acd57600e54612a808361112f565b82612a8b91906141bb565b1115612acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac390614afd565b60405180910390fd5b5b5b5b5b5b6000612adc3061112f565b90506000600d548210159050808015612b025750600960009054906101000a900460ff16155b8015612b585750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612bae5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612c045750601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c48576001600960006101000a81548160ff021916908315150217905550612c2c613637565b6000600960006101000a81548160ff0219169083151502179055505b6000600960009054906101000a900460ff16159050601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612cfe5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612d0857600090505b60008115612df757612d386064612d2a6012548861386290919063ffffffff16565b61344b90919063ffffffff16565b905060125460145482612d4b9190614087565b612d5591906140f8565b60176000828254612d6691906141bb565b9250508190555060125460155482612d7e9190614087565b612d8891906140f8565b60186000828254612d9991906141bb565b9250508190555060125460135482612db19190614087565b612dbb91906140f8565b60166000828254612dcc91906141bb565b925050819055506000811115612de857612de78730836131cc565b5b8085612df491906148c7565b94505b612e028787876131cc565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612ee091906141bb565b905092915050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600267ffffffffffffffff811115612fa657612fa5613b52565b5b604051908082528060200260200182016040528015612fd45781602001602082028036833780820191505090505b5090503081600081518110612fec57612feb613fe1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613093573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b79190614bc4565b816001815181106130cb576130ca613fe1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061313230600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ef4565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613196959493929190614cf4565b600060405180830381600087803b1580156131b057600080fd5b505af11580156131c4573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361323b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132329061475d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a1906147ef565b60405180910390fd5b6132b5838383613878565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561333b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333290614dc0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133ce91906141bb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134329190613d1a565b60405180910390a361344584848461387d565b50505050565b6000818361345991906140f8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790614e52565b60405180910390fd5b6134dc82600083613878565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355990614ee4565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546135b991906148c7565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161361e9190613d1a565b60405180910390a36136328360008461387d565b505050565b60006136423061112f565b9050600060185460165460175461365991906141bb565b61366391906141bb565b905060008214806136745750600081145b15613680575050613860565b600d5482111561369057600d5491505b6000600282601754856136a39190614087565b6136ad91906140f8565b6136b791906140f8565b905060006136ce828561388290919063ffffffff16565b905060004790506136de82612f89565b60006136f3824761388290919063ffffffff16565b9050600061371e866137106016548561386290919063ffffffff16565b61344b90919063ffffffff16565b905060006137498761373b6018548661386290919063ffffffff16565b61344b90919063ffffffff16565b9050600081838561375a91906148c7565b61376491906148c7565b9050600060178190555060006016819055506000601881905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6137cd8486612ed290919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156137f8573d6000803e3d6000fd5b506000871180156138095750600081115b15613856576138188782613898565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561868260175460405161384d93929190614f04565b60405180910390a15b5050505050505050505b565b600081836138709190614087565b905092915050565b505050565b505050565b6000818361389091906148c7565b905092915050565b6138c530600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ef4565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613911611429565b426040518863ffffffff1660e01b815260040161393396959493929190614f3b565b60606040518083038185885af1158015613951573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906139769190614fb1565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139b757808201518184015260208101905061399c565b60008484015250505050565b6000601f19601f8301169050919050565b60006139df8261397d565b6139e98185613988565b93506139f9818560208601613999565b613a02816139c3565b840191505092915050565b60006020820190508181036000830152613a2781846139d4565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a6e82613a43565b9050919050565b613a7e81613a63565b8114613a8957600080fd5b50565b600081359050613a9b81613a75565b92915050565b6000819050919050565b613ab481613aa1565b8114613abf57600080fd5b50565b600081359050613ad181613aab565b92915050565b60008060408385031215613aee57613aed613a39565b5b6000613afc85828601613a8c565b9250506020613b0d85828601613ac2565b9150509250929050565b60008115159050919050565b613b2c81613b17565b82525050565b6000602082019050613b476000830184613b23565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b8a826139c3565b810181811067ffffffffffffffff82111715613ba957613ba8613b52565b5b80604052505050565b6000613bbc613a2f565b9050613bc88282613b81565b919050565b600067ffffffffffffffff821115613be857613be7613b52565b5b602082029050602081019050919050565b600080fd5b6000613c11613c0c84613bcd565b613bb2565b90508083825260208201905060208402830185811115613c3457613c33613bf9565b5b835b81811015613c5d5780613c498882613a8c565b845260208401935050602081019050613c36565b5050509392505050565b600082601f830112613c7c57613c7b613b4d565b5b8135613c8c848260208601613bfe565b91505092915050565b600060208284031215613cab57613caa613a39565b5b600082013567ffffffffffffffff811115613cc957613cc8613a3e565b5b613cd584828501613c67565b91505092915050565b600060208284031215613cf457613cf3613a39565b5b6000613d0284828501613a8c565b91505092915050565b613d1481613aa1565b82525050565b6000602082019050613d2f6000830184613d0b565b92915050565b600060208284031215613d4b57613d4a613a39565b5b6000613d5984828501613ac2565b91505092915050565b600080600060608486031215613d7b57613d7a613a39565b5b6000613d8986828701613ac2565b9350506020613d9a86828701613ac2565b9250506040613dab86828701613ac2565b9150509250925092565b600080600060608486031215613dce57613dcd613a39565b5b6000613ddc86828701613a8c565b9350506020613ded86828701613a8c565b9250506040613dfe86828701613ac2565b9150509250925092565b600060ff82169050919050565b613e1e81613e08565b82525050565b6000602082019050613e396000830184613e15565b92915050565b613e4881613b17565b8114613e5357600080fd5b50565b600081359050613e6581613e3f565b92915050565b60008060408385031215613e8257613e81613a39565b5b6000613e9085828601613a8c565b9250506020613ea185828601613e56565b9150509250929050565b613eb481613a63565b82525050565b6000602082019050613ecf6000830184613eab565b92915050565b60008060408385031215613eec57613eeb613a39565b5b6000613efa85828601613a8c565b9250506020613f0b85828601613a8c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f5c57607f821691505b602082108103613f6f57613f6e613f15565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613fab602083613988565b9150613fb682613f75565b602082019050919050565b60006020820190508181036000830152613fda81613f9e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061404a82613aa1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361407c5761407b614010565b5b600182019050919050565b600061409282613aa1565b915061409d83613aa1565b92508282026140ab81613aa1565b915082820484148315176140c2576140c1614010565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061410382613aa1565b915061410e83613aa1565b92508261411e5761411d6140c9565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614185602f83613988565b915061419082614129565b604082019050919050565b600060208201905081810360008301526141b481614178565b9050919050565b60006141c682613aa1565b91506141d183613aa1565b92508282019050808211156141e9576141e8614010565b5b92915050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b600061424b603983613988565b9150614256826141ef565b604082019050919050565b6000602082019050818103600083015261427a8161423e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006142dd602583613988565b91506142e882614281565b604082019050919050565b6000602082019050818103600083015261430c816142d0565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b600061436f602483613988565b915061437a82614313565b604082019050919050565b6000602082019050818103600083015261439e81614362565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000614401603583613988565b915061440c826143a5565b604082019050919050565b60006020820190508181036000830152614430816143f4565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b6000614493603483613988565b915061449e82614437565b604082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614525602683613988565b9150614530826144c9565b604082019050919050565b6000602082019050818103600083015261455481614518565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145b7602483613988565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614649602283613988565b9150614654826145ed565b604082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006146b5601d83613988565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614747602583613988565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006147d9602383613988565b91506147e48261477d565b604082019050919050565b60006020820190508181036000830152614808816147cc565b9050919050565b7f596f7572206164647265737320686173206265656e206d61726b65642061732060008201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60208201527f73666572206f7220737761702e00000000000000000000000000000000000000604082015250565b6000614891604d83613988565b915061489c8261480f565b606082019050919050565b600060208201905081810360008301526148c081614884565b9050919050565b60006148d282613aa1565b91506148dd83613aa1565b92508282039050818111156148f5576148f4614010565b5b92915050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614931601683613988565b915061493c826148fb565b602082019050919050565b6000602082019050818103600083015261496081614924565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b60006149e9604983613988565b91506149f482614967565b606082019050919050565b60006020820190508181036000830152614a18816149dc565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614a7b603583613988565b9150614a8682614a1f565b604082019050919050565b60006020820190508181036000830152614aaa81614a6e565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614ae7601383613988565b9150614af282614ab1565b602082019050919050565b60006020820190508181036000830152614b1681614ada565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000614b79603683613988565b9150614b8482614b1d565b604082019050919050565b60006020820190508181036000830152614ba881614b6c565b9050919050565b600081519050614bbe81613a75565b92915050565b600060208284031215614bda57614bd9613a39565b5b6000614be884828501614baf565b91505092915050565b6000819050919050565b6000819050919050565b6000614c20614c1b614c1684614bf1565b614bfb565b613aa1565b9050919050565b614c3081614c05565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614c6b81613a63565b82525050565b6000614c7d8383614c62565b60208301905092915050565b6000602082019050919050565b6000614ca182614c36565b614cab8185614c41565b9350614cb683614c52565b8060005b83811015614ce7578151614cce8882614c71565b9750614cd983614c89565b925050600181019050614cba565b5085935050505092915050565b600060a082019050614d096000830188613d0b565b614d166020830187614c27565b8181036040830152614d288186614c96565b9050614d376060830185613eab565b614d446080830184613d0b565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614daa602683613988565b9150614db582614d4e565b604082019050919050565b60006020820190508181036000830152614dd981614d9d565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e3c602183613988565b9150614e4782614de0565b604082019050919050565b60006020820190508181036000830152614e6b81614e2f565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ece602283613988565b9150614ed982614e72565b604082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b6000606082019050614f196000830186613d0b565b614f266020830185613d0b565b614f336040830184613d0b565b949350505050565b600060c082019050614f506000830189613eab565b614f5d6020830188613d0b565b614f6a6040830187614c27565b614f776060830186614c27565b614f846080830185613eab565b614f9160a0830184613d0b565b979650505050505050565b600081519050614fab81613aab565b92915050565b600080600060608486031215614fca57614fc9613a39565b5b6000614fd886828701614f9c565b9350506020614fe986828701614f9c565b9250506040614ffa86828701614f9c565b915050925092509256fea26469706673582212201ba1ef1983e596d2c0a4d53bb167ab2e10b5f74c712a51738ce196ef73d4a95264736f6c63430008120033

Deployed Bytecode Sourcemap

4149:14047:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2196:100:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4547:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10616:321:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11164:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18047:109;;;;;;;;;;;;;:::i;:::-;;4904:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3316:108:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8771:232:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9390:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5328:295:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3158:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6032:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4592:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10479:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10314:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3487:127:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:9;;;;;;;;;;;;;:::i;:::-;;7981:121:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9234:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7795:130;;;;;;;;;;;;;:::i;:::-;;1063:87:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2415:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9862:244:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6775:438:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3820:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4632:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9672:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9011:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10949:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4856:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4469:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8377:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4076:151:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17879:160:1;;;;;;;;;;;;;:::i;:::-;;4511:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8167:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1972:201:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4551:24:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2196:100:2;2250:13;2283:5;2276:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2196:100;:::o;4547:201::-;4630:4;4647:13;4663:12;:10;:12::i;:::-;4647:28;;4686:32;4695:5;4702:7;4711:6;4686:8;:32::i;:::-;4736:4;4729:11;;;4547:201;;;;:::o;10616:321:1:-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10704:6:1::1;10699:231;10720:12;:19;10716:1;:23;10699:231;;;10784:13;;;;;;;;;;;10765:32;;:12;10778:1;10765:15;;;;;;;;:::i;:::-;;;;;;;;:32;;;;:79;;;;;10828:15;;;;;;;;;;;10801:43;;:12;10814:1;10801:15;;;;;;;;:::i;:::-;;;;;;;;:43;;;;10765:79;10761:158;;;10899:4;10865:14;:31;10880:12;10893:1;10880:15;;;;;;;;:::i;:::-;;;;;;;;10865:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;10761:158;10741:3;;;;;:::i;:::-;;;;10699:231;;;;10616:321:::0;:::o;11164:105::-;11217:4;11241:14;:20;11256:4;11241:20;;;;;;;;;;;;;;;;;;;;;;;;;11234:27;;11164:105;;;:::o;18047:109::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18106:9:1::1;;;;;;;;;;;18098:27;;:50;18126:21;18098:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;18047:109::o:0;4904:24::-;;;;:::o;3316:108:2:-;3377:7;3404:12;;3397:19;;3316:108;:::o;8771:232:1:-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8892:4:1::1;8884;8880:1;8864:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;8863:33;;;;:::i;:::-;8853:6;:43;;8845:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;8991:4;8982:6;:13;;;;:::i;:::-;8959:20;:36;;;;8771:232:::0;:::o;9390:274::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9516:12:1::1;9500:13;:28;;;;9555:12;9539:13;:28;;;;9588:6;9578:7;:16;;;;9649:7;;9633:13;;9617;;:29;;;;:::i;:::-;:39;;;;:::i;:::-;9605:9;:51;;;;9390:274:::0;;;:::o;5328:295:2:-;5459:4;5476:15;5494:12;:10;:12::i;:::-;5476:30;;5517:38;5533:4;5539:7;5548:6;5517:15;:38::i;:::-;5566:27;5576:4;5582:2;5586:6;5566:9;:27::i;:::-;5611:4;5604:11;;;5328:295;;;;;:::o;3158:93::-;3216:5;3241:2;3234:9;;3158:93;:::o;6032:240::-;6120:4;6137:13;6153:12;:10;:12::i;:::-;6137:28;;6176:66;6185:5;6192:7;6231:10;6201:11;:18;6213:5;6201:18;;;;;;;;;;;;;;;:27;6220:7;6201:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;6176:8;:66::i;:::-;6260:4;6253:11;;;6032:240;;;;:::o;4592:33:1:-;;;;;;;;;;;;;:::o;10479:125::-;10544:4;10568:19;:28;10588:7;10568:28;;;;;;;;;;;;;;;;;;;;;;;;;10561:35;;10479:125;;;:::o;10314:157::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10421:9:1::1;;;;;;;;;;;10393:38;;10410:9;10393:38;;;;;;;;;;;;10454:9;10442;;:21;;;;;;;;;;;;;;;;;;10314:157:::0;:::o;3487:127:2:-;3561:7;3588:9;:18;3598:7;3588:18;;;;;;;;;;;;;;;;3581:25;;3487:127;;;:::o;1714:103:9:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;7981:121:1:-;8033:4;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8067:5:1::1;8050:14;;:22;;;;;;;;;;;;;;;;;;8090:4;8083:11;;7981:121:::0;:::o;9234:144::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9366:4:1::1;9324:31;:39;9356:6;9324:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;9234:144:::0;;:::o;7795:130::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7866:4:1::1;7850:13;;:20;;;;;;;;;;;;;;;;;;7895:22;7915:1;7895:15;:19;;:22;;;;:::i;:::-;7881:11;:36;;;;7795:130::o:0;1063:87:9:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;2415:104:2:-;2471:13;2504:7;2497:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2415:104;:::o;9862:244:1:-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9969:13:1::1;;;;;;;;;;;9961:21;;:4;:21;;::::0;9953:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10057:41;10086:4;10092:5;10057:28;:41::i;:::-;9862:244:::0;;:::o;6775:438:2:-;6868:4;6885:13;6901:12;:10;:12::i;:::-;6885:28;;6924:24;6951:11;:18;6963:5;6951:18;;;;;;;;;;;;;;;:27;6970:7;6951:27;;;;;;;;;;;;;;;;6924:54;;7017:15;6997:16;:35;;6989:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;7110:60;7119:5;7126:7;7154:15;7135:16;:34;7110:8;:60::i;:::-;7201:4;7194:11;;;;6775:438;;;;:::o;3820:193::-;3899:4;3916:13;3932:12;:10;:12::i;:::-;3916:28;;3955;3965:5;3972:2;3976:6;3955:9;:28::i;:::-;4001:4;3994:11;;;3820:193;;;;:::o;4632:33:1:-;;;;;;;;;;;;;:::o;9672:182::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9788:8:1::1;9757:19;:28;9777:7;9757:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;9828:7;9812:34;;;9837:8;9812:34;;;;;;:::i;:::-;;;;;;;;9672:182:::0;;:::o;9011:211::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9133:4:1::1;9127;9123:1;9107:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;9106:31;;;;:::i;:::-;9096:6;:41;;9088:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;9210:4;9201:6;:13;;;;:::i;:::-;9189:9;:25;;;;9011:211:::0;:::o;10949:203::-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11037:6:1::1;11032:113;11053:12;:19;11049:1;:23;11032:113;;;11128:5;11094:14;:31;11109:12;11122:1;11109:15;;;;;;;;:::i;:::-;;;;;;;;11094:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;11074:3;;;;;:::i;:::-;;;;11032:113;;;;10949:203:::0;:::o;4856:39::-;;;;;;;;;;;;;:::o;4469:35::-;;;;:::o;8377:382::-;8458:4;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8515:6:1::1;8511:1;8495:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;8482:9;:39;;8474:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;8630:4;8626:1;8610:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;8597:9;:37;;8589:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;8722:9;8701:18;:30;;;;8748:4;8741:11;;8377:382:::0;;;:::o;4076:151:2:-;4165:7;4192:11;:18;4204:5;4192:18;;;;;;;;;;;;;;;:27;4211:7;4192:27;;;;;;;;;;;;;;;;4185:34;;4076:151;;;;:::o;17879:160:1:-;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17930:40:1::1;17948:21;17930:17;:40::i;:::-;17989:9;;;;;;;;;;;17981:27;;:50;18009:21;17981:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;17879:160::o:0;4511:33::-;;;;:::o;8167:135::-;8227:4;1294:12:9;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8267:5:1::1;8244:20;;:28;;;;;;;;;;;;;;;;;;8290:4;8283:11;;8167:135:::0;:::o;1972:201:9:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;::::0;2053:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;4551:24:1:-;;;;:::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;10411:380:2:-;10564:1;10547:19;;:5;:19;;;10539:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10645:1;10626:21;;:7;:21;;;10618:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10729:6;10699:11;:18;10711:5;10699:18;;;;;;;;;;;;;;;:27;10718:7;10699:27;;;;;;;;;;;;;;;:36;;;;10767:7;10751:32;;10760:5;10751:32;;;10776:6;10751:32;;;;;;:::i;:::-;;;;;;;;10411:380;;;:::o;11078:453::-;11213:24;11240:25;11250:5;11257:7;11240:9;:25::i;:::-;11213:52;;11300:17;11280:16;:37;11276:248;;11362:6;11342:16;:26;;11334:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11446:51;11455:5;11462:7;11490:6;11471:16;:25;11446:8;:51::i;:::-;11276:248;11202:329;11078:453;;;:::o;11277:3962:1:-;11425:1;11409:18;;:4;:18;;;11401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11502:1;11488:16;;:2;:16;;;11480:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;11564:14;:20;11579:4;11564:20;;;;;;;;;;;;;;;;;;;;;;;;;11563:21;11555:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;11702:1;11692:6;:11;11688:93;;11720:28;11736:4;11742:2;11746:1;11720:15;:28::i;:::-;11763:7;;11688:93;11831:19;:25;11851:4;11831:25;;;;;;;;;;;;;;;;;;;;;;;;;11830:26;:54;;;;;11861:19;:23;11881:2;11861:23;;;;;;;;;;;;;;;;;;;;;;;;;11860:24;11830:54;11826:196;;;11901:18;11922:15;11933:3;11922:6;:10;;:15;;;;:::i;:::-;11901:36;;11952:23;11958:4;11964:10;11952:5;:23::i;:::-;12000:10;11990:20;;;;;:::i;:::-;;;11886:136;11826:196;12057:11;;12038:15;:30;12034:61;;12091:4;12070:14;:18;12085:2;12070:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;12034:61;12120:14;;;;;;;;;;;12116:1838;;;12181:7;:5;:7::i;:::-;12173:15;;:4;:15;;;;:49;;;;;12215:7;:5;:7::i;:::-;12209:13;;:2;:13;;;;12173:49;:86;;;;;12257:1;12243:16;;:2;:16;;;;12173:86;:128;;;;;12294:6;12280:21;;:2;:21;;;;12173:128;:159;;;;;12323:9;;;;;;;;;;;12322:10;12173:159;12151:1792;;;12372:13;;;;;;;;;;;12367:150;;12418:19;:25;12438:4;12418:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;12447:19;:23;12467:2;12447:23;;;;;;;;;;;;;;;;;;;;;;;;;12418:52;12410:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;12367:150;12675:20;;;;;;;;;;;12671:423;;;12729:7;:5;:7::i;:::-;12723:13;;:2;:13;;;;:47;;;;;12754:15;;;;;;;;;;;12740:30;;:2;:30;;;;12723:47;:79;;;;;12788:13;;;;;;;;;;;12774:28;;:2;:28;;;;12723:79;12719:356;;;12880:12;12838:28;:39;12867:9;12838:39;;;;;;;;;;;;;;;;:54;12830:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;13039:12;12997:28;:39;13026:9;12997:39;;;;;;;;;;;;;;;:54;;;;12719:356;12671:423;13164:25;:31;13190:4;13164:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;13200:31;:35;13232:2;13200:35;;;;;;;;;;;;;;;;;;;;;;;;;13199:36;13164:71;13160:768;;;13278:20;;13268:6;:30;;13260:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;13413:9;;13396:13;13406:2;13396:9;:13::i;:::-;13387:6;:22;;;;:::i;:::-;:35;;13379:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13160:768;;;13541:25;:29;13567:2;13541:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;13575:31;:37;13607:4;13575:37;;;;;;;;;;;;;;;;;;;;;;;;;13574:38;13541:71;13537:391;;;13655:20;;13645:6;:30;;13637:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;13537:391;;;13782:31;:35;13814:2;13782:35;;;;;;;;;;;;;;;;;;;;;;;;;13777:151;;13875:9;;13858:13;13868:2;13858:9;:13::i;:::-;13849:6;:22;;;;:::i;:::-;:35;;13841:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13777:151;13537:391;13160:768;12151:1792;12116:1838;13968:28;13999:24;14017:4;13999:9;:24::i;:::-;13968:55;;14034:12;14073:18;;14049:20;:42;;14034:57;;14120:7;:34;;;;;14145:9;;;;;;;;;;;14144:10;14120:34;:83;;;;;14172:25;:31;14198:4;14172:31;;;;;;;;;;;;;;;;;;;;;;;;;14171:32;14120:83;:126;;;;;14221:19;:25;14241:4;14221:25;;;;;;;;;;;;;;;;;;;;;;;;;14220:26;14120:126;:167;;;;;14264:19;:23;14284:2;14264:23;;;;;;;;;;;;;;;;;;;;;;;;;14263:24;14120:167;14102:297;;;14326:4;14314:9;;:16;;;;;;;;;;;;;;;;;;14345:10;:8;:10::i;:::-;14382:5;14370:9;;:17;;;;;;;;;;;;;;;;;;14102:297;14411:12;14427:9;;;;;;;;;;;14426:10;14411:25;;14538:19;:25;14558:4;14538:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;14567:19;:23;14587:2;14567:23;;;;;;;;;;;;;;;;;;;;;;;;;14538:52;14534:100;;;14617:5;14607:15;;14534:100;14654:12;14759:7;14755:431;;;14790:30;14816:3;14790:21;14801:9;;14790:6;:10;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;14783:37;;14881:9;;14865:13;;14858:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;14835:19;;:55;;;;;;;:::i;:::-;;;;;;;;14939:9;;14929:7;;14922:4;:14;;;;:::i;:::-;:26;;;;:::i;:::-;14905:13;;:43;;;;;;;:::i;:::-;;;;;;;;15009:9;;14993:13;;14986:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;14963:19;;:55;;;;;;;:::i;:::-;;;;;;;;15058:1;15051:4;:8;15047:91;;;15080:42;15096:4;15110;15117;15080:15;:42::i;:::-;15047:91;15170:4;15160:14;;;;;:::i;:::-;;;14755:431;15198:33;15214:4;15220:2;15224:6;15198:15;:33::i;:::-;11390:3849;;;;11277:3962;;;;:::o;2333:191:9:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;2833:98:10:-;2891:7;2922:1;2918;:5;;;;:::i;:::-;2911:12;;2833:98;;;;:::o;10114:188:1:-;10231:5;10197:25;:31;10223:4;10197:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;10288:5;10254:40;;10282:4;10254:40;;;;;;;;;;;;10114:188;;:::o;15247:590::-;15374:21;15412:1;15398:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15374:40;;15443:4;15425;15430:1;15425:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;15469:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15459:4;15464:1;15459:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;15504:62;15521:4;15536:15;;;;;;;;;;;15554:11;15504:8;:62::i;:::-;15605:15;;;;;;;;;;;:66;;;15686:11;15712:1;15756:4;15783;15803:15;15605:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15303:534;15247:590;:::o;7692:671:2:-;7839:1;7823:18;;:4;:18;;;7815:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7916:1;7902:16;;:2;:16;;;7894:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7971:38;7992:4;7998:2;8002:6;7971:20;:38::i;:::-;8022:19;8044:9;:15;8054:4;8044:15;;;;;;;;;;;;;;;;8022:37;;8093:6;8078:11;:21;;8070:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;8210:6;8196:11;:20;8178:9;:15;8188:4;8178:15;;;;;;;;;;;;;;;:38;;;;8255:6;8238:9;:13;8248:2;8238:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;8294:2;8279:26;;8288:4;8279:26;;;8298:6;8279:26;;;;;;:::i;:::-;;;;;;;;8318:37;8338:4;8344:2;8348:6;8318:19;:37::i;:::-;7804:559;7692:671;;;:::o;3970:98:10:-;4028:7;4059:1;4055;:5;;;;:::i;:::-;4048:12;;3970:98;;;;:::o;9382:591:2:-;9485:1;9466:21;;:7;:21;;;9458:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9538:49;9559:7;9576:1;9580:6;9538:20;:49::i;:::-;9600:22;9625:9;:18;9635:7;9625:18;;;;;;;;;;;;;;;;9600:43;;9680:6;9662:14;:24;;9654:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9799:6;9782:14;:23;9761:9;:18;9771:7;9761:18;;;;;;;;;;;;;;;:44;;;;9843:6;9827:12;;:22;;;;;;;:::i;:::-;;;;;;;;9893:1;9867:37;;9876:7;9867:37;;;9897:6;9867:37;;;;;;:::i;:::-;;;;;;;;9917:48;9937:7;9954:1;9958:6;9917:19;:48::i;:::-;9447:526;9382:591;;:::o;16371:1500:1:-;16410:23;16436:24;16454:4;16436:9;:24::i;:::-;16410:50;;16471:25;16543:13;;16521:19;;16499;;:41;;;;:::i;:::-;:57;;;;:::i;:::-;16471:85;;16600:1;16581:15;:20;:46;;;;16626:1;16605:17;:22;16581:46;16577:59;;;16629:7;;;;16577:59;16668:18;;16650:15;:36;16646:103;;;16719:18;;16701:36;;16646:103;16818:23;16904:1;16884:17;16862:19;;16844:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;16818:87;;16916:26;16945:36;16965:15;16945;:19;;:36;;;;:::i;:::-;16916:65;;17002:25;17030:21;17002:49;;17064:37;17082:18;17064:17;:37::i;:::-;17123:18;17144:44;17170:17;17144:21;:25;;:44;;;;:::i;:::-;17123:65;;17199:23;17225:58;17265:17;17225:35;17240:19;;17225:10;:14;;:35;;;;:::i;:::-;:39;;:58;;;;:::i;:::-;17199:84;;17294:17;17314:52;17348:17;17314:29;17329:13;;17314:10;:14;;:29;;;;:::i;:::-;:33;;:52;;;;:::i;:::-;17294:72;;17377:23;17434:9;17416:15;17403:10;:28;;;;:::i;:::-;:40;;;;:::i;:::-;17377:66;;17486:1;17464:19;:23;;;;17520:1;17498:19;:23;;;;17548:1;17532:13;:17;;;;17570:9;;;;;;;;;;;17562:27;;:59;17590:30;17610:9;17590:15;:19;;:30;;;;:::i;:::-;17562:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17672:1;17654:15;:19;:42;;;;;17695:1;17677:15;:19;17654:42;17650:214;;;17713:47;17727:15;17744;17713:13;:47::i;:::-;17780:72;17795:18;17815:15;17832:19;;17780:72;;;;;;;;:::i;:::-;;;;;;;;17650:214;16399:1472;;;;;;;;;16371:1500;:::o;3571:98:10:-;3629:7;3660:1;3656;:5;;;;:::i;:::-;3649:12;;3571:98;;;;:::o;12131:125:2:-;;;;:::o;12860:124::-;;;;:::o;3214:98:10:-;3272:7;3303:1;3299;:5;;;;:::i;:::-;3292:12;;3214:98;;;;:::o;15849:514:1:-;15998:62;16015:4;16030:15;;;;;;;;;;;16048:11;15998:8;:62::i;:::-;16103:15;;;;;;;;;;;:31;;;16142:9;16175:4;16195:11;16221:1;16264;16307:7;:5;:7::i;:::-;16329:15;16103:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;15849:514;;:::o;7:99:11:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:117::-;3555:1;3552;3545:12;3569:180;3617:77;3614:1;3607:88;3714:4;3711:1;3704:15;3738:4;3735:1;3728:15;3755:281;3838:27;3860:4;3838:27;:::i;:::-;3830:6;3826:40;3968:6;3956:10;3953:22;3932:18;3920:10;3917:34;3914:62;3911:88;;;3979:18;;:::i;:::-;3911:88;4019:10;4015:2;4008:22;3798:238;3755:281;;:::o;4042:129::-;4076:6;4103:20;;:::i;:::-;4093:30;;4132:33;4160:4;4152:6;4132:33;:::i;:::-;4042:129;;;:::o;4177:311::-;4254:4;4344:18;4336:6;4333:30;4330:56;;;4366:18;;:::i;:::-;4330:56;4416:4;4408:6;4404:17;4396:25;;4476:4;4470;4466:15;4458:23;;4177:311;;;:::o;4494:117::-;4603:1;4600;4593:12;4634:710;4730:5;4755:81;4771:64;4828:6;4771:64;:::i;:::-;4755:81;:::i;:::-;4746:90;;4856:5;4885:6;4878:5;4871:21;4919:4;4912:5;4908:16;4901:23;;4972:4;4964:6;4960:17;4952:6;4948:30;5001:3;4993:6;4990:15;4987:122;;;5020:79;;:::i;:::-;4987:122;5135:6;5118:220;5152:6;5147:3;5144:15;5118:220;;;5227:3;5256:37;5289:3;5277:10;5256:37;:::i;:::-;5251:3;5244:50;5323:4;5318:3;5314:14;5307:21;;5194:144;5178:4;5173:3;5169:14;5162:21;;5118:220;;;5122:21;4736:608;;4634:710;;;;;:::o;5367:370::-;5438:5;5487:3;5480:4;5472:6;5468:17;5464:27;5454:122;;5495:79;;:::i;:::-;5454:122;5612:6;5599:20;5637:94;5727:3;5719:6;5712:4;5704:6;5700:17;5637:94;:::i;:::-;5628:103;;5444:293;5367:370;;;;:::o;5743:539::-;5827:6;5876:2;5864:9;5855:7;5851:23;5847:32;5844:119;;;5882:79;;:::i;:::-;5844:119;6030:1;6019:9;6015:17;6002:31;6060:18;6052:6;6049:30;6046:117;;;6082:79;;:::i;:::-;6046:117;6187:78;6257:7;6248:6;6237:9;6233:22;6187:78;:::i;:::-;6177:88;;5973:302;5743:539;;;;:::o;6288:329::-;6347:6;6396:2;6384:9;6375:7;6371:23;6367:32;6364:119;;;6402:79;;:::i;:::-;6364:119;6522:1;6547:53;6592:7;6583:6;6572:9;6568:22;6547:53;:::i;:::-;6537:63;;6493:117;6288:329;;;;:::o;6623:118::-;6710:24;6728:5;6710:24;:::i;:::-;6705:3;6698:37;6623:118;;:::o;6747:222::-;6840:4;6878:2;6867:9;6863:18;6855:26;;6891:71;6959:1;6948:9;6944:17;6935:6;6891:71;:::i;:::-;6747:222;;;;:::o;6975:329::-;7034:6;7083:2;7071:9;7062:7;7058:23;7054:32;7051:119;;;7089:79;;:::i;:::-;7051:119;7209:1;7234:53;7279:7;7270:6;7259:9;7255:22;7234:53;:::i;:::-;7224:63;;7180:117;6975:329;;;;:::o;7310:619::-;7387:6;7395;7403;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7705:2;7731:53;7776:7;7767:6;7756:9;7752:22;7731:53;:::i;:::-;7721:63;;7676:118;7833:2;7859:53;7904:7;7895:6;7884:9;7880:22;7859:53;:::i;:::-;7849:63;;7804:118;7310:619;;;;;:::o;7935:::-;8012:6;8020;8028;8077:2;8065:9;8056:7;8052:23;8048:32;8045:119;;;8083:79;;:::i;:::-;8045:119;8203:1;8228:53;8273:7;8264:6;8253:9;8249:22;8228:53;:::i;:::-;8218:63;;8174:117;8330:2;8356:53;8401:7;8392:6;8381:9;8377:22;8356:53;:::i;:::-;8346:63;;8301:118;8458:2;8484:53;8529:7;8520:6;8509:9;8505:22;8484:53;:::i;:::-;8474:63;;8429:118;7935:619;;;;;:::o;8560:86::-;8595:7;8635:4;8628:5;8624:16;8613:27;;8560:86;;;:::o;8652:112::-;8735:22;8751:5;8735:22;:::i;:::-;8730:3;8723:35;8652:112;;:::o;8770:214::-;8859:4;8897:2;8886:9;8882:18;8874:26;;8910:67;8974:1;8963:9;8959:17;8950:6;8910:67;:::i;:::-;8770:214;;;;:::o;8990:116::-;9060:21;9075:5;9060:21;:::i;:::-;9053:5;9050:32;9040:60;;9096:1;9093;9086:12;9040:60;8990:116;:::o;9112:133::-;9155:5;9193:6;9180:20;9171:29;;9209:30;9233:5;9209:30;:::i;:::-;9112:133;;;;:::o;9251:468::-;9316:6;9324;9373:2;9361:9;9352:7;9348:23;9344:32;9341:119;;;9379:79;;:::i;:::-;9341:119;9499:1;9524:53;9569:7;9560:6;9549:9;9545:22;9524:53;:::i;:::-;9514:63;;9470:117;9626:2;9652:50;9694:7;9685:6;9674:9;9670:22;9652:50;:::i;:::-;9642:60;;9597:115;9251:468;;;;;:::o;9725:118::-;9812:24;9830:5;9812:24;:::i;:::-;9807:3;9800:37;9725:118;;:::o;9849:222::-;9942:4;9980:2;9969:9;9965:18;9957:26;;9993:71;10061:1;10050:9;10046:17;10037:6;9993:71;:::i;:::-;9849:222;;;;:::o;10077:474::-;10145:6;10153;10202:2;10190:9;10181:7;10177:23;10173:32;10170:119;;;10208:79;;:::i;:::-;10170:119;10328:1;10353:53;10398:7;10389:6;10378:9;10374:22;10353:53;:::i;:::-;10343:63;;10299:117;10455:2;10481:53;10526:7;10517:6;10506:9;10502:22;10481:53;:::i;:::-;10471:63;;10426:118;10077:474;;;;;:::o;10557:180::-;10605:77;10602:1;10595:88;10702:4;10699:1;10692:15;10726:4;10723:1;10716:15;10743:320;10787:6;10824:1;10818:4;10814:12;10804:22;;10871:1;10865:4;10861:12;10892:18;10882:81;;10948:4;10940:6;10936:17;10926:27;;10882:81;11010:2;11002:6;10999:14;10979:18;10976:38;10973:84;;11029:18;;:::i;:::-;10973:84;10794:269;10743:320;;;:::o;11069:182::-;11209:34;11205:1;11197:6;11193:14;11186:58;11069:182;:::o;11257:366::-;11399:3;11420:67;11484:2;11479:3;11420:67;:::i;:::-;11413:74;;11496:93;11585:3;11496:93;:::i;:::-;11614:2;11609:3;11605:12;11598:19;;11257:366;;;:::o;11629:419::-;11795:4;11833:2;11822:9;11818:18;11810:26;;11882:9;11876:4;11872:20;11868:1;11857:9;11853:17;11846:47;11910:131;12036:4;11910:131;:::i;:::-;11902:139;;11629:419;;;:::o;12054:180::-;12102:77;12099:1;12092:88;12199:4;12196:1;12189:15;12223:4;12220:1;12213:15;12240:180;12288:77;12285:1;12278:88;12385:4;12382:1;12375:15;12409:4;12406:1;12399:15;12426:233;12465:3;12488:24;12506:5;12488:24;:::i;:::-;12479:33;;12534:66;12527:5;12524:77;12521:103;;12604:18;;:::i;:::-;12521:103;12651:1;12644:5;12640:13;12633:20;;12426:233;;;:::o;12665:410::-;12705:7;12728:20;12746:1;12728:20;:::i;:::-;12723:25;;12762:20;12780:1;12762:20;:::i;:::-;12757:25;;12817:1;12814;12810:9;12839:30;12857:11;12839:30;:::i;:::-;12828:41;;13018:1;13009:7;13005:15;13002:1;12999:22;12979:1;12972:9;12952:83;12929:139;;13048:18;;:::i;:::-;12929:139;12713:362;12665:410;;;;:::o;13081:180::-;13129:77;13126:1;13119:88;13226:4;13223:1;13216:15;13250:4;13247:1;13240:15;13267:185;13307:1;13324:20;13342:1;13324:20;:::i;:::-;13319:25;;13358:20;13376:1;13358:20;:::i;:::-;13353:25;;13397:1;13387:35;;13402:18;;:::i;:::-;13387:35;13444:1;13441;13437:9;13432:14;;13267:185;;;;:::o;13458:234::-;13598:34;13594:1;13586:6;13582:14;13575:58;13667:17;13662:2;13654:6;13650:15;13643:42;13458:234;:::o;13698:366::-;13840:3;13861:67;13925:2;13920:3;13861:67;:::i;:::-;13854:74;;13937:93;14026:3;13937:93;:::i;:::-;14055:2;14050:3;14046:12;14039:19;;13698:366;;;:::o;14070:419::-;14236:4;14274:2;14263:9;14259:18;14251:26;;14323:9;14317:4;14313:20;14309:1;14298:9;14294:17;14287:47;14351:131;14477:4;14351:131;:::i;:::-;14343:139;;14070:419;;;:::o;14495:191::-;14535:3;14554:20;14572:1;14554:20;:::i;:::-;14549:25;;14588:20;14606:1;14588:20;:::i;:::-;14583:25;;14631:1;14628;14624:9;14617:16;;14652:3;14649:1;14646:10;14643:36;;;14659:18;;:::i;:::-;14643:36;14495:191;;;;:::o;14692:244::-;14832:34;14828:1;14820:6;14816:14;14809:58;14901:27;14896:2;14888:6;14884:15;14877:52;14692:244;:::o;14942:366::-;15084:3;15105:67;15169:2;15164:3;15105:67;:::i;:::-;15098:74;;15181:93;15270:3;15181:93;:::i;:::-;15299:2;15294:3;15290:12;15283:19;;14942:366;;;:::o;15314:419::-;15480:4;15518:2;15507:9;15503:18;15495:26;;15567:9;15561:4;15557:20;15553:1;15542:9;15538:17;15531:47;15595:131;15721:4;15595:131;:::i;:::-;15587:139;;15314:419;;;:::o;15739:224::-;15879:34;15875:1;15867:6;15863:14;15856:58;15948:7;15943:2;15935:6;15931:15;15924:32;15739:224;:::o;15969:366::-;16111:3;16132:67;16196:2;16191:3;16132:67;:::i;:::-;16125:74;;16208:93;16297:3;16208:93;:::i;:::-;16326:2;16321:3;16317:12;16310:19;;15969:366;;;:::o;16341:419::-;16507:4;16545:2;16534:9;16530:18;16522:26;;16594:9;16588:4;16584:20;16580:1;16569:9;16565:17;16558:47;16622:131;16748:4;16622:131;:::i;:::-;16614:139;;16341:419;;;:::o;16766:223::-;16906:34;16902:1;16894:6;16890:14;16883:58;16975:6;16970:2;16962:6;16958:15;16951:31;16766:223;:::o;16995:366::-;17137:3;17158:67;17222:2;17217:3;17158:67;:::i;:::-;17151:74;;17234:93;17323:3;17234:93;:::i;:::-;17352:2;17347:3;17343:12;17336:19;;16995:366;;;:::o;17367:419::-;17533:4;17571:2;17560:9;17556:18;17548:26;;17620:9;17614:4;17610:20;17606:1;17595:9;17591:17;17584:47;17648:131;17774:4;17648:131;:::i;:::-;17640:139;;17367:419;;;:::o;17792:240::-;17932:34;17928:1;17920:6;17916:14;17909:58;18001:23;17996:2;17988:6;17984:15;17977:48;17792:240;:::o;18038:366::-;18180:3;18201:67;18265:2;18260:3;18201:67;:::i;:::-;18194:74;;18277:93;18366:3;18277:93;:::i;:::-;18395:2;18390:3;18386:12;18379:19;;18038:366;;;:::o;18410:419::-;18576:4;18614:2;18603:9;18599:18;18591:26;;18663:9;18657:4;18653:20;18649:1;18638:9;18634:17;18627:47;18691:131;18817:4;18691:131;:::i;:::-;18683:139;;18410:419;;;:::o;18835:239::-;18975:34;18971:1;18963:6;18959:14;18952:58;19044:22;19039:2;19031:6;19027:15;19020:47;18835:239;:::o;19080:366::-;19222:3;19243:67;19307:2;19302:3;19243:67;:::i;:::-;19236:74;;19319:93;19408:3;19319:93;:::i;:::-;19437:2;19432:3;19428:12;19421:19;;19080:366;;;:::o;19452:419::-;19618:4;19656:2;19645:9;19641:18;19633:26;;19705:9;19699:4;19695:20;19691:1;19680:9;19676:17;19669:47;19733:131;19859:4;19733:131;:::i;:::-;19725:139;;19452:419;;;:::o;19877:225::-;20017:34;20013:1;20005:6;20001:14;19994:58;20086:8;20081:2;20073:6;20069:15;20062:33;19877:225;:::o;20108:366::-;20250:3;20271:67;20335:2;20330:3;20271:67;:::i;:::-;20264:74;;20347:93;20436:3;20347:93;:::i;:::-;20465:2;20460:3;20456:12;20449:19;;20108:366;;;:::o;20480:419::-;20646:4;20684:2;20673:9;20669:18;20661:26;;20733:9;20727:4;20723:20;20719:1;20708:9;20704:17;20697:47;20761:131;20887:4;20761:131;:::i;:::-;20753:139;;20480:419;;;:::o;20905:223::-;21045:34;21041:1;21033:6;21029:14;21022:58;21114:6;21109:2;21101:6;21097:15;21090:31;20905:223;:::o;21134:366::-;21276:3;21297:67;21361:2;21356:3;21297:67;:::i;:::-;21290:74;;21373:93;21462:3;21373:93;:::i;:::-;21491:2;21486:3;21482:12;21475:19;;21134:366;;;:::o;21506:419::-;21672:4;21710:2;21699:9;21695:18;21687:26;;21759:9;21753:4;21749:20;21745:1;21734:9;21730:17;21723:47;21787:131;21913:4;21787:131;:::i;:::-;21779:139;;21506:419;;;:::o;21931:221::-;22071:34;22067:1;22059:6;22055:14;22048:58;22140:4;22135:2;22127:6;22123:15;22116:29;21931:221;:::o;22158:366::-;22300:3;22321:67;22385:2;22380:3;22321:67;:::i;:::-;22314:74;;22397:93;22486:3;22397:93;:::i;:::-;22515:2;22510:3;22506:12;22499:19;;22158:366;;;:::o;22530:419::-;22696:4;22734:2;22723:9;22719:18;22711:26;;22783:9;22777:4;22773:20;22769:1;22758:9;22754:17;22747:47;22811:131;22937:4;22811:131;:::i;:::-;22803:139;;22530:419;;;:::o;22955:179::-;23095:31;23091:1;23083:6;23079:14;23072:55;22955:179;:::o;23140:366::-;23282:3;23303:67;23367:2;23362:3;23303:67;:::i;:::-;23296:74;;23379:93;23468:3;23379:93;:::i;:::-;23497:2;23492:3;23488:12;23481:19;;23140:366;;;:::o;23512:419::-;23678:4;23716:2;23705:9;23701:18;23693:26;;23765:9;23759:4;23755:20;23751:1;23740:9;23736:17;23729:47;23793:131;23919:4;23793:131;:::i;:::-;23785:139;;23512:419;;;:::o;23937:224::-;24077:34;24073:1;24065:6;24061:14;24054:58;24146:7;24141:2;24133:6;24129:15;24122:32;23937:224;:::o;24167:366::-;24309:3;24330:67;24394:2;24389:3;24330:67;:::i;:::-;24323:74;;24406:93;24495:3;24406:93;:::i;:::-;24524:2;24519:3;24515:12;24508:19;;24167:366;;;:::o;24539:419::-;24705:4;24743:2;24732:9;24728:18;24720:26;;24792:9;24786:4;24782:20;24778:1;24767:9;24763:17;24756:47;24820:131;24946:4;24820:131;:::i;:::-;24812:139;;24539:419;;;:::o;24964:222::-;25104:34;25100:1;25092:6;25088:14;25081:58;25173:5;25168:2;25160:6;25156:15;25149:30;24964:222;:::o;25192:366::-;25334:3;25355:67;25419:2;25414:3;25355:67;:::i;:::-;25348:74;;25431:93;25520:3;25431:93;:::i;:::-;25549:2;25544:3;25540:12;25533:19;;25192:366;;;:::o;25564:419::-;25730:4;25768:2;25757:9;25753:18;25745:26;;25817:9;25811:4;25807:20;25803:1;25792:9;25788:17;25781:47;25845:131;25971:4;25845:131;:::i;:::-;25837:139;;25564:419;;;:::o;25989:301::-;26129:34;26125:1;26117:6;26113:14;26106:58;26198:34;26193:2;26185:6;26181:15;26174:59;26267:15;26262:2;26254:6;26250:15;26243:40;25989:301;:::o;26296:366::-;26438:3;26459:67;26523:2;26518:3;26459:67;:::i;:::-;26452:74;;26535:93;26624:3;26535:93;:::i;:::-;26653:2;26648:3;26644:12;26637:19;;26296:366;;;:::o;26668:419::-;26834:4;26872:2;26861:9;26857:18;26849:26;;26921:9;26915:4;26911:20;26907:1;26896:9;26892:17;26885:47;26949:131;27075:4;26949:131;:::i;:::-;26941:139;;26668:419;;;:::o;27093:194::-;27133:4;27153:20;27171:1;27153:20;:::i;:::-;27148:25;;27187:20;27205:1;27187:20;:::i;:::-;27182:25;;27231:1;27228;27224:9;27216:17;;27255:1;27249:4;27246:11;27243:37;;;27260:18;;:::i;:::-;27243:37;27093:194;;;;:::o;27293:172::-;27433:24;27429:1;27421:6;27417:14;27410:48;27293:172;:::o;27471:366::-;27613:3;27634:67;27698:2;27693:3;27634:67;:::i;:::-;27627:74;;27710:93;27799:3;27710:93;:::i;:::-;27828:2;27823:3;27819:12;27812:19;;27471:366;;;:::o;27843:419::-;28009:4;28047:2;28036:9;28032:18;28024:26;;28096:9;28090:4;28086:20;28082:1;28071:9;28067:17;28060:47;28124:131;28250:4;28124:131;:::i;:::-;28116:139;;27843:419;;;:::o;28268:297::-;28408:34;28404:1;28396:6;28392:14;28385:58;28477:34;28472:2;28464:6;28460:15;28453:59;28546:11;28541:2;28533:6;28529:15;28522:36;28268:297;:::o;28571:366::-;28713:3;28734:67;28798:2;28793:3;28734:67;:::i;:::-;28727:74;;28810:93;28899:3;28810:93;:::i;:::-;28928:2;28923:3;28919:12;28912:19;;28571:366;;;:::o;28943:419::-;29109:4;29147:2;29136:9;29132:18;29124:26;;29196:9;29190:4;29186:20;29182:1;29171:9;29167:17;29160:47;29224:131;29350:4;29224:131;:::i;:::-;29216:139;;28943:419;;;:::o;29368:240::-;29508:34;29504:1;29496:6;29492:14;29485:58;29577:23;29572:2;29564:6;29560:15;29553:48;29368:240;:::o;29614:366::-;29756:3;29777:67;29841:2;29836:3;29777:67;:::i;:::-;29770:74;;29853:93;29942:3;29853:93;:::i;:::-;29971:2;29966:3;29962:12;29955:19;;29614:366;;;:::o;29986:419::-;30152:4;30190:2;30179:9;30175:18;30167:26;;30239:9;30233:4;30229:20;30225:1;30214:9;30210:17;30203:47;30267:131;30393:4;30267:131;:::i;:::-;30259:139;;29986:419;;;:::o;30411:169::-;30551:21;30547:1;30539:6;30535:14;30528:45;30411:169;:::o;30586:366::-;30728:3;30749:67;30813:2;30808:3;30749:67;:::i;:::-;30742:74;;30825:93;30914:3;30825:93;:::i;:::-;30943:2;30938:3;30934:12;30927:19;;30586:366;;;:::o;30958:419::-;31124:4;31162:2;31151:9;31147:18;31139:26;;31211:9;31205:4;31201:20;31197:1;31186:9;31182:17;31175:47;31239:131;31365:4;31239:131;:::i;:::-;31231:139;;30958:419;;;:::o;31383:241::-;31523:34;31519:1;31511:6;31507:14;31500:58;31592:24;31587:2;31579:6;31575:15;31568:49;31383:241;:::o;31630:366::-;31772:3;31793:67;31857:2;31852:3;31793:67;:::i;:::-;31786:74;;31869:93;31958:3;31869:93;:::i;:::-;31987:2;31982:3;31978:12;31971:19;;31630:366;;;:::o;32002:419::-;32168:4;32206:2;32195:9;32191:18;32183:26;;32255:9;32249:4;32245:20;32241:1;32230:9;32226:17;32219:47;32283:131;32409:4;32283:131;:::i;:::-;32275:139;;32002:419;;;:::o;32427:143::-;32484:5;32515:6;32509:13;32500:22;;32531:33;32558:5;32531:33;:::i;:::-;32427:143;;;;:::o;32576:351::-;32646:6;32695:2;32683:9;32674:7;32670:23;32666:32;32663:119;;;32701:79;;:::i;:::-;32663:119;32821:1;32846:64;32902:7;32893:6;32882:9;32878:22;32846:64;:::i;:::-;32836:74;;32792:128;32576:351;;;;:::o;32933:85::-;32978:7;33007:5;32996:16;;32933:85;;;:::o;33024:60::-;33052:3;33073:5;33066:12;;33024:60;;;:::o;33090:158::-;33148:9;33181:61;33199:42;33208:32;33234:5;33208:32;:::i;:::-;33199:42;:::i;:::-;33181:61;:::i;:::-;33168:74;;33090:158;;;:::o;33254:147::-;33349:45;33388:5;33349:45;:::i;:::-;33344:3;33337:58;33254:147;;:::o;33407:114::-;33474:6;33508:5;33502:12;33492:22;;33407:114;;;:::o;33527:184::-;33626:11;33660:6;33655:3;33648:19;33700:4;33695:3;33691:14;33676:29;;33527:184;;;;:::o;33717:132::-;33784:4;33807:3;33799:11;;33837:4;33832:3;33828:14;33820:22;;33717:132;;;:::o;33855:108::-;33932:24;33950:5;33932:24;:::i;:::-;33927:3;33920:37;33855:108;;:::o;33969:179::-;34038:10;34059:46;34101:3;34093:6;34059:46;:::i;:::-;34137:4;34132:3;34128:14;34114:28;;33969:179;;;;:::o;34154:113::-;34224:4;34256;34251:3;34247:14;34239:22;;34154:113;;;:::o;34303:732::-;34422:3;34451:54;34499:5;34451:54;:::i;:::-;34521:86;34600:6;34595:3;34521:86;:::i;:::-;34514:93;;34631:56;34681:5;34631:56;:::i;:::-;34710:7;34741:1;34726:284;34751:6;34748:1;34745:13;34726:284;;;34827:6;34821:13;34854:63;34913:3;34898:13;34854:63;:::i;:::-;34847:70;;34940:60;34993:6;34940:60;:::i;:::-;34930:70;;34786:224;34773:1;34770;34766:9;34761:14;;34726:284;;;34730:14;35026:3;35019:10;;34427:608;;;34303:732;;;;:::o;35041:831::-;35304:4;35342:3;35331:9;35327:19;35319:27;;35356:71;35424:1;35413:9;35409:17;35400:6;35356:71;:::i;:::-;35437:80;35513:2;35502:9;35498:18;35489:6;35437:80;:::i;:::-;35564:9;35558:4;35554:20;35549:2;35538:9;35534:18;35527:48;35592:108;35695:4;35686:6;35592:108;:::i;:::-;35584:116;;35710:72;35778:2;35767:9;35763:18;35754:6;35710:72;:::i;:::-;35792:73;35860:3;35849:9;35845:19;35836:6;35792:73;:::i;:::-;35041:831;;;;;;;;:::o;35878:225::-;36018:34;36014:1;36006:6;36002:14;35995:58;36087:8;36082:2;36074:6;36070:15;36063:33;35878:225;:::o;36109:366::-;36251:3;36272:67;36336:2;36331:3;36272:67;:::i;:::-;36265:74;;36348:93;36437:3;36348:93;:::i;:::-;36466:2;36461:3;36457:12;36450:19;;36109:366;;;:::o;36481:419::-;36647:4;36685:2;36674:9;36670:18;36662:26;;36734:9;36728:4;36724:20;36720:1;36709:9;36705:17;36698:47;36762:131;36888:4;36762:131;:::i;:::-;36754:139;;36481:419;;;:::o;36906:220::-;37046:34;37042:1;37034:6;37030:14;37023:58;37115:3;37110:2;37102:6;37098:15;37091:28;36906:220;:::o;37132:366::-;37274:3;37295:67;37359:2;37354:3;37295:67;:::i;:::-;37288:74;;37371:93;37460:3;37371:93;:::i;:::-;37489:2;37484:3;37480:12;37473:19;;37132:366;;;:::o;37504:419::-;37670:4;37708:2;37697:9;37693:18;37685:26;;37757:9;37751:4;37747:20;37743:1;37732:9;37728:17;37721:47;37785:131;37911:4;37785:131;:::i;:::-;37777:139;;37504:419;;;:::o;37929:221::-;38069:34;38065:1;38057:6;38053:14;38046:58;38138:4;38133:2;38125:6;38121:15;38114:29;37929:221;:::o;38156:366::-;38298:3;38319:67;38383:2;38378:3;38319:67;:::i;:::-;38312:74;;38395:93;38484:3;38395:93;:::i;:::-;38513:2;38508:3;38504:12;38497:19;;38156:366;;;:::o;38528:419::-;38694:4;38732:2;38721:9;38717:18;38709:26;;38781:9;38775:4;38771:20;38767:1;38756:9;38752:17;38745:47;38809:131;38935:4;38809:131;:::i;:::-;38801:139;;38528:419;;;:::o;38953:442::-;39102:4;39140:2;39129:9;39125:18;39117:26;;39153:71;39221:1;39210:9;39206:17;39197:6;39153:71;:::i;:::-;39234:72;39302:2;39291:9;39287:18;39278:6;39234:72;:::i;:::-;39316;39384:2;39373:9;39369:18;39360:6;39316:72;:::i;:::-;38953:442;;;;;;:::o;39401:807::-;39650:4;39688:3;39677:9;39673:19;39665:27;;39702:71;39770:1;39759:9;39755:17;39746:6;39702:71;:::i;:::-;39783:72;39851:2;39840:9;39836:18;39827:6;39783:72;:::i;:::-;39865:80;39941:2;39930:9;39926:18;39917:6;39865:80;:::i;:::-;39955;40031:2;40020:9;40016:18;40007:6;39955:80;:::i;:::-;40045:73;40113:3;40102:9;40098:19;40089:6;40045:73;:::i;:::-;40128;40196:3;40185:9;40181:19;40172:6;40128:73;:::i;:::-;39401:807;;;;;;;;;:::o;40214:143::-;40271:5;40302:6;40296:13;40287:22;;40318:33;40345:5;40318:33;:::i;:::-;40214:143;;;;:::o;40363:663::-;40451:6;40459;40467;40516:2;40504:9;40495:7;40491:23;40487:32;40484:119;;;40522:79;;:::i;:::-;40484:119;40642:1;40667:64;40723:7;40714:6;40703:9;40699:22;40667:64;:::i;:::-;40657:74;;40613:128;40780:2;40806:64;40862:7;40853:6;40842:9;40838:22;40806:64;:::i;:::-;40796:74;;40751:129;40919:2;40945:64;41001:7;40992:6;40981:9;40977:22;40945:64;:::i;:::-;40935:74;;40890:129;40363:663;;;;;:::o

Swarm Source

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