ETH Price: $3,714.07 (+3.35%)

Token

Depicted (DPT)
 

Overview

Max Total Supply

250,000,000 DPT

Holders

311 (0.00%)

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

OVERVIEW

Depicted is an innovative RWA hybrid e-commerce platform that aims to revolutionize the online marketplace by combining mobile 3D scanning technology, artificial intelligence, and blockchain-based asset tokenization.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Depicted

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-10-24
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {return msg.sender;}
    function _msgData() internal view virtual returns (bytes memory) {this; return msg.data;}
}

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {_name = name_; _symbol = symbol_;}
    function name() public view virtual override returns (string memory) {return _name;}
    function symbol() public view virtual override returns (string memory) {return _symbol;}
    function decimals() public view virtual override returns (uint8) {return 18;}
    function totalSupply() public view virtual override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view virtual override returns (uint256) {return _balances[account];}
    function transfer(address to, uint256 amount) public virtual override returns (bool) {_transfer(_msgSender(), to, amount); return true;}
    function allowance(address owner, address spender) public view virtual override returns (uint256) {return _allowances[owner][spender];}
    function approve(address spender, uint256 amount) public virtual override returns (bool) {_approve(_msgSender(), spender, amount); return true;}
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {_spendAllowance(from, _msgSender(), amount); _transfer(from, to, amount); return true;}
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {_approve(_msgSender(), spender, allowance(_msgSender(), spender) + addedValue); return true;}
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = allowance(_msgSender(), spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {_approve(_msgSender(), spender, currentAllowance - subtractedValue);}
        return true;
    }
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0) && to != address(0), "ERC20: transfer from/to the zero address");
        _beforeTokenTransfer(from, to, amount);
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }
        emit Transfer(from, to, amount);
        _afterTokenTransfer(from, to, amount);
    }
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply += amount;
        unchecked {_balances[account] += amount;}
        emit Transfer(address(0), account, amount);
        _afterTokenTransfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _beforeTokenTransfer(account, address(0), amount);
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            _totalSupply -= amount;
        }
        emit Transfer(account, address(0), amount);
        _afterTokenTransfer(account, address(0), amount);
    }
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0) && spender != address(0), "ERC20: approve from/to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {_approve(owner, spender, currentAllowance - amount);}
        }
    }
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

interface IUniswapV2Pair {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Sync(uint112 reserve0, uint112 reserve1);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;
    function sync() external;
}
interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IUniswapV2Router01 {
    function factory() external view returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
}

abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }
    function owner() public view returns (address) { return _owner; }
    modifier onlyOwner() {
        require(_owner == _msgSender(), "You are not owner");
        _;
    }
    function renounceOwnership() public virtual onlyOwner {
        _owner = address(0);
        emit OwnershipTransferred(_owner, address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Use renounce function");
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }
}

