S Price: $0.563266 (-4.90%)

Contract

0xD90d0D33f08e4Fe6702D5149EA3005494dbACD4b

Overview

S Balance

Sonic LogoSonic LogoSonic Logo1 wei

S Value

Less Than $0.01 (@ $0.56/S)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Process Liquidit...116600432025-03-04 17:32:0546 hrs ago1741109525IN
0xD90d0D33...94dbACD4b
0 S0.0193455955
Approve116598592025-03-04 17:31:0446 hrs ago1741109464IN
0xD90d0D33...94dbACD4b
0 S0.0032147966
Approve116595232025-03-04 17:29:1346 hrs ago1741109353IN
0xD90d0D33...94dbACD4b
0 S0.0026794855.01
Refresh All Appr...116593842025-03-04 17:28:2346 hrs ago1741109303IN
0xD90d0D33...94dbACD4b
0 S0.0043234455
Add Initial Liqu...116593592025-03-04 17:28:1546 hrs ago1741109295IN
0xD90d0D33...94dbACD4b
50 S0.015187255
Set Swap Proxy116591892025-03-04 17:27:1146 hrs ago1741109231IN
0xD90d0D33...94dbACD4b
0 S0.0016738755
Initialize116591342025-03-04 17:26:5146 hrs ago1741109211IN
0xD90d0D33...94dbACD4b
0 S0.1294004255

Latest 6 internal transactions

Parent Transaction Hash Block From To
116600432025-03-04 17:32:0546 hrs ago1741109525
0xD90d0D33...94dbACD4b
0.00097357 S
116600432025-03-04 17:32:0546 hrs ago1741109525
0xD90d0D33...94dbACD4b
0.00097357 S
116600432025-03-04 17:32:0546 hrs ago1741109525
0xD90d0D33...94dbACD4b
0.00064904 S
116600432025-03-04 17:32:0546 hrs ago1741109525
0xD90d0D33...94dbACD4b
0.00259619 S
116600432025-03-04 17:32:0546 hrs ago1741109525
0xD90d0D33...94dbACD4b
0.00519238 S
116593592025-03-04 17:28:1546 hrs ago1741109295
0xD90d0D33...94dbACD4b
50 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FARMER

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-03-04
*/

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

// OpenZeppelin Contracts v5.0.1

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "R1");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism
 */
abstract contract Ownable {
    address private _owner;

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

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert("O1");
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "O2");
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "O1");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is IERC20 {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual returns (uint8) {
        return 18;
    }

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

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

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0) && to != address(0), "E1");
        _beforeTokenTransfer(from, to, amount);
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "E2");
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }
        emit Transfer(from, to, amount);
        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "E3");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply += amount;
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
        _afterTokenTransfer(address(0), account, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0) && spender != address(0), "E4");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= amount, "E5");
        unchecked {
            _approve(owner, spender, currentAllowance - amount);
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }
}

interface IMetropolisRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    // Mevcut fonksiyonlar
    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 swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    // Yeni eklenen fonksiyonlar
    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;
    
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    // WETH ile ilgili fonksiyonlar
    function swapExactTokensForWETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    function swapExactWETHForETH(
        uint wethAmount,
        uint amountOutMin,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

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

// Pair interface'ini de ekleyelim
interface IMetropolisPair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    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;
}

// SwapProxy interface
interface ISwapProxy {
    function sendETHToFarmer() external;
}