contract Depicted is IERC20, Ownable {
    string private constant _name = "Depicted";
    string private constant _symbol = "DPT";
    uint8 private constant _decimals = 18;
    uint256 private _totalSupply = 250000000 * (10**_decimals); // 250,000,000

    address public WETH;
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address public constant ZERO = 0x0000000000000000000000000000000000000000;

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

    // Remove from fee collection mapping
    mapping(address => bool) public isFeeExempt;

    // Blacklist mapping
    mapping(address => bool) public isBlacklisted;

    // Remove from trading enabled check
    mapping(address => bool) public isAuthorized;
    
    // Remove from transaction and wallet limits mapping
    mapping (address => bool) public isExcludedFromTransactionLimitChecks;

    // Buy fees
    uint256 public buyWallet1Fee = 2;
    uint256 public buyWallet2Fee = 2;
    uint256 public buyWallet3Fee = 1;
    uint256 public buyLiquidityFee = 1;
    uint256 public buyTotalFees = 6;

    // Sell fees
    uint256 public sellWallet1Fee = 2;
    uint256 public sellLiquidityFee = 2;
    uint256 public sellWallet2Fee = 1;
    uint256 public sellWallet3Fee = 1;
    uint256 public sellTotalFees = 6;

    // Tax collection counter
    uint256 public tokenForWallet1 = 0;
    uint256 public tokenForWallet2 = 0;
    uint256 public tokenForWallet3 = 0;
    uint256 public tokenForLiquidity = 0;

    // Fee receiver
    address public wallet1FeeReceiver;
    address public wallet2FeeReceiver;
    address public wallet3FeeReceiver;

    IUniswapV2Router02 public router;
    address public pair;

    bool public tradingOpen = false;
    uint256 public maxTransactionLimitBuy;
    uint256 public maxTransactionLimitSell;
    uint256 public maxWalletLimit;

    bool public swapEnabled = true;
    uint256 public swapThreshold = (_totalSupply * 1) / 10000; // 0.01% of supply
    bool private inSwap;
    bool public transactionLimitsInEffect = true;

    // Modifiers
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    // Events
    event TradingEnabled(bool enabled);
    event BlacklistUpdated(address indexed _address, bool isBlacklisted);
    event ETHCleared(address indexed wallet, uint256 amount);
    event TokensCleared(address indexed tokenAddress, address indexed wallet, uint256 amount);
    event BuyFeesUpdated(uint256 wallet1, uint256 liquidity, uint256 wallet2, uint256 wallet3);
    event SellFeesUpdated(uint256 wallet1, uint256 liquidity, uint256 wallet2, uint256 wallet3);
    event MaxTransactionLimitUpdated(uint256 maxTransactionLimitBuy, uint256 maxTransactionLimitSell);
    event MaxWalletLimitUpdated(uint256 newMaxWalletLimit);
    event TransactionLimitsRemovedForever();
    event TaxCounterReset();
    event AuthorizationStatusUpdated(address indexed account, bool isAuthorized);
    event FeeExemptionStatusUpdated(address indexed holder, bool isFeeExempt);
    event ExcludedFromTransactionLimitChecks(address indexed holder, bool exempt);
    event Wallet1ReceiverUpdated(address indexed newReceiver);
    event Wallet2ReceiverUpdated(address indexed newReceiver);
    event Wallet3ReceiverUpdated(address indexed newReceiver);
    event SwapBackSettingsUpdated(bool enabled, uint256 amount);
    event SwapFailed(string message);
    event LiquidityAddedFailed(string message);

    constructor() {
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // Uniswap 
        WETH = router.WETH(); // WETH on Ethereum
        pair = IUniswapV2Factory(router.factory()).createPair(WETH, address(this));
        _allowances[address(this)][address(router)] = type(uint256).max;
        maxTransactionLimitBuy = _totalSupply * 1 / 100; // 1% of total supply is maxTransactionLimitBuy
        maxTransactionLimitSell = _totalSupply * 1 / 100; // 1% of total supply is maxTransactionLimitSell
        maxWalletLimit = _totalSupply * 2 / 100; // 2% of total supply is maxWalletLimit

        isFeeExempt[msg.sender] = true;
        isFeeExempt[owner()] = true;
        isAuthorized[owner()] = true;
        isExcludedFromTransactionLimitChecks[address(this)] = true;
        isExcludedFromTransactionLimitChecks[owner()] = true;
        isExcludedFromTransactionLimitChecks[DEAD] = true;
        isExcludedFromTransactionLimitChecks[ZERO] = true;
        wallet1FeeReceiver = 0x04662A7067d9Af5bd87fBcf7ec82574a8BB60Df4;
        wallet2FeeReceiver = 0x982FB4769216023fAce96a4e6Aa700a9cF4d0cC5;
        wallet3FeeReceiver = 0x7A3b40CB8B1ADDb9BFCF2BD8D1F1CB91c0AE279d;
        // One time supply transfer
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    // Fallback
    receive() external payable {}

    // Basic ERC20 override
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

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

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

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

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

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

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

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

    function approveMax(address spender) internal returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            _allowances[sender][msg.sender] -= amount;
        }
        return _transferFrom(sender, recipient, amount);
    }

    // Burn tokens from the owner's balance
    function burn(uint256 amount) external onlyOwner {
        require(amount > 0, "Amount must be greater than zero");
        require(_balances[msg.sender] >= amount, "Insufficient balance to burn");
        _totalSupply -= amount;
        _balances[msg.sender] -= amount;
        emit Transfer(msg.sender, address(0), amount);
    }

    // Open trading function
    function enableTrading() external onlyOwner {
        require(!tradingOpen, "Trading is already open");
        tradingOpen = true;
        emit TradingEnabled(true);
    }

    // Update blacklist status
    function updateBlacklistStatus(address _address, bool _isBlacklisted) external onlyOwner {
        require(_address != address(0), "Invalid address");
        require(_address != owner(), "Cannot blacklist the owner");
        isBlacklisted[_address] = _isBlacklisted;
        emit BlacklistUpdated(_address, _isBlacklisted);
    }

    function clearETH() external onlyOwner {
        uint256 amount = address(this).balance;
        require(amount > 0, "No ETH in contract");
        payable(msg.sender).transfer(amount);
        emit ETHCleared(msg.sender, amount);
    }

    // WARNING: Use this function with trusted tokens only
    function clearTokens(address tokenAddress) external onlyOwner {
        require(tokenAddress != address(this), "Cannot clear native tokens");
        IERC20 token = IERC20(tokenAddress);
        uint256 balance = token.balanceOf(address(this));
        require(balance > 0, "No token in contract");
        token.transfer(msg.sender, balance);
        emit TokensCleared(tokenAddress, msg.sender, balance);
    }

    // Buy fees setter
    function updateBuyFees(uint256 wallet1, uint256 liquidity, uint256 wallet2, uint256 wallet3) external onlyOwner {
        buyWallet1Fee = wallet1;
        buyLiquidityFee = liquidity;
        buyWallet2Fee = wallet2;
        buyWallet3Fee = wallet3;
        buyTotalFees = wallet1 + liquidity + wallet2 + wallet3;
        require(buyTotalFees <= 10, "Buy fees can not be greater than 10%");
        emit BuyFeesUpdated(wallet1, liquidity, wallet2, wallet3);
    }

    // Sell fees setter
    function updateSellFees(uint256 wallet1, uint256 liquidity, uint256 wallet2, uint256 wallet3) external onlyOwner {
        sellWallet1Fee = wallet1;
        sellLiquidityFee = liquidity;
        sellWallet2Fee = wallet2;
        sellWallet3Fee = wallet3;
        sellTotalFees = wallet1 + liquidity + wallet2 + wallet3;
        require(sellTotalFees <= 10, "Sell fees can not be greater than 10%");
        emit SellFeesUpdated(wallet1, liquidity, wallet2, wallet3);
    }

    // Maximum transaction limits setter for both buy and sell
    function updateMaxTransactionLimits(uint256 _amountBuy, uint256 _amountSell) external onlyOwner {
        uint256 minimumLimit = (_totalSupply * 1 / 1000) / (10**_decimals);
        require(_amountBuy >= minimumLimit, "Cannot set maxTransactionLimitBuy lower than 0.1% of total supply");
        require(_amountSell >= minimumLimit, "Cannot set maxTransactionLimitSell lower than 0.1% of total supply");
        maxTransactionLimitBuy = _amountBuy * (10**_decimals);
        maxTransactionLimitSell = _amountSell * (10**_decimals);
        emit MaxTransactionLimitUpdated(maxTransactionLimitBuy, maxTransactionLimitSell);
    }

    // Maximum wallet limit setter
    function updateMaxWalletLimit(uint256 _amount) external onlyOwner {
        require(_amount >= (_totalSupply * 1 / 100) / (10**_decimals), "Cannot set maxWalletLimit lower than 1% of total supply");
        maxWalletLimit = _amount * (10**_decimals);
        emit MaxWalletLimitUpdated(maxWalletLimit);
    }

    // Reset tax counter to zero
    function resetTaxCounter() external onlyOwner {
        tokenForWallet1 = 0;
        tokenForWallet2 = 0;
        tokenForWallet3 = 0;
        tokenForLiquidity = 0;
        emit TaxCounterReset();
    }

    // Clear transaction and wallet limits forever
    function removeTransactionLimitsForever() external onlyOwner {
        require(transactionLimitsInEffect, "Transaction limits already removed");
        transactionLimitsInEffect = false;
        emit TransactionLimitsRemovedForever();
    }

    // Exemptions
    function setIsAuthorized(address value, bool exempt) external onlyOwner {
        isAuthorized[value] = exempt;
        emit AuthorizationStatusUpdated(value, exempt);
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
        emit FeeExemptionStatusUpdated(holder, exempt);
    }

    function excludeFromTransactionLimitChecks(address holder, bool exempt) public onlyOwner {
        isExcludedFromTransactionLimitChecks[holder] = exempt;
        emit ExcludedFromTransactionLimitChecks(holder, exempt);
    }

    // Receivers
    function setWallet1Receiver(address _wallet1FeeReceiver) external onlyOwner {
        wallet1FeeReceiver = _wallet1FeeReceiver;
        emit Wallet1ReceiverUpdated(_wallet1FeeReceiver);
    }

    function setWallet2Receiver(address _wallet2FeeReceiver) external onlyOwner {
        wallet2FeeReceiver = _wallet2FeeReceiver;
        emit Wallet2ReceiverUpdated(_wallet2FeeReceiver);
    }

    function setWallet3Receiver(address _wallet3FeeReceiver) external onlyOwner {
        wallet3FeeReceiver = _wallet3FeeReceiver;
        emit Wallet3ReceiverUpdated(_wallet3FeeReceiver);
    }

    // Swapback settings
    function setSwapBackSettings(bool _enabled, uint256 _amount) external onlyOwner {
        require(_amount > 2500, "Swap threshold must be greater than 2500");
        swapEnabled = _enabled;
        swapThreshold = _amount;
        emit SwapBackSettingsUpdated(_enabled, _amount);
    }

    // Manually trigger tax distribution
    function manualTaxSwap() external onlyOwner {
        uint256 contractTokenBalance = _balances[address(this)];
        require(contractTokenBalance > 0, "No tokens to swap");
        require(!inSwap, "Already in swap");
        swapBack();
    }

    // Internal and Private functions
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        require(!isBlacklisted[sender], "Sender is blacklisted");
        require(!isBlacklisted[recipient], "Recipient is blacklisted");
        if (inSwap) {return _basicTransfer(sender, recipient, amount);}
        require(isAuthorized[sender] || isAuthorized[recipient] || tradingOpen, "Trading is not open yet");
        if (shouldSwapBack()) {swapBack();}

        if (transactionLimitsInEffect && !isAuthorized[sender] && !isAuthorized[recipient]) {
            require(sender != owner() && recipient != owner() && recipient != address(0) && recipient != address(DEAD), "Invalid addresses");
            if (sender == pair) { // Buy transaction
                if (!isExcludedFromTransactionLimitChecks[recipient]) {
                    require(amount <= maxTransactionLimitBuy, "Buy exceeds limit");
                    require(_balances[recipient] + amount <= maxWalletLimit, "Wallet exceeds limit");
                }
            } else if (recipient == pair) { // Sell transaction
                if (!isExcludedFromTransactionLimitChecks[sender]) {
                    require(amount <= maxTransactionLimitSell, "Sell exceeds limit");
                }
            } else { // For other transfers
                if (!isExcludedFromTransactionLimitChecks[recipient]) {
                    require(_balances[recipient] + amount <= maxWalletLimit, "Transfer exceeds limit");
                }
            }
        }

        _balances[sender] -= amount;
        uint256 amountReceived = shouldTakeFee(sender, recipient) ? takeFee(sender, amount, recipient) : amount;
        _balances[recipient] += amountReceived;
        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

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

    function takeFee(address sender, uint256 amount, address to) internal returns (uint256) {
        uint256 feeAmount = (to == pair) ? (amount * sellTotalFees) / 100 : (sender == pair ? (amount * buyTotalFees) / 100 : 0);
        if (feeAmount == 0) return amount;
        _balances[address(this)] += feeAmount;
        emit Transfer(sender, address(this), feeAmount);

        distributeFee(feeAmount, to == pair);
        return amount - feeAmount;
    }

    function distributeFee(uint256 feeAmount, bool isSell) internal {
        uint256 wallet1Part = (feeAmount * (isSell ? sellWallet1Fee : buyWallet1Fee)) / (isSell ? sellTotalFees : buyTotalFees);
        uint256 wallet2Part = (feeAmount * (isSell ? sellWallet2Fee : buyWallet2Fee)) / (isSell ? sellTotalFees : buyTotalFees);
        uint256 wallet3Part = (feeAmount * (isSell ? sellWallet3Fee : buyWallet3Fee)) / (isSell ? sellTotalFees : buyTotalFees);
        uint256 liquidityPart = feeAmount - (wallet1Part + wallet2Part + wallet3Part);

        tokenForWallet1 += wallet1Part;
        tokenForWallet2 += wallet2Part;
        tokenForWallet3 += wallet3Part;
        tokenForLiquidity += liquidityPart;
    }

    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair &&
            !inSwap &&
            swapEnabled &&
            tradingOpen &&
            _balances[address(this)] >= swapThreshold;
    }

    function swapBack() internal swapping {
        uint256 totalTokensToSwap = tokenForWallet1 + tokenForWallet2 + tokenForWallet3 + tokenForLiquidity;
        if (totalTokensToSwap == 0) return;  // If there's nothing to swap, just return
        uint256 liquidityTokens = (tokenForLiquidity * _balances[address(this)]) / (2 * totalTokensToSwap);
        uint256 amountToSwapForETH = _balances[address(this)] - liquidityTokens;
        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(amountToSwapForETH);
        uint256 newETHBalance = address(this).balance;
        uint256 ethBalanceChange = newETHBalance - initialETHBalance;
        distributeETH(ethBalanceChange, liquidityTokens, totalTokensToSwap);
    }

    function distributeETH(uint256 ethBalance, uint256 liquidityTokens, uint256 totalTokensToSwap) private {
        uint256 ethForWallet1 = ethBalance * tokenForWallet1 / totalTokensToSwap;
        uint256 ethForWallet2 = ethBalance * tokenForWallet2 / totalTokensToSwap;
        uint256 ethForWallet3 = ethBalance * tokenForWallet3 / totalTokensToSwap;
        uint256 ethForLiquidity = ethBalance - (ethForWallet1 + ethForWallet2 + ethForWallet3);

        sendETH(wallet1FeeReceiver, ethForWallet1);
        sendETH(wallet2FeeReceiver, ethForWallet2);
        sendETH(wallet3FeeReceiver, ethForWallet3);

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    function sendETH(address to, uint256 amount) private {
        (bool success, ) = payable(to).call{value: amount}("");
        require(success, "ETH Transfer failed");
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        ) {} catch {emit SwapFailed("Failed to swap tokens for ETH");}
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        try router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            DEAD,
            block.timestamp
        ) {} catch {emit LiquidityAddedFailed("Failed to add liquidity");}
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorized","type":"bool"}],"name":"AuthorizationStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"wallet1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wallet2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wallet3","type":"uint256"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"exempt","type":"bool"}],"name":"ExcludedFromTransactionLimitChecks","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"isFeeExempt","type":"bool"}],"name":"FeeExemptionStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"LiquidityAddedFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTransactionLimitBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxTransactionLimitSell","type":"uint256"}],"name":"MaxTransactionLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWalletLimit","type":"uint256"}],"name":"MaxWalletLimitUpdated","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":"wallet1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wallet2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wallet3","type":"uint256"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapBackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[],"name":"TaxCounterReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TransactionLimitsRemovedForever","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newReceiver","type":"address"}],"name":"Wallet1ReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newReceiver","type":"address"}],"name":"Wallet2ReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newReceiver","type":"address"}],"name":"Wallet3ReceiverUpdated","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyWallet1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyWallet2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyWallet3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"clearTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"excludeFromTransactionLimitChecks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromTransactionLimitChecks","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualTaxSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTransactionLimitBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionLimitSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeTransactionLimitsForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetTaxCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellWallet1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellWallet2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellWallet3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet1FeeReceiver","type":"address"}],"name":"setWallet1Receiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet2FeeReceiver","type":"address"}],"name":"setWallet2Receiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet3FeeReceiver","type":"address"}],"name":"setWallet3Receiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tokenForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenForWallet1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenForWallet2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenForWallet3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionLimitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isBlacklisted","type":"bool"}],"name":"updateBlacklistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wallet1","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"wallet2","type":"uint256"},{"internalType":"uint256","name":"wallet3","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountBuy","type":"uint256"},{"internalType":"uint256","name":"_amountSell","type":"uint256"}],"name":"updateMaxTransactionLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wallet1","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"wallet2","type":"uint256"},{"internalType":"uint256","name":"wallet3","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wallet1FeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet2FeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet3FeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526100106012600a6105fd565b61001e90630ee6b280610612565b600181815560026009819055600a819055600b829055600c8290556006600d819055600e829055600f91909155601082905560118290556012555f601381905560148190556015819055601655601b805460ff60a01b19169055601f805460ff1916821790556127109161009191610612565b61009b9190610629565b6020556021805461ff0019166101001790553480156100b8575f80fd5b505f80546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3601a80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015610159573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017d9190610648565b600280546001600160a01b0319166001600160a01b03928316179055601a546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa1580156101d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101fd9190610648565b6002546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c65396906044016020604051808303815f875af115801561024b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026f9190610648565b601b80546001600160a01b0319166001600160a01b03928316179055305f908152600460209081526040808320601a549094168352929052205f199055600180546064916102bd9190610612565b6102c79190610629565b601c55600180546064916102db9190610612565b6102e59190610629565b601d556001546064906102f9906002610612565b6103039190610629565b601e55335f9081526005602081905260408220805460ff19166001908117909155916103365f546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f908120805460ff1916921515929092179091556001906007906103775f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff19958616179055308152600892839052908120805490931660019081179093556103cc5f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff199586161790557f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd093342998054851660019081179091557f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c780549095168117909455601780546001600160a01b03199081167304662a7067d9af5bd87fbcf7ec82574a8bb60df41790915560188054821673982fb4769216023face96a4e6aa700a9cf4d0cc517905560198054909116737a3b40cb8b1addb9bfcf2bd8d1f1cb91c0ae279d179055925433808552600390935281842081905590519192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916104fa9190815260200190565b60405180910390a361066e565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561055557815f190482111561053b5761053b610507565b8085161561054857918102915b93841c9390800290610520565b509250929050565b5f8261056b575060016105f7565b8161057757505f6105f7565b816001811461058d5760028114610597576105b3565b60019150506105f7565b60ff8411156105a8576105a8610507565b50506001821b6105f7565b5060208310610133831016604e8410600b84101617156105d6575081810a6105f7565b6105e0838361051b565b805f19048211156105f3576105f3610507565b0290505b92915050565b5f61060b60ff84168361055d565b9392505050565b80820281158282048414176105f7576105f7610507565b5f8261064357634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610658575f80fd5b81516001600160a01b038116811461060b575f80fd5b6131668061067b5f395ff3fe6080604052600436106103b6575f3560e01c80638a8c523c116101e9578063dd62ed3e11610108578063f11a24d31161009d578063f887ea401161006d578063f887ea4014610a9b578063fe575a8714610aba578063fe9fbb8014610ae8578063ffb54a9914610b16575f80fd5b8063f11a24d314610a33578063f2fde38b14610a48578063f491288114610a67578063f637434214610a86575f80fd5b8063e303e662116100d8578063e303e662146109c1578063e3a4d134146109e0578063e7ad9fcd146109ff578063e9483f2514610a1e575f80fd5b8063dd62ed3e1461092b578063dea687311461096f578063df20fd4914610984578063e12d729c146109a3575f80fd5b8063a9059cbb1161017e578063b7e15da91161014e578063b7e15da9146108c3578063b8360806146108e2578063bbcdf22c14610901578063d85ba06314610916575f80fd5b8063a9059cbb14610852578063ad5c464814610871578063b48bd37014610890578063b5d2703c146108a4575f80fd5b80639ebe6908116101b95780639ebe6908146107f55780639f93910a14610809578063a0cb25f51461081e578063a8aa1b3114610833575f80fd5b80638a8c523c146107855780638da5cb5b1461079957806395d89b41146107b55780639a82d756146107e0575f80fd5b806358fa63ca116102d55780636b53c8751161026a578063724436131161023a578063724436131461072757806379fd9355146107465780637fc34ab11461075b5780638340bfa614610770575f80fd5b80636b53c875146106a75780636ddd1713146106c657806370a08231146106df578063715018a614610713575f80fd5b8063616eb638116102a5578063616eb6381461064a578063658d4b7f1461065e57806366a88d961461067d5780636a486a8e14610692575f80fd5b806358fa63ca146105d55780635d23273f146105e85780635d33f90c146106075780635f069ed514610635575f80fd5b80632e6ed7ef1161034b57806342966c681161031b57806342966c68146105645780634324deae146105835780634f006763146105a257806350c3a065146105c1575f80fd5b80632e6ed7ef146104e557806330ee928614610506578063313ce5671461051b5780633f4218e014610536575f80fd5b80630ea2290e116103865780630ea2290e1461047e57806318160ddd1461049d5780631afc8058146104b157806323b872dd146104c6575f80fd5b806303fd2a45146103c15780630445b667146103f357806306fdde0314610416578063095ea7b31461044f575f80fd5b366103bd57005b5f80fd5b3480156103cc575f80fd5b506103d661dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fe575f80fd5b5061040860205481565b6040519081526020016103ea565b348015610421575f80fd5b5060408051808201909152600881526711195c1a58dd195960c21b60208201525b6040516103ea9190612ccc565b34801561045a575f80fd5b5061046e610469366004612d15565b610b36565b60405190151581526020016103ea565b348015610489575f80fd5b506018546103d6906001600160a01b031681565b3480156104a8575f80fd5b50600154610408565b3480156104bc575f80fd5b5061040860155481565b3480156104d1575f80fd5b5061046e6104e0366004612d3f565b610ba2565b3480156104f0575f80fd5b506105046104ff366004612d7d565b610c19565b005b348015610511575f80fd5b50610408600b5481565b348015610526575f80fd5b50604051601281526020016103ea565b348015610541575f80fd5b5061046e610550366004612dac565b60056020525f908152604090205460ff1681565b34801561056f575f80fd5b5061050461057e366004612dc7565b610d2f565b34801561058e575f80fd5b5061050461059d366004612dc7565b610e65565b3480156105ad575f80fd5b506105046105bc366004612dde565b610f85565b3480156105cc575f80fd5b5061050461115e565b3480156105e0575f80fd5b506103d65f81565b3480156105f3575f80fd5b50610504610602366004612e0b565b611227565b348015610612575f80fd5b5061046e610621366004612dac565b60086020525f908152604090205460ff1681565b348015610640575f80fd5b5061040860105481565b348015610655575f80fd5b506105046112af565b348015610669575f80fd5b50610504610678366004612e0b565b61137e565b348015610688575f80fd5b50610408601e5481565b34801561069d575f80fd5b5061040860125481565b3480156106b2575f80fd5b506105046106c1366004612dac565b6113fe565b3480156106d1575f80fd5b50601f5461046e9060ff1681565b3480156106ea575f80fd5b506104086106f9366004612dac565b6001600160a01b03165f9081526003602052604090205490565b34801561071e575f80fd5b50610504611470565b348015610732575f80fd5b506019546103d6906001600160a01b031681565b348015610751575f80fd5b50610408600a5481565b348015610766575f80fd5b50610408600e5481565b34801561077b575f80fd5b50610408601c5481565b348015610790575f80fd5b506105046114d4565b3480156107a4575f80fd5b505f546001600160a01b03166103d6565b3480156107c0575f80fd5b5060408051808201909152600381526211141560ea1b6020820152610442565b3480156107eb575f80fd5b5061040860145481565b348015610800575f80fd5b506105046115a0565b348015610814575f80fd5b5061040860095481565b348015610829575f80fd5b5061040860115481565b34801561083e575f80fd5b50601b546103d6906001600160a01b031681565b34801561085d575f80fd5b5061046e61086c366004612d15565b611607565b34801561087c575f80fd5b506002546103d6906001600160a01b031681565b34801561089b575f80fd5b50610504611613565b3480156108af575f80fd5b506105046108be366004612e0b565b6116d3565b3480156108ce575f80fd5b506105046108dd366004612dac565b611753565b3480156108ed575f80fd5b506105046108fc366004612e0b565b6117c5565b34801561090c575f80fd5b5061040860165481565b348015610921575f80fd5b50610408600d5481565b348015610936575f80fd5b50610408610945366004612e42565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561097a575f80fd5b5061040860135481565b34801561098f575f80fd5b5061050461099e366004612e6e565b6118f8565b3480156109ae575f80fd5b5060215461046e90610100900460ff1681565b3480156109cc575f80fd5b506105046109db366004612dac565b6119d6565b3480156109eb575f80fd5b506017546103d6906001600160a01b031681565b348015610a0a575f80fd5b50610504610a19366004612d7d565b611bbe565b348015610a29575f80fd5b50610408601d5481565b348015610a3e575f80fd5b50610408600c5481565b348015610a53575f80fd5b50610504610a62366004612dac565b611cc3565b348015610a72575f80fd5b50610504610a81366004612dac565b611d84565b348015610a91575f80fd5b50610408600f5481565b348015610aa6575f80fd5b50601a546103d6906001600160a01b031681565b348015610ac5575f80fd5b5061046e610ad4366004612dac565b60066020525f908152604090205460ff1681565b348015610af3575f80fd5b5061046e610b02366004612dac565b60076020525f908152604090205460ff1681565b348015610b21575f80fd5b50601b5461046e90600160a01b900460ff1681565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b909086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1914610c04576001600160a01b0384165f90815260046020908152604080832033845290915281208054849290610bfe908490612e9e565b90915550505b610c0f848484611df6565b90505b9392505050565b5f546001600160a01b03163314610c4b5760405162461bcd60e51b8152600401610c4290612eb1565b60405180910390fd5b6009849055600c839055600a829055600b8190558082610c6b8587612edc565b610c759190612edc565b610c7f9190612edc565b600d819055600a1015610ce05760405162461bcd60e51b8152602060048201526024808201527f42757920666565732063616e206e6f742062652067726561746572207468616e6044820152632031302560e01b6064820152608401610c42565b6040805185815260208101859052908101839052606081018290527f892b2caa2d791bf7b8d9a49c4db7a4513ff1ae2e0e068ed217f9d5ab4c1a28f0906080015b60405180910390a150505050565b5f546001600160a01b03163314610d585760405162461bcd60e51b8152600401610c4290612eb1565b5f8111610da75760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610c42565b335f90815260036020526040902054811115610e055760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e742062616c616e636520746f206275726e000000006044820152606401610c42565b8060015f828254610e169190612e9e565b9091555050335f9081526003602052604081208054839290610e39908490612e9e565b90915550506040518181525f9033905f805160206131118339815191529060200160405180910390a350565b5f546001600160a01b03163314610e8e5760405162461bcd60e51b8152600401610c4290612eb1565b610e9a6012600a612fcf565b60646001546001610eab9190612fdd565b610eb59190612ff4565b610ebf9190612ff4565b811015610f345760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f7420736574206d617857616c6c65744c696d6974206c6f7765722060448201527f7468616e203125206f6620746f74616c20737570706c790000000000000000006064820152608401610c42565b610f406012600a612fcf565b610f4a9082612fdd565b601e8190556040519081527fe2e6151ed0b472c61401059745339ca42474813911b22d24023385def6377e1c9060200160405180910390a150565b5f546001600160a01b03163314610fae5760405162461bcd60e51b8152600401610c4290612eb1565b5f610fbb6012600a612fcf565b6103e86001546001610fcd9190612fdd565b610fd79190612ff4565b610fe19190612ff4565b9050808310156110635760405162461bcd60e51b815260206004820152604160248201527f43616e6e6f7420736574206d61785472616e73616374696f6e4c696d6974427560448201527f79206c6f776572207468616e20302e3125206f6620746f74616c20737570706c6064820152607960f81b608482015260a401610c42565b808210156110e45760405162461bcd60e51b815260206004820152604260248201527f43616e6e6f7420736574206d61785472616e73616374696f6e4c696d6974536560448201527f6c6c206c6f776572207468616e20302e3125206f6620746f74616c20737570706064820152616c7960f01b608482015260a401610c42565b6110f06012600a612fcf565b6110fa9084612fdd565b601c556111096012600a612fcf565b6111139083612fdd565b601d819055601c546040517f8c783a77c5aa395c8a91cbc5151561b3e731af22c701db3f250e9f63726b488092611151928252602082015260400190565b60405180910390a1505050565b5f546001600160a01b031633146111875760405162461bcd60e51b8152600401610c4290612eb1565b305f90815260036020526040902054806111d75760405162461bcd60e51b815260206004820152601160248201527004e6f20746f6b656e7320746f207377617607c1b6044820152606401610c42565b60215460ff161561121c5760405162461bcd60e51b815260206004820152600f60248201526e0416c726561647920696e207377617608c1b6044820152606401610c42565b611224612332565b50565b5f546001600160a01b031633146112505760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382165f81815260076020908152604091829020805460ff191685151590811790915591519182527fb1efe852be30e7167f7516f06975288bb90db091d44bb7a9af30947600cc88e691015b60405180910390a25050565b5f546001600160a01b031633146112d85760405162461bcd60e51b8152600401610c4290612eb1565b478061131b5760405162461bcd60e51b8152602060048201526012602482015271139bc8115512081a5b8818dbdb9d1c9858dd60721b6044820152606401610c42565b604051339082156108fc029083905f818181858888f19350505050158015611345573d5f803e3d5ffd5b5060405181815233907fb04a5c4bad0471e14274f37daa3837a36ec3eb247e07c385b164ceb3aca699ae9060200160405180910390a250565b5f546001600160a01b031633146113a75760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382165f81815260056020908152604091829020805460ff191685151590811790915591519182527f7f6f5fb51391452770326385e3346a0f01613c59fb90ca223cf38a74796df38e91016112a3565b5f546001600160a01b031633146114275760405162461bcd60e51b8152600401610c4290612eb1565b601880546001600160a01b0319166001600160a01b0383169081179091556040517fbbb21d3193bc05d347de5f275b917079ea7032e862b75e419055583b1f26a97d905f90a250565b5f546001600160a01b031633146114995760405162461bcd60e51b8152600401610c4290612eb1565b5f80546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b5f546001600160a01b031633146114fd5760405162461bcd60e51b8152600401610c4290612eb1565b601b54600160a01b900460ff16156115575760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610c42565b601b805460ff60a01b1916600160a01b179055604051600181527fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a9060200160405180910390a1565b5f546001600160a01b031633146115c95760405162461bcd60e51b8152600401610c4290612eb1565b5f60138190556014819055601581905560168190556040517f88a2eaf8279b4700c41049eef111b3cf995af0f05743dc0ebacef57d8199b3e89190a1565b5f610c12338484611df6565b5f546001600160a01b0316331461163c5760405162461bcd60e51b8152600401610c4290612eb1565b602154610100900460ff1661169e5760405162461bcd60e51b815260206004820152602260248201527f5472616e73616374696f6e206c696d69747320616c72656164792072656d6f76604482015261195960f21b6064820152608401610c42565b6021805461ff00191690556040517f501b52b2e87d4f95f50c13f7b22c6a69c776eea1da388bc5d5bca2c92f0a0259905f90a1565b5f546001600160a01b031633146116fc5760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382165f81815260086020908152604091829020805460ff191685151590811790915591519182527f5e2fbd7e4595cc665b7c4ac07e2f0fd6fd9c6150fbcb6239a698edf8ea5d035f91016112a3565b5f546001600160a01b0316331461177c5760405162461bcd60e51b8152600401610c4290612eb1565b601780546001600160a01b0319166001600160a01b0383169081179091556040517f2066f27514d1fa80d57c52f882f9514de9a57157a5742181e53d973dc3258f25905f90a250565b5f546001600160a01b031633146117ee5760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382166118365760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c42565b5f546001600160a01b03166001600160a01b0316826001600160a01b0316036118a15760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f7420626c61636b6c69737420746865206f776e65720000000000006044820152606401610c42565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac91016112a3565b5f546001600160a01b031633146119215760405162461bcd60e51b8152600401610c4290612eb1565b6109c481116119835760405162461bcd60e51b815260206004820152602860248201527f53776170207468726573686f6c64206d75737420626520677265617465722074604482015267068616e20323530360c41b6064820152608401610c42565b601f805460ff19168315159081179091556020828155604080519283529082018390527f30e0f7c488b6c70123097f13cf387e140b0e0b8c9d9e3473e502f35b035d377c91015b60405180910390a15050565b5f546001600160a01b031633146119ff5760405162461bcd60e51b8152600401610c4290612eb1565b306001600160a01b03821603611a575760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f7420636c656172206e617469766520746f6b656e730000000000006044820152606401610c42565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac19190613013565b90505f8111611b095760405162461bcd60e51b8152602060048201526014602482015273139bc81d1bdad95b881a5b8818dbdb9d1c9858dd60621b6044820152606401610c42565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015611b53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b77919061302a565b5060405181815233906001600160a01b038516907f29f092f0132733eafea5bfaa3a548578cf46b1ed811bdd2d76ee4603aa888b6b906020015b60405180910390a3505050565b5f546001600160a01b03163314611be75760405162461bcd60e51b8152600401610c4290612eb1565b600e849055600f839055601082905560118190558082611c078587612edc565b611c119190612edc565b611c1b9190612edc565b6012819055600a1015611c7e5760405162461bcd60e51b815260206004820152602560248201527f53656c6c20666565732063616e206e6f742062652067726561746572207468616044820152646e2031302560d81b6064820152608401610c42565b6040805185815260208101859052908101839052606081018290527f439932620c72dddea29980c098bca1a482729646d1216b226d723c6d278a30d190608001610d21565b5f546001600160a01b03163314611cec5760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b038116611d3a5760405162461bcd60e51b81526020600482015260156024820152742ab9b2903932b737bab731b290333ab731ba34b7b760591b6044820152606401610c42565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b03163314611dad5760405162461bcd60e51b8152600401610c4290612eb1565b601980546001600160a01b0319166001600160a01b0383169081179091556040517f41c4b0dd16ccfd8e6812e80870e3042cdf16e8a38135050fffa9d51e6f51c62e905f90a250565b6001600160a01b0383165f9081526006602052604081205460ff1615611e565760405162461bcd60e51b815260206004820152601560248201527414d95b99195c881a5cc8189b1858dadb1a5cdd1959605a1b6044820152606401610c42565b6001600160a01b0383165f9081526006602052604090205460ff1615611ebe5760405162461bcd60e51b815260206004820152601860248201527f526563697069656e7420697320626c61636b6c697374656400000000000000006044820152606401610c42565b60215460ff1615611edb57611ed4848484612403565b9050610c12565b6001600160a01b0384165f9081526007602052604090205460ff1680611f1857506001600160a01b0383165f9081526007602052604090205460ff165b80611f2c5750601b54600160a01b900460ff165b611f785760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206973206e6f74206f70656e207965740000000000000000006044820152606401610c42565b611f806124a3565b15611f8d57611f8d612332565b602154610100900460ff168015611fbc57506001600160a01b0384165f9081526007602052604090205460ff16155b8015611fe057506001600160a01b0383165f9081526007602052604090205460ff16155b1561226d575f546001600160a01b0385811691161480159061200f57505f546001600160a01b03848116911614155b801561202357506001600160a01b03831615155b801561203a57506001600160a01b03831661dead14155b61207a5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b6044820152606401610c42565b601b546001600160a01b0390811690851603612165576001600160a01b0383165f9081526008602052604090205460ff1661216057601c548211156120f55760405162461bcd60e51b8152602060048201526011602482015270109d5e48195e18d959591cc81b1a5b5a5d607a1b6044820152606401610c42565b601e546001600160a01b0384165f9081526003602052604090205461211b908490612edc565b11156121605760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08195e18d959591cc81b1a5b5a5d60621b6044820152606401610c42565b61226d565b601b546001600160a01b03908116908416036121e1576001600160a01b0384165f9081526008602052604090205460ff1661216057601d548211156121605760405162461bcd60e51b815260206004820152601260248201527114d95b1b08195e18d959591cc81b1a5b5a5d60721b6044820152606401610c42565b6001600160a01b0383165f9081526008602052604090205460ff1661226d57601e546001600160a01b0384165f90815260036020526040902054612226908490612edc565b111561226d5760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c88195e18d959591cc81b1a5b5a5d60521b6044820152606401610c42565b6001600160a01b0384165f9081526003602052604081208054849290612294908490612e9e565b909155505f90506122a58585612509565b6122af57826122ba565b6122ba85848661254d565b6001600160a01b0385165f908152600360205260408120805492935083929091906122e6908490612edc565b92505081905550836001600160a01b0316856001600160a01b03165f805160206131118339815191528360405161231f91815260200190565b60405180910390a3506001949350505050565b6021805460ff191660011790556016546015546014546013545f93929161235891612edc565b6123629190612edc565b61236c9190612edc565b9050805f0361237b57506123f7565b5f612387826002612fdd565b305f908152600360205260409020546016546123a39190612fdd565b6123ad9190612ff4565b305f90815260036020526040812054919250906123cb908390612e9e565b9050476123d78261264b565b475f6123e38383612e9e565b90506123f08186886127f9565b5050505050505b6021805460ff19169055565b6001600160a01b0383165f9081526003602052604081208054839190839061242c908490612e9e565b90915550506001600160a01b0383165f9081526003602052604081208054849290612458908490612edc565b92505081905550826001600160a01b0316846001600160a01b03165f805160206131118339815191528460405161249191815260200190565b60405180910390a35060019392505050565b601b545f906001600160a01b031633148015906124c3575060215460ff16155b80156124d15750601f5460ff165b80156124e65750601b54600160a01b900460ff165b8015612504575060208054305f908152600390925260409091205410155b905090565b6001600160a01b0382165f9081526005602052604081205460ff16158015610c125750506001600160a01b03165f9081526005602052604090205460ff1615919050565b601b545f9081906001600160a01b038481169116146125a057601b546001600160a01b03868116911614612581575f6125ba565b6064600d54856125919190612fdd565b61259b9190612ff4565b6125ba565b6064601254856125b09190612fdd565b6125ba9190612ff4565b9050805f036125cc5783915050610c12565b305f90815260036020526040812080548392906125ea908490612edc565b909155505060405181815230906001600160a01b038716905f805160206131118339815191529060200160405180910390a3601b546126389082906001600160a01b038681169116146128d8565b6126428185612e9e565b95945050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061267e5761267e613045565b6001600160a01b03928316602091820292909201810191909152601a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156126d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126f99190613059565b8160018151811061270c5761270c613045565b6001600160a01b039283166020918202929092010152601a546127329130911684612a0b565b601a5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061276a9085905f90869030904290600401613074565b5f604051808303815f87803b158015612781575f80fd5b505af1925050508015612792575060015b6127f5577f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07236040516119ca906020808252601d908201527f4661696c656420746f207377617020746f6b656e7320666f7220455448000000604082015260600190565b5050565b5f81601354856128099190612fdd565b6128139190612ff4565b90505f82601454866128259190612fdd565b61282f9190612ff4565b90505f83601554876128419190612fdd565b61284b9190612ff4565b90505f816128598486612edc565b6128639190612edc565b61286d9088612e9e565b601754909150612886906001600160a01b031685612b26565b60185461289c906001600160a01b031684612b26565b6019546128b2906001600160a01b031683612b26565b5f861180156128c057505f81115b156128cf576128cf8682612bc0565b50505050505050565b5f816128e657600d546128ea565b6012545b826128f7576009546128fb565b600e545b6129059085612fdd565b61290f9190612ff4565b90505f8261291f57600d54612923565b6012545b8361293057600a54612934565b6010545b61293e9086612fdd565b6129489190612ff4565b90505f8361295857600d5461295c565b6012545b8461296957600b5461296d565b6011545b6129779087612fdd565b6129819190612ff4565b90505f8161298f8486612edc565b6129999190612edc565b6129a39087612e9e565b90508360135f8282546129b69190612edc565b925050819055508260145f8282546129ce9190612edc565b925050819055508160155f8282546129e69190612edc565b925050819055508060165f8282546129fe9190612edc565b9091555050505050505050565b6001600160a01b038316612a6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c42565b6001600160a01b038216612ace5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c42565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611bb1565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612b6f576040519150601f19603f3d011682016040523d82523d5f602084013e612b74565b606091505b5050905080612bbb5760405162461bcd60e51b815260206004820152601360248201527211551208151c985b9cd9995c8819985a5b1959606a1b6044820152606401610c42565b505050565b601a54612bd89030906001600160a01b031684612a0b565b601a5460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af193505050508015612c62575060408051601f3d908101601f19168201909252612c5f918101906130e5565b60015b612cc5577f64fb7f56dc3c30cbc51de6b01b5c5db1150d07b45c9c633b8b70667484b392c76040516119ca9060208082526017908201527f4661696c656420746f20616464206c6971756964697479000000000000000000604082015260600190565b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611224575f80fd5b5f8060408385031215612d26575f80fd5b8235612d3181612d01565b946020939093013593505050565b5f805f60608486031215612d51575f80fd5b8335612d5c81612d01565b92506020840135612d6c81612d01565b929592945050506040919091013590565b5f805f8060808587031215612d90575f80fd5b5050823594602084013594506040840135936060013592509050565b5f60208284031215612dbc575f80fd5b8135610c1281612d01565b5f60208284031215612dd7575f80fd5b5035919050565b5f8060408385031215612def575f80fd5b50508035926020909101359150565b8015158114611224575f80fd5b5f8060408385031215612e1c575f80fd5b8235612e2781612d01565b91506020830135612e3781612dfe565b809150509250929050565b5f8060408385031215612e53575f80fd5b8235612e5e81612d01565b91506020830135612e3781612d01565b5f8060408385031215612e7f575f80fd5b8235612d3181612dfe565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610b9c57610b9c612e8a565b6020808252601190820152702cb7ba9030b932903737ba1037bbb732b960791b604082015260600190565b80820180821115610b9c57610b9c612e8a565b600181815b80851115612f2957815f1904821115612f0f57612f0f612e8a565b80851615612f1c57918102915b93841c9390800290612ef4565b509250929050565b5f82612f3f57506001610b9c565b81612f4b57505f610b9c565b8160018114612f615760028114612f6b57612f87565b6001915050610b9c565b60ff841115612f7c57612f7c612e8a565b50506001821b610b9c565b5060208310610133831016604e8410600b8410161715612faa575081810a610b9c565b612fb48383612eef565b805f1904821115612fc757612fc7612e8a565b029392505050565b5f610c1260ff841683612f31565b8082028115828204841417610b9c57610b9c612e8a565b5f8261300e57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613023575f80fd5b5051919050565b5f6020828403121561303a575f80fd5b8151610c1281612dfe565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613069575f80fd5b8151610c1281612d01565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156130c45784516001600160a01b03168352938301939183019160010161309f565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156130f7575f80fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bb25d09cf0d1e771abeb1b7e5a53d6ff9208f9ae62e3b4d84c2eb9a4814f5b1a64736f6c63430008190033

Deployed Bytecode

0x6080604052600436106103b6575f3560e01c80638a8c523c116101e9578063dd62ed3e11610108578063f11a24d31161009d578063f887ea401161006d578063f887ea4014610a9b578063fe575a8714610aba578063fe9fbb8014610ae8578063ffb54a9914610b16575f80fd5b8063f11a24d314610a33578063f2fde38b14610a48578063f491288114610a67578063f637434214610a86575f80fd5b8063e303e662116100d8578063e303e662146109c1578063e3a4d134146109e0578063e7ad9fcd146109ff578063e9483f2514610a1e575f80fd5b8063dd62ed3e1461092b578063dea687311461096f578063df20fd4914610984578063e12d729c146109a3575f80fd5b8063a9059cbb1161017e578063b7e15da91161014e578063b7e15da9146108c3578063b8360806146108e2578063bbcdf22c14610901578063d85ba06314610916575f80fd5b8063a9059cbb14610852578063ad5c464814610871578063b48bd37014610890578063b5d2703c146108a4575f80fd5b80639ebe6908116101b95780639ebe6908146107f55780639f93910a14610809578063a0cb25f51461081e578063a8aa1b3114610833575f80fd5b80638a8c523c146107855780638da5cb5b1461079957806395d89b41146107b55780639a82d756146107e0575f80fd5b806358fa63ca116102d55780636b53c8751161026a578063724436131161023a578063724436131461072757806379fd9355146107465780637fc34ab11461075b5780638340bfa614610770575f80fd5b80636b53c875146106a75780636ddd1713146106c657806370a08231146106df578063715018a614610713575f80fd5b8063616eb638116102a5578063616eb6381461064a578063658d4b7f1461065e57806366a88d961461067d5780636a486a8e14610692575f80fd5b806358fa63ca146105d55780635d23273f146105e85780635d33f90c146106075780635f069ed514610635575f80fd5b80632e6ed7ef1161034b57806342966c681161031b57806342966c68146105645780634324deae146105835780634f006763146105a257806350c3a065146105c1575f80fd5b80632e6ed7ef146104e557806330ee928614610506578063313ce5671461051b5780633f4218e014610536575f80fd5b80630ea2290e116103865780630ea2290e1461047e57806318160ddd1461049d5780631afc8058146104b157806323b872dd146104c6575f80fd5b806303fd2a45146103c15780630445b667146103f357806306fdde0314610416578063095ea7b31461044f575f80fd5b366103bd57005b5f80fd5b3480156103cc575f80fd5b506103d661dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fe575f80fd5b5061040860205481565b6040519081526020016103ea565b348015610421575f80fd5b5060408051808201909152600881526711195c1a58dd195960c21b60208201525b6040516103ea9190612ccc565b34801561045a575f80fd5b5061046e610469366004612d15565b610b36565b60405190151581526020016103ea565b348015610489575f80fd5b506018546103d6906001600160a01b031681565b3480156104a8575f80fd5b50600154610408565b3480156104bc575f80fd5b5061040860155481565b3480156104d1575f80fd5b5061046e6104e0366004612d3f565b610ba2565b3480156104f0575f80fd5b506105046104ff366004612d7d565b610c19565b005b348015610511575f80fd5b50610408600b5481565b348015610526575f80fd5b50604051601281526020016103ea565b348015610541575f80fd5b5061046e610550366004612dac565b60056020525f908152604090205460ff1681565b34801561056f575f80fd5b5061050461057e366004612dc7565b610d2f565b34801561058e575f80fd5b5061050461059d366004612dc7565b610e65565b3480156105ad575f80fd5b506105046105bc366004612dde565b610f85565b3480156105cc575f80fd5b5061050461115e565b3480156105e0575f80fd5b506103d65f81565b3480156105f3575f80fd5b50610504610602366004612e0b565b611227565b348015610612575f80fd5b5061046e610621366004612dac565b60086020525f908152604090205460ff1681565b348015610640575f80fd5b5061040860105481565b348015610655575f80fd5b506105046112af565b348015610669575f80fd5b50610504610678366004612e0b565b61137e565b348015610688575f80fd5b50610408601e5481565b34801561069d575f80fd5b5061040860125481565b3480156106b2575f80fd5b506105046106c1366004612dac565b6113fe565b3480156106d1575f80fd5b50601f5461046e9060ff1681565b3480156106ea575f80fd5b506104086106f9366004612dac565b6001600160a01b03165f9081526003602052604090205490565b34801561071e575f80fd5b50610504611470565b348015610732575f80fd5b506019546103d6906001600160a01b031681565b348015610751575f80fd5b50610408600a5481565b348015610766575f80fd5b50610408600e5481565b34801561077b575f80fd5b50610408601c5481565b348015610790575f80fd5b506105046114d4565b3480156107a4575f80fd5b505f546001600160a01b03166103d6565b3480156107c0575f80fd5b5060408051808201909152600381526211141560ea1b6020820152610442565b3480156107eb575f80fd5b5061040860145481565b348015610800575f80fd5b506105046115a0565b348015610814575f80fd5b5061040860095481565b348015610829575f80fd5b5061040860115481565b34801561083e575f80fd5b50601b546103d6906001600160a01b031681565b34801561085d575f80fd5b5061046e61086c366004612d15565b611607565b34801561087c575f80fd5b506002546103d6906001600160a01b031681565b34801561089b575f80fd5b50610504611613565b3480156108af575f80fd5b506105046108be366004612e0b565b6116d3565b3480156108ce575f80fd5b506105046108dd366004612dac565b611753565b3480156108ed575f80fd5b506105046108fc366004612e0b565b6117c5565b34801561090c575f80fd5b5061040860165481565b348015610921575f80fd5b50610408600d5481565b348015610936575f80fd5b50610408610945366004612e42565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561097a575f80fd5b5061040860135481565b34801561098f575f80fd5b5061050461099e366004612e6e565b6118f8565b3480156109ae575f80fd5b5060215461046e90610100900460ff1681565b3480156109cc575f80fd5b506105046109db366004612dac565b6119d6565b3480156109eb575f80fd5b506017546103d6906001600160a01b031681565b348015610a0a575f80fd5b50610504610a19366004612d7d565b611bbe565b348015610a29575f80fd5b50610408601d5481565b348015610a3e575f80fd5b50610408600c5481565b348015610a53575f80fd5b50610504610a62366004612dac565b611cc3565b348015610a72575f80fd5b50610504610a81366004612dac565b611d84565b348015610a91575f80fd5b50610408600f5481565b348015610aa6575f80fd5b50601a546103d6906001600160a01b031681565b348015610ac5575f80fd5b5061046e610ad4366004612dac565b60066020525f908152604090205460ff1681565b348015610af3575f80fd5b5061046e610b02366004612dac565b60076020525f908152604090205460ff1681565b348015610b21575f80fd5b50601b5461046e90600160a01b900460ff1681565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b909086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f1914610c04576001600160a01b0384165f90815260046020908152604080832033845290915281208054849290610bfe908490612e9e565b90915550505b610c0f848484611df6565b90505b9392505050565b5f546001600160a01b03163314610c4b5760405162461bcd60e51b8152600401610c4290612eb1565b60405180910390fd5b6009849055600c839055600a829055600b8190558082610c6b8587612edc565b610c759190612edc565b610c7f9190612edc565b600d819055600a1015610ce05760405162461bcd60e51b8152602060048201526024808201527f42757920666565732063616e206e6f742062652067726561746572207468616e6044820152632031302560e01b6064820152608401610c42565b6040805185815260208101859052908101839052606081018290527f892b2caa2d791bf7b8d9a49c4db7a4513ff1ae2e0e068ed217f9d5ab4c1a28f0906080015b60405180910390a150505050565b5f546001600160a01b03163314610d585760405162461bcd60e51b8152600401610c4290612eb1565b5f8111610da75760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610c42565b335f90815260036020526040902054811115610e055760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e742062616c616e636520746f206275726e000000006044820152606401610c42565b8060015f828254610e169190612e9e565b9091555050335f9081526003602052604081208054839290610e39908490612e9e565b90915550506040518181525f9033905f805160206131118339815191529060200160405180910390a350565b5f546001600160a01b03163314610e8e5760405162461bcd60e51b8152600401610c4290612eb1565b610e9a6012600a612fcf565b60646001546001610eab9190612fdd565b610eb59190612ff4565b610ebf9190612ff4565b811015610f345760405162461bcd60e51b815260206004820152603760248201527f43616e6e6f7420736574206d617857616c6c65744c696d6974206c6f7765722060448201527f7468616e203125206f6620746f74616c20737570706c790000000000000000006064820152608401610c42565b610f406012600a612fcf565b610f4a9082612fdd565b601e8190556040519081527fe2e6151ed0b472c61401059745339ca42474813911b22d24023385def6377e1c9060200160405180910390a150565b5f546001600160a01b03163314610fae5760405162461bcd60e51b8152600401610c4290612eb1565b5f610fbb6012600a612fcf565b6103e86001546001610fcd9190612fdd565b610fd79190612ff4565b610fe19190612ff4565b9050808310156110635760405162461bcd60e51b815260206004820152604160248201527f43616e6e6f7420736574206d61785472616e73616374696f6e4c696d6974427560448201527f79206c6f776572207468616e20302e3125206f6620746f74616c20737570706c6064820152607960f81b608482015260a401610c42565b808210156110e45760405162461bcd60e51b815260206004820152604260248201527f43616e6e6f7420736574206d61785472616e73616374696f6e4c696d6974536560448201527f6c6c206c6f776572207468616e20302e3125206f6620746f74616c20737570706064820152616c7960f01b608482015260a401610c42565b6110f06012600a612fcf565b6110fa9084612fdd565b601c556111096012600a612fcf565b6111139083612fdd565b601d819055601c546040517f8c783a77c5aa395c8a91cbc5151561b3e731af22c701db3f250e9f63726b488092611151928252602082015260400190565b60405180910390a1505050565b5f546001600160a01b031633146111875760405162461bcd60e51b8152600401610c4290612eb1565b305f90815260036020526040902054806111d75760405162461bcd60e51b815260206004820152601160248201527004e6f20746f6b656e7320746f207377617607c1b6044820152606401610c42565b60215460ff161561121c5760405162461bcd60e51b815260206004820152600f60248201526e0416c726561647920696e207377617608c1b6044820152606401610c42565b611224612332565b50565b5f546001600160a01b031633146112505760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382165f81815260076020908152604091829020805460ff191685151590811790915591519182527fb1efe852be30e7167f7516f06975288bb90db091d44bb7a9af30947600cc88e691015b60405180910390a25050565b5f546001600160a01b031633146112d85760405162461bcd60e51b8152600401610c4290612eb1565b478061131b5760405162461bcd60e51b8152602060048201526012602482015271139bc8115512081a5b8818dbdb9d1c9858dd60721b6044820152606401610c42565b604051339082156108fc029083905f818181858888f19350505050158015611345573d5f803e3d5ffd5b5060405181815233907fb04a5c4bad0471e14274f37daa3837a36ec3eb247e07c385b164ceb3aca699ae9060200160405180910390a250565b5f546001600160a01b031633146113a75760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382165f81815260056020908152604091829020805460ff191685151590811790915591519182527f7f6f5fb51391452770326385e3346a0f01613c59fb90ca223cf38a74796df38e91016112a3565b5f546001600160a01b031633146114275760405162461bcd60e51b8152600401610c4290612eb1565b601880546001600160a01b0319166001600160a01b0383169081179091556040517fbbb21d3193bc05d347de5f275b917079ea7032e862b75e419055583b1f26a97d905f90a250565b5f546001600160a01b031633146114995760405162461bcd60e51b8152600401610c4290612eb1565b5f80546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b5f546001600160a01b031633146114fd5760405162461bcd60e51b8152600401610c4290612eb1565b601b54600160a01b900460ff16156115575760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610c42565b601b805460ff60a01b1916600160a01b179055604051600181527fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a9060200160405180910390a1565b5f546001600160a01b031633146115c95760405162461bcd60e51b8152600401610c4290612eb1565b5f60138190556014819055601581905560168190556040517f88a2eaf8279b4700c41049eef111b3cf995af0f05743dc0ebacef57d8199b3e89190a1565b5f610c12338484611df6565b5f546001600160a01b0316331461163c5760405162461bcd60e51b8152600401610c4290612eb1565b602154610100900460ff1661169e5760405162461bcd60e51b815260206004820152602260248201527f5472616e73616374696f6e206c696d69747320616c72656164792072656d6f76604482015261195960f21b6064820152608401610c42565b6021805461ff00191690556040517f501b52b2e87d4f95f50c13f7b22c6a69c776eea1da388bc5d5bca2c92f0a0259905f90a1565b5f546001600160a01b031633146116fc5760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382165f81815260086020908152604091829020805460ff191685151590811790915591519182527f5e2fbd7e4595cc665b7c4ac07e2f0fd6fd9c6150fbcb6239a698edf8ea5d035f91016112a3565b5f546001600160a01b0316331461177c5760405162461bcd60e51b8152600401610c4290612eb1565b601780546001600160a01b0319166001600160a01b0383169081179091556040517f2066f27514d1fa80d57c52f882f9514de9a57157a5742181e53d973dc3258f25905f90a250565b5f546001600160a01b031633146117ee5760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b0382166118365760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610c42565b5f546001600160a01b03166001600160a01b0316826001600160a01b0316036118a15760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f7420626c61636b6c69737420746865206f776e65720000000000006044820152606401610c42565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac91016112a3565b5f546001600160a01b031633146119215760405162461bcd60e51b8152600401610c4290612eb1565b6109c481116119835760405162461bcd60e51b815260206004820152602860248201527f53776170207468726573686f6c64206d75737420626520677265617465722074604482015267068616e20323530360c41b6064820152608401610c42565b601f805460ff19168315159081179091556020828155604080519283529082018390527f30e0f7c488b6c70123097f13cf387e140b0e0b8c9d9e3473e502f35b035d377c91015b60405180910390a15050565b5f546001600160a01b031633146119ff5760405162461bcd60e51b8152600401610c4290612eb1565b306001600160a01b03821603611a575760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f7420636c656172206e617469766520746f6b656e730000000000006044820152606401610c42565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611a9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac19190613013565b90505f8111611b095760405162461bcd60e51b8152602060048201526014602482015273139bc81d1bdad95b881a5b8818dbdb9d1c9858dd60621b6044820152606401610c42565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015611b53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b77919061302a565b5060405181815233906001600160a01b038516907f29f092f0132733eafea5bfaa3a548578cf46b1ed811bdd2d76ee4603aa888b6b906020015b60405180910390a3505050565b5f546001600160a01b03163314611be75760405162461bcd60e51b8152600401610c4290612eb1565b600e849055600f839055601082905560118190558082611c078587612edc565b611c119190612edc565b611c1b9190612edc565b6012819055600a1015611c7e5760405162461bcd60e51b815260206004820152602560248201527f53656c6c20666565732063616e206e6f742062652067726561746572207468616044820152646e2031302560d81b6064820152608401610c42565b6040805185815260208101859052908101839052606081018290527f439932620c72dddea29980c098bca1a482729646d1216b226d723c6d278a30d190608001610d21565b5f546001600160a01b03163314611cec5760405162461bcd60e51b8152600401610c4290612eb1565b6001600160a01b038116611d3a5760405162461bcd60e51b81526020600482015260156024820152742ab9b2903932b737bab731b290333ab731ba34b7b760591b6044820152606401610c42565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b03163314611dad5760405162461bcd60e51b8152600401610c4290612eb1565b601980546001600160a01b0319166001600160a01b0383169081179091556040517f41c4b0dd16ccfd8e6812e80870e3042cdf16e8a38135050fffa9d51e6f51c62e905f90a250565b6001600160a01b0383165f9081526006602052604081205460ff1615611e565760405162461bcd60e51b815260206004820152601560248201527414d95b99195c881a5cc8189b1858dadb1a5cdd1959605a1b6044820152606401610c42565b6001600160a01b0383165f9081526006602052604090205460ff1615611ebe5760405162461bcd60e51b815260206004820152601860248201527f526563697069656e7420697320626c61636b6c697374656400000000000000006044820152606401610c42565b60215460ff1615611edb57611ed4848484612403565b9050610c12565b6001600160a01b0384165f9081526007602052604090205460ff1680611f1857506001600160a01b0383165f9081526007602052604090205460ff165b80611f2c5750601b54600160a01b900460ff165b611f785760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206973206e6f74206f70656e207965740000000000000000006044820152606401610c42565b611f806124a3565b15611f8d57611f8d612332565b602154610100900460ff168015611fbc57506001600160a01b0384165f9081526007602052604090205460ff16155b8015611fe057506001600160a01b0383165f9081526007602052604090205460ff16155b1561226d575f546001600160a01b0385811691161480159061200f57505f546001600160a01b03848116911614155b801561202357506001600160a01b03831615155b801561203a57506001600160a01b03831661dead14155b61207a5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b6044820152606401610c42565b601b546001600160a01b0390811690851603612165576001600160a01b0383165f9081526008602052604090205460ff1661216057601c548211156120f55760405162461bcd60e51b8152602060048201526011602482015270109d5e48195e18d959591cc81b1a5b5a5d607a1b6044820152606401610c42565b601e546001600160a01b0384165f9081526003602052604090205461211b908490612edc565b11156121605760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08195e18d959591cc81b1a5b5a5d60621b6044820152606401610c42565b61226d565b601b546001600160a01b03908116908416036121e1576001600160a01b0384165f9081526008602052604090205460ff1661216057601d548211156121605760405162461bcd60e51b815260206004820152601260248201527114d95b1b08195e18d959591cc81b1a5b5a5d60721b6044820152606401610c42565b6001600160a01b0383165f9081526008602052604090205460ff1661226d57601e546001600160a01b0384165f90815260036020526040902054612226908490612edc565b111561226d5760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c88195e18d959591cc81b1a5b5a5d60521b6044820152606401610c42565b6001600160a01b0384165f9081526003602052604081208054849290612294908490612e9e565b909155505f90506122a58585612509565b6122af57826122ba565b6122ba85848661254d565b6001600160a01b0385165f908152600360205260408120805492935083929091906122e6908490612edc565b92505081905550836001600160a01b0316856001600160a01b03165f805160206131118339815191528360405161231f91815260200190565b60405180910390a3506001949350505050565b6021805460ff191660011790556016546015546014546013545f93929161235891612edc565b6123629190612edc565b61236c9190612edc565b9050805f0361237b57506123f7565b5f612387826002612fdd565b305f908152600360205260409020546016546123a39190612fdd565b6123ad9190612ff4565b305f90815260036020526040812054919250906123cb908390612e9e565b9050476123d78261264b565b475f6123e38383612e9e565b90506123f08186886127f9565b5050505050505b6021805460ff19169055565b6001600160a01b0383165f9081526003602052604081208054839190839061242c908490612e9e565b90915550506001600160a01b0383165f9081526003602052604081208054849290612458908490612edc565b92505081905550826001600160a01b0316846001600160a01b03165f805160206131118339815191528460405161249191815260200190565b60405180910390a35060019392505050565b601b545f906001600160a01b031633148015906124c3575060215460ff16155b80156124d15750601f5460ff165b80156124e65750601b54600160a01b900460ff165b8015612504575060208054305f908152600390925260409091205410155b905090565b6001600160a01b0382165f9081526005602052604081205460ff16158015610c125750506001600160a01b03165f9081526005602052604090205460ff1615919050565b601b545f9081906001600160a01b038481169116146125a057601b546001600160a01b03868116911614612581575f6125ba565b6064600d54856125919190612fdd565b61259b9190612ff4565b6125ba565b6064601254856125b09190612fdd565b6125ba9190612ff4565b9050805f036125cc5783915050610c12565b305f90815260036020526040812080548392906125ea908490612edc565b909155505060405181815230906001600160a01b038716905f805160206131118339815191529060200160405180910390a3601b546126389082906001600160a01b038681169116146128d8565b6126428185612e9e565b95945050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061267e5761267e613045565b6001600160a01b03928316602091820292909201810191909152601a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156126d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126f99190613059565b8160018151811061270c5761270c613045565b6001600160a01b039283166020918202929092010152601a546127329130911684612a0b565b601a5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061276a9085905f90869030904290600401613074565b5f604051808303815f87803b158015612781575f80fd5b505af1925050508015612792575060015b6127f5577f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07236040516119ca906020808252601d908201527f4661696c656420746f207377617020746f6b656e7320666f7220455448000000604082015260600190565b5050565b5f81601354856128099190612fdd565b6128139190612ff4565b90505f82601454866128259190612fdd565b61282f9190612ff4565b90505f83601554876128419190612fdd565b61284b9190612ff4565b90505f816128598486612edc565b6128639190612edc565b61286d9088612e9e565b601754909150612886906001600160a01b031685612b26565b60185461289c906001600160a01b031684612b26565b6019546128b2906001600160a01b031683612b26565b5f861180156128c057505f81115b156128cf576128cf8682612bc0565b50505050505050565b5f816128e657600d546128ea565b6012545b826128f7576009546128fb565b600e545b6129059085612fdd565b61290f9190612ff4565b90505f8261291f57600d54612923565b6012545b8361293057600a54612934565b6010545b61293e9086612fdd565b6129489190612ff4565b90505f8361295857600d5461295c565b6012545b8461296957600b5461296d565b6011545b6129779087612fdd565b6129819190612ff4565b90505f8161298f8486612edc565b6129999190612edc565b6129a39087612e9e565b90508360135f8282546129b69190612edc565b925050819055508260145f8282546129ce9190612edc565b925050819055508160155f8282546129e69190612edc565b925050819055508060165f8282546129fe9190612edc565b9091555050505050505050565b6001600160a01b038316612a6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c42565b6001600160a01b038216612ace5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c42565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611bb1565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612b6f576040519150601f19603f3d011682016040523d82523d5f602084013e612b74565b606091505b5050905080612bbb5760405162461bcd60e51b815260206004820152601360248201527211551208151c985b9cd9995c8819985a5b1959606a1b6044820152606401610c42565b505050565b601a54612bd89030906001600160a01b031684612a0b565b601a5460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af193505050508015612c62575060408051601f3d908101601f19168201909252612c5f918101906130e5565b60015b612cc5577f64fb7f56dc3c30cbc51de6b01b5c5db1150d07b45c9c633b8b70667484b392c76040516119ca9060208082526017908201527f4661696c656420746f20616464206c6971756964697479000000000000000000604082015260600190565b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611224575f80fd5b5f8060408385031215612d26575f80fd5b8235612d3181612d01565b946020939093013593505050565b5f805f60608486031215612d51575f80fd5b8335612d5c81612d01565b92506020840135612d6c81612d01565b929592945050506040919091013590565b5f805f8060808587031215612d90575f80fd5b5050823594602084013594506040840135936060013592509050565b5f60208284031215612dbc575f80fd5b8135610c1281612d01565b5f60208284031215612dd7575f80fd5b5035919050565b5f8060408385031215612def575f80fd5b50508035926020909101359150565b8015158114611224575f80fd5b5f8060408385031215612e1c575f80fd5b8235612e2781612d01565b91506020830135612e3781612dfe565b809150509250929050565b5f8060408385031215612e53575f80fd5b8235612e5e81612d01565b91506020830135612e3781612d01565b5f8060408385031215612e7f575f80fd5b8235612d3181612dfe565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610b9c57610b9c612e8a565b6020808252601190820152702cb7ba9030b932903737ba1037bbb732b960791b604082015260600190565b80820180821115610b9c57610b9c612e8a565b600181815b80851115612f2957815f1904821115612f0f57612f0f612e8a565b80851615612f1c57918102915b93841c9390800290612ef4565b509250929050565b5f82612f3f57506001610b9c565b81612f4b57505f610b9c565b8160018114612f615760028114612f6b57612f87565b6001915050610b9c565b60ff841115612f7c57612f7c612e8a565b50506001821b610b9c565b5060208310610133831016604e8410600b8410161715612faa575081810a610b9c565b612fb48383612eef565b805f1904821115612fc757612fc7612e8a565b029392505050565b5f610c1260ff841683612f31565b8082028115828204841417610b9c57610b9c612e8a565b5f8261300e57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613023575f80fd5b5051919050565b5f6020828403121561303a575f80fd5b8151610c1281612dfe565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613069575f80fd5b8151610c1281612d01565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156130c45784516001600160a01b03168352938301939183019160010161309f565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156130f7575f80fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bb25d09cf0d1e771abeb1b7e5a53d6ff9208f9ae62e3b4d84c2eb9a4814f5b1a64736f6c63430008190033

Deployed Bytecode Sourcemap

8194:19645:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8485:73;;;;;;;;;;;;8516:42;8485:73;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;8485:73:0;;;;;;;;10232:57;;;;;;;;;;;;;;;;;;;368:25:1;;;356:2;341:18;10232:57:0;222:177:1;13401:83:0;;;;;;;;;;-1:-1:-1;13471:5:0;;;;;;;;;;;;-1:-1:-1;;;13471:5:0;;;;13401:83;;;;;;;:::i;13960:216::-;;;;;;;;;;-1:-1:-1;13960:216:0;;;;;:::i;:::-;;:::i;:::-;;;1448:14:1;;1441:22;1423:41;;1411:2;1396:18;13960:216:0;1283:187:1;9881:33:0;;;;;;;;;;-1:-1:-1;9881:33:0;;;;-1:-1:-1;;;;;9881:33:0;;;13291:102;;;;;;;;;;-1:-1:-1;13373:12:0;;13291:102;;9734:34;;;;;;;;;;;;;;;;15097:308;;;;;;;;;;-1:-1:-1;15097:308:0;;;;;:::i;:::-;;:::i;17153:471::-;;;;;;;;;;-1:-1:-1;17153:471:0;;;;;:::i;:::-;;:::i;:::-;;9280:32;;;;;;;;;;;;;;;;13587:83;;;;;;;;;;-1:-1:-1;13587:83:0;;8368:2;2468:36:1;;2456:2;2441:18;13587:83:0;2326:184:1;8818:43:0;;;;;;;;;;-1:-1:-1;8818:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15458:337;;;;;;;;;;-1:-1:-1;15458:337:0;;;;;:::i;:::-;;:::i;18887:312::-;;;;;;;;;;-1:-1:-1;18887:312:0;;;;;:::i;:::-;;:::i;18209:634::-;;;;;;;;;;-1:-1:-1;18209:634:0;;;;;:::i;:::-;;:::i;21376:250::-;;;;;;;;;;;;;:::i;8565:73::-;;;;;;;;;;;;8596:42;8565:73;;19782:176;;;;;;;;;;-1:-1:-1;19782:176:0;;;;;:::i;:::-;;:::i;9107:69::-;;;;;;;;;;-1:-1:-1;9107:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9500:33;;;;;;;;;;;;;;;;16393:241;;;;;;;;;;;;;:::i;19966:176::-;;;;;;;;;;-1:-1:-1;19966:176:0;;;;;:::i;:::-;;:::i;10157:29::-;;;;;;;;;;;;;;;;9580:32;;;;;;;;;;;;;;;;20605:194;;;;;;;;;;-1:-1:-1;20605:194:0;;;;;:::i;:::-;;:::i;10195:30::-;;;;;;;;;;-1:-1:-1;10195:30:0;;;;;;;;13678:119;;;;;;;;;;-1:-1:-1;13678:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;13771:18:0;13744:7;13771:18;;;:9;:18;;;;;;;13678:119;7806:148;;;;;;;;;;;;;:::i;9921:33::-;;;;;;;;;;-1:-1:-1;9921:33:0;;;;-1:-1:-1;;;;;9921:33:0;;;9241:32;;;;;;;;;;;;;;;;9418:33;;;;;;;;;;;;;;;;10068:37;;;;;;;;;;;;;;;;15833:176;;;;;;;;;;;;;:::i;7625:65::-;;;;;;;;;;-1:-1:-1;7663:7:0;7681:6;-1:-1:-1;;;;;7681:6:0;7625:65;;13492:87;;;;;;;;;;-1:-1:-1;13564:7:0;;;;;;;;;;;;-1:-1:-1;;;13564:7:0;;;;13492:87;;9693:34;;;;;;;;;;;;;;;;19241:209;;;;;;;;;;;;;:::i;9202:32::-;;;;;;;;;;;;;;;;9540:33;;;;;;;;;;;;;;;;10002:19;;;;;;;;;;-1:-1:-1;10002:19:0;;;;-1:-1:-1;;;;;10002:19:0;;;14933:156;;;;;;;;;;-1:-1:-1;14933:156:0;;;;;:::i;:::-;;:::i;8459:19::-;;;;;;;;;;-1:-1:-1;8459:19:0;;;;-1:-1:-1;;;;;8459:19:0;;;19510:245;;;;;;;;;;;;;:::i;20150:227::-;;;;;;;;;;-1:-1:-1;20150:227:0;;;;;:::i;:::-;;:::i;20403:194::-;;;;;;;;;;-1:-1:-1;20403:194:0;;;;;:::i;:::-;;:::i;16049:336::-;;;;;;;;;;-1:-1:-1;16049:336:0;;;;;:::i;:::-;;:::i;9775:36::-;;;;;;;;;;;;;;;;9360:31;;;;;;;;;;;;;;;;13805:147;;;;;;;;;;-1:-1:-1;13805:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;13916:19:0;;;13889:7;13916:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;13805:147;9652:34;;;;;;;;;;;;;;;;21035:291;;;;;;;;;;-1:-1:-1;21035:291:0;;;;;:::i;:::-;;:::i;10341:44::-;;;;;;;;;;-1:-1:-1;10341:44:0;;;;;;;;;;;16702:419;;;;;;;;;;-1:-1:-1;16702:419:0;;;;;:::i;:::-;;:::i;9841:33::-;;;;;;;;;;-1:-1:-1;9841:33:0;;;;-1:-1:-1;;;;;9841:33:0;;;17657:480;;;;;;;;;;-1:-1:-1;17657:480:0;;;;;:::i;:::-;;:::i;10112:38::-;;;;;;;;;;;;;;;;9319:34;;;;;;;;;;;;;;;;7960:227;;;;;;;;;;-1:-1:-1;7960:227:0;;;;;:::i;:::-;;:::i;20807:194::-;;;;;;;;;;-1:-1:-1;20807:194:0;;;;;:::i;:::-;;:::i;9458:35::-;;;;;;;;;;;;;;;;9963:32;;;;;;;;;;-1:-1:-1;9963:32:0;;;;-1:-1:-1;;;;;9963:32:0;;;8896:45;;;;;;;;;;-1:-1:-1;8896:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;8992:44;;;;;;;;;;-1:-1:-1;8992:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;10030:31;;;;;;;;;;-1:-1:-1;10030:31:0;;;;-1:-1:-1;;;10030:31:0;;;;;;13960:216;14064:10;14035:4;14052:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;14052:32:0;;;;;;;;;;:41;;;14109:37;14035:4;;14052:32;;14109:37;;;;14087:6;368:25:1;;356:2;341:18;;222:177;14109:37:0;;;;;;;;-1:-1:-1;14164:4:0;13960:216;;;;;:::o;15097:308::-;-1:-1:-1;;;;;15218:19:0;;15197:4;15218:19;;;:11;:19;;;;;;;;15238:10;15218:31;;;;;;;;-1:-1:-1;;15218:52:0;15214:126;;-1:-1:-1;;;;;15287:19:0;;;;;;:11;:19;;;;;;;;15307:10;15287:31;;;;;;;:41;;15322:6;;15287:19;:41;;15322:6;;15287:41;:::i;:::-;;;;-1:-1:-1;;15214:126:0;15357:40;15371:6;15379:9;15390:6;15357:13;:40::i;:::-;15350:47;;15097:308;;;;;;:::o;17153:471::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;;;;;;;;;17276:13:::1;:23:::0;;;17310:15:::1;:27:::0;;;17348:13:::1;:23:::0;;;17382:13:::1;:23:::0;;;17398:7;17364;17431:19:::1;17328:9:::0;17292:7;17431:19:::1;:::i;:::-;:29;;;;:::i;:::-;:39;;;;:::i;:::-;17416:12;:54:::0;;;17505:2:::1;-1:-1:-1::0;17489:18:0::1;17481:67;;;::::0;-1:-1:-1;;;17481:67:0;;5599:2:1;17481:67:0::1;::::0;::::1;5581:21:1::0;5638:2;5618:18;;;5611:30;5677:34;5657:18;;;5650:62;-1:-1:-1;;;5728:18:1;;;5721:34;5772:19;;17481:67:0::1;5397:400:1::0;17481:67:0::1;17564:52;::::0;;6033:25:1;;;6089:2;6074:18;;6067:34;;;6117:18;;;6110:34;;;6175:2;6160:18;;6153:34;;;17564:52:0::1;::::0;6020:3:1;6005:19;17564:52:0::1;;;;;;;;17153:471:::0;;;;:::o;15458:337::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;15535:1:::1;15526:6;:10;15518:55;;;::::0;-1:-1:-1;;;15518:55:0;;6400:2:1;15518:55:0::1;::::0;::::1;6382:21:1::0;;;6419:18;;;6412:30;6478:34;6458:18;;;6451:62;6530:18;;15518:55:0::1;6198:356:1::0;15518:55:0::1;15602:10;15592:21;::::0;;;:9:::1;:21;::::0;;;;;:31;-1:-1:-1;15592:31:0::1;15584:72;;;::::0;-1:-1:-1;;;15584:72:0;;6761:2:1;15584:72:0::1;::::0;::::1;6743:21:1::0;6800:2;6780:18;;;6773:30;6839;6819:18;;;6812:58;6887:18;;15584:72:0::1;6559:352:1::0;15584:72:0::1;15683:6;15667:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15710:10:0::1;15700:21;::::0;;;:9:::1;:21;::::0;;;;:31;;15725:6;;15700:21;:31:::1;::::0;15725:6;;15700:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;15747:40:0::1;::::0;368:25:1;;;15776:1:0::1;::::0;15756:10:::1;::::0;-1:-1:-1;;;;;;;;;;;15747:40:0;356:2:1;341:18;15747:40:0::1;;;;;;;15458:337:::0;:::o;18887:312::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;19011:13:::1;8368:2;19011;:13;:::i;:::-;19003:3;18984:12;;18999:1;18984:16;;;;:::i;:::-;:22;;;;:::i;:::-;18983:42;;;;:::i;:::-;18972:7;:53;;18964:121;;;::::0;-1:-1:-1;;;18964:121:0;;8890:2:1;18964:121:0::1;::::0;::::1;8872:21:1::0;8929:2;8909:18;;;8902:30;8968:34;8948:18;;;8941:62;9039:25;9019:18;;;9012:53;9082:19;;18964:121:0::1;8688:419:1::0;18964:121:0::1;19124:13;8368:2;19124;:13;:::i;:::-;19113:25;::::0;:7;:25:::1;:::i;:::-;19096:14;:42:::0;;;19154:37:::1;::::0;368:25:1;;;19154:37:0::1;::::0;356:2:1;341:18;19154:37:0::1;;;;;;;18887:312:::0;:::o;18209:634::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;18316:20:::1;18368:13;8368:2;18368;:13;:::i;:::-;18359:4;18340:12;;18355:1;18340:16;;;;:::i;:::-;:23;;;;:::i;:::-;18339:43;;;;:::i;:::-;18316:66;;18415:12;18401:10;:26;;18393:104;;;::::0;-1:-1:-1;;;18393:104:0;;9314:2:1;18393:104:0::1;::::0;::::1;9296:21:1::0;9353:2;9333:18;;;9326:30;9392:34;9372:18;;;9365:62;9463:34;9443:18;;;9436:62;-1:-1:-1;;;9514:19:1;;;9507:32;9556:19;;18393:104:0::1;9112:469:1::0;18393:104:0::1;18531:12;18516:11;:27;;18508:106;;;::::0;-1:-1:-1;;;18508:106:0;;9788:2:1;18508:106:0::1;::::0;::::1;9770:21:1::0;9827:2;9807:18;;;9800:30;9866:34;9846:18;;;9839:62;9937:34;9917:18;;;9910:62;-1:-1:-1;;;9988:19:1;;;9981:33;10031:19;;18508:106:0::1;9586:470:1::0;18508:106:0::1;18664:13;8368:2;18664;:13;:::i;:::-;18650:28;::::0;:10;:28:::1;:::i;:::-;18625:22;:53:::0;18730:13:::1;8368:2;18730;:13;:::i;:::-;18715:29;::::0;:11;:29:::1;:::i;:::-;18689:23;:55:::0;;;18787:22:::1;::::0;18760:75:::1;::::0;::::1;::::0;::::1;::::0;10235:25:1;;10291:2;10276:18;;10269:34;10223:2;10208:18;;10061:248;18760:75:0::1;;;;;;;;18305:538;18209:634:::0;;:::o;21376:250::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;21480:4:::1;21431:28;21462:24:::0;;;:9:::1;:24;::::0;;;;;21505;21497:54:::1;;;::::0;-1:-1:-1;;;21497:54:0;;10516:2:1;21497:54:0::1;::::0;::::1;10498:21:1::0;10555:2;10535:18;;;10528:30;-1:-1:-1;;;10574:18:1;;;10567:47;10631:18;;21497:54:0::1;10314:341:1::0;21497:54:0::1;21571:6;::::0;::::1;;21570:7;21562:35;;;::::0;-1:-1:-1;;;21562:35:0;;10862:2:1;21562:35:0::1;::::0;::::1;10844:21:1::0;10901:2;10881:18;;;10874:30;-1:-1:-1;;;10920:18:1;;;10913:45;10975:18;;21562:35:0::1;10660:339:1::0;21562:35:0::1;21608:10;:8;:10::i;:::-;21420:206;21376:250::o:0;19782:176::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19865:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;;:28;;-1:-1:-1;;19865:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19909:41;;1423::1;;;19909::0::1;::::0;1396:18:1;19909:41:0::1;;;;;;;;19782:176:::0;;:::o;16393:241::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;16460:21:::1;16500:10:::0;16492:41:::1;;;::::0;-1:-1:-1;;;16492:41:0;;11206:2:1;16492:41:0::1;::::0;::::1;11188:21:1::0;11245:2;11225:18;;;11218:30;-1:-1:-1;;;11264:18:1;;;11257:48;11322:18;;16492:41:0::1;11004:342:1::0;16492:41:0::1;16544:36;::::0;16552:10:::1;::::0;16544:36;::::1;;;::::0;16573:6;;16544:36:::1;::::0;;;16573:6;16552:10;16544:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;16596:30:0::1;::::0;368:25:1;;;16607:10:0::1;::::0;16596:30:::1;::::0;356:2:1;341:18;16596:30:0::1;;;;;;;16432:202;16393:241::o:0;19966:176::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20049:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;;:28;;-1:-1:-1;;20049:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20093:41;;1423::1;;;20093::0::1;::::0;1396:18:1;20093:41:0::1;1283:187:1::0;20605:194:0;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;20692:18:::1;:40:::0;;-1:-1:-1;;;;;;20692:40:0::1;-1:-1:-1::0;;;;;20692:40:0;::::1;::::0;;::::1;::::0;;;20748:43:::1;::::0;::::1;::::0;-1:-1:-1;;20748:43:0::1;20605:194:::0;:::o;7806:148::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;7888:1:::1;7871:19:::0;;-1:-1:-1;;;;;;7871:19:0::1;::::0;;7906:40:::1;::::0;7888:1;;7906:40:::1;::::0;7888:1;;7906:40:::1;7806:148::o:0;15833:176::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;15897:11:::1;::::0;-1:-1:-1;;;15897:11:0;::::1;;;15896:12;15888:48;;;::::0;-1:-1:-1;;;15888:48:0;;11553:2:1;15888:48:0::1;::::0;::::1;11535:21:1::0;11592:2;11572:18;;;11565:30;11631:25;11611:18;;;11604:53;11674:18;;15888:48:0::1;11351:347:1::0;15888:48:0::1;15947:11;:18:::0;;-1:-1:-1;;;;15947:18:0::1;-1:-1:-1::0;;;15947:18:0::1;::::0;;15981:20:::1;::::0;-1:-1:-1;1423:41:1;;15981:20:0::1;::::0;1411:2:1;1396:18;15981:20:0::1;;;;;;;15833:176::o:0;19241:209::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;19316:1:::1;19298:15;:19:::0;;;19328:15:::1;:19:::0;;;19358:15:::1;:19:::0;;;19388:17:::1;:21:::0;;;19425:17:::1;::::0;::::1;::::0;19316:1;19425:17:::1;19241:209::o:0;14933:156::-;15013:4;15037:44;15051:10;15063:9;15074:6;15037:13;:44::i;19510:245::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;19590:25:::1;::::0;::::1;::::0;::::1;;;19582:72;;;::::0;-1:-1:-1;;;19582:72:0;;11905:2:1;19582:72:0::1;::::0;::::1;11887:21:1::0;11944:2;11924:18;;;11917:30;11983:34;11963:18;;;11956:62;-1:-1:-1;;;12034:18:1;;;12027:32;12076:19;;19582:72:0::1;11703:398:1::0;19582:72:0::1;19665:25;:33:::0;;-1:-1:-1;;19665:33:0::1;::::0;;19714::::1;::::0;::::1;::::0;19693:5:::1;::::0;19714:33:::1;19510:245::o:0;20150:227::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20250:44:0;::::1;;::::0;;;:36:::1;:44;::::0;;;;;;;;:53;;-1:-1:-1;;20250:53:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20319:50;;1423:41:1;;;20319:50:0::1;::::0;1396:18:1;20319:50:0::1;1283:187:1::0;20403:194:0;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;20490:18:::1;:40:::0;;-1:-1:-1;;;;;;20490:40:0::1;-1:-1:-1::0;;;;;20490:40:0;::::1;::::0;;::::1;::::0;;;20546:43:::1;::::0;::::1;::::0;-1:-1:-1;;20546:43:0::1;20403:194:::0;:::o;16049:336::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16157:22:0;::::1;16149:50;;;::::0;-1:-1:-1;;;16149:50:0;;12308:2:1;16149:50:0::1;::::0;::::1;12290:21:1::0;12347:2;12327:18;;;12320:30;-1:-1:-1;;;12366:18:1;;;12359:45;12421:18;;16149:50:0::1;12106:339:1::0;16149:50:0::1;7663:7:::0;7681:6;-1:-1:-1;;;;;7681:6:0;-1:-1:-1;;;;;16218:19:0::1;:8;-1:-1:-1::0;;;;;16218:19:0::1;::::0;16210:58:::1;;;::::0;-1:-1:-1;;;16210:58:0;;12652:2:1;16210:58:0::1;::::0;::::1;12634:21:1::0;12691:2;12671:18;;;12664:30;12730:28;12710:18;;;12703:56;12776:18;;16210:58:0::1;12450:350:1::0;16210:58:0::1;-1:-1:-1::0;;;;;16279:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;;;;:40;;-1:-1:-1;;16279:40:0::1;::::0;::::1;;::::0;;::::1;::::0;;;16335:42;;1423:41:1;;;16335:42:0::1;::::0;1396:18:1;16335:42:0::1;1283:187:1::0;21035:291:0;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;21144:4:::1;21134:7;:14;21126:67;;;::::0;-1:-1:-1;;;21126:67:0;;13007:2:1;21126:67:0::1;::::0;::::1;12989:21:1::0;13046:2;13026:18;;;13019:30;13085:34;13065:18;;;13058:62;-1:-1:-1;;;13136:18:1;;;13129:38;13184:19;;21126:67:0::1;12805:404:1::0;21126:67:0::1;21204:11;:22:::0;;-1:-1:-1;;21204:22:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21237:13:::1;:23:::0;;;21276:42:::1;::::0;;13382:41:1;;;13439:18;;;13432:34;;;21276:42:0::1;::::0;13355:18:1;21276:42:0::1;;;;;;;;21035:291:::0;;:::o;16702:419::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;16807:4:::1;-1:-1:-1::0;;;;;16783:29:0;::::1;::::0;16775:68:::1;;;::::0;-1:-1:-1;;;16775:68:0;;13679:2:1;16775:68:0::1;::::0;::::1;13661:21:1::0;13718:2;13698:18;;;13691:30;13757:28;13737:18;;;13730:56;13803:18;;16775:68:0::1;13477:350:1::0;16775:68:0::1;16918:30;::::0;-1:-1:-1;;;16918:30:0;;16942:4:::1;16918:30;::::0;::::1;160:51:1::0;16876:12:0;;16854::::1;::::0;-1:-1:-1;;;;;16918:15:0;::::1;::::0;::::1;::::0;133:18:1;;16918:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16900:48;;16977:1;16967:7;:11;16959:44;;;::::0;-1:-1:-1;;;16959:44:0;;14223:2:1;16959:44:0::1;::::0;::::1;14205:21:1::0;14262:2;14242:18;;;14235:30;-1:-1:-1;;;14281:18:1;;;14274:50;14341:18;;16959:44:0::1;14021:344:1::0;16959:44:0::1;17014:35;::::0;-1:-1:-1;;;17014:35:0;;17029:10:::1;17014:35;::::0;::::1;14544:51:1::0;14611:18;;;14604:34;;;-1:-1:-1;;;;;17014:14:0;::::1;::::0;::::1;::::0;14517:18:1;;17014:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;17065:48:0::1;::::0;368:25:1;;;17093:10:0::1;::::0;-1:-1:-1;;;;;17065:48:0;::::1;::::0;::::1;::::0;356:2:1;341:18;17065:48:0::1;;;;;;;;16764:357;;16702:419:::0;:::o;17657:480::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;17781:14:::1;:24:::0;;;17816:16:::1;:28:::0;;;17855:14:::1;:24:::0;;;17890:14:::1;:24:::0;;;17907:7;17872;17941:19:::1;17835:9:::0;17798:7;17941:19:::1;:::i;:::-;:29;;;;:::i;:::-;:39;;;;:::i;:::-;17925:13;:55:::0;;;18016:2:::1;-1:-1:-1::0;17999:19:0::1;17991:69;;;::::0;-1:-1:-1;;;17991:69:0;;15101:2:1;17991:69:0::1;::::0;::::1;15083:21:1::0;15140:2;15120:18;;;15113:30;15179:34;15159:18;;;15152:62;-1:-1:-1;;;15230:18:1;;;15223:35;15275:19;;17991:69:0::1;14899:401:1::0;17991:69:0::1;18076:53;::::0;;6033:25:1;;;6089:2;6074:18;;6067:34;;;6117:18;;;6110:34;;;6175:2;6160:18;;6153:34;;;18076:53:0::1;::::0;6020:3:1;6005:19;18076:53:0::1;5802:391:1::0;7960:227:0;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8049:22:0;::::1;8041:56;;;::::0;-1:-1:-1;;;8041:56:0;;15507:2:1;8041:56:0::1;::::0;::::1;15489:21:1::0;15546:2;15526:18;;;15519:30;-1:-1:-1;;;15565:18:1;;;15558:51;15626:18;;8041:56:0::1;15305:345:1::0;8041:56:0::1;8108:6;:17:::0;;-1:-1:-1;;;;;;8108:17:0::1;-1:-1:-1::0;;;;;8108:17:0;::::1;::::0;;::::1;::::0;;8141:38:::1;::::0;8108:17;;;;8141:38:::1;::::0;8108:6;8141:38:::1;7960:227:::0;:::o;20807:194::-;7736:6;;-1:-1:-1;;;;;7736:6:0;163:10;7736:22;7728:52;;;;-1:-1:-1;;;7728:52:0;;;;;;;:::i;:::-;20894:18:::1;:40:::0;;-1:-1:-1;;;;;;20894:40:0::1;-1:-1:-1::0;;;;;20894:40:0;::::1;::::0;;::::1;::::0;;;20950:43:::1;::::0;::::1;::::0;-1:-1:-1;;20950:43:0::1;20807:194:::0;:::o;21673:1840::-;-1:-1:-1;;;;;21791:21:0;;21765:4;21791:21;;;:13;:21;;;;;;;;21790:22;21782:56;;;;-1:-1:-1;;;21782:56:0;;15857:2:1;21782:56:0;;;15839:21:1;15896:2;15876:18;;;15869:30;-1:-1:-1;;;15915:18:1;;;15908:51;15976:18;;21782:56:0;15655:345:1;21782:56:0;-1:-1:-1;;;;;21858:24:0;;;;;;:13;:24;;;;;;;;21857:25;21849:62;;;;-1:-1:-1;;;21849:62:0;;16207:2:1;21849:62:0;;;16189:21:1;16246:2;16226:18;;;16219:30;16285:26;16265:18;;;16258:54;16329:18;;21849:62:0;16005:348:1;21849:62:0;21926:6;;;;21922:63;;;21942:41;21957:6;21965:9;21976:6;21942:14;:41::i;:::-;21935:48;;;;21922:63;-1:-1:-1;;;;;22003:20:0;;;;;;:12;:20;;;;;;;;;:47;;-1:-1:-1;;;;;;22027:23:0;;;;;;:12;:23;;;;;;;;22003:47;:62;;;-1:-1:-1;22054:11:0;;-1:-1:-1;;;22054:11:0;;;;22003:62;21995:98;;;;-1:-1:-1;;;21995:98:0;;16560:2:1;21995:98:0;;;16542:21:1;16599:2;16579:18;;;16572:30;16638:25;16618:18;;;16611:53;16681:18;;21995:98:0;16358:347:1;21995:98:0;22108:16;:14;:16::i;:::-;22104:35;;;22127:10;:8;:10::i;:::-;22155:25;;;;;;;:50;;;;-1:-1:-1;;;;;;22185:20:0;;;;;;:12;:20;;;;;;;;22184:21;22155:50;:78;;;;-1:-1:-1;;;;;;22210:23:0;;;;;;:12;:23;;;;;;;;22209:24;22155:78;22151:1071;;;7663:7;7681:6;-1:-1:-1;;;;;22258:17:0;;;7681:6;;22258:17;;;;:41;;-1:-1:-1;7663:7:0;7681:6;-1:-1:-1;;;;;22279:20:0;;;7681:6;;22279:20;;22258:41;:68;;;;-1:-1:-1;;;;;;22303:23:0;;;;22258:68;:98;;;;-1:-1:-1;;;;;;22330:26:0;;8516:42;22330:26;;22258:98;22250:128;;;;-1:-1:-1;;;22250:128:0;;16912:2:1;22250:128:0;;;16894:21:1;16951:2;16931:18;;;16924:30;-1:-1:-1;;;16970:18:1;;;16963:47;17027:18;;22250:128:0;16710:341:1;22250:128:0;22407:4;;-1:-1:-1;;;;;22407:4:0;;;22397:14;;;;22393:818;;-1:-1:-1;;;;;22456:47:0;;;;;;:36;:47;;;;;;;;22451:262;;22546:22;;22536:6;:32;;22528:62;;;;-1:-1:-1;;;22528:62:0;;17258:2:1;22528:62:0;;;17240:21:1;17297:2;17277:18;;;17270:30;-1:-1:-1;;;17316:18:1;;;17309:47;17373:18;;22528:62:0;17056:341:1;22528:62:0;22654:14;;-1:-1:-1;;;;;22621:20:0;;;;;;:9;:20;;;;;;:29;;22644:6;;22621:29;:::i;:::-;:47;;22613:80;;;;-1:-1:-1;;;22613:80:0;;17604:2:1;22613:80:0;;;17586:21:1;17643:2;17623:18;;;17616:30;-1:-1:-1;;;17662:18:1;;;17655:50;17722:18;;22613:80:0;17402:344:1;22613:80:0;22393:818;;;22751:4;;-1:-1:-1;;;;;22751:4:0;;;22738:17;;;;22734:477;;-1:-1:-1;;;;;22801:44:0;;;;;;:36;:44;;;;;;;;22796:158;;22888:23;;22878:6;:33;;22870:64;;;;-1:-1:-1;;;22870:64:0;;17953:2:1;22870:64:0;;;17935:21:1;17992:2;17972:18;;;17965:30;-1:-1:-1;;;18011:18:1;;;18004:48;18069:18;;22870:64:0;17751:342:1;22734:477:0;-1:-1:-1;;;;;23022:47:0;;;;;;:36;:47;;;;;;;;23017:179;;23135:14;;-1:-1:-1;;;;;23102:20:0;;;;;;:9;:20;;;;;;:29;;23125:6;;23102:29;:::i;:::-;:47;;23094:82;;;;-1:-1:-1;;;23094:82:0;;18300:2:1;23094:82:0;;;18282:21:1;18339:2;18319:18;;;18312:30;-1:-1:-1;;;18358:18:1;;;18351:52;18420:18;;23094:82:0;18098:346:1;23094:82:0;-1:-1:-1;;;;;23234:17:0;;;;;;:9;:17;;;;;:27;;23255:6;;23234:17;:27;;23255:6;;23234:27;:::i;:::-;;;;-1:-1:-1;23272:22:0;;-1:-1:-1;23297:32:0;23311:6;23319:9;23297:13;:32::i;:::-;:78;;23369:6;23297:78;;;23332:34;23340:6;23348;23356:9;23332:7;:34::i;:::-;-1:-1:-1;;;;;23386:20:0;;;;;;:9;:20;;;;;:38;;23272:103;;-1:-1:-1;23272:103:0;;23386:20;;;:38;;23272:103;;23386:38;:::i;:::-;;;;;;;;23457:9;-1:-1:-1;;;;;23440:43:0;23449:6;-1:-1:-1;;;;;23440:43:0;-1:-1:-1;;;;;;;;;;;23468:14:0;23440:43;;;;368:25:1;;356:2;341:18;;222:177;23440:43:0;;;;;;;;-1:-1:-1;23501:4:0;;21673:1840;-1:-1:-1;;;;21673:1840:0:o;25132:748::-;10443:6;:13;;-1:-1:-1;;10443:13:0;10452:4;10443:13;;;25263:17:::1;::::0;25245:15:::1;::::0;25227::::1;::::0;25209::::1;::::0;10443:6;;25263:17;25245:15;25209:33:::1;::::0;::::1;:::i;:::-;:51;;;;:::i;:::-;:71;;;;:::i;:::-;25181:99;;25295:17;25316:1;25295:22:::0;25291:35:::1;;25319:7;;;25291:35;25380:23;25456:21;25460:17:::0;25456:1:::1;:21;:::i;:::-;25445:4;25427:24;::::0;;;:9:::1;:24;::::0;;;;;25407:17:::1;::::0;:44:::1;::::0;25427:24;25407:44:::1;:::i;:::-;25406:72;;;;:::i;:::-;25536:4;25489:26;25518:24:::0;;;:9:::1;:24;::::0;;;;;25380:98;;-1:-1:-1;25489:26:0;25518:42:::1;::::0;25380:98;;25518:42:::1;:::i;:::-;25489:71:::0;-1:-1:-1;25599:21:0::1;25631:36;25489:71:::0;25631:16:::1;:36::i;:::-;25702:21;25678;25761:33;25777:17:::0;25702:21;25761:33:::1;:::i;:::-;25734:60;;25805:67;25819:16;25837:15;25854:17;25805:13;:67::i;:::-;25170:710;;;;;;10467:1;10479:6:::0;:14;;-1:-1:-1;;10479:14:0;;;25132:748::o;14666:259::-;-1:-1:-1;;;;;14776:17:0;;14759:4;14776:17;;;:9;:17;;;;;:27;;14797:6;;14776:17;14759:4;;14776:27;;14797:6;;14776:27;:::i;:::-;;;;-1:-1:-1;;;;;;;14814:20:0;;;;;;:9;:20;;;;;:30;;14838:6;;14814:20;:30;;14838:6;;14814:30;:::i;:::-;;;;;;;;14877:9;-1:-1:-1;;;;;14860:35:0;14869:6;-1:-1:-1;;;;;14860:35:0;-1:-1:-1;;;;;;;;;;;14888:6:0;14860:35;;;;368:25:1;;356:2;341:18;;222:177;14860:35:0;;;;;;;;-1:-1:-1;14913:4:0;14666:259;;;;;:::o;24887:237::-;24974:4;;24936;;-1:-1:-1;;;;;24974:4:0;24960:10;:18;;;;:42;;-1:-1:-1;24996:6:0;;;;24995:7;24960:42;:70;;;;-1:-1:-1;25019:11:0;;;;24960:70;:98;;;;-1:-1:-1;25047:11:0;;-1:-1:-1;;;25047:11:0;;;;24960:98;:156;;;;-1:-1:-1;25103:13:0;;;25093:4;25075:24;;;;:9;:24;;;;;;;;:41;;24960:156;24953:163;;24887:237;:::o;23521:160::-;-1:-1:-1;;;;;23627:19:0;;23602:4;23627:19;;;:11;:19;;;;;;;;23626:20;:47;;;;-1:-1:-1;;;;;;;23651:22:0;;;;;:11;:22;;;;;;;;23650:23;;23521:160;-1:-1:-1;23521:160:0:o;23689:462::-;23815:4;;23768:7;;;;-1:-1:-1;;;;;23809:10:0;;;23815:4;;23809:10;23808:100;;23867:4;;-1:-1:-1;;;;;23857:14:0;;;23867:4;;23857:14;:50;;23906:1;23808:100;;23857:50;23900:3;23884:12;;23875:6;:21;;;;:::i;:::-;23874:29;;;;:::i;:::-;23808:100;;;23850:3;23833:13;;23824:6;:22;;;;:::i;:::-;23823:30;;;;:::i;:::-;23788:120;;23923:9;23936:1;23923:14;23919:33;;23946:6;23939:13;;;;;23919:33;23981:4;23963:24;;;;:9;:24;;;;;:37;;23991:9;;23963:24;:37;;23991:9;;23963:37;:::i;:::-;;;;-1:-1:-1;;24016:42:0;;368:25:1;;;24041:4:0;;-1:-1:-1;;;;;24016:42:0;;;-1:-1:-1;;;;;;;;;;;24016:42:0;356:2:1;341:18;24016:42:0;;;;;;;24102:4;;24071:36;;24085:9;;-1:-1:-1;;;;;24096:10:0;;;24102:4;;24096:10;24071:13;:36::i;:::-;24125:18;24134:9;24125:6;:18;:::i;:::-;24118:25;23689:462;-1:-1:-1;;;;;23689:462:0:o;26831:536::-;26921:16;;;26935:1;26921:16;;;;;;;;26897:21;;26921:16;;;;;;;;;;-1:-1:-1;26921:16:0;26897:40;;26966:4;26948;26953:1;26948:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26948:23:0;;;:7;;;;;;;;;;:23;;;;26992:6;;:13;;;-1:-1:-1;;;26992:13:0;;;;:6;;;;;:11;;:13;;;;;26948:7;;26992:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26982:4;26987:1;26982:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26982:23:0;;;:7;;;;;;;;;:23;27048:6;;27016:53;;27033:4;;27048:6;27057:11;27016:8;:53::i;:::-;27084:6;;:215;;-1:-1:-1;;;27084:215:0;;-1:-1:-1;;;;;27084:6:0;;;;:57;;:215;;27156:11;;27084:6;;27226:4;;27253;;27273:15;;27084:215;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27080:280;;27315:43;;;;;20156:2:1;20138:21;;;20195:2;20175:18;;;20168:30;20234:31;20229:2;20214:18;;20207:59;20298:2;20283:18;;19954:353;27080:280:0;26886:481;26831:536;:::o;25888:751::-;26002:21;26057:17;26039:15;;26026:10;:28;;;;:::i;:::-;:48;;;;:::i;:::-;26002:72;;26085:21;26140:17;26122:15;;26109:10;:28;;;;:::i;:::-;:48;;;;:::i;:::-;26085:72;;26168:21;26223:17;26205:15;;26192:10;:28;;;;:::i;:::-;:48;;;;:::i;:::-;26168:72;-1:-1:-1;26251:23:0;26168:72;26291:29;26307:13;26291;:29;:::i;:::-;:45;;;;:::i;:::-;26277:60;;:10;:60;:::i;:::-;26358:18;;26251:86;;-1:-1:-1;26350:42:0;;-1:-1:-1;;;;;26358:18:0;26378:13;26350:7;:42::i;:::-;26411:18;;26403:42;;-1:-1:-1;;;;;26411:18:0;26431:13;26403:7;:42::i;:::-;26464:18;;26456:42;;-1:-1:-1;;;;;26464:18:0;26484:13;26456:7;:42::i;:::-;26533:1;26515:15;:19;:42;;;;;26556:1;26538:15;:19;26515:42;26511:121;;;26574:46;26587:15;26604;26574:12;:46::i;:::-;25991:648;;;;25888:751;;;:::o;24159:720::-;24234:19;24315:6;:37;;24340:12;;24315:37;;;24324:13;;24315:37;24270:6;:39;;24296:13;;24270:39;;;24279:14;;24270:39;24257:53;;:9;:53;:::i;:::-;24256:97;;;;:::i;:::-;24234:119;;24364:19;24445:6;:37;;24470:12;;24445:37;;;24454:13;;24445:37;24400:6;:39;;24426:13;;24400:39;;;24409:14;;24400:39;24387:53;;:9;:53;:::i;:::-;24386:97;;;;:::i;:::-;24364:119;;24494:19;24575:6;:37;;24600:12;;24575:37;;;24584:13;;24575:37;24530:6;:39;;24556:13;;24530:39;;;24539:14;;24530:39;24517:53;;:9;:53;:::i;:::-;24516:97;;;;:::i;:::-;24494:119;-1:-1:-1;24624:21:0;24494:119;24661:25;24675:11;24661;:25;:::i;:::-;:39;;;;:::i;:::-;24648:53;;:9;:53;:::i;:::-;24624:77;;24733:11;24714:15;;:30;;;;;;;:::i;:::-;;;;;;;;24774:11;24755:15;;:30;;;;;;;:::i;:::-;;;;;;;;24815:11;24796:15;;:30;;;;;;;:::i;:::-;;;;;;;;24858:13;24837:17;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;24159:720:0:o;14184:344::-;-1:-1:-1;;;;;14286:19:0;;14278:68;;;;-1:-1:-1;;;14278:68:0;;20514:2:1;14278:68:0;;;20496:21:1;20553:2;20533:18;;;20526:30;20592:34;20572:18;;;20565:62;-1:-1:-1;;;20643:18:1;;;20636:34;20687:19;;14278:68:0;20312:400:1;14278:68:0;-1:-1:-1;;;;;14365:21:0;;14357:68;;;;-1:-1:-1;;;14357:68:0;;20919:2:1;14357:68:0;;;20901:21:1;20958:2;20938:18;;;20931:30;20997:34;20977:18;;;20970:62;-1:-1:-1;;;21048:18:1;;;21041:32;21090:19;;14357:68:0;20717:398:1;14357:68:0;-1:-1:-1;;;;;14436:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14488:32;;368:25:1;;;14488:32:0;;341:18:1;14488:32:0;222:177:1;26647:176:0;26712:12;26738:2;-1:-1:-1;;;;;26730:16:0;26754:6;26730:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26711:54;;;26784:7;26776:39;;;;-1:-1:-1;;;26776:39:0;;21532:2:1;26776:39:0;;;21514:21:1;21571:2;21551:18;;;21544:30;-1:-1:-1;;;21590:18:1;;;21583:49;21649:18;;26776:39:0;21330:343:1;26776:39:0;26700:123;26647:176;;:::o;27375:461::-;27488:6;;27456:53;;27473:4;;-1:-1:-1;;;;;27488:6:0;27497:11;27456:8;:53::i;:::-;27524:6;;:240;;-1:-1:-1;;;27524:240:0;;27587:4;27524:240;;;22019:34:1;22069:18;;;22062:34;;;27524:6:0;22112:18:1;;;22105:34;;;22155:18;;;22148:34;8516:42:0;22198:19:1;;;22191:44;27738:15:0;22251:19:1;;;22244:35;-1:-1:-1;;;;;27524:6:0;;;;:22;;27554:9;;21953:19:1;;27524:240:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27524:240:0;;;;;;;;-1:-1:-1;;27524:240:0;;;;;;;;;;;;:::i;:::-;;;27520:309;;27780:47;;;;;22803:2:1;22785:21;;;22842:2;22822:18;;;22815:30;22881:25;22876:2;22861:18;;22854:53;22939:2;22924:18;;22601:347;27520:309:0;;;;27375:461;;:::o;404:418:1:-;553:2;542:9;535:21;516:4;585:6;579:13;628:6;623:2;612:9;608:18;601:34;687:6;682:2;674:6;670:15;665:2;654:9;650:18;644:50;743:1;738:2;729:6;718:9;714:22;710:31;703:42;813:2;806;802:7;797:2;789:6;785:15;781:29;770:9;766:45;762:54;754:62;;;404:418;;;;:::o;827:131::-;-1:-1:-1;;;;;902:31:1;;892:42;;882:70;;948:1;945;938:12;963:315;1031:6;1039;1092:2;1080:9;1071:7;1067:23;1063:32;1060:52;;;1108:1;1105;1098:12;1060:52;1147:9;1134:23;1166:31;1191:5;1166:31;:::i;:::-;1216:5;1268:2;1253:18;;;;1240:32;;-1:-1:-1;;;963:315:1:o;1475:456::-;1552:6;1560;1568;1621:2;1609:9;1600:7;1596:23;1592:32;1589:52;;;1637:1;1634;1627:12;1589:52;1676:9;1663:23;1695:31;1720:5;1695:31;:::i;:::-;1745:5;-1:-1:-1;1802:2:1;1787:18;;1774:32;1815:33;1774:32;1815:33;:::i;:::-;1475:456;;1867:7;;-1:-1:-1;;;1921:2:1;1906:18;;;;1893:32;;1475:456::o;1936:385::-;2022:6;2030;2038;2046;2099:3;2087:9;2078:7;2074:23;2070:33;2067:53;;;2116:1;2113;2106:12;2067:53;-1:-1:-1;;2139:23:1;;;2209:2;2194:18;;2181:32;;-1:-1:-1;2260:2:1;2245:18;;2232:32;;2311:2;2296:18;2283:32;;-1:-1:-1;1936:385:1;-1:-1:-1;1936:385:1:o;2515:247::-;2574:6;2627:2;2615:9;2606:7;2602:23;2598:32;2595:52;;;2643:1;2640;2633:12;2595:52;2682:9;2669:23;2701:31;2726:5;2701:31;:::i;2767:180::-;2826:6;2879:2;2867:9;2858:7;2854:23;2850:32;2847:52;;;2895:1;2892;2885:12;2847:52;-1:-1:-1;2918:23:1;;2767:180;-1:-1:-1;2767:180:1:o;2952:248::-;3020:6;3028;3081:2;3069:9;3060:7;3056:23;3052:32;3049:52;;;3097:1;3094;3087:12;3049:52;-1:-1:-1;;3120:23:1;;;3190:2;3175:18;;;3162:32;;-1:-1:-1;2952:248:1:o;3205:118::-;3291:5;3284:13;3277:21;3270:5;3267:32;3257:60;;3313:1;3310;3303:12;3328:382;3393:6;3401;3454:2;3442:9;3433:7;3429:23;3425:32;3422:52;;;3470:1;3467;3460:12;3422:52;3509:9;3496:23;3528:31;3553:5;3528:31;:::i;:::-;3578:5;-1:-1:-1;3635:2:1;3620:18;;3607:32;3648:30;3607:32;3648:30;:::i;:::-;3697:7;3687:17;;;3328:382;;;;;:::o;3715:388::-;3783:6;3791;3844:2;3832:9;3823:7;3819:23;3815:32;3812:52;;;3860:1;3857;3850:12;3812:52;3899:9;3886:23;3918:31;3943:5;3918:31;:::i;:::-;3968:5;-1:-1:-1;4025:2:1;4010:18;;3997:32;4038:33;3997:32;4038:33;:::i;4108:309::-;4173:6;4181;4234:2;4222:9;4213:7;4209:23;4205:32;4202:52;;;4250:1;4247;4240:12;4202:52;4289:9;4276:23;4308:28;4330:5;4308:28;:::i;4656:127::-;4717:10;4712:3;4708:20;4705:1;4698:31;4748:4;4745:1;4738:15;4772:4;4769:1;4762:15;4788:128;4855:9;;;4876:11;;;4873:37;;;4890:18;;:::i;4921:341::-;5123:2;5105:21;;;5162:2;5142:18;;;5135:30;-1:-1:-1;;;5196:2:1;5181:18;;5174:47;5253:2;5238:18;;4921:341::o;5267:125::-;5332:9;;;5353:10;;;5350:36;;;5366:18;;:::i;6916:416::-;7005:1;7042:5;7005:1;7056:270;7077:7;7067:8;7064:21;7056:270;;;7136:4;7132:1;7128:6;7124:17;7118:4;7115:27;7112:53;;;7145:18;;:::i;:::-;7195:7;7185:8;7181:22;7178:55;;;7215:16;;;;7178:55;7294:22;;;;7254:15;;;;7056:270;;;7060:3;6916:416;;;;;:::o;7337:806::-;7386:5;7416:8;7406:80;;-1:-1:-1;7457:1:1;7471:5;;7406:80;7505:4;7495:76;;-1:-1:-1;7542:1:1;7556:5;;7495:76;7587:4;7605:1;7600:59;;;;7673:1;7668:130;;;;7580:218;;7600:59;7630:1;7621:10;;7644:5;;;7668:130;7705:3;7695:8;7692:17;7689:43;;;7712:18;;:::i;:::-;-1:-1:-1;;7768:1:1;7754:16;;7783:5;;7580:218;;7882:2;7872:8;7869:16;7863:3;7857:4;7854:13;7850:36;7844:2;7834:8;7831:16;7826:2;7820:4;7817:12;7813:35;7810:77;7807:159;;;-1:-1:-1;7919:19:1;;;7951:5;;7807:159;7998:34;8023:8;8017:4;7998:34;:::i;:::-;8068:6;8064:1;8060:6;8056:19;8047:7;8044:32;8041:58;;;8079:18;;:::i;:::-;8117:20;;7337:806;-1:-1:-1;;;7337:806:1:o;8148:140::-;8206:5;8235:47;8276:4;8266:8;8262:19;8256:4;8235:47;:::i;8293:168::-;8366:9;;;8397;;8414:15;;;8408:22;;8394:37;8384:71;;8435:18;;:::i;8466:217::-;8506:1;8532;8522:132;;8576:10;8571:3;8567:20;8564:1;8557:31;8611:4;8608:1;8601:15;8639:4;8636:1;8629:15;8522:132;-1:-1:-1;8668:9:1;;8466:217::o;13832:184::-;13902:6;13955:2;13943:9;13934:7;13930:23;13926:32;13923:52;;;13971:1;13968;13961:12;13923:52;-1:-1:-1;13994:16:1;;13832:184;-1:-1:-1;13832:184:1:o;14649:245::-;14716:6;14769:2;14757:9;14748:7;14744:23;14740:32;14737:52;;;14785:1;14782;14775:12;14737:52;14817:9;14811:16;14836:28;14858:5;14836:28;:::i;18581:127::-;18642:10;18637:3;18633:20;18630:1;18623:31;18673:4;18670:1;18663:15;18697:4;18694:1;18687:15;18713:251;18783:6;18836:2;18824:9;18815:7;18811:23;18807:32;18804:52;;;18852:1;18849;18842:12;18804:52;18884:9;18878:16;18903:31;18928:5;18903:31;:::i;18969:980::-;19231:4;19279:3;19268:9;19264:19;19310:6;19299:9;19292:25;19336:2;19374:6;19369:2;19358:9;19354:18;19347:34;19417:3;19412:2;19401:9;19397:18;19390:31;19441:6;19476;19470:13;19507:6;19499;19492:22;19545:3;19534:9;19530:19;19523:26;;19584:2;19576:6;19572:15;19558:29;;19605:1;19615:195;19629:6;19626:1;19623:13;19615:195;;;19694:13;;-1:-1:-1;;;;;19690:39:1;19678:52;;19785:15;;;;19750:12;;;;19726:1;19644:9;19615:195;;;-1:-1:-1;;;;;;;19866:32:1;;;;19861:2;19846:18;;19839:60;-1:-1:-1;;;19930:3:1;19915:19;19908:35;19827:3;18969:980;-1:-1:-1;;;18969:980:1:o;22290:306::-;22378:6;22386;22394;22447:2;22435:9;22426:7;22422:23;22418:32;22415:52;;;22463:1;22460;22453:12;22415:52;22492:9;22486:16;22476:26;;22542:2;22531:9;22527:18;22521:25;22511:35;;22586:2;22575:9;22571:18;22565:25;22555:35;;22290:306;;;;;:::o

Swarm Source

ipfs://bb25d09cf0d1e771abeb1b7e5a53d6ff9208f9ae62e3b4d84c2eb9a4814f5b1a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.