// FARMER Token Contract
contract FARMER is ERC20, ReentrancyGuard, Ownable {
    // Constants
    uint256 private constant TOTAL_SUPPLY = 1_000_000 * 10**18;
    uint256 private constant TAX_RATE = 5; // 5%
    uint256 private constant LIQUIDITY_TAX = 25; // 2.5%
    uint256 private constant AIRDROP_TAX = 25; // 2.5%
    uint256 private constant MIN_HOLDER_AMOUNT = 10 * 10**18; // 10 tokens minimum for holder status
    uint256 private constant MIN_TOKENS_FOR_PROCESS = 50 * 10**18; // 50 tokens minimum for processing (azaltıldı)
    uint256 private constant SWAP_PERCENTAGE = 75; // 75% will be swapped
    uint256 private constant LIQUIDITY_PERCENTAGE = 25; // 25% will be used for liquidity
    uint256 private constant MAX_SLIPPAGE = 100; // 100% slippage tolerance (maksimuma çıkarıldı)

    // Metropolis DEX addresses
    IMetropolisRouter public metropolisRouter;
    IMetropolisFactory public metropolisFactory;
    address public sonicToken;
    address public liquidityPair;
    address public treasuryWallet;

    // Holder tracking
    mapping(address => bool) public isHolder;
    address[] public holders;

    // Events
    event LiquidityAdded(uint256 tokenAmount, uint256 sonicAmount);
    event AirdropDistributed(uint256 amount, uint256 holdersCount);
    event SwapFailed(string reason);
    event ProcessStarted(uint256 tokensForLiquidity, uint256 tokensForAirdrop);
    event SwapSuccessful(uint256 tokensSwapped, uint256 wethReceived);
    event TreasuryWalletUpdated(address oldTreasury, address newTreasury);
    event LiquidityAddFailed(string reason);
    event AirdropFailed(string reason);
    event ApprovalRefreshed(address token, address spender, uint256 amount);
    event WaitingForTreasuryTransfer(uint256 amount);
    event SwapProxySet(address indexed proxyAddress);
    event ManualSwapCompleted(uint256 tokenAmount, uint256 ethReceived);
    event ETHReceived(address indexed sender, uint256 amount);

    uint256 private _pendingLiquidityTokens;
    uint256 private _pendingAirdropTokens;
    bool private _initialized;
    bool private _inSwap;

    // Proxy kontrat adresi
    address public swapProxy;
    bool public swapProxySet;

    constructor() ERC20("FARMER", "FARM") Ownable(msg.sender) {
        address _metropolisRouter = 0x95a7e403d7cF20F675fF9273D66e94d35ba49fA3;
        address _metropolisFactory = 0x1570300e9cFEC66c9Fb0C8bc14366C86EB170Ad0;
        address _sonicToken = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38;
        address _treasuryWallet = 0x95503A306cD81e08c0c43C49FAae71165937d175;

        require(_metropolisRouter != address(0) && _metropolisFactory != address(0) && _sonicToken != address(0) && _treasuryWallet != address(0), "F1");

        metropolisRouter = IMetropolisRouter(_metropolisRouter);
        metropolisFactory = IMetropolisFactory(_metropolisFactory);
        sonicToken = _sonicToken;
        treasuryWallet = _treasuryWallet;

        _mint(address(this), TOTAL_SUPPLY);
    }

    function initialize() external onlyOwner {
        require(!_initialized, "F2");
        _initialized = true;

        // Try to get existing pair first
        liquidityPair = metropolisFactory.getPair(address(this), sonicToken);
        
        // If pair doesn't exist, create it
        if (liquidityPair == address(0)) {
            liquidityPair = metropolisFactory.createPair(address(this), sonicToken);
        }
        
        require(liquidityPair != address(0), "F3");

        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        require(IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max), "F4");
        IERC20(sonicToken).approve(liquidityPair, type(uint256).max);
        IERC20(address(this)).approve(liquidityPair, type(uint256).max);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Vergi işleme mantığı
        if (
            !_inSwap && 
            from != owner() && 
            to != owner() && 
            from != address(this) && 
            to == liquidityPair
        ) {
            // Vergi hesapla
            uint256 taxAmount = amount * TAX_RATE / 100;
            
            if (taxAmount > 0) {
                // Vergiyi likidite ve airdrop için ayır
                uint256 liquidityTokens = taxAmount * LIQUIDITY_TAX / 100;
                uint256 airdropTokens = taxAmount * AIRDROP_TAX / 100;
                
                // Vergi miktarını ana miktardan düş
                uint256 transferAmount = amount - taxAmount;
                
                // Vergiyi kontrata aktar
                super._transfer(from, address(this), taxAmount);
                
                // Kalan miktarı alıcıya aktar
                super._transfer(from, to, transferAmount);
                
                // Bekleyen miktarları güncelle
                _pendingLiquidityTokens += liquidityTokens;
                _pendingAirdropTokens += airdropTokens;
                
                // Eğer bekleyen tokenlar belirli bir miktarı aşarsa, işlemi başlat
                // Büyük satışlarda E5 hatasını önlemek için maksimum işlem miktarını sınırlıyoruz
                uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (daha düşük değer)
                
                if (_pendingLiquidityTokens + _pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS) {
                    // Eğer bekleyen token miktarı çok fazlaysa, sadece bir kısmını işle
                    if (_pendingLiquidityTokens + _pendingAirdropTokens > maxProcessAmount) {
                        // Büyük miktarlar için işlemi başlatma, bir sonraki satışta daha küçük miktarla işlenecek
                        // Bu, E5 hatasını önlemeye yardımcı olur
                        emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
                    } else {
                        // Normal işlemi başlat - try/catch bloğunu genişlet
                        try this.processLiquidityAndAirdrop() {
                            // İşlem başarılı
                        } catch Error(string memory reason) {
                            // Hata durumunda event yayınla
                            emit SwapFailed(reason);
                        } catch {
                            // Bilinmeyen hata durumunda event yayınla
                            emit SwapFailed("Unknown error in processLiquidityAndAirdrop");
                        }
                    }
                }
                
                // Holder durumunu güncelle
                _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
                _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
                
                return;
            }
        }
        
        // Normal transfer
        super._transfer(from, to, amount);
        
        // Holder durumunu güncelle
        _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
        _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
    }

    function _updateHolder(address account, bool isHolderStatus) private {
        if (account != liquidityPair && account != address(this)) {
            if (isHolderStatus && !isHolder[account]) {
                isHolder[account] = true;
                holders.push(account);
            } else if (!isHolderStatus && isHolder[account]) {
                isHolder[account] = false;
                
                // Remove from holders array
                for (uint256 i = 0; i < holders.length; i++) {
                    if (holders[i] == account) {
                        holders[i] = holders[holders.length - 1];
                        holders.pop();
                        break;
                    }
                }
            }
        }
    }

    function processLiquidityAndAirdrop() external nonReentrant {
        require(!_inSwap, "AP");
        _inSwap = true;
        
        uint256 tokensForLiquidity = _pendingLiquidityTokens;
        uint256 tokensForAirdrop = _pendingAirdropTokens;
        
        if (tokensForLiquidity == 0 && tokensForAirdrop == 0) {
            _inSwap = false;
            return;
        }
        
        // Kontratın token bakiyesini kontrol et
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 totalTokensToProcess = tokensForLiquidity + tokensForAirdrop;
        
        if (contractTokenBalance < totalTokensToProcess) {
            emit SwapFailed("Insufficient token balance");
            _inSwap = false;
            return;
        }
        
        // Maksimum işlem miktarını sınırla
        uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (daha düşük değer)
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        
        // Eğer toplam miktar maksimum miktardan fazlaysa, sadece bir kısmını işle
        if (totalTokensToSwap > maxProcessAmount) {
            // Oranları koru
            uint256 ratio = maxProcessAmount * 1e18 / totalTokensToSwap;
            tokensForLiquidity = tokensForLiquidity * ratio / 1e18;
            tokensForAirdrop = tokensForAirdrop * ratio / 1e18;
            totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
            
            // Bekleyen miktarları güncelle
            _pendingLiquidityTokens -= tokensForLiquidity;
            _pendingAirdropTokens -= tokensForAirdrop;
        } else {
            // Tüm bekleyen miktarları sıfırla
            _pendingLiquidityTokens = 0;
            _pendingAirdropTokens = 0;
        }
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Process swap - ETH doğrudan kontrata gelecek
        uint256 ethReceived = _processSwap(totalTokensToSwap);
        
        if (ethReceived == 0) {
            _inSwap = false;
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            emit SwapFailed("No ETH received from swap");
            _inSwap = false;
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * tokensForLiquidity / totalTokensToSwap;
        uint256 ethForAirdrop = actualEthReceived - ethForLiquidity;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokensForLiquidity);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
        
        _inSwap = false;
    }

    // Likidite işlemini ayrı bir fonksiyona taşıdık
    function _processLiquidity(uint256 wethAmount, uint256 tokenAmount) private {
        // Bu fonksiyon artık kullanılmıyor, kaldırılabilir
        // Doğrudan _addLiquidity fonksiyonu kullanılıyor
    }

    // Likidite ekleme işlemi
    function _addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        // Kontratın token bakiyesini kontrol et
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance < tokenAmount) {
            emit LiquidityAddFailed("Insufficient token balance for liquidity");
            return;
        }
        
        // Daha yüksek slippage toleransı için minimum miktarları düşür
        uint256 minTokenAmount = tokenAmount * (100 - MAX_SLIPPAGE) / 100;
        uint256 minEthAmount = ethAmount * (100 - MAX_SLIPPAGE) / 100;
        
        // Swap işleminde kullanılacak token'lar için onay ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            minTokenAmount,
            minEthAmount,
            address(this),
            block.timestamp + 3600 // Deadline'ı 1 saate çıkardık
        ) {
            emit LiquidityAdded(tokenAmount, ethAmount);
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("Unknown liquidity add error");
        }
    }

    function _processSwap(uint256 tokenAmount) private returns (uint256) {
        if (tokenAmount == 0) return 0;
        require(swapProxySet, "Swap proxy not set");
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = metropolisRouter.WETH();
        
        // Swap işlemi için minimum çıktı miktarını hesapla
        // Daha yüksek slippage toleransı için minimum çıktı miktarını 0 olarak ayarlıyoruz
        uint256 minAmountOut = 0; // Minimum çıktı miktarı 0 olarak ayarlandı
        
        // Swap işleminden önce onayları yenile
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        // Gas limitini artır ve deadline'ı uzat
        uint256 deadline = block.timestamp + 3600; // 1 saat
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // FARMER -> ETH swap işlemi - FeeOnTransfer fonksiyonu kullanıyoruz
        try metropolisRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            minAmountOut,
            path,
            swapProxy, // ETH'yi proxy kontrata gönder
            deadline
        ) {
            // Swap başarılı oldu, proxy kontratın ETH'yi kontrata göndermesini iste
            try ISwapProxy(swapProxy).sendETHToFarmer() {
                // Kontratın ETH bakiyesini kontrol et
                uint256 contractEthBalance = address(this).balance;
                uint256 ethReceived = contractEthBalance - initialEthBalance;
                
                if (ethReceived > 0) {
                    emit SwapSuccessful(tokenAmount, ethReceived);
                    return ethReceived;
                } else {
                    emit SwapFailed("No ETH received after proxy transfer");
                    return 0;
                }
            } catch Error(string memory reason) {
                emit SwapFailed(string(abi.encodePacked("Proxy ETH transfer failed: ", reason)));
                return 0;
            } catch {
                emit SwapFailed("Proxy ETH transfer failed: unknown error");
                return 0;
            }
        } catch Error(string memory reason) {
            emit SwapFailed(reason);
            return 0;
        } catch {
            emit SwapFailed("Unknown swap error");
            return 0;
        }
    }

    // WETH ile airdrop işlemi
    function _processAirdropWithETH(uint256 amount) private {
        uint256 holdersCount = holders.length;
        if (holdersCount == 0 || amount == 0) return;
        
        // Treasury wallet için %25 pay ayır
        uint256 treasuryAmount = amount * 25 / 100;
        uint256 holderAmount = amount - treasuryAmount;
        
        // Treasury wallet'a ETH gönder
        if (treasuryAmount > 0 && treasuryWallet != address(0)) {
            (bool treasurySuccess, ) = treasuryWallet.call{value: treasuryAmount}("");
            if (!treasurySuccess) {
                emit AirdropFailed("Treasury ETH transfer failed");
                // Treasury transfer başarısız olursa tutar holder'lara eklensin
                holderAmount = amount;
            }
        } else {
            // Treasury wallet ayarlanmamışsa tüm miktarı holder'lara dağıt
            holderAmount = amount;
        }
        
        // Holder'lara ETH dağıt
        if (holdersCount > 0 && holderAmount > 0) {
            uint256 amountPerHolder = holderAmount / holdersCount;
            if (amountPerHolder > 0) {
                for (uint256 i = 0; i < holdersCount; i++) {
                    address holder = holders[i];
                    if (holder != address(0) && holder != address(this) && holder != liquidityPair) {
                        // ETH'yi doğrudan holder'a gönder
                        (bool success, ) = holder.call{value: amountPerHolder}("");
                        if (!success) {
                            emit AirdropFailed("ETH transfer failed");
                        }
                    }
                }
            }
        }
        
        emit AirdropDistributed(amount, holdersCount);
    }

    // View functions
    function getHolderCount() external view returns (uint256) {
        return holders.length;
    }
    
    function getHolders() external view returns (address[] memory) {
        return holders;
    }

    // Initial liquidity function with WSonic
    function addInitialLiquidityWithWSonic(uint256 tokenAmount, uint256 sonicAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(sonicAmount > 0, "NS");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "IB"
        );
        
        require(
            IERC20(sonicToken).balanceOf(msg.sender) >= sonicAmount,
            "IS"
        );
        
        // WSonic token'ları kontrata transfer et
        require(
            IERC20(sonicToken).transferFrom(msg.sender, address(this), sonicAmount),
            "TF"
        );
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        IERC20(sonicToken).approve(address(metropolisRouter), sonicAmount);
        
        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokenAmount,
            sonicAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum sonic miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, sonicAmount);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert("FL");
        }
        
        // Kalan WSonic token'ları geri gönder
        uint256 remainingWSonic = IERC20(sonicToken).balanceOf(address(this));
        if (remainingWSonic > 0) {
            IERC20(sonicToken).transfer(msg.sender, remainingWSonic);
        }
    }

    // Tüm FARMER tokenlarını ETH ile likiditeye eklemek için fonksiyon
    function addInitialLiquidityWithAllTokensAndETH() external payable onlyOwner {
        uint256 tokenAmount = IERC20(address(this)).balanceOf(address(this));
        require(tokenAmount > 0, "NT");
        require(msg.value > 0, "NE");
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum ETH miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert("FL");
        }
    }

    function setRouter(address _router) external onlyOwner {
        require(_router != address(0), "IR");
        metropolisRouter = IMetropolisRouter(_router);
    }

    function rescueTokens(address _token, uint256 _amount) external onlyOwner {
        require(_token != address(this), "CF");
        IERC20(_token).transfer(owner(), _amount);
    }

    // View functions for pending amounts
    function getPendingLiquidityTokens() external view returns (uint256) {
        return _pendingLiquidityTokens;
    }

    function getPendingAirdropTokens() external view returns (uint256) {
        return _pendingAirdropTokens;
    }

    // Manual trigger for processing (only owner)
    function triggerProcessing() external onlyOwner {
        require(_pendingLiquidityTokens > 0 || _pendingAirdropTokens > 0, "NP");
        require(holders.length > 0, "NH");
        try this.processLiquidityAndAirdrop() {
            // Process successful
        } catch {
            emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
        }
    }

    // Router için onayları yenile
    function refreshAllApprovals() external onlyOwner {
        // Router için onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Sonic token için onayları yenile
        try IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max) {
            emit ApprovalRefreshed(sonicToken, address(metropolisRouter), type(uint256).max);
        } catch {}
        
        // Likidite çifti için onayları yenile
        if (liquidityPair != address(0)) {
            try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(sonicToken, liquidityPair, type(uint256).max);
            } catch {}
            
            try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(address(this), liquidityPair, type(uint256).max);
            } catch {}
        }
    }

    // Manuel swap işlemi
    function manualSwap(uint256 tokenAmount) external onlyOwner nonReentrant {
        require(tokenAmount > 0, "Amount must be greater than 0");
        require(tokenAmount <= balanceOf(address(this)), "Insufficient balance");
        require(swapProxySet, "Swap proxy not set");
        
        // Swap işlemi
        uint256 ethReceived = _processSwap(tokenAmount);
        
        // Swap sonucunu kontrol et
        require(ethReceived > 0, "Swap failed, no ETH received");
        
        emit ManualSwapCompleted(tokenAmount, ethReceived);
    }

    // Treasury wallet'ı güncelleme fonksiyonu
    function setTreasuryWallet(address newTreasuryWallet) external onlyOwner {
        require(newTreasuryWallet != address(0), "ZA");
        
        address oldTreasury = treasuryWallet;
        treasuryWallet = newTreasuryWallet;
        
        emit TreasuryWalletUpdated(oldTreasury, newTreasuryWallet);
    }

    // Manuel likidite ve airdrop işlemi
    function manualLiquidityAndAirdrop(uint256 tokenAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(IERC20(address(this)).balanceOf(address(this)) >= tokenAmount, "IB");
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Swap işlemini gerçekleştir
        uint256 ethReceived = _processSwap(tokenAmount);
        
        if (ethReceived == 0) {
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            emit SwapFailed("No ETH received from swap");
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * LIQUIDITY_TAX / 100;
        uint256 ethForAirdrop = actualEthReceived * AIRDROP_TAX / 100;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokenAmount * LIQUIDITY_TAX / 100);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
    }

    // Kontratın ETH alabilmesi için receive fonksiyonu
    receive() external payable {
        // ETH alındığında event yayınla
        if (msg.value > 0) {
            emit ETHReceived(msg.sender, msg.value);
        }
    }

    // Swap proxy adresini ayarla
    function setSwapProxy(address _swapProxy) external onlyOwner {
        require(!swapProxySet, "Proxy already set");
        require(_swapProxy != address(0), "Invalid proxy address");
        swapProxy = _swapProxy;
        swapProxySet = true;
        emit SwapProxySet(_swapProxy);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"holdersCount","type":"uint256"}],"name":"AirdropDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"AirdropFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ApprovalRefreshed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"LiquidityAddFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"ManualSwapCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensForAirdrop","type":"uint256"}],"name":"ProcessStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxyAddress","type":"address"}],"name":"SwapProxySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethReceived","type":"uint256"}],"name":"SwapSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTreasury","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WaitingForTreasuryTransfer","type":"event"},{"inputs":[],"name":"addInitialLiquidityWithAllTokensAndETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"addInitialLiquidityWithWSonic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAirdropTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingLiquidityTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metropolisFactory","outputs":[{"internalType":"contract IMetropolisFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metropolisRouter","outputs":[{"internalType":"contract IMetropolisRouter","name":"","type":"address"}],"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":"processLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshAllApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapProxy","type":"address"}],"name":"setSwapProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxySet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"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":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000314565b5060046200006f828262000314565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c38162000171565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790559091620001673069d3c21bcecceda1000000620001c3565b5050505062000408565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002005760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b8060026000828254620002149190620003e0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200029b57607f821691505b602082108103620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026b57600081815260208120601f850160051c81016020861015620002eb5750805b601f850160051c820191505b818110156200030c57828155600101620002f7565b505050505050565b81516001600160401b0381111562000330576200033062000270565b620003488162000341845462000286565b84620002c2565b602080601f831160018114620003805760008415620003675750858301515b600019600386901b1c1916600185901b1785556200030c565b600085815260208120601f198616915b82811015620003b15788860151825594840194600190910190840162000390565b5085821015620003d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040257634e487b7160e01b600052601160045260246000fd5b92915050565b613a9680620004186000396000f3fe6080604052600436106102135760003560e01c8063808a545711610118578063c0d78655116100a0578063dd62ed3e1161006f578063dd62ed3e14610633578063e3a8fa5514610679578063ed9cacfe14610681578063f2fde38b14610696578063fd7c9fab146106b657600080fd5b8063c0d78655146105a3578063c84a705c146105c3578063d4d7b19a146105e3578063d720a2a81461061357600080fd5b8063975b87e8116100e7578063975b87e814610502578063a8602fea14610522578063a9059cbb14610542578063b70143c914610562578063b9276e4b1461058257600080fd5b8063808a54571461049a5780638129fc1c146104ba5780638da5cb5b146104cf57806395d89b41146104ed57600080fd5b80634626402b1161019b57806362b6327a1161016a57806362b6327a1461040a5780636ec4be901461042a57806370a08231146104505780637136982b146104705780637ac84fc11461048557600080fd5b80634626402b1461039357806357376198146103b35780635d76b04c146103d35780635fe8e7cc146103e857600080fd5b806323b872dd116101e257806323b872dd146102ea5780632a11ced01461030a578063313ce56714610342578063397883d21461035e578063461a3a951461037357600080fd5b806306fdde031461025b57806308dee2b414610286578063095ea7b3146102a557806318160ddd146102d557600080fd5b366102565734156102545760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b34801561026757600080fd5b506102706106d6565b60405161027d919061352c565b60405180910390f35b34801561029257600080fd5b50600e545b60405190815260200161027d565b3480156102b157600080fd5b506102c56102c0366004613574565b610768565b604051901515815260200161027d565b3480156102e157600080fd5b50600254610297565b3480156102f657600080fd5b506102c56103053660046135a0565b610782565b34801561031657600080fd5b5061032a6103253660046135e1565b6107a6565b6040516001600160a01b03909116815260200161027d565b34801561034e57600080fd5b506040516012815260200161027d565b34801561036a57600080fd5b506102546107d0565b34801561037f57600080fd5b5060095461032a906001600160a01b031681565b34801561039f57600080fd5b50600b5461032a906001600160a01b031681565b3480156103bf57600080fd5b506102546103ce366004613574565b6108ee565b3480156103df57600080fd5b50600f54610297565b3480156103f457600080fd5b506103fd6109ba565b60405161027d919061363e565b34801561041657600080fd5b5060075461032a906001600160a01b031681565b34801561043657600080fd5b5060105461032a906201000090046001600160a01b031681565b34801561045c57600080fd5b5061029761046b366004613658565b610a1b565b34801561047c57600080fd5b50600d54610297565b34801561049157600080fd5b50610254610a36565b3480156104a657600080fd5b50600a5461032a906001600160a01b031681565b3480156104c657600080fd5b50610254610da9565b3480156104db57600080fd5b506006546001600160a01b031661032a565b3480156104f957600080fd5b5061027061111f565b34801561050e57600080fd5b5061025461051d366004613675565b61112e565b34801561052e57600080fd5b5061025461053d366004613658565b611871565b34801561054e57600080fd5b506102c561055d366004613574565b611915565b34801561056e57600080fd5b5061025461057d3660046135e1565b611923565b34801561058e57600080fd5b506010546102c590600160b01b900460ff1681565b3480156105af57600080fd5b506102546105be366004613658565b611af0565b3480156105cf57600080fd5b506102546105de366004613658565b611b55565b3480156105ef57600080fd5b506102c56105fe366004613658565b600c6020526000908152604090205460ff1681565b34801561061f57600080fd5b5061025461062e3660046135e1565b611c5e565b34801561063f57600080fd5b5061029761064e366004613697565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610254611e30565b34801561068d57600080fd5b5061025461207e565b3480156106a257600080fd5b506102546106b1366004613658565b6122f7565b3480156106c257600080fd5b5060085461032a906001600160a01b031681565b6060600380546106e5906136d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610711906136d0565b801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b5050505050905090565b600033610776818585612343565b60019150505b92915050565b6000336107908582856123f5565b61079b85858561245d565b506001949350505050565b600d81815481106107b657600080fd5b6000918252602090912001546001600160a01b0316905081565b6107d8612783565b6000600e5411806107eb57506000600f54115b6108215760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108555760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610818565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561089057600080fd5b505af19250505080156108a1575060015b6108ec577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516108e3929190918252602082015260400190565b60405180910390a15b565b6108f6612783565b306001600160a01b038316036109335760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610818565b816001600160a01b031663a9059cbb6109546006546001600160a01b031690565b836040518363ffffffff1660e01b815260040161097292919061370a565b6020604051808303816000875af1158015610991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b59190613723565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561075e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f4575050505050905090565b6001600160a01b031660009081526020819052604090205490565b600260055403610a6d5760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555601054610100900460ff1615610aaf5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610818565b6010805461ff001916610100179055600e54600f5481158015610ad0575080155b15610ae75750506010805461ff0019169055610da2565b6000610af230610a1b565b90506000610b00838561375b565b905080821015610b7457600080516020613a41833981519152604051610b57906020808252601a908201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604082015260600190565b60405180910390a150506010805461ff001916905550610da29050565b68056bc75e2d631000006000610b8a858761375b565b905081811115610c3657600081610ba984670de0b6b3a764000061376e565b610bb39190613785565b9050670de0b6b3a7640000610bc8828961376e565b610bd29190613785565b9650670de0b6b3a7640000610be7828861376e565b610bf19190613785565b9550610bfd868861375b565b915086600e6000828254610c1191906137a7565b9250508190555085600f6000828254610c2a91906137a7565b90915550610c41915050565b6000600e819055600f555b60408051878152602081018790527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a1600754610c949030906001600160a01b0316600019612343565b476000610ca0836127d1565b905080600003610cc35750506010805461ff001916905550610da2945050505050565b47828111610d3657600080516020613a41833981519152604051610d149060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150506010805461ff001916905550610da295505050505050565b6000610d4284836137a7565b9050600085610d518c8461376e565b610d5b9190613785565b90506000610d6982846137a7565b90508115610d7b57610d7b828d612c45565b8015610d8a57610d8a81612ed1565b50506010805461ff0019169055505050505050505050505b6001600555565b610db1612783565b60105460ff1615610de95760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610818565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6c91906137ba565b600a80546001600160a01b0319166001600160a01b03929092169182179055610f28576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0791906137ba565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b0316610f655760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610818565b600754610f7f9030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610fb7929116906000199060040161370a565b6020604051808303816000875af1158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190613723565b61102b5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610818565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611063929116906000199060040161370a565b6020604051808303816000875af1158015611082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a69190613723565b50600a5460405163095ea7b360e01b8152309163095ea7b3916110d9916001600160a01b0316906000199060040161370a565b6020604051808303816000875af11580156110f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111c9190613723565b50565b6060600480546106e5906136d0565b611136612783565b600082116111565760405162461bcd60e51b8152600401610818906137d7565b6000811161118b5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610818565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa1580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec91906137f3565b101561121f5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b91906137f3565b10156112be5760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610818565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906112f29033903090869060040161380c565b6020604051808303816000875af1158015611311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113359190613723565b6113665760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610818565b60075461137e9030906001600160a01b031684612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926113b492911690859060040161370a565b6020604051808303816000875af11580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f79190613723565b506007546009546001600160a01b039182169163e8e33700913091168585600080336114254261025861375b565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156114bd575060408051601f3d908101601f191682019092526114ba91810190613830565b60015b611745576114c961385e565b806308c379a00361160c57506114dd6138b5565b806114e8575061160e565b6007546115019030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115389291169060009060040161370a565b6020604051808303816000875af1158015611557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157b9190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115ae903390869060040161370a565b6020604051808303816000875af11580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f19190613723565b508060405162461bcd60e51b8152600401610818919061352c565b505b6007546116279030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261165e9291169060009060040161370a565b6020604051808303816000875af115801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a19190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906116d4903390859060040161370a565b6020604051808303816000875af11580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190613723565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610818565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906137f3565b905080156109b55760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611828903390859060040161370a565b6020604051808303816000875af1158015611847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186b9190613723565b50505050565b611879612783565b6001600160a01b0381166118b45760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610818565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b60003361077681858561245d565b61192b612783565b6002600554036119625760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555806119b45760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610818565b6119bd30610a1b565b811115611a035760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610818565b601054600160b01b900460ff16611a515760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b6000611a5c826127d1565b905060008111611aae5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610818565b60408051838152602081018390527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a150506001600555565b611af8612783565b6001600160a01b038116611b335760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610818565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611b5d612783565b601054600160b01b900460ff1615611bab5760405162461bcd60e51b8152602060048201526011602482015270141c9bde1e48185b1c9958591e481cd95d607a1b6044820152606401610818565b6001600160a01b038116611bf95760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642070726f7879206164647265737360581b6044820152606401610818565b6010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b611c66612783565b60008111611c865760405162461bcd60e51b8152600401610818906137d7565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce791906137f3565b1015611d1a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b600754611d349030906001600160a01b0316600019612343565b476000611d40836127d1565b905080600003611d4f57505050565b47828111611dae57600080516020613a41833981519152604051611da09060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150505050565b6000611dba84836137a7565b905060006064611dcb60198461376e565b611dd59190613785565b905060006064611de660198561376e565b611df09190613785565b90508115611e1857611e18826064611e0960198b61376e565b611e139190613785565b612c45565b8015611e2757611e2781612ed1565b50505050505050565b611e38612783565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a91906137f3565b905060008111611ebc5760405162461bcd60e51b8152600401610818906137d7565b60003411611ef15760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610818565b600754611f099030906001600160a01b031683612343565b6007546001600160a01b031663f305d71934308460008033611f2d4261025861375b565b6040518863ffffffff1660e01b8152600401611f4e9695949392919061393f565b60606040518083038185885af193505050508015611f89575060408051601f3d908101601f19168201909252611f8691810190613830565b60015b61204057611f9561385e565b806308c379a003611ff95750611fa96138b5565b80611fb45750611ffb565b600754611fcd9030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f193505050501580156115f1573d6000803e3d6000fd5b505b6007546120149030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f19350505050158015611717573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b612086612783565b6007546120a09030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926120d8929116906000199060040161370a565b6020604051808303816000875af1925050508015612113575060408051601f3d908101601f1916820190925261211091810190613723565b60015b1561216957506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612160926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a546001600160a01b0316156108ec57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121b2929116906000199060040161370a565b6020604051808303816000875af19250505080156121ed575060408051601f3d908101601f191682019092526121ea91810190613723565b60015b156122435750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261223a926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612275916001600160a01b0316906000199060040161370a565b6020604051808303816000875af19250505080156122b0575060408051601f3d908101601f191682019092526122ad91810190613723565b60015b156108ec5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca916108e39130916001600160a01b0316906000199061380c565b6122ff612783565b6001600160a01b03811661233a5760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610818565b61111c8161319e565b6001600160a01b0383161580159061236357506001600160a01b03821615155b6123945760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610818565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054818110156124505760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610818565b61186b8484848403612343565b601054610100900460ff1615801561248357506006546001600160a01b03848116911614155b801561249d57506006546001600160a01b03838116911614155b80156124b257506001600160a01b0383163014155b80156124cb5750600a546001600160a01b038381169116145b1561274c57600060646124df60058461376e565b6124e99190613785565b9050801561274a576000606461250060198461376e565b61250a9190613785565b90506000606461251b60198561376e565b6125259190613785565b9050600061253384866137a7565b90506125408730866131f0565b61254b8787836131f0565b82600e600082825461255d919061375b565b9250508190555081600f6000828254612576919061375b565b9091555050600f54600e5468056bc75e2d63100000916802b5e3af16b1880000916125a1919061375b565b1061270d5780600f54600e546125b7919061375b565b1115612608577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516125fb929190918252602082015260400190565b60405180910390a161270d565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561264357600080fd5b505af1925050508015612654575060015b61270d5761266061385e565b806308c379a0036126aa57506126746138b5565b8061267f57506126ac565b600080516020613a418339815191528160405161269c919061352c565b60405180910390a15061270d565b505b600080516020613a418339815191526040516125fb906020808252602b908201527f556e6b6e6f776e206572726f7220696e2070726f636573734c6971756964697460408201526a079416e6441697264726f760ac1b606082015260800190565b61272a88678ac7230489e800006127238b610a1b565b10156132f5565b61274087678ac7230489e800006127238a610a1b565b5050505050505050565b505b6127578383836131f0565b61276d83678ac7230489e8000061272386610a1b565b6109b582678ac7230489e8000061272385610a1b565b336127966006546001600160a01b031690565b6001600160a01b0316146108ec5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610818565b6000816000036127e357506000919050565b601054600160b01b900460ff166128315760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106128665761286661397a565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e391906137ba565b816001815181106128f6576128f661397a565b6001600160a01b03928316602091820292909201015260075460009161291f9130911686612343565b600061292d42610e1061375b565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac94792612976928b9289928b9262010000909104909116908990600401613990565b600060405180830381600087803b15801561299057600080fd5b505af19250505080156129a1575060015b612a56576129ad61385e565b806308c379a0036129fe57506129c16138b5565b806129cc5750612a00565b600080516020613a41833981519152816040516129e9919061352c565b60405180910390a15060009695505050505050565b505b600080516020613a41833981519152604051612a42906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b60405180910390a150600095945050505050565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa657600080fd5b505af1925050508015612ab7575060015b612b7c57612ac361385e565b806308c379a003612b1c5750612ad76138b5565b80612ae25750612b1e565b600080516020613a4183398151915281604051602001612b0291906139cc565b60408051601f19818403018152908290526129e99161352c565b505b600080516020613a41833981519152604051612a429060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b476000612b8983836137a7565b90508015612bd55760408051898152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a1979650505050505050565b600080516020613a41833981519152604051612c2f9060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a1506000979650505050505050565b6000612c5030610a1b565b905081811015612cd7577fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612cca9060208082526028908201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f72206c604082015267697175696469747960c01b606082015260800190565b60405180910390a1505050565b60006064612ce581806137a7565b612cef908561376e565b612cf99190613785565b905060006064612d0981806137a7565b612d13908761376e565b612d1d9190613785565b600754909150612d389030906001600160a01b031686612343565b6007546001600160a01b031663f305d719863087868683612d5b42610e1061375b565b6040518863ffffffff1660e01b8152600401612d7c9695949392919061393f565b60606040518083038185885af193505050508015612db7575060408051601f3d908101601f19168201909252612db491810190613830565b60015b612e8d57612dc361385e565b806308c379a003612e1f5750612dd76138b5565b80612de25750612e21565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad81604051612e11919061352c565b60405180910390a150612eca565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612e80906020808252601b908201527f556e6b6e6f776e206c697175696469747920616464206572726f720000000000604082015260600190565b60405180910390a1612eca565b505060408051868152602081018890527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15b5050505050565b600d54801580612edf575081155b15612ee8575050565b60006064612ef784601961376e565b612f019190613785565b90506000612f0f82856137a7565b9050600082118015612f2b5750600b546001600160a01b031615155b15612ffc57600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612f7d576040519150601f19603f3d011682016040523d82523d6000602084013e612f82565b606091505b5050905080612ff6577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051612fea906020808252601c908201527f547265617375727920455448207472616e73666572206661696c656400000000604082015260600190565b60405180910390a18491505b50612fff565b50825b60008311801561300f5750600081115b156131685760006130208483613785565b905080156131665760005b84811015613164576000600d82815481106130485761304861397a565b6000918252602090912001546001600160a01b03169050801580159061307757506001600160a01b0381163014155b80156130915750600a546001600160a01b03828116911614155b15613151576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146130e3576040519150601f19603f3d011682016040523d82523d6000602084013e6130e8565b606091505b505090508061314f577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161314690602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b508061315c81613a11565b91505061302b565b505b505b60408051858152602081018590527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101611da0565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383161580159061321057506001600160a01b03821615155b6132415760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610818565b6001600160a01b0383166000908152602081905260409020548181101561328f5760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610818565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361186b565b600a546001600160a01b0383811691161480159061331c57506001600160a01b0382163014155b156135045780801561334757506001600160a01b0382166000908152600c602052604090205460ff16155b156133b357506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156133d957506001600160a01b0382166000908152600c602052604090205460ff165b15613504576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d548110156109b557826001600160a01b0316600d82815481106134265761342661397a565b6000918252602090912001546001600160a01b0316036134f257600d8054613450906001906137a7565b815481106134605761346061397a565b600091825260209091200154600d80546001600160a01b03909216918390811061348c5761348c61397a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d8054806134cb576134cb613a2a565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806134fc81613a11565b9150506133ff565b5050565b60005b8381101561352357818101518382015260200161350b565b50506000910152565b602081526000825180602084015261354b816040850160208701613508565b601f01601f19169190910160400192915050565b6001600160a01b038116811461111c57600080fd5b6000806040838503121561358757600080fd5b82356135928161355f565b946020939093013593505050565b6000806000606084860312156135b557600080fd5b83356135c08161355f565b925060208401356135d08161355f565b929592945050506040919091013590565b6000602082840312156135f357600080fd5b5035919050565b600081518084526020808501945080840160005b838110156136335781516001600160a01b03168752958201959082019060010161360e565b509495945050505050565b60208152600061365160208301846135fa565b9392505050565b60006020828403121561366a57600080fd5b81356136518161355f565b6000806040838503121561368857600080fd5b50508035926020909101359150565b600080604083850312156136aa57600080fd5b82356136b58161355f565b915060208301356136c58161355f565b809150509250929050565b600181811c908216806136e457607f821691505b60208210810361370457634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561373557600080fd5b8151801515811461365157600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561077c5761077c613745565b808202811582820484141761077c5761077c613745565b6000826137a257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561077c5761077c613745565b6000602082840312156137cc57600080fd5b81516136518161355f565b602080825260029082015261139560f21b604082015260600190565b60006020828403121561380557600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561384557600080fd5b8351925060208401519150604084015190509250925092565b600060033d11156138775760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff811182821017156138ae57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156138c35790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138f357505050505090565b828501915081518181111561390b5750505050505090565b843d87010160208285010111156139255750505050505090565b6139346020828601018761387a565b509095945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a0604082015260006139af60a08301866135fa565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a200000000000815260008251613a0481601b850160208701613508565b91909101601b0192915050565b600060018201613a2357613a23613745565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a2646970667358221220576b7eb94c4c881804a73f6f8e6b06b9e9f8c6a75ccc1d3cb95676af804f5a8c64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102135760003560e01c8063808a545711610118578063c0d78655116100a0578063dd62ed3e1161006f578063dd62ed3e14610633578063e3a8fa5514610679578063ed9cacfe14610681578063f2fde38b14610696578063fd7c9fab146106b657600080fd5b8063c0d78655146105a3578063c84a705c146105c3578063d4d7b19a146105e3578063d720a2a81461061357600080fd5b8063975b87e8116100e7578063975b87e814610502578063a8602fea14610522578063a9059cbb14610542578063b70143c914610562578063b9276e4b1461058257600080fd5b8063808a54571461049a5780638129fc1c146104ba5780638da5cb5b146104cf57806395d89b41146104ed57600080fd5b80634626402b1161019b57806362b6327a1161016a57806362b6327a1461040a5780636ec4be901461042a57806370a08231146104505780637136982b146104705780637ac84fc11461048557600080fd5b80634626402b1461039357806357376198146103b35780635d76b04c146103d35780635fe8e7cc146103e857600080fd5b806323b872dd116101e257806323b872dd146102ea5780632a11ced01461030a578063313ce56714610342578063397883d21461035e578063461a3a951461037357600080fd5b806306fdde031461025b57806308dee2b414610286578063095ea7b3146102a557806318160ddd146102d557600080fd5b366102565734156102545760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b34801561026757600080fd5b506102706106d6565b60405161027d919061352c565b60405180910390f35b34801561029257600080fd5b50600e545b60405190815260200161027d565b3480156102b157600080fd5b506102c56102c0366004613574565b610768565b604051901515815260200161027d565b3480156102e157600080fd5b50600254610297565b3480156102f657600080fd5b506102c56103053660046135a0565b610782565b34801561031657600080fd5b5061032a6103253660046135e1565b6107a6565b6040516001600160a01b03909116815260200161027d565b34801561034e57600080fd5b506040516012815260200161027d565b34801561036a57600080fd5b506102546107d0565b34801561037f57600080fd5b5060095461032a906001600160a01b031681565b34801561039f57600080fd5b50600b5461032a906001600160a01b031681565b3480156103bf57600080fd5b506102546103ce366004613574565b6108ee565b3480156103df57600080fd5b50600f54610297565b3480156103f457600080fd5b506103fd6109ba565b60405161027d919061363e565b34801561041657600080fd5b5060075461032a906001600160a01b031681565b34801561043657600080fd5b5060105461032a906201000090046001600160a01b031681565b34801561045c57600080fd5b5061029761046b366004613658565b610a1b565b34801561047c57600080fd5b50600d54610297565b34801561049157600080fd5b50610254610a36565b3480156104a657600080fd5b50600a5461032a906001600160a01b031681565b3480156104c657600080fd5b50610254610da9565b3480156104db57600080fd5b506006546001600160a01b031661032a565b3480156104f957600080fd5b5061027061111f565b34801561050e57600080fd5b5061025461051d366004613675565b61112e565b34801561052e57600080fd5b5061025461053d366004613658565b611871565b34801561054e57600080fd5b506102c561055d366004613574565b611915565b34801561056e57600080fd5b5061025461057d3660046135e1565b611923565b34801561058e57600080fd5b506010546102c590600160b01b900460ff1681565b3480156105af57600080fd5b506102546105be366004613658565b611af0565b3480156105cf57600080fd5b506102546105de366004613658565b611b55565b3480156105ef57600080fd5b506102c56105fe366004613658565b600c6020526000908152604090205460ff1681565b34801561061f57600080fd5b5061025461062e3660046135e1565b611c5e565b34801561063f57600080fd5b5061029761064e366004613697565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610254611e30565b34801561068d57600080fd5b5061025461207e565b3480156106a257600080fd5b506102546106b1366004613658565b6122f7565b3480156106c257600080fd5b5060085461032a906001600160a01b031681565b6060600380546106e5906136d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610711906136d0565b801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b5050505050905090565b600033610776818585612343565b60019150505b92915050565b6000336107908582856123f5565b61079b85858561245d565b506001949350505050565b600d81815481106107b657600080fd5b6000918252602090912001546001600160a01b0316905081565b6107d8612783565b6000600e5411806107eb57506000600f54115b6108215760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108555760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610818565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561089057600080fd5b505af19250505080156108a1575060015b6108ec577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516108e3929190918252602082015260400190565b60405180910390a15b565b6108f6612783565b306001600160a01b038316036109335760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610818565b816001600160a01b031663a9059cbb6109546006546001600160a01b031690565b836040518363ffffffff1660e01b815260040161097292919061370a565b6020604051808303816000875af1158015610991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b59190613723565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561075e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f4575050505050905090565b6001600160a01b031660009081526020819052604090205490565b600260055403610a6d5760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555601054610100900460ff1615610aaf5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610818565b6010805461ff001916610100179055600e54600f5481158015610ad0575080155b15610ae75750506010805461ff0019169055610da2565b6000610af230610a1b565b90506000610b00838561375b565b905080821015610b7457600080516020613a41833981519152604051610b57906020808252601a908201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604082015260600190565b60405180910390a150506010805461ff001916905550610da29050565b68056bc75e2d631000006000610b8a858761375b565b905081811115610c3657600081610ba984670de0b6b3a764000061376e565b610bb39190613785565b9050670de0b6b3a7640000610bc8828961376e565b610bd29190613785565b9650670de0b6b3a7640000610be7828861376e565b610bf19190613785565b9550610bfd868861375b565b915086600e6000828254610c1191906137a7565b9250508190555085600f6000828254610c2a91906137a7565b90915550610c41915050565b6000600e819055600f555b60408051878152602081018790527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a1600754610c949030906001600160a01b0316600019612343565b476000610ca0836127d1565b905080600003610cc35750506010805461ff001916905550610da2945050505050565b47828111610d3657600080516020613a41833981519152604051610d149060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150506010805461ff001916905550610da295505050505050565b6000610d4284836137a7565b9050600085610d518c8461376e565b610d5b9190613785565b90506000610d6982846137a7565b90508115610d7b57610d7b828d612c45565b8015610d8a57610d8a81612ed1565b50506010805461ff0019169055505050505050505050505b6001600555565b610db1612783565b60105460ff1615610de95760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610818565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6c91906137ba565b600a80546001600160a01b0319166001600160a01b03929092169182179055610f28576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0791906137ba565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b0316610f655760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610818565b600754610f7f9030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610fb7929116906000199060040161370a565b6020604051808303816000875af1158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190613723565b61102b5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610818565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611063929116906000199060040161370a565b6020604051808303816000875af1158015611082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a69190613723565b50600a5460405163095ea7b360e01b8152309163095ea7b3916110d9916001600160a01b0316906000199060040161370a565b6020604051808303816000875af11580156110f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111c9190613723565b50565b6060600480546106e5906136d0565b611136612783565b600082116111565760405162461bcd60e51b8152600401610818906137d7565b6000811161118b5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610818565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa1580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec91906137f3565b101561121f5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b91906137f3565b10156112be5760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610818565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906112f29033903090869060040161380c565b6020604051808303816000875af1158015611311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113359190613723565b6113665760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610818565b60075461137e9030906001600160a01b031684612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926113b492911690859060040161370a565b6020604051808303816000875af11580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f79190613723565b506007546009546001600160a01b039182169163e8e33700913091168585600080336114254261025861375b565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156114bd575060408051601f3d908101601f191682019092526114ba91810190613830565b60015b611745576114c961385e565b806308c379a00361160c57506114dd6138b5565b806114e8575061160e565b6007546115019030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115389291169060009060040161370a565b6020604051808303816000875af1158015611557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157b9190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115ae903390869060040161370a565b6020604051808303816000875af11580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f19190613723565b508060405162461bcd60e51b8152600401610818919061352c565b505b6007546116279030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261165e9291169060009060040161370a565b6020604051808303816000875af115801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a19190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906116d4903390859060040161370a565b6020604051808303816000875af11580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190613723565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610818565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906137f3565b905080156109b55760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611828903390859060040161370a565b6020604051808303816000875af1158015611847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186b9190613723565b50505050565b611879612783565b6001600160a01b0381166118b45760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610818565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b60003361077681858561245d565b61192b612783565b6002600554036119625760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555806119b45760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610818565b6119bd30610a1b565b811115611a035760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610818565b601054600160b01b900460ff16611a515760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b6000611a5c826127d1565b905060008111611aae5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610818565b60408051838152602081018390527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a150506001600555565b611af8612783565b6001600160a01b038116611b335760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610818565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611b5d612783565b601054600160b01b900460ff1615611bab5760405162461bcd60e51b8152602060048201526011602482015270141c9bde1e48185b1c9958591e481cd95d607a1b6044820152606401610818565b6001600160a01b038116611bf95760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642070726f7879206164647265737360581b6044820152606401610818565b6010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b611c66612783565b60008111611c865760405162461bcd60e51b8152600401610818906137d7565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce791906137f3565b1015611d1a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b600754611d349030906001600160a01b0316600019612343565b476000611d40836127d1565b905080600003611d4f57505050565b47828111611dae57600080516020613a41833981519152604051611da09060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150505050565b6000611dba84836137a7565b905060006064611dcb60198461376e565b611dd59190613785565b905060006064611de660198561376e565b611df09190613785565b90508115611e1857611e18826064611e0960198b61376e565b611e139190613785565b612c45565b8015611e2757611e2781612ed1565b50505050505050565b611e38612783565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a91906137f3565b905060008111611ebc5760405162461bcd60e51b8152600401610818906137d7565b60003411611ef15760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610818565b600754611f099030906001600160a01b031683612343565b6007546001600160a01b031663f305d71934308460008033611f2d4261025861375b565b6040518863ffffffff1660e01b8152600401611f4e9695949392919061393f565b60606040518083038185885af193505050508015611f89575060408051601f3d908101601f19168201909252611f8691810190613830565b60015b61204057611f9561385e565b806308c379a003611ff95750611fa96138b5565b80611fb45750611ffb565b600754611fcd9030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f193505050501580156115f1573d6000803e3d6000fd5b505b6007546120149030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f19350505050158015611717573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b612086612783565b6007546120a09030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926120d8929116906000199060040161370a565b6020604051808303816000875af1925050508015612113575060408051601f3d908101601f1916820190925261211091810190613723565b60015b1561216957506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612160926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a546001600160a01b0316156108ec57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121b2929116906000199060040161370a565b6020604051808303816000875af19250505080156121ed575060408051601f3d908101601f191682019092526121ea91810190613723565b60015b156122435750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261223a926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612275916001600160a01b0316906000199060040161370a565b6020604051808303816000875af19250505080156122b0575060408051601f3d908101601f191682019092526122ad91810190613723565b60015b156108ec5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca916108e39130916001600160a01b0316906000199061380c565b6122ff612783565b6001600160a01b03811661233a5760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610818565b61111c8161319e565b6001600160a01b0383161580159061236357506001600160a01b03821615155b6123945760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610818565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054818110156124505760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610818565b61186b8484848403612343565b601054610100900460ff1615801561248357506006546001600160a01b03848116911614155b801561249d57506006546001600160a01b03838116911614155b80156124b257506001600160a01b0383163014155b80156124cb5750600a546001600160a01b038381169116145b1561274c57600060646124df60058461376e565b6124e99190613785565b9050801561274a576000606461250060198461376e565b61250a9190613785565b90506000606461251b60198561376e565b6125259190613785565b9050600061253384866137a7565b90506125408730866131f0565b61254b8787836131f0565b82600e600082825461255d919061375b565b9250508190555081600f6000828254612576919061375b565b9091555050600f54600e5468056bc75e2d63100000916802b5e3af16b1880000916125a1919061375b565b1061270d5780600f54600e546125b7919061375b565b1115612608577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516125fb929190918252602082015260400190565b60405180910390a161270d565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561264357600080fd5b505af1925050508015612654575060015b61270d5761266061385e565b806308c379a0036126aa57506126746138b5565b8061267f57506126ac565b600080516020613a418339815191528160405161269c919061352c565b60405180910390a15061270d565b505b600080516020613a418339815191526040516125fb906020808252602b908201527f556e6b6e6f776e206572726f7220696e2070726f636573734c6971756964697460408201526a079416e6441697264726f760ac1b606082015260800190565b61272a88678ac7230489e800006127238b610a1b565b10156132f5565b61274087678ac7230489e800006127238a610a1b565b5050505050505050565b505b6127578383836131f0565b61276d83678ac7230489e8000061272386610a1b565b6109b582678ac7230489e8000061272385610a1b565b336127966006546001600160a01b031690565b6001600160a01b0316146108ec5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610818565b6000816000036127e357506000919050565b601054600160b01b900460ff166128315760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106128665761286661397a565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e391906137ba565b816001815181106128f6576128f661397a565b6001600160a01b03928316602091820292909201015260075460009161291f9130911686612343565b600061292d42610e1061375b565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac94792612976928b9289928b9262010000909104909116908990600401613990565b600060405180830381600087803b15801561299057600080fd5b505af19250505080156129a1575060015b612a56576129ad61385e565b806308c379a0036129fe57506129c16138b5565b806129cc5750612a00565b600080516020613a41833981519152816040516129e9919061352c565b60405180910390a15060009695505050505050565b505b600080516020613a41833981519152604051612a42906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b60405180910390a150600095945050505050565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa657600080fd5b505af1925050508015612ab7575060015b612b7c57612ac361385e565b806308c379a003612b1c5750612ad76138b5565b80612ae25750612b1e565b600080516020613a4183398151915281604051602001612b0291906139cc565b60408051601f19818403018152908290526129e99161352c565b505b600080516020613a41833981519152604051612a429060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b476000612b8983836137a7565b90508015612bd55760408051898152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a1979650505050505050565b600080516020613a41833981519152604051612c2f9060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a1506000979650505050505050565b6000612c5030610a1b565b905081811015612cd7577fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612cca9060208082526028908201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f72206c604082015267697175696469747960c01b606082015260800190565b60405180910390a1505050565b60006064612ce581806137a7565b612cef908561376e565b612cf99190613785565b905060006064612d0981806137a7565b612d13908761376e565b612d1d9190613785565b600754909150612d389030906001600160a01b031686612343565b6007546001600160a01b031663f305d719863087868683612d5b42610e1061375b565b6040518863ffffffff1660e01b8152600401612d7c9695949392919061393f565b60606040518083038185885af193505050508015612db7575060408051601f3d908101601f19168201909252612db491810190613830565b60015b612e8d57612dc361385e565b806308c379a003612e1f5750612dd76138b5565b80612de25750612e21565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad81604051612e11919061352c565b60405180910390a150612eca565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612e80906020808252601b908201527f556e6b6e6f776e206c697175696469747920616464206572726f720000000000604082015260600190565b60405180910390a1612eca565b505060408051868152602081018890527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15b5050505050565b600d54801580612edf575081155b15612ee8575050565b60006064612ef784601961376e565b612f019190613785565b90506000612f0f82856137a7565b9050600082118015612f2b5750600b546001600160a01b031615155b15612ffc57600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612f7d576040519150601f19603f3d011682016040523d82523d6000602084013e612f82565b606091505b5050905080612ff6577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051612fea906020808252601c908201527f547265617375727920455448207472616e73666572206661696c656400000000604082015260600190565b60405180910390a18491505b50612fff565b50825b60008311801561300f5750600081115b156131685760006130208483613785565b905080156131665760005b84811015613164576000600d82815481106130485761304861397a565b6000918252602090912001546001600160a01b03169050801580159061307757506001600160a01b0381163014155b80156130915750600a546001600160a01b03828116911614155b15613151576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146130e3576040519150601f19603f3d011682016040523d82523d6000602084013e6130e8565b606091505b505090508061314f577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161314690602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b508061315c81613a11565b91505061302b565b505b505b60408051858152602081018590527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101611da0565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383161580159061321057506001600160a01b03821615155b6132415760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610818565b6001600160a01b0383166000908152602081905260409020548181101561328f5760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610818565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361186b565b600a546001600160a01b0383811691161480159061331c57506001600160a01b0382163014155b156135045780801561334757506001600160a01b0382166000908152600c602052604090205460ff16155b156133b357506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156133d957506001600160a01b0382166000908152600c602052604090205460ff165b15613504576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d548110156109b557826001600160a01b0316600d82815481106134265761342661397a565b6000918252602090912001546001600160a01b0316036134f257600d8054613450906001906137a7565b815481106134605761346061397a565b600091825260209091200154600d80546001600160a01b03909216918390811061348c5761348c61397a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d8054806134cb576134cb613a2a565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806134fc81613a11565b9150506133ff565b5050565b60005b8381101561352357818101518382015260200161350b565b50506000910152565b602081526000825180602084015261354b816040850160208701613508565b601f01601f19169190910160400192915050565b6001600160a01b038116811461111c57600080fd5b6000806040838503121561358757600080fd5b82356135928161355f565b946020939093013593505050565b6000806000606084860312156135b557600080fd5b83356135c08161355f565b925060208401356135d08161355f565b929592945050506040919091013590565b6000602082840312156135f357600080fd5b5035919050565b600081518084526020808501945080840160005b838110156136335781516001600160a01b03168752958201959082019060010161360e565b509495945050505050565b60208152600061365160208301846135fa565b9392505050565b60006020828403121561366a57600080fd5b81356136518161355f565b6000806040838503121561368857600080fd5b50508035926020909101359150565b600080604083850312156136aa57600080fd5b82356136b58161355f565b915060208301356136c58161355f565b809150509250929050565b600181811c908216806136e457607f821691505b60208210810361370457634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561373557600080fd5b8151801515811461365157600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561077c5761077c613745565b808202811582820484141761077c5761077c613745565b6000826137a257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561077c5761077c613745565b6000602082840312156137cc57600080fd5b81516136518161355f565b602080825260029082015261139560f21b604082015260600190565b60006020828403121561380557600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561384557600080fd5b8351925060208401519150604084015190509250925092565b600060033d11156138775760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff811182821017156138ae57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156138c35790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138f357505050505090565b828501915081518181111561390b5750505050505090565b843d87010160208285010111156139255750505050505090565b6139346020828601018761387a565b509095945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a0604082015260006139af60a08301866135fa565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a200000000000815260008251613a0481601b850160208701613508565b91909101601b0192915050565b600060018201613a2357613a23613745565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a2646970667358221220576b7eb94c4c881804a73f6f8e6b06b9e9f8c6a75ccc1d3cb95676af804f5a8c64736f6c63430008110033

Deployed Bytecode Sourcemap

9170:26603:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35344:9;:13;35340:85;;35379:34;;35403:9;160:25:1;;35391:10:0;;35379:34;;148:2:1;133:18;35379:34:0;;;;;;;35340:85;9170:26603;;;;;2801:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30945:118;;;;;;;;;;-1:-1:-1;31032:23:0;;30945:118;;;160:25:1;;;148:2;133:18;30945:118:0;14:177:1;3668:190:0;;;;;;;;;;-1:-1:-1;3668:190:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;3668:190:0;1308:187:1;3095:99:0;;;;;;;;;;-1:-1:-1;3174:12:0;;3095:99;;3866:250;;;;;;;;;;-1:-1:-1;3866:250:0;;;;;:::i;:::-;;:::i;10273:24::-;;;;;;;;;;-1:-1:-1;10273:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2310:32:1;;;2292:51;;2280:2;2265:18;10273:24:0;2146:203:1;3003:84:0;;;;;;;;;;-1:-1:-1;3003:84:0;;3077:2;2496:36:1;;2484:2;2469:18;3003:84:0;2354:184:1;31244:378:0;;;;;;;;;;;;;:::i;10097:25::-;;;;;;;;;;-1:-1:-1;10097:25:0;;;;-1:-1:-1;;;;;10097:25:0;;;10164:29;;;;;;;;;;-1:-1:-1;10164:29:0;;;;-1:-1:-1;;;;;10164:29:0;;;30711:183;;;;;;;;;;-1:-1:-1;30711:183:0;;;;;:::i;:::-;;:::i;31071:114::-;;;;;;;;;;-1:-1:-1;31156:21:0;;31071:114;;26714:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9999:41::-;;;;;;;;;;-1:-1:-1;9999:41:0;;;;-1:-1:-1;;;;;9999:41:0;;;11321:24;;;;;;;;;;-1:-1:-1;11321:24:0;;;;;;;-1:-1:-1;;;;;11321:24:0;;;3202:118;;;;;;;;;;-1:-1:-1;3202:118:0;;;;;:::i;:::-;;:::i;26604:98::-;;;;;;;;;;-1:-1:-1;26680:7:0;:14;26604:98;;17272:3360;;;;;;;;;;;;;:::i;10129:28::-;;;;;;;;;;-1:-1:-1;10129:28:0;;;;-1:-1:-1;;;;;10129:28:0;;;12195:836;;;;;;;;;;;;;:::i;1789:87::-;;;;;;;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;1862:6:0;1789:87;;2900:95;;;;;;;;;;;;;:::i;26865:2260::-;;;;;;;;;;-1:-1:-1;26865:2260:0;;;;;:::i;:::-;;:::i;33284:319::-;;;;;;;;;;-1:-1:-1;33284:319:0;;;;;:::i;:::-;;:::i;3328:182::-;;;;;;;;;;-1:-1:-1;3328:182:0;;;;;:::i;:::-;;:::i;32662:564::-;;;;;;;;;;-1:-1:-1;32662:564:0;;;;;:::i;:::-;;:::i;11352:24::-;;;;;;;;;;-1:-1:-1;11352:24:0;;;;-1:-1:-1;;;11352:24:0;;;;;;30537:166;;;;;;;;;;-1:-1:-1;30537:166:0;;;;;:::i;:::-;;:::i;35475:295::-;;;;;;;;;;-1:-1:-1;35475:295:0;;;;;:::i;:::-;;:::i;10226:40::-;;;;;;;;;;-1:-1:-1;10226:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33654:1534;;;;;;;;;;-1:-1:-1;33654:1534:0;;;;;:::i;:::-;;:::i;3518:142::-;;;;;;;;;;-1:-1:-1;3518:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;3625:18:0;;;3598:7;3625:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3518:142;29210:1319;;;:::i;31668:958::-;;;;;;;;;;;;;:::i;1992:165::-;;;;;;;;;;-1:-1:-1;1992:165:0;;;;;:::i;:::-;;:::i;10047:43::-;;;;;;;;;;-1:-1:-1;10047:43:0;;;;-1:-1:-1;;;;;10047:43:0;;;2801:91;2846:13;2879:5;2872:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2801:91;:::o;3668:190::-;3742:4;3775:10;3796:32;3775:10;3812:7;3821:6;3796:8;:32::i;:::-;3846:4;3839:11;;;3668:190;;;;;:::o;3866:250::-;3954:4;3989:10;4010:38;4026:4;3989:10;4041:6;4010:15;:38::i;:::-;4059:27;4069:4;4075:2;4079:6;4059:9;:27::i;:::-;-1:-1:-1;4104:4:0;;3866:250;-1:-1:-1;;;;3866:250:0:o;10273:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10273:24:0;;-1:-1:-1;10273:24:0;:::o;31244:378::-;1748:13;:11;:13::i;:::-;31337:1:::1;31311:23;;:27;:56;;;;31366:1;31342:21;;:25;31311:56;31303:71;;;::::0;-1:-1:-1;;;31303:71:0;;5227:2:1;31303:71:0::1;::::0;::::1;5209:21:1::0;5266:1;5246:18;;;5239:29;-1:-1:-1;;;5284:18:1;;;5277:32;5326:18;;31303:71:0::1;;;;;;;;;31393:7;:14:::0;31385:33:::1;;;::::0;-1:-1:-1;;;31385:33:0;;5557:2:1;31385:33:0::1;::::0;::::1;5539:21:1::0;5596:1;5576:18;;;5569:29;-1:-1:-1;;;5614:18:1;;;5607:32;5656:18;;31385:33:0::1;5355:325:1::0;31385:33:0::1;31433:4;-1:-1:-1::0;;;;;31433:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;31429:186;;31541:62;31556:23;;31581:21;;31541:62;;;;;;5859:25:1::0;;;5915:2;5900:18;;5893:34;5847:2;5832:18;;5685:248;31541:62:0::1;;;;;;;;31429:186;31244:378::o:0;30711:183::-;1748:13;:11;:13::i;:::-;30822:4:::1;-1:-1:-1::0;;;;;30804:23:0;::::1;::::0;30796:38:::1;;;::::0;-1:-1:-1;;;30796:38:0;;6140:2:1;30796:38:0::1;::::0;::::1;6122:21:1::0;6179:1;6159:18;;;6152:29;-1:-1:-1;;;6197:18:1;;;6190:32;6239:18;;30796:38:0::1;5938:325:1::0;30796:38:0::1;30852:6;-1:-1:-1::0;;;;;30845:23:0::1;;30869:7;1862:6:::0;;-1:-1:-1;;;;;1862:6:0;;1789:87;30869:7:::1;30878;30845:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30711:183:::0;;:::o;26714:96::-;26759:16;26795:7;26788:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26788:14:0;;;;;;;;;;;;;;;;;;;;;;26714:96;:::o;3202:118::-;-1:-1:-1;;;;;3294:18:0;3267:7;3294:18;;;;;;;;;;;;3202:118::o;17272:3360::-;1042:1;1188:7;;:19;1180:34;;;;-1:-1:-1;;;1180:34:0;;7031:2:1;1180:34:0;;;7013:21:1;7070:1;7050:18;;;7043:29;-1:-1:-1;;;7088:18:1;;;7081:32;7130:18;;1180:34:0;6829:325:1;1180:34:0;1042:1;1225:7;:18;17352:7:::1;::::0;::::1;::::0;::::1;;;17351:8;17343:23;;;::::0;-1:-1:-1;;;17343:23:0;;7361:2:1;17343:23:0::1;::::0;::::1;7343:21:1::0;7400:1;7380:18;;;7373:29;-1:-1:-1;;;7418:18:1;;;7411:32;7460:18;;17343:23:0::1;7159:325:1::0;17343:23:0::1;17377:7;:14:::0;;-1:-1:-1;;17377:14:0::1;;;::::0;;17441:23:::1;::::0;17502:21:::1;::::0;17548:23;;:48;::::1;;;-1:-1:-1::0;17575:21:0;;17548:48:::1;17544:117;;;-1:-1:-1::0;;17613:7:0::1;:15:::0;;-1:-1:-1;;17613:15:0::1;::::0;;17643:7:::1;;17544:117;17732:28;17763:24;17781:4;17763:9;:24::i;:::-;17732:55:::0;-1:-1:-1;17798:28:0::1;17829:37;17850:16:::0;17829:18;:37:::1;:::i;:::-;17798:68;;17914:20;17891;:43;17887:172;;;-1:-1:-1::0;;;;;;;;;;;17956:40:0::1;;;;7953:2:1::0;7935:21;;;7992:2;7972:18;;;7965:30;8031:28;8026:2;8011:18;;8004:56;8092:2;8077:18;;7751:350;17956:40:0::1;;;;;;;;-1:-1:-1::0;;18011:7:0::1;:15:::0;;-1:-1:-1;;18011:15:0::1;::::0;;-1:-1:-1;18041:7:0::1;::::0;-1:-1:-1;18041:7:0::1;17887:172;18156:12;18129:24;18263:37;18284:16:::0;18263:18;:37:::1;:::i;:::-;18235:65;;18434:16;18414:17;:36;18410:694;;;18498:13;18540:17:::0;18514:23:::1;:16:::0;18533:4:::1;18514:23;:::i;:::-;:43;;;;:::i;:::-;18498:59:::0;-1:-1:-1;18622:4:0::1;18593:26;18498:59:::0;18593:18;:26:::1;:::i;:::-;:33;;;;:::i;:::-;18572:54:::0;-1:-1:-1;18687:4:0::1;18660:24;18679:5:::0;18660:16;:24:::1;:::i;:::-;:31;;;;:::i;:::-;18641:50:::0;-1:-1:-1;18726:37:0::1;18641:50:::0;18726:18;:37:::1;:::i;:::-;18706:57;;18866:18;18839:23;;:45;;;;;;;:::i;:::-;;;;;;;;18924:16;18899:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;18410:694:0::1;::::0;-1:-1:-1;;18410:694:0::1;;19051:1;19025:23;:27:::0;;;19067:21:::1;:25:::0;18410:694:::1;19129:52;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;19129:52:0::1;::::0;5832:18:1;19129:52:0::1;;;;;;;19264:16;::::0;19232:69:::1;::::0;19249:4:::1;::::0;-1:-1:-1;;;;;19264:16:0::1;-1:-1:-1::0;;19232:8:0::1;:69::i;:::-;19397:21;19369:25;19519:31;19532:17:::0;19519:12:::1;:31::i;:::-;19497:53;;19575:11;19590:1;19575:16:::0;19571:85:::1;;-1:-1:-1::0;;19608:7:0::1;:15:::0;;-1:-1:-1;;19608:15:0::1;::::0;;-1:-1:-1;19638:7:0::1;::::0;-1:-1:-1;;;;;19638:7:0::1;19571:85;19754:21;19790:39:::0;;::::1;19786:167;;-1:-1:-1::0;;;;;;;;;;;19851:39:0::1;;;;8836:2:1::0;8818:21;;;8875:2;8855:18;;;8848:30;-1:-1:-1;;;8909:2:1;8894:18;;8887:55;8974:2;8959:18;;8634:349;19851:39:0::1;;;;;;;;-1:-1:-1::0;;19905:7:0::1;:15:::0;;-1:-1:-1;;19905:15:0::1;::::0;;-1:-1:-1;19935:7:0::1;::::0;-1:-1:-1;;;;;;19935:7:0::1;19786:167;20017:25;20045:38;20066:17:::0;20045:18;:38:::1;:::i;:::-;20017:66:::0;-1:-1:-1;20134:23:0::1;20201:17:::0;20160:38:::1;20180:18:::0;20017:66;20160:38:::1;:::i;:::-;:58;;;;:::i;:::-;20134:84:::0;-1:-1:-1;20229:21:0::1;20253:35;20134:84:::0;20253:17;:35:::1;:::i;:::-;20229:59:::0;-1:-1:-1;20347:19:0;;20343:102:::1;;20383:50;20397:15;20414:18;20383:13;:50::i;:::-;20506:17:::0;;20502:87:::1;;20540:37;20563:13;20540:22;:37::i;:::-;-1:-1:-1::0;;20609:7:0::1;:15:::0;;-1:-1:-1;;20609:15:0::1;::::0;;-1:-1:-1;;;;;;;;;;1254:1:0::1;998::::0;1266:7;:22;17272:3360::o;12195:836::-;1748:13;:11;:13::i;:::-;12256:12:::1;::::0;::::1;;12255:13;12247:28;;;::::0;-1:-1:-1;;;12247:28:0;;9190:2:1;12247:28:0::1;::::0;::::1;9172:21:1::0;9229:1;9209:18;;;9202:29;-1:-1:-1;;;9247:18:1;;;9240:32;9289:18;;12247:28:0::1;8988:325:1::0;12247:28:0::1;12286:12;:19:::0;;-1:-1:-1;;12286:19:0::1;12301:4;12286:19;::::0;;12377:17:::1;::::0;12418:10:::1;::::0;12377:52:::1;::::0;-1:-1:-1;;;12377:52:0;;12411:4:::1;12377:52;::::0;::::1;9530:34:1::0;-1:-1:-1;;;;;12418:10:0;;::::1;9580:18:1::0;;;9573:43;12377:17:0;::::1;::::0;:25:::1;::::0;9465:18:1;;12377:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12361:13;:68:::0;;-1:-1:-1;;;;;;12361:68:0::1;-1:-1:-1::0;;;;;12361:68:0;;;::::1;::::0;;::::1;::::0;;12495:131:::1;;12559:17;::::0;12603:10:::1;::::0;12559:55:::1;::::0;-1:-1:-1;;;12559:55:0;;12596:4:::1;12559:55;::::0;::::1;9530:34:1::0;-1:-1:-1;;;;;12603:10:0;;::::1;9580:18:1::0;;;9573:43;12559:17:0;::::1;::::0;:28:::1;::::0;9465:18:1;;12559:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12543:13;:71:::0;;-1:-1:-1;;;;;;12543:71:0::1;-1:-1:-1::0;;;;;12543:71:0;;;::::1;::::0;;;::::1;::::0;;12495:131:::1;12654:13;::::0;-1:-1:-1;;;;;12654:13:0::1;12646:42;;;::::0;-1:-1:-1;;;12646:42:0;;10085:2:1;12646:42:0::1;::::0;::::1;10067:21:1::0;10124:1;10104:18;;;10097:29;-1:-1:-1;;;10142:18:1;;;10135:32;10184:18;;12646:42:0::1;9883:325:1::0;12646:42:0::1;12733:16;::::0;12701:69:::1;::::0;12718:4:::1;::::0;-1:-1:-1;;;;;12733:16:0::1;-1:-1:-1::0;;12701:8:0::1;:69::i;:::-;12806:10;::::0;12834:16:::1;::::0;12799:72:::1;::::0;-1:-1:-1;;;12799:72:0;;-1:-1:-1;;;;;12806:10:0;;::::1;::::0;12799:26:::1;::::0;:72:::1;::::0;12834:16;::::1;::::0;-1:-1:-1;;12853:17:0;12799:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12791:87;;;::::0;-1:-1:-1;;;12791:87:0;;10415:2:1;12791:87:0::1;::::0;::::1;10397:21:1::0;10454:1;10434:18;;;10427:29;-1:-1:-1;;;10472:18:1;;;10465:32;10514:18;;12791:87:0::1;10213:325:1::0;12791:87:0::1;12896:10;::::0;12916:13:::1;::::0;12889:60:::1;::::0;-1:-1:-1;;;12889:60:0;;-1:-1:-1;;;;;12896:10:0;;::::1;::::0;12889:26:::1;::::0;:60:::1;::::0;12916:13;::::1;::::0;-1:-1:-1;;12931:17:0;12889:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12990:13:0::1;::::0;12960:63:::1;::::0;-1:-1:-1;;;12960:63:0;;12975:4:::1;::::0;12960:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;12990:13:0::1;::::0;-1:-1:-1;;13005:17:0;12960:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12195:836::o:0;2900:95::-;2947:13;2980:7;2973:14;;;;;:::i;26865:2260::-;1748:13;:11;:13::i;:::-;26998:1:::1;26984:11;:15;26976:30;;;;-1:-1:-1::0;;;26976:30:0::1;;;;;;;:::i;:::-;27039:1;27025:11;:15;27017:30;;;::::0;-1:-1:-1;;;27017:30:0;;11075:2:1;27017:30:0::1;::::0;::::1;11057:21:1::0;11114:1;11094:18;;;11087:29;-1:-1:-1;;;11132:18:1;;;11125:32;11174:18;;27017:30:0::1;10873:325:1::0;27017:30:0::1;27090:46;::::0;-1:-1:-1;;;27090:46:0;;27105:4:::1;27090:46;::::0;::::1;2292:51:1::0;;;27140:11:0;;27090:31:::1;::::0;2265:18:1;;27090:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;27068:113;;;::::0;-1:-1:-1;;;27068:113:0;;11594:2:1;27068:113:0::1;::::0;::::1;11576:21:1::0;11633:1;11613:18;;;11606:29;-1:-1:-1;;;11651:18:1;;;11644:32;11693:18;;27068:113:0::1;11392:325:1::0;27068:113:0::1;27231:10;::::0;27224:40:::1;::::0;-1:-1:-1;;;27224:40:0;;27253:10:::1;27224:40;::::0;::::1;2292:51:1::0;27268:11:0;;-1:-1:-1;;;;;27231:10:0::1;::::0;27224:28:::1;::::0;2265:18:1;;27224:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;27202:107;;;::::0;-1:-1:-1;;;27202:107:0;;11924:2:1;27202:107:0::1;::::0;::::1;11906:21:1::0;11963:1;11943:18;;;11936:29;-1:-1:-1;;;11981:18:1;;;11974:32;12023:18;;27202:107:0::1;11722:325:1::0;27202:107:0::1;27411:10;::::0;27404:71:::1;::::0;-1:-1:-1;;;27404:71:0;;-1:-1:-1;;;;;27411:10:0;;::::1;::::0;27404:31:::1;::::0;:71:::1;::::0;27436:10:::1;::::0;27456:4:::1;::::0;27463:11;;27404:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27382:123;;;::::0;-1:-1:-1;;;27382:123:0;;12634:2:1;27382:123:0::1;::::0;::::1;12616:21:1::0;12673:1;12653:18;;;12646:29;-1:-1:-1;;;12691:18:1;;;12684:32;12733:18;;27382:123:0::1;12432:325:1::0;27382:123:0::1;27584:16;::::0;27552:63:::1;::::0;27569:4:::1;::::0;-1:-1:-1;;;;;27584:16:0::1;27603:11:::0;27552:8:::1;:63::i;:::-;27633:10;::::0;27661:16:::1;::::0;27626:66:::1;::::0;-1:-1:-1;;;27626:66:0;;-1:-1:-1;;;;;27633:10:0;;::::1;::::0;27626:26:::1;::::0;:66:::1;::::0;27661:16;::::1;::::0;27680:11;;27626:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27717:16:0::1;::::0;27789:10:::1;::::0;-1:-1:-1;;;;;27717:16:0;;::::1;::::0;:29:::1;::::0;27769:4:::1;::::0;27789:10:::1;27814:11:::0;27840;27717:16:::1;::::0;27990:10:::1;28015:21;:15;28033:3;28015:21;:::i;:::-;27717:356;::::0;::::1;::::0;;;-1:-1:-1;;;;;;27717:356:0;;;-1:-1:-1;;;;;13177:15:1;;;27717:356:0::1;::::0;::::1;13159:34:1::0;13229:15;;;13209:18;;;13202:43;13261:18;;;13254:34;;;;13304:18;;;13297:34;;;;13347:19;;;13340:35;;;;13391:19;;;13384:35;13456:15;;;13435:19;;;13428:44;13488:19;;;13481:35;;;;13093:19;;27717:356:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27717:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;27717:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;27713:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;28228:16;::::0;28196:53:::1;::::0;28213:4:::1;::::0;-1:-1:-1;;;;;28228:16:0::1;;28196:8;:53::i;:::-;28271:10;::::0;28299:16:::1;::::0;28264:56:::1;::::0;-1:-1:-1;;;28264:56:0;;-1:-1:-1;;;;;28271:10:0;;::::1;::::0;28264:26:::1;::::0;:56:::1;::::0;28299:16;::::1;::::0;28271:10:::1;::::0;28264:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28404:10:0::1;::::0;28397:52:::1;::::0;-1:-1:-1;;;28397:52:0;;-1:-1:-1;;;;;28404:10:0;;::::1;::::0;28397:27:::1;::::0;:52:::1;::::0;28425:10:::1;::::0;28437:11;;28397:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28485:6;28478:14;;-1:-1:-1::0;;;28478:14:0::1;;;;;;;;:::i;27713:1147::-;;;28586:16;::::0;28554:53:::1;::::0;28571:4:::1;::::0;-1:-1:-1;;;;;28586:16:0::1;;28554:8;:53::i;:::-;28629:10;::::0;28657:16:::1;::::0;28622:56:::1;::::0;-1:-1:-1;;;28622:56:0;;-1:-1:-1;;;;;28629:10:0;;::::1;::::0;28622:26:::1;::::0;:56:::1;::::0;28657:16;::::1;::::0;28629:10:::1;::::0;28622:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28762:10:0::1;::::0;28755:52:::1;::::0;-1:-1:-1;;;28755:52:0;;-1:-1:-1;;;;;28762:10:0;;::::1;::::0;28755:27:::1;::::0;:52:::1;::::0;28783:10:::1;::::0;28795:11;;28755:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28836:12:0::1;::::0;-1:-1:-1;;;28836:12:0;;15670:2:1;28836:12:0::1;::::0;::::1;15652:21:1::0;15709:1;15689:18;;;15682:29;-1:-1:-1;;;15727:18:1;;;15720:32;15769:18;;28836:12:0::1;15468:325:1::0;27713:1147:0::1;-1:-1:-1::0;;28094:40:0::1;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;28094:40:0::1;::::0;-1:-1:-1;5832:18:1;28094:40:0::1;;;;;;;28963:10;::::0;28956:43:::1;::::0;-1:-1:-1;;;28956:43:0;;28993:4:::1;28956:43;::::0;::::1;2292:51:1::0;28930:23:0::1;::::0;-1:-1:-1;;;;;28963:10:0::1;::::0;28956:28:::1;::::0;2265:18:1;;28956:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28930:69:::0;-1:-1:-1;29014:19:0;;29010:108:::1;;29057:10;::::0;29050:56:::1;::::0;-1:-1:-1;;;29050:56:0;;-1:-1:-1;;;;;29057:10:0;;::::1;::::0;29050:27:::1;::::0;:56:::1;::::0;29078:10:::1;::::0;29090:15;;29050:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26965:2160;26865:2260:::0;;:::o;33284:319::-;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;33376:31:0;::::1;33368:46;;;::::0;-1:-1:-1;;;33368:46:0;;16000:2:1;33368:46:0::1;::::0;::::1;15982:21:1::0;16039:1;16019:18;;;16012:29;-1:-1:-1;;;16057:18:1;;;16050:32;16099:18;;33368:46:0::1;15798:325:1::0;33368:46:0::1;33457:14;::::0;;-1:-1:-1;;;;;33482:34:0;;::::1;-1:-1:-1::0;;;;;;33482:34:0;::::1;::::0;::::1;::::0;;;33542:53:::1;::::0;;33457:14;;;::::1;9530:34:1::0;;;9595:2;9580:18;;9573:43;;;;33542:53:0::1;::::0;9465:18:1;33542:53:0::1;;;;;;;33357:246;33284:319:::0;:::o;3328:182::-;3398:4;3431:10;3452:28;3431:10;3469:2;3473:6;3452:9;:28::i;32662:564::-;1748:13;:11;:13::i;:::-;1042:1:::1;1188:7;;:19:::0;1180:34:::1;;;::::0;-1:-1:-1;;;1180:34:0;;7031:2:1;1180:34:0::1;::::0;::::1;7013:21:1::0;7070:1;7050:18;;;7043:29;-1:-1:-1;;;7088:18:1;;;7081:32;7130:18;;1180:34:0::1;6829:325:1::0;1180:34:0::1;1042:1;1225:7;:18:::0;32754:15;32746:57:::2;;;::::0;-1:-1:-1;;;32746:57:0;;16330:2:1;32746:57:0::2;::::0;::::2;16312:21:1::0;16369:2;16349:18;;;16342:30;16408:31;16388:18;;;16381:59;16457:18;;32746:57:0::2;16128:353:1::0;32746:57:0::2;32837:24;32855:4;32837:9;:24::i;:::-;32822:11;:39;;32814:72;;;::::0;-1:-1:-1;;;32814:72:0;;16688:2:1;32814:72:0::2;::::0;::::2;16670:21:1::0;16727:2;16707:18;;;16700:30;-1:-1:-1;;;16746:18:1;;;16739:50;16806:18;;32814:72:0::2;16486:344:1::0;32814:72:0::2;32905:12;::::0;-1:-1:-1;;;32905:12:0;::::2;;;32897:43;;;::::0;-1:-1:-1;;;32897:43:0;;17037:2:1;32897:43:0::2;::::0;::::2;17019:21:1::0;17076:2;17056:18;;;17049:30;-1:-1:-1;;;17095:18:1;;;17088:48;17153:18;;32897:43:0::2;16835:342:1::0;32897:43:0::2;32986:19;33008:25;33021:11;33008:12;:25::i;:::-;32986:47;;33113:1;33099:11;:15;33091:56;;;::::0;-1:-1:-1;;;33091:56:0;;17384:2:1;33091:56:0::2;::::0;::::2;17366:21:1::0;17423:2;17403:18;;;17396:30;17462;17442:18;;;17435:58;17510:18;;33091:56:0::2;17182:352:1::0;33091:56:0::2;33173:45;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;33173:45:0::2;::::0;5832:18:1;33173:45:0::2;;;;;;;-1:-1:-1::0;;998:1:0::1;1266:7;:22:::0;32662:564::o;30537:166::-;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;30611:21:0;::::1;30603:36;;;::::0;-1:-1:-1;;;30603:36:0;;17741:2:1;30603:36:0::1;::::0;::::1;17723:21:1::0;17780:1;17760:18;;;17753:29;-1:-1:-1;;;17798:18:1;;;17791:32;17840:18;;30603:36:0::1;17539:325:1::0;30603:36:0::1;30650:16;:45:::0;;-1:-1:-1;;;;;;30650:45:0::1;-1:-1:-1::0;;;;;30650:45:0;;;::::1;::::0;;;::::1;::::0;;30537:166::o;35475:295::-;1748:13;:11;:13::i;:::-;35556:12:::1;::::0;-1:-1:-1;;;35556:12:0;::::1;;;35555:13;35547:43;;;::::0;-1:-1:-1;;;35547:43:0;;18071:2:1;35547:43:0::1;::::0;::::1;18053:21:1::0;18110:2;18090:18;;;18083:30;-1:-1:-1;;;18129:18:1;;;18122:47;18186:18;;35547:43:0::1;17869:341:1::0;35547:43:0::1;-1:-1:-1::0;;;;;35609:24:0;::::1;35601:58;;;::::0;-1:-1:-1;;;35601:58:0;;18417:2:1;35601:58:0::1;::::0;::::1;18399:21:1::0;18456:2;18436:18;;;18429:30;-1:-1:-1;;;18475:18:1;;;18468:51;18536:18;;35601:58:0::1;18215:345:1::0;35601:58:0::1;35670:9;:22:::0;;-1:-1:-1;;;;;;;;;35670:22:0;::::1;::::0;;::::1;35703:19:::0;;;;-1:-1:-1;;;;;;35703:19:0;;;;;;;-1:-1:-1;;;35703:19:0::1;::::0;;;35738:24:::1;::::0;::::1;::::0;-1:-1:-1;;35738:24:0::1;35475:295:::0;:::o;33654:1534::-;1748:13;:11;:13::i;:::-;33762:1:::1;33748:11;:15;33740:30;;;;-1:-1:-1::0;;;33740:30:0::1;;;;;;;:::i;:::-;33789:46;::::0;-1:-1:-1;;;33789:46:0;;33804:4:::1;33789:46;::::0;::::1;2292:51:1::0;;;33839:11:0;;33789:31:::1;::::0;2265:18:1;;33789:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;33781:76;;;::::0;-1:-1:-1;;;33781:76:0;;11594:2:1;33781:76:0::1;::::0;::::1;11576:21:1::0;11633:1;11613:18;;;11606:29;-1:-1:-1;;;11651:18:1;;;11644:32;11693:18;;33781:76:0::1;11392:325:1::0;33781:76:0::1;33940:16;::::0;33908:69:::1;::::0;33925:4:::1;::::0;-1:-1:-1;;;;;33940:16:0::1;-1:-1:-1::0;;33908:8:0::1;:69::i;:::-;34073:21;34045:25;34179;34192:11:::0;34179:12:::1;:25::i;:::-;34157:47;;34229:11;34244:1;34229:16:::0;34225:55:::1;;34262:7;;12960:63;12195:836::o:0;34225:55::-:1;34378:21;34414:39:::0;;::::1;34410:137;;-1:-1:-1::0;;;;;;;;;;;34475:39:0::1;;;;8836:2:1::0;8818:21;;;8875:2;8855:18;;;8848:30;-1:-1:-1;;;8909:2:1;8894:18;;8887:55;8974:2;8959:18;;8634:349;34475:39:0::1;;;;;;;;34529:7;;;12960:63;12195:836::o:0;34410:137::-:1;34611:25;34639:38;34660:17:::0;34639:18;:38:::1;:::i;:::-;34611:66:::0;-1:-1:-1;34728:23:0::1;34790:3;34754:33;9402:2;34611:66:::0;34754:33:::1;:::i;:::-;:39;;;;:::i;:::-;34728:65:::0;-1:-1:-1;34804:21:0::1;34862:3;34828:31;9458:2;34828:17:::0;:31:::1;:::i;:::-;:37;;;;:::i;:::-;34804:61:::0;-1:-1:-1;34924:19:0;;34920:117:::1;;34960:65;34974:15:::0;35021:3:::1;34991:27;9402:2;34991:11:::0;:27:::1;:::i;:::-;:33;;;;:::i;:::-;34960:13;:65::i;:::-;35098:17:::0;;35094:87:::1;;35132:37;35155:13;35132:22;:37::i;:::-;33729:1459;;;;;;33654:1534:::0;:::o;29210:1319::-;1748:13;:11;:13::i;:::-;29320:46:::1;::::0;-1:-1:-1;;;29320:46:0;;29335:4:::1;29320:46;::::0;::::1;2292:51:1::0;;;29298:19:0::1;::::0;29320:31:::1;::::0;2265:18:1;;29320:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29298:68;;29399:1;29385:11;:15;29377:30;;;;-1:-1:-1::0;;;29377:30:0::1;;;;;;;:::i;:::-;29438:1;29426:9;:13;29418:28;;;::::0;-1:-1:-1;;;29418:28:0;;18767:2:1;29418:28:0::1;::::0;::::1;18749:21:1::0;18806:1;18786:18;;;18779:29;-1:-1:-1;;;18824:18:1;;;18817:32;18866:18;;29418:28:0::1;18565:325:1::0;29418:28:0::1;29525:16;::::0;29493:63:::1;::::0;29510:4:::1;::::0;-1:-1:-1;;;;;29525:16:0::1;29544:11:::0;29493:8:::1;:63::i;:::-;29581:16;::::0;-1:-1:-1;;;;;29581:16:0::1;:32;29621:9;29654:4;29674:11:::0;29581:16:::1;::::0;29822:10:::1;29847:21;:15;29865:3;29847:21;:::i;:::-;29581:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29581:324:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;29581:324:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;29577:945;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;30058:16;::::0;30026:53:::1;::::0;30043:4:::1;::::0;-1:-1:-1;;;;;30058:16:0::1;;30026:8;:53::i;:::-;30144:51;::::0;30152:10:::1;::::0;30173:21:::1;30144:51:::0;::::1;;;::::0;::::1;::::0;;;30173:21;30152:10;30144:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29577:945;;;30332:16;::::0;30300:53:::1;::::0;30317:4:::1;::::0;-1:-1:-1;;;;;30332:16:0::1;;30300:8;:53::i;:::-;30418:51;::::0;30426:10:::1;::::0;30447:21:::1;30418:51:::0;::::1;;;::::0;::::1;::::0;;;30447:21;30426:10;30418:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29577:945;-1:-1:-1::0;;29926:38:0::1;::::0;;5859:25:1;;;29954:9:0::1;5915:2:1::0;5900:18;;5893:34;29926:38:0::1;::::0;-1:-1:-1;5832:18:1;29926:38:0::1;;;;;;;29287:1242;29210:1319::o:0;31668:958::-;1748:13;:11;:13::i;:::-;31803:16:::1;::::0;31771:69:::1;::::0;31788:4:::1;::::0;-1:-1:-1;;;;;31803:16:0::1;-1:-1:-1::0;;31771:8:0::1;:69::i;:::-;31919:10;::::0;31947:16:::1;::::0;31912:72:::1;::::0;-1:-1:-1;;;31912:72:0;;-1:-1:-1;;;;;31919:10:0;;::::1;::::0;31912:26:::1;::::0;:72:::1;::::0;31947:16;::::1;::::0;-1:-1:-1;;31966:17:0;31912:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;31912:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;31912:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;31908:193:::0;::::1;;-1:-1:-1::0;32023:10:0::1;::::0;32043:16:::1;::::0;32005:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;32023:10:0;;::::1;::::0;32043:16;::::1;::::0;-1:-1:-1;;32062:17:0;32005:75:::1;:::i;:::-;;;;;;;;31908:193;32176:13;::::0;-1:-1:-1;;;;;32176:13:0::1;:27:::0;32172:447:::1;;32231:10;::::0;32251:13:::1;::::0;32224:60:::1;::::0;-1:-1:-1;;;32224:60:0;;-1:-1:-1;;;;;32231:10:0;;::::1;::::0;32224:26:::1;::::0;:60:::1;::::0;32251:13;::::1;::::0;-1:-1:-1;;32266:17:0;32224:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;32224:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;32224:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;32220:177:::0;::::1;;-1:-1:-1::0;32327:10:0::1;::::0;32339:13:::1;::::0;32309:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;32327:10:0;;::::1;::::0;32339:13;::::1;::::0;-1:-1:-1;;32354:17:0;32309:63:::1;:::i;:::-;;;;;;;;32220:177;32459:13;::::0;32429:63:::1;::::0;-1:-1:-1;;;32429:63:0;;32444:4:::1;::::0;32429:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;32459:13:0::1;::::0;-1:-1:-1;;32474:17:0;32429:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;32429:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;32429:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;32425:183:::0;::::1;;-1:-1:-1::0;32550:13:0::1;::::0;32517:66:::1;::::0;::::1;::::0;::::1;::::0;32543:4:::1;::::0;-1:-1:-1;;;;;32550:13:0::1;::::0;-1:-1:-1;;32565:17:0;32517:66:::1;:::i;1992:165::-:0;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;2081:22:0;::::1;2073:37;;;::::0;-1:-1:-1;;;2073:37:0;;19709:2:1;2073:37:0::1;::::0;::::1;19691:21:1::0;19748:1;19728:18;;;19721:29;-1:-1:-1;;;19766:18:1;;;19759:32;19808:18;;2073:37:0::1;19507:325:1::0;2073:37:0::1;2121:28;2140:8;2121:18;:28::i;5047:256::-:0;-1:-1:-1;;;;;5149:19:0;;;;;;:44;;-1:-1:-1;;;;;;5172:21:0;;;;5149:44;5141:59;;;;-1:-1:-1;;;5141:59:0;;20039:2:1;5141:59:0;;;20021:21:1;20078:1;20058:18;;;20051:29;-1:-1:-1;;;20096:18:1;;;20089:32;20138:18;;5141:59:0;19837:325:1;5141:59:0;-1:-1:-1;;;;;5211:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5263:32;;160:25:1;;;5263:32:0;;133:18:1;5263:32:0;;;;;;;5047:256;;;:::o;5311:311::-;-1:-1:-1;;;;;3625:18:0;;;5412:24;3625:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5483:26;;;;5475:41;;;;-1:-1:-1;;;5475:41:0;;20369:2:1;5475:41:0;;;20351:21:1;20408:1;20388:18;;;20381:29;-1:-1:-1;;;20426:18:1;;;20419:32;20468:18;;5475:41:0;20167:325:1;5475:41:0;5552:51;5561:5;5568:7;5596:6;5577:16;:25;5552:8;:51::i;13039:3438::-;13227:7;;;;;;;13226:8;:41;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;13252:15:0;;;1862:6;;13252:15;;13226:41;:72;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;13285:13:0;;;1862:6;;13285:13;;13226:72;:111;;;;-1:-1:-1;;;;;;13316:21:0;;13332:4;13316:21;;13226:111;:148;;;;-1:-1:-1;13361:13:0;;-1:-1:-1;;;;;13355:19:0;;;13361:13;;13355:19;13226:148;13208:3000;;;13431:17;13471:3;13451:17;9347:1;13451:6;:17;:::i;:::-;:23;;;;:::i;:::-;13431:43;-1:-1:-1;13507:13:0;;13503:2694;;13601:23;13655:3;13627:25;9402:2;13627:9;:25;:::i;:::-;:31;;;;:::i;:::-;13601:57;-1:-1:-1;13677:21:0;13727:3;13701:23;9458:2;13701:9;:23;:::i;:::-;:29;;;;:::i;:::-;13677:53;-1:-1:-1;13825:22:0;13850:18;13859:9;13850:6;:18;:::i;:::-;13825:43;;13948:47;13964:4;13978;13985:9;13948:15;:47::i;:::-;14083:41;14099:4;14105:2;14109:14;14083:15;:41::i;:::-;14239:15;14212:23;;:42;;;;;;;:::i;:::-;;;;;;;;14298:13;14273:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;14714:21:0;;14688:23;;14579:12;;9627:11;;14688:47;;14714:21;14688:47;:::i;:::-;:73;14684:1243;;14937:16;14913:21;;14887:23;;:47;;;;:::i;:::-;:66;14883:1025;;;15186:62;15201:23;;15226:21;;15186:62;;;;;;5859:25:1;;;5915:2;5900:18;;5893:34;5847:2;5832:18;;5685:248;15186:62:0;;;;;;;;14883:1025;;;15391:4;-1:-1:-1;;;;;15391:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15387:498;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;15649:6:0;15638:18;;;;;;:::i;:::-;;;;;;;;15506:178;15387:498;;;;;-1:-1:-1;;;;;;;;;;;15800:57:0;;;;20699:2:1;20681:21;;;20738:2;20718:18;;;20711:30;20777:34;20772:2;20757:18;;20750:62;-1:-1:-1;;;20843:2:1;20828:18;;20821:41;20894:3;20879:19;;20497:407;15387:498:0;16009:57;16023:4;9520:11;16029:15;16039:4;16029:9;:15::i;:::-;:36;;16009:13;:57::i;:::-;16085:53;16099:2;9520:11;16103:13;16113:2;16103:9;:13::i;16085:53::-;16175:7;;;;;13039:3438;;;:::o;13503:2694::-;13386:2822;13208:3000;16256:33;16272:4;16278:2;16282:6;16256:15;:33::i;:::-;16348:57;16362:4;9520:11;16368:15;16378:4;16368:9;:15::i;16348:57::-;16416:53;16430:2;9520:11;16434:13;16444:2;16434:9;:13::i;1884:100::-;1959:10;1948:7;1862:6;;-1:-1:-1;;;;;1862:6:0;;1789:87;1948:7;-1:-1:-1;;;;;1948:21:0;;1940:36;;;;-1:-1:-1;;;1940:36:0;;21111:2:1;1940:36:0;;;21093:21:1;21150:1;21130:18;;;21123:29;-1:-1:-1;;;21168:18:1;;;21161:32;21210:18;;1940:36:0;20909:325:1;22256:2497:0;22316:7;22340:11;22355:1;22340:16;22336:30;;-1:-1:-1;22365:1:0;;22256:2497;-1:-1:-1;22256:2497:0:o;22336:30::-;22385:12;;-1:-1:-1;;;22385:12:0;;;;22377:43;;;;-1:-1:-1;;;22377:43:0;;17037:2:1;22377:43:0;;;17019:21:1;17076:2;17056:18;;;17049:30;-1:-1:-1;;;17095:18:1;;;17088:48;17153:18;;22377:43:0;16835:342:1;22377:43:0;22465:16;;;22479:1;22465:16;;;;;;;;22441:21;;22465:16;;;;;;;;;;-1:-1:-1;22465:16:0;22441:40;;22510:4;22492;22497:1;22492:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22492:23:0;;;:7;;;;;;;;;;:23;;;;22536:16;;:23;;;-1:-1:-1;;;22536:23:0;;;;:16;;;;;:21;;:23;;;;;22492:7;;22536:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22526:4;22531:1;22526:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22526:33:0;;;:7;;;;;;;;;:33;22928:16;;22750:20;;22896:63;;22913:4;;22928:16;22947:11;22896:8;:63::i;:::-;23032:16;23051:22;:15;23069:4;23051:22;:::i;:::-;23305:16;;23459:9;;23305:230;;-1:-1:-1;;;23305:230:0;;23032:41;;-1:-1:-1;23179:21:0;;-1:-1:-1;;;;;23305:16:0;;;;:67;;:230;;23387:11;;23413:12;;23440:4;;23459:9;;;;;;;;23032:41;;23305:230;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23301:1445;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;24610:6:0;24599:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;24639:1:0;;22256:2497;-1:-1:-1;;;;;;22256:2497:0:o;23301:1445::-;;;-1:-1:-1;;;;;;;;;;;24679:32:0;;;;22152:2:1;22134:21;;;22191:2;22171:18;;;22164:30;-1:-1:-1;;;22225:2:1;22210:18;;22203:48;22283:2;22268:18;;21950:342;24679:32:0;;;;;;;;-1:-1:-1;24733:1:0;;22256:2497;-1:-1:-1;;;;;22256:2497:0:o;23301:1445::-;23657:9;;;;;;;;;-1:-1:-1;;;;;23657:9:0;-1:-1:-1;;;;;23646:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23642:891;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;24353:6:0;24305:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24305:55:0;;;;;;;;;;24287:75;;;:::i;23642:891::-;;;-1:-1:-1;;;;;;;;;;;24436:54:0;;;;22963:2:1;22945:21;;;23002:2;22982:18;;;22975:30;23041:34;23036:2;23021:18;;23014:62;-1:-1:-1;;;23107:2:1;23092:18;;23085:38;23155:3;23140:19;;22761:404;23642:891:0;23791:21;23762:26;23853:38;23874:17;23791:21;23853:38;:::i;:::-;23831:60;-1:-1:-1;23932:15:0;;23928:285;;23977:40;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;23977:40:0;;5832:18:1;23977:40:0;;;;;;;24047:11;22256:2497;-1:-1:-1;;;;;;;22256:2497:0:o;23928:285::-;-1:-1:-1;;;;;;;;;;;24112:50:0;;;;23372:2:1;23354:21;;;23411:2;23391:18;;;23384:30;23450:34;23445:2;23430:18;;23423:62;-1:-1:-1;;;23516:2:1;23501:18;;23494:34;23560:3;23545:19;;23170:400;24112:50:0;;;;;;;;-1:-1:-1;24192:1:0;;22256:2497;-1:-1:-1;;;;;;;22256:2497:0:o;20951:1297::-;21084:28;21115:24;21133:4;21115:9;:24::i;:::-;21084:55;;21177:11;21154:20;:34;21150:155;;;21210:62;;;;;23777:2:1;23759:21;;;23816:2;23796:18;;;23789:30;23855:34;23850:2;23835:18;;23828:62;-1:-1:-1;;;23921:2:1;23906:18;;23899:38;23969:3;23954:19;;23575:404;21210:62:0;;;;;;;;21287:7;20951:1297;;:::o;21150:155::-;21405:22;21467:3;21445:18;21467:3;;21445:18;:::i;:::-;21430:34;;:11;:34;:::i;:::-;:40;;;;:::i;:::-;21405:65;-1:-1:-1;21481:20:0;21539:3;21517:18;21539:3;;21517:18;:::i;:::-;21504:32;;:9;:32;:::i;:::-;:38;;;;:::i;:::-;21662:16;;21481:61;;-1:-1:-1;21630:63:0;;21647:4;;-1:-1:-1;;;;;21662:16:0;21681:11;21630:8;:63::i;:::-;21718:16;;-1:-1:-1;;;;;21718:16:0;:32;21758:9;21791:4;21811:11;21837:14;21866:12;21791:4;21921:22;:15;21939:4;21921:22;:::i;:::-;21718:271;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21718:271:0;;;;;;;;-1:-1:-1;;21718:271:0;;;;;;;;;;;;:::i;:::-;;;21714:527;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;22115:26;22134:6;22115:26;;;;;;:::i;:::-;;;;;;;;22061:92;21714:527;;;;;22180:49;;;;;24782:2:1;24764:21;;;24821:2;24801:18;;;24794:30;24860:29;24855:2;24840:18;;24833:57;24922:2;24907:18;;24580:351;22180:49:0;;;;;;;;21714:527;;;-1:-1:-1;;22010:38:0;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;22010:38:0;;-1:-1:-1;5832:18:1;22010:38:0;;;;;;;21714:527;21022:1226;;;20951:1297;;:::o;24794:1779::-;24884:7;:14;24913:17;;;:32;;-1:-1:-1;24934:11:0;;24913:32;24909:45;;;24947:7;24794:1779;:::o;24909:45::-;25022:22;25061:3;25047:11;:6;25056:2;25047:11;:::i;:::-;:17;;;;:::i;:::-;25022:42;-1:-1:-1;25075:20:0;25098:23;25022:42;25098:6;:23;:::i;:::-;25075:46;;25205:1;25188:14;:18;:50;;;;-1:-1:-1;25210:14:0;;-1:-1:-1;;;;;25210:14:0;:28;;25188:50;25184:539;;;25282:14;;:46;;25256:20;;-1:-1:-1;;;;;25282:14:0;;25309;;25256:20;25282:46;25256:20;25282:46;25309:14;25282;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25255:73;;;25348:15;25343:232;;25389:45;;;;;25348:2:1;25330:21;;;25387:2;25367:18;;;25360:30;25426;25421:2;25406:18;;25399:58;25489:2;25474:18;;25146:352;25389:45:0;;;;;;;;25553:6;25538:21;;25343:232;25240:346;25184:539;;;-1:-1:-1;25705:6:0;25184:539;25798:1;25783:12;:16;:36;;;;;25818:1;25803:12;:16;25783:36;25779:721;;;25836:23;25862:27;25877:12;25862;:27;:::i;:::-;25836:53;-1:-1:-1;25908:19:0;;25904:585;;25953:9;25948:526;25972:12;25968:1;:16;25948:526;;;26014:14;26031:7;26039:1;26031:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26031:10:0;;-1:-1:-1;26068:20:0;;;;;:47;;-1:-1:-1;;;;;;26092:23:0;;26110:4;26092:23;;26068:47;:74;;;;-1:-1:-1;26129:13:0;;-1:-1:-1;;;;;26119:23:0;;;26129:13;;26119:23;;26068:74;26064:391;;;26234:12;26252:6;-1:-1:-1;;;;;26252:11:0;26271:15;26252:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26233:58;;;26323:7;26318:114;;26368:36;;;;;25705:2:1;25687:21;;;25744:2;25724:18;;;25717:30;-1:-1:-1;;;25778:2:1;25763:18;;25756:49;25837:2;25822:18;;25503:343;26368:36:0;;;;;;;;26318:114;26144:311;26064:391;-1:-1:-1;25986:3:0;;;;:::i;:::-;;;;25948:526;;;;25904:585;25821:679;25779:721;26525:40;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;26525:40:0;;5832:18:1;26525:40:0;5685:248:1;2165:191:0;2258:6;;;-1:-1:-1;;;;;2275:17:0;;;-1:-1:-1;;;;;;2275:17:0;;;;;;;2308:40;;2258:6;;;2275:17;2258:6;;2308:40;;2239:16;;2308:40;2228:128;2165:191;:::o;4124:507::-;-1:-1:-1;;;;;4221:18:0;;;;;;:38;;-1:-1:-1;;;;;;4243:16:0;;;;4221:38;4213:53;;;;-1:-1:-1;;;4213:53:0;;26193:2:1;4213:53:0;;;26175:21:1;26232:1;26212:18;;;26205:29;-1:-1:-1;;;26250:18:1;;;26243:32;26292:18;;4213:53:0;25991:325:1;4213:53:0;-1:-1:-1;;;;;4348:15:0;;4326:19;4348:15;;;;;;;;;;;4382:21;;;;4374:36;;;;-1:-1:-1;;;4374:36:0;;26523:2:1;4374:36:0;;;26505:21:1;26562:1;26542:18;;;26535:29;-1:-1:-1;;;26580:18:1;;;26573:32;26622:18;;4374:36:0;26321:325:1;4374:36:0;-1:-1:-1;;;;;4446:15:0;;;:9;:15;;;;;;;;;;;4464:20;;;4446:38;;4499:13;;;;;;;;;;:23;;;;;;4549:26;;160:25:1;;;4499:13:0;;4549:26;;133:18:1;4549:26:0;;;;;;;4586:37;30711:183;16485:779;16580:13;;-1:-1:-1;;;;;16569:24:0;;;16580:13;;16569:24;;;;:52;;-1:-1:-1;;;;;;16597:24:0;;16616:4;16597:24;;16569:52;16565:692;;;16642:14;:36;;;;-1:-1:-1;;;;;;16661:17:0;;;;;;:8;:17;;;;;;;;16660:18;16642:36;16638:608;;;-1:-1:-1;;;;;;16699:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;16699:24:0;16719:4;16699:24;;;;;;16742:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;16742:21:0;;;;;;16485:779::o;16638:608::-;16790:14;16789:15;:36;;;;-1:-1:-1;;;;;;16808:17:0;;;;;;:8;:17;;;;;;;;16789:36;16785:461;;;-1:-1:-1;;;;;16846:17:0;;16866:5;16846:17;;;:8;:17;;;;;:25;;-1:-1:-1;;16846:25:0;;;16954:277;16978:7;:14;16974:18;;16954:277;;;17040:7;-1:-1:-1;;;;;17026:21:0;:7;17034:1;17026:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17026:10:0;:21;17022:190;;17089:7;17097:14;;:18;;17114:1;;17097:18;:::i;:::-;17089:27;;;;;;;;:::i;:::-;;;;;;;;;;;17076:7;:10;;-1:-1:-1;;;;;17089:27:0;;;;17084:1;;17076:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;17076:40:0;;;;;-1:-1:-1;;;;;17076:40:0;;;;;;17143:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;17143:13:0;;;;;-1:-1:-1;;;;;;17143:13:0;;;;;;30845:41:::1;30711:183:::0;;:::o;17022:190::-;16994:3;;;;:::i;:::-;;;;16954:277;;16785:461;16485:779;;:::o;196:250:1:-;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;852:131::-;-1:-1:-1;;;;;927:31:1;;917:42;;907:70;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:456::-;1577:6;1585;1593;1646:2;1634:9;1625:7;1621:23;1617:32;1614:52;;;1662:1;1659;1652:12;1614:52;1701:9;1688:23;1720:31;1745:5;1720:31;:::i;:::-;1770:5;-1:-1:-1;1827:2:1;1812:18;;1799:32;1840:33;1799:32;1840:33;:::i;:::-;1500:456;;1892:7;;-1:-1:-1;;;1946:2:1;1931:18;;;;1918:32;;1500:456::o;1961:180::-;2020:6;2073:2;2061:9;2052:7;2048:23;2044:32;2041:52;;;2089:1;2086;2079:12;2041:52;-1:-1:-1;2112:23:1;;1961:180;-1:-1:-1;1961:180:1:o;2543:461::-;2596:3;2634:5;2628:12;2661:6;2656:3;2649:19;2687:4;2716:2;2711:3;2707:12;2700:19;;2753:2;2746:5;2742:14;2774:1;2784:195;2798:6;2795:1;2792:13;2784:195;;;2863:13;;-1:-1:-1;;;;;2859:39:1;2847:52;;2919:12;;;;2954:15;;;;2895:1;2813:9;2784:195;;;-1:-1:-1;2995:3:1;;2543:461;-1:-1:-1;;;;;2543:461:1:o;3009:261::-;3188:2;3177:9;3170:21;3151:4;3208:56;3260:2;3249:9;3245:18;3237:6;3208:56;:::i;:::-;3200:64;3009:261;-1:-1:-1;;;3009:261:1:o;3508:247::-;3567:6;3620:2;3608:9;3599:7;3595:23;3591:32;3588:52;;;3636:1;3633;3626:12;3588:52;3675:9;3662:23;3694:31;3719:5;3694:31;:::i;3760:248::-;3828:6;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;-1:-1:-1;;3928:23:1;;;3998:2;3983:18;;;3970:32;;-1:-1:-1;3760:248:1:o;4013:388::-;4081:6;4089;4142:2;4130:9;4121:7;4117:23;4113:32;4110:52;;;4158:1;4155;4148:12;4110:52;4197:9;4184:23;4216:31;4241:5;4216:31;:::i;:::-;4266:5;-1:-1:-1;4323:2:1;4308:18;;4295:32;4336:33;4295:32;4336:33;:::i;:::-;4388:7;4378:17;;;4013:388;;;;;:::o;4640:380::-;4719:1;4715:12;;;;4762;;;4783:61;;4837:4;4829:6;4825:17;4815:27;;4783:61;4890:2;4882:6;4879:14;4859:18;4856:38;4853:161;;4936:10;4931:3;4927:20;4924:1;4917:31;4971:4;4968:1;4961:15;4999:4;4996:1;4989:15;4853:161;;4640:380;;;:::o;6268:274::-;-1:-1:-1;;;;;6460:32:1;;;;6442:51;;6524:2;6509:18;;6502:34;6430:2;6415:18;;6268:274::o;6547:277::-;6614:6;6667:2;6655:9;6646:7;6642:23;6638:32;6635:52;;;6683:1;6680;6673:12;6635:52;6715:9;6709:16;6768:5;6761:13;6754:21;6747:5;6744:32;6734:60;;6790:1;6787;6780:12;7489:127;7550:10;7545:3;7541:20;7538:1;7531:31;7581:4;7578:1;7571:15;7605:4;7602:1;7595:15;7621:125;7686:9;;;7707:10;;;7704:36;;;7720:18;;:::i;8106:168::-;8179:9;;;8210;;8227:15;;;8221:22;;8207:37;8197:71;;8248:18;;:::i;8279:217::-;8319:1;8345;8335:132;;8389:10;8384:3;8380:20;8377:1;8370:31;8424:4;8421:1;8414:15;8452:4;8449:1;8442:15;8335:132;-1:-1:-1;8481:9:1;;8279:217::o;8501:128::-;8568:9;;;8589:11;;;8586:37;;;8603:18;;:::i;9627:251::-;9697:6;9750:2;9738:9;9729:7;9725:23;9721:32;9718:52;;;9766:1;9763;9756:12;9718:52;9798:9;9792:16;9817:31;9842:5;9817:31;:::i;10543:325::-;10745:2;10727:21;;;10784:1;10764:18;;;10757:29;-1:-1:-1;;;10817:2:1;10802:18;;10795:32;10859:2;10844:18;;10543:325::o;11203:184::-;11273:6;11326:2;11314:9;11305:7;11301:23;11297:32;11294:52;;;11342:1;11339;11332:12;11294:52;-1:-1:-1;11365:16:1;;11203:184;-1:-1:-1;11203:184:1:o;12052:375::-;-1:-1:-1;;;;;12310:15:1;;;12292:34;;12362:15;;;;12357:2;12342:18;;12335:43;12409:2;12394:18;;12387:34;;;;12242:2;12227:18;;12052:375::o;13527:306::-;13615:6;13623;13631;13684:2;13672:9;13663:7;13659:23;13655:32;13652:52;;;13700:1;13697;13690:12;13652:52;13729:9;13723:16;13713:26;;13779:2;13768:9;13764:18;13758:25;13748:35;;13823:2;13812:9;13808:18;13802:25;13792:35;;13527:306;;;;;:::o;13838:179::-;13873:3;13915:1;13897:16;13894:23;13891:120;;;13961:1;13958;13955;13940:23;-1:-1:-1;13998:1:1;13992:8;13987:3;13983:18;13891:120;13838:179;:::o;14154:346::-;14264:2;14245:13;;-1:-1:-1;;14241:27:1;14229:40;;14299:18;14284:34;;14320:22;;;14281:62;14278:185;;;14385:10;14380:3;14376:20;14373:1;14366:31;14420:4;14417:1;14410:15;14448:4;14445:1;14438:15;14278:185;14479:2;14472:22;-1:-1:-1;;14154:346:1:o;14505:671::-;14544:3;14586:4;14568:16;14565:26;14562:39;;;14505:671;:::o;14562:39::-;14628:2;14622:9;-1:-1:-1;;14693:16:1;14689:25;;14686:1;14622:9;14665:50;14744:4;14738:11;14768:16;14803:18;14874:2;14867:4;14859:6;14855:17;14852:25;14847:2;14839:6;14836:14;14833:45;14830:58;;;14881:5;;;;;14505:671;:::o;14830:58::-;14918:6;14912:4;14908:17;14897:28;;14954:3;14948:10;14981:2;14973:6;14970:14;14967:27;;;14987:5;;;;;;14505:671;:::o;14967:27::-;15071:2;15052:16;15046:4;15042:27;15038:36;15031:4;15022:6;15017:3;15013:16;15009:27;15006:69;15003:82;;;15078:5;;;;;;14505:671;:::o;15003:82::-;15094:57;15145:4;15136:6;15128;15124:19;15120:30;15114:4;15094:57;:::i;:::-;-1:-1:-1;15167:3:1;;14505:671;-1:-1:-1;;;;;14505:671:1:o;18895:607::-;-1:-1:-1;;;;;19254:15:1;;;19236:34;;19301:2;19286:18;;19279:34;;;;19344:2;19329:18;;19322:34;;;;19387:2;19372:18;;19365:34;;;;19436:15;;;19430:3;19415:19;;19408:44;19216:3;19468:19;;19461:35;;;;19185:3;19170:19;;18895:607::o;21239:127::-;21300:10;21295:3;21291:20;21288:1;21281:31;21331:4;21328:1;21321:15;21355:4;21352:1;21345:15;21371:574;21662:6;21651:9;21644:25;21705:6;21700:2;21689:9;21685:18;21678:34;21748:3;21743:2;21732:9;21728:18;21721:31;21625:4;21769:57;21821:3;21810:9;21806:19;21798:6;21769:57;:::i;:::-;-1:-1:-1;;;;;21862:32:1;;;;21857:2;21842:18;;21835:60;-1:-1:-1;21926:3:1;21911:19;21904:35;21761:65;21371:574;-1:-1:-1;;;21371:574:1:o;22297:459::-;22559:29;22554:3;22547:42;22529:3;22618:6;22612:13;22634:75;22702:6;22697:2;22692:3;22688:12;22681:4;22673:6;22669:17;22634:75;:::i;:::-;22729:16;;;;22747:2;22725:25;;22297:459;-1:-1:-1;;22297:459:1:o;25851:135::-;25890:3;25911:17;;;25908:43;;25931:18;;:::i;:::-;-1:-1:-1;25978:1:1;25967:13;;25851:135::o;26651:127::-;26712:10;26707:3;26703:20;26700:1;26693:31;26743:4;26740:1;26733:15;26767:4;26764:1;26757:15

Swarm Source

ipfs://576b7eb94c4c881804a73f6f8e6b06b9e9f8c6a75ccc1d3cb95676af804f5a8c

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.