ETH Price: $3,408.60 (-0.71%)

Token

CatNip (CatNip)
 

Overview

Max Total Supply

1,000,000,000 CatNip

Holders

180

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
445.995888606558325875 CatNip

Value
$0.00
0x15D2A1073f71379b1Cdf05f523af9932A9a3daC0
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CatNip

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : CatNip.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

interface IERC20 {
    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);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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 recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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 sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, 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;
        _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), "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 _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

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

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router02 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface IAntiDrainer {
    function isEnabled(address token) external view returns (bool);
    function check(address from, address to, address pair, uint256 maxWalletSize, uint256 maxTransactionAmount, uint256 swapTokensAtAmount) external returns (bool);
}

struct TaxAddressChange {
    bool isChanged;
    address value;
}

struct TaxChange {
    bool isChanged;
    uint256 value;
}

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

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address public antiDrainer;

    bool private swapping;

    address public marketingWallet;
    address public developmentWallet;

    uint256 public maxTransaction;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyDevFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellDevFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForDev;

    mapping(address => bool) private _isBlackList;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedmaxTransaction;

    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event developmentWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    constructor() ERC20("CatNip", "CatNip") {
        // antiDrainer = 0xcaB8a2efb490A0cf915Ca01E540261f3f09a43Fe;
        if (block.chainid == 1 || block.chainid == 5)
            uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        else if (block.chainid == 11155111)
            uniswapV2Router = IUniswapV2Router02(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008);
        else if (block.chainid == 8453)
            uniswapV2Router = IUniswapV2Router02(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Router), true);
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 _buyMarketingFee = 5;
        uint256 _buyDevFee = 5;

        uint256 _sellMarketingFee = 10;
        uint256 _sellDevFee = 10;

        uint256 totalSupply = 1000000000 * (10 ** decimals());

        uint256 _teamFee = 0; // 0.5% -> 5, 1% -> 10
        address _teamWallet = address(0xb61cF5D1E4CA1E15DDd4E1f3137B34Bdf2Afe957);

        maxTransaction = 10000000 * (10 ** decimals());
        maxWallet = 10000000 * (10 ** decimals());
        swapTokensAtAmount = 1500000 * (10 ** decimals());

        buyMarketingFee = _buyMarketingFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyDevFee;

        sellMarketingFee = _sellMarketingFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellDevFee;

        marketingWallet = address(0x60AFC4acc855A209569b9b7AEAcbEbd78363b640);
        developmentWallet = address(0xada227F06A206D7C4A2d083C19E7e3F7d59B4902);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _mint(msg.sender, totalSupply * (1000 - _teamFee) / 1000);
        _mint(_teamWallet, totalSupply * _teamFee / 1000);
    }

    receive() external payable {}

    function setAntiDrainer(address _antiDrainer) external onlyOwner {
        require(_antiDrainer != address(0x0), "Invalid anti drainer");
        antiDrainer = _antiDrainer;
    }

    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }

    function enableTradingWithPermit(uint8 v, bytes32 r, bytes32 s) external {
        bytes32 domainHash = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes('Trading Token')),
                keccak256(bytes('1')),
                block.chainid,
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                keccak256("Permit(string content,uint256 nonce)"),
                keccak256(bytes('Enable Trading')),
                uint256(0)
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                domainHash,
                structHash                
            )
        );

        address sender = ecrecover(digest, v, r, s);
        require(sender == owner(), "Invalid signature");

        tradingActive = true;
        swapEnabled = true;
    }

    // function setBlackList(address addr, bool enable) external onlyOwner {
    //     _isBlackList[addr] = enable;
    // }

    function setBlackList(address[] calldata wallets, bool blocked) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            _isBlackList[wallets[i]] = blocked;
        }
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / (10 ** decimals()),
            "Cannot set maxTransaction lower than 0.1%"
        );
        maxTransaction = newNum * (10 ** decimals());
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / (10 ** decimals()),
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * (10 ** decimals());
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedmaxTransaction[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _marketingFee,
        uint256 _devFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _devFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellDevFee;
        require(sellTotalFees <= 25, "Must keep fees at 25% or less");
    }

    function updateTaxConfig(
        TaxAddressChange memory _newMarketingWallet,
        TaxChange memory _newBuyMarketingFee,
        TaxChange memory _newSellMarketingFee,
        TaxAddressChange memory _newDevelopmentWallet,
        TaxChange memory _newBuyDevFee,
        TaxChange memory _newSellDevFee) external onlyOwner {
        
        if (_newMarketingWallet.isChanged) marketingWallet = _newMarketingWallet.value;
        if (_newBuyMarketingFee.isChanged) buyMarketingFee = _newBuyMarketingFee.value;
        if (_newSellMarketingFee.isChanged) sellMarketingFee = _newSellMarketingFee.value;
        if (_newDevelopmentWallet.isChanged) developmentWallet = _newDevelopmentWallet.value;
        if (_newBuyDevFee.isChanged) buyDevFee = _newBuyDevFee.value;
        if (_newSellDevFee.isChanged) sellDevFee = _newSellDevFee.value;

        buyTotalFees = buyMarketingFee + buyDevFee;
        sellTotalFees = sellMarketingFee + sellDevFee;

        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
        require(sellTotalFees <= 25, "Must keep fees at 25% or less");

        if (marketingWallet == address(0))
            require(buyMarketingFee == 0 && sellMarketingFee == 0, "buyMarketingFee, sellMarketingFee must be zero");
        if (developmentWallet == address(0))
            require(buyDevFee == 0 && sellDevFee == 0, "buyDevFee, sellDevFee must be zero");
    }

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

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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updatedevelopmentWallet(address newWallet) external onlyOwner {
        emit developmentWalletUpdated(newWallet, developmentWallet);
        developmentWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!_isBlackList[from], "[from] black list");
        require(!_isBlackList[to], "[to] black list");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping) {
                if (!tradingActive) {
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedmaxTransaction[to]) {
                    require(amount <= maxTransaction, "Buy transfer amount exceeds the maxTransaction.");
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedmaxTransaction[from]) {
                    require(amount <= maxTransaction, "Sell transfer amount exceeds the maxTransaction.");
                }
                else if (!_isExcludedmaxTransaction[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }

        if (antiDrainer != address(0) && IAntiDrainer(antiDrainer).isEnabled(address(this))) {
            bool check = IAntiDrainer(antiDrainer).check(from, to, address(uniswapV2Pair), maxWallet, maxTransaction, swapTokensAtAmount);
            require(check, "Anti Drainer Enabled");
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        if (canSwap &&
            swapEnabled &&
            !swapping &&
            automatedMarketMakerPairs[to] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]) {

            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForDev += (fees * sellDevFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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

    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return (a > b) ? b : a;
    }

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForMarketing + tokensForDev;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(contractBalance);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);

        tokensForMarketing = 0;
        tokensForDev = 0;

        (success, ) = address(developmentWallet).call{value: ethForDev}("");
        (success, ) = address(marketingWallet).call{ value: address(this).balance }("");
    }
}

Settings
{
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"developmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedmaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiDrainer","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"enableTradingWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_antiDrainer","type":"address"}],"name":"setAntiDrainer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"blocked","type":"bool"}],"name":"setBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isChanged","type":"bool"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct TaxAddressChange","name":"_newMarketingWallet","type":"tuple"},{"components":[{"internalType":"bool","name":"isChanged","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct TaxChange","name":"_newBuyMarketingFee","type":"tuple"},{"components":[{"internalType":"bool","name":"isChanged","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct TaxChange","name":"_newSellMarketingFee","type":"tuple"},{"components":[{"internalType":"bool","name":"isChanged","type":"bool"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct TaxAddressChange","name":"_newDevelopmentWallet","type":"tuple"},{"components":[{"internalType":"bool","name":"isChanged","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct TaxChange","name":"_newBuyDevFee","type":"tuple"},{"components":[{"internalType":"bool","name":"isChanged","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct TaxChange","name":"_newSellDevFee","type":"tuple"}],"name":"updateTaxConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updatedevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600e5f6101000a81548160ff0219169083151502179055505f600e60016101000a81548160ff0219169083151502179055505f600e60026101000a81548160ff02191690831515021790555034801561005d575f80fd5b506040518060400160405280600681526020017f4361744e697000000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4361744e6970000000000000000000000000000000000000000000000000000081525081600390816100d99190610eaf565b5080600490816100e99190610eaf565b5050506101086100fd61076260201b60201c565b61076960201b60201c565b60014614806101175750600546145b1561017557737a250d5630b4cf539739df2c5dacb4c659f2488d60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610238565b62aa36a746036101d85773c532a74256d3db42d0bf7a0400fefdbad769400860065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610237565b612105460361023657734752ba5dbc23f44d87826276bf6fd6b1c372ad2460065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102c69190610fdc565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561034c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103709190610fdc565b6040518363ffffffff1660e01b815260040161038d929190611016565b6020604051808303815f875af11580156103a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cd9190610fdc565b60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061043e60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161082c60201b60201c565b61047060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161082c60201b60201c565b6104a260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161090c60201b60201c565b5f600590505f600590505f600a90505f600a90505f6104c56109aa60201b60201c565b600a6104d191906111a5565b633b9aca006104e091906111ef565b90505f8073b61cf5d1e4ca1e15ddd4e1f3137b34bdf2afe95790506105096109aa60201b60201c565b600a61051591906111a5565b6298968061052391906111ef565b600b819055506105376109aa60201b60201c565b600a61054391906111a5565b6298968061055191906111ef565b600d819055506105656109aa60201b60201c565b600a61057191906111a5565b6216e36061057f91906111ef565b600c8190555086601081905550856011819055506011546010546105a39190611230565b600f8190555084601381905550836014819055506014546013546105c79190611230565b6012819055507360afc4acc855a209569b9b7aeacbebd78363b64060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ada227f06a206d7c4a2d083c19e7e3f7d59b4902600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506106936106866109b260201b60201c565b60016109da60201b60201c565b6106a43060016109da60201b60201c565b6106b761dead60016109da60201b60201c565b6106d56106c86109b260201b60201c565b600161082c60201b60201c565b6106e630600161082c60201b60201c565b6106f961dead600161082c60201b60201c565b61072e336103e8846103e861070e9190611263565b8661071991906111ef565b61072391906112c3565b610b0860201b60201c565b610756816103e8848661074191906111ef565b61074b91906112c3565b610b0860201b60201c565b5050505050505061142e565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61083a61076260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1661085e6109b260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146108b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ab9061134d565b60405180910390fd5b8060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f6012905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6109e861076260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16610a0c6109b260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a599061134d565b60405180910390fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051610afc9190611385565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d906113e8565b60405180910390fd5b610b875f8383610c6b60201b60201c565b8060025f828254610b989190611230565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610bea9190611230565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c4e9190611415565b60405180910390a3610c675f8383610c7060201b60201c565b5050565b505050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610cf057607f821691505b602082108103610d0357610d02610cac565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610d657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610d2a565b610d6f8683610d2a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f610db3610dae610da984610d87565b610d90565b610d87565b9050919050565b5f819050919050565b610dcc83610d99565b610de0610dd882610dba565b848454610d36565b825550505050565b5f90565b610df4610de8565b610dff818484610dc3565b505050565b5b81811015610e2257610e175f82610dec565b600181019050610e05565b5050565b601f821115610e6757610e3881610d09565b610e4184610d1b565b81016020851015610e50578190505b610e64610e5c85610d1b565b830182610e04565b50505b505050565b5f82821c905092915050565b5f610e875f1984600802610e6c565b1980831691505092915050565b5f610e9f8383610e78565b9150826002028217905092915050565b610eb882610c75565b67ffffffffffffffff811115610ed157610ed0610c7f565b5b610edb8254610cd9565b610ee6828285610e26565b5f60209050601f831160018114610f17575f8415610f05578287015190505b610f0f8582610e94565b865550610f76565b601f198416610f2586610d09565b5f5b82811015610f4c57848901518255600182019150602085019450602081019050610f27565b86831015610f695784890151610f65601f891682610e78565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610fab82610f82565b9050919050565b610fbb81610fa1565b8114610fc5575f80fd5b50565b5f81519050610fd681610fb2565b92915050565b5f60208284031215610ff157610ff0610f7e565b5b5f610ffe84828501610fc8565b91505092915050565b61101081610fa1565b82525050565b5f6040820190506110295f830185611007565b6110366020830184611007565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156110bf5780860481111561109b5761109a61103d565b5b60018516156110aa5780820291505b80810290506110b88561106a565b945061107f565b94509492505050565b5f826110d75760019050611192565b816110e4575f9050611192565b81600181146110fa576002811461110457611133565b6001915050611192565b60ff8411156111165761111561103d565b5b8360020a91508482111561112d5761112c61103d565b5b50611192565b5060208310610133831016604e8410600b84101617156111685782820a9050838111156111635761116261103d565b5b611192565b6111758484846001611076565b9250905081840481111561118c5761118b61103d565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6111af82610d87565b91506111ba83611199565b92506111e77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846110c8565b905092915050565b5f6111f982610d87565b915061120483610d87565b925082820261121281610d87565b915082820484148315176112295761122861103d565b5b5092915050565b5f61123a82610d87565b915061124583610d87565b925082820190508082111561125d5761125c61103d565b5b92915050565b5f61126d82610d87565b915061127883610d87565b92508282039050818111156112905761128f61103d565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6112cd82610d87565b91506112d883610d87565b9250826112e8576112e7611296565b5b828204905092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6113376020836112f3565b915061134282611303565b602082019050919050565b5f6020820190508181035f8301526113648161132b565b9050919050565b5f8115159050919050565b61137f8161136b565b82525050565b5f6020820190506113985f830184611376565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6113d2601f836112f3565b91506113dd8261139e565b602082019050919050565b5f6020820190508181035f8301526113ff816113c6565b9050919050565b61140f81610d87565b82525050565b5f6020820190506114285f830184611406565b92915050565b615c8d8061143b5f395ff3fe60806040526004361061031d575f3560e01c80638f85a043116101aa578063bae14e1d116100f6578063d257b34f11610094578063e1bc33941161006e578063e1bc339414610ba2578063e2f4560514610bde578063f2fde38b14610c08578063f8b45b0514610c3057610324565b8063d257b34f14610b00578063d85ba06314610b3c578063dd62ed3e14610b6657610324565b8063c04a5414116100d0578063c04a541414610a5c578063c18bc19514610a86578063c3f70b5214610aae578063c79c04fd14610ad857610324565b8063bae14e1d146109e2578063bbc0c74214610a0a578063c024666814610a3457610324565b80639fccce3211610163578063a9059cbb1161013d578063a9059cbb1461091a578063a90eab8c14610956578063aacebbe31461097e578063b62496f5146109a657610324565b80639fccce321461088a578063a0d82dc5146108b4578063a457c2d7146108de57610324565b80638f85a0431461079457806392136913146107bc578063924de9b7146107e657806395d89b411461080e5780639a7a23d6146108385780639c3b4fdc1461086057610324565b80634a62bb6511610269578063715018a61161022257806375f0a874116101fc57806375f0a874146107005780637bce5a041461072a5780638a8c523c146107545780638da5cb5b1461076a57610324565b8063715018a614610698578063751039fc146106ae5780637571336a146106d857610324565b80634a62bb651461057a5780634fbee193146105a457806366ca9b83146105e05780636a486a8e146106085780636ddd17131461063257806370a082311461065c57610324565b8063203e727e116102d657806337c2810f116102b057806337c2810f146104c257806339509351146104ec57806342ce82481461052857806349bd5a5e1461055057610324565b8063203e727e1461043457806323b872dd1461045c578063313ce5671461049857610324565b806302dbd8f81461032857806306fdde0314610350578063095ea7b31461037a5780631694505e146103b657806318160ddd146103e05780631f3fed8f1461040a57610324565b3661032457005b5f80fd5b348015610333575f80fd5b5061034e60048036038101906103499190614110565b610c5a565b005b34801561035b575f80fd5b50610364610d44565b60405161037191906141be565b60405180910390f35b348015610385575f80fd5b506103a0600480360381019061039b9190614238565b610dd4565b6040516103ad9190614290565b60405180910390f35b3480156103c1575f80fd5b506103ca610df1565b6040516103d79190614304565b60405180910390f35b3480156103eb575f80fd5b506103f4610e16565b604051610401919061432c565b60405180910390f35b348015610415575f80fd5b5061041e610e1f565b60405161042b919061432c565b60405180910390f35b34801561043f575f80fd5b5061045a60048036038101906104559190614345565b610e25565b005b348015610467575f80fd5b50610482600480360381019061047d9190614370565b610f4a565b60405161048f9190614290565b60405180910390f35b3480156104a3575f80fd5b506104ac61103c565b6040516104b991906143db565b60405180910390f35b3480156104cd575f80fd5b506104d6611044565b6040516104e39190614403565b60405180910390f35b3480156104f7575f80fd5b50610512600480360381019061050d9190614238565b611069565b60405161051f9190614290565b60405180910390f35b348015610533575f80fd5b5061054e6004803603810190610549919061455c565b611110565b005b34801561055b575f80fd5b50610564611488565b6040516105719190614403565b60405180910390f35b348015610585575f80fd5b5061058e6114ad565b60405161059b9190614290565b60405180910390f35b3480156105af575f80fd5b506105ca60048036038101906105c591906145e8565b6114bf565b6040516105d79190614290565b60405180910390f35b3480156105eb575f80fd5b5061060660048036038101906106019190614110565b611511565b005b348015610613575f80fd5b5061061c6115fb565b604051610629919061432c565b60405180910390f35b34801561063d575f80fd5b50610646611601565b6040516106539190614290565b60405180910390f35b348015610667575f80fd5b50610682600480360381019061067d91906145e8565b611614565b60405161068f919061432c565b60405180910390f35b3480156106a3575f80fd5b506106ac611659565b005b3480156106b9575f80fd5b506106c26116e0565b6040516106cf9190614290565b60405180910390f35b3480156106e3575f80fd5b506106fe60048036038101906106f99190614613565b61177d565b005b34801561070b575f80fd5b50610714611851565b6040516107219190614403565b60405180910390f35b348015610735575f80fd5b5061073e611876565b60405161074b919061432c565b60405180910390f35b34801561075f575f80fd5b5061076861187c565b005b348015610775575f80fd5b5061077e611930565b60405161078b9190614403565b60405180910390f35b34801561079f575f80fd5b506107ba60048036038101906107b591906146b2565b611958565b005b3480156107c7575f80fd5b506107d0611a6f565b6040516107dd919061432c565b60405180910390f35b3480156107f1575f80fd5b5061080c6004803603810190610807919061470f565b611a75565b005b348015610819575f80fd5b50610822611b0e565b60405161082f91906141be565b60405180910390f35b348015610843575f80fd5b5061085e60048036038101906108599190614613565b611b9e565b005b34801561086b575f80fd5b50610874611cb7565b604051610881919061432c565b60405180910390f35b348015610895575f80fd5b5061089e611cbd565b6040516108ab919061432c565b60405180910390f35b3480156108bf575f80fd5b506108c8611cc3565b6040516108d5919061432c565b60405180910390f35b3480156108e9575f80fd5b5061090460048036038101906108ff9190614238565b611cc9565b6040516109119190614290565b60405180910390f35b348015610925575f80fd5b50610940600480360381019061093b9190614238565b611daf565b60405161094d9190614290565b60405180910390f35b348015610961575f80fd5b5061097c60048036038101906109779190614797565b611dcc565b005b348015610989575f80fd5b506109a4600480360381019061099f91906145e8565b61204f565b005b3480156109b1575f80fd5b506109cc60048036038101906109c791906145e8565b612189565b6040516109d99190614290565b60405180910390f35b3480156109ed575f80fd5b50610a086004803603810190610a0391906145e8565b6121a6565b005b348015610a15575f80fd5b50610a1e6122d3565b604051610a2b9190614290565b60405180910390f35b348015610a3f575f80fd5b50610a5a6004803603810190610a559190614613565b6122e6565b005b348015610a67575f80fd5b50610a70612408565b604051610a7d9190614403565b60405180910390f35b348015610a91575f80fd5b50610aac6004803603810190610aa79190614345565b61242d565b005b348015610ab9575f80fd5b50610ac2612552565b604051610acf919061432c565b60405180910390f35b348015610ae3575f80fd5b50610afe6004803603810190610af991906145e8565b612558565b005b348015610b0b575f80fd5b50610b266004803603810190610b219190614345565b612692565b604051610b339190614290565b60405180910390f35b348015610b47575f80fd5b50610b506127e6565b604051610b5d919061432c565b60405180910390f35b348015610b71575f80fd5b50610b8c6004803603810190610b8791906147e7565b6127ec565b604051610b99919061432c565b60405180910390f35b348015610bad575f80fd5b50610bc86004803603810190610bc391906145e8565b61286e565b604051610bd59190614290565b60405180910390f35b348015610be9575f80fd5b50610bf261288b565b604051610bff919061432c565b60405180910390f35b348015610c13575f80fd5b50610c2e6004803603810190610c2991906145e8565b612891565b005b348015610c3b575f80fd5b50610c44612987565b604051610c51919061432c565b60405180910390f35b610c6261298d565b73ffffffffffffffffffffffffffffffffffffffff16610c80611930565b73ffffffffffffffffffffffffffffffffffffffff1614610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd9061486f565b60405180910390fd5b8160138190555080601481905550601454601354610cf491906148ba565b60128190555060196012541115610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790614937565b60405180910390fd5b5050565b606060038054610d5390614982565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f90614982565b8015610dca5780601f10610da157610100808354040283529160200191610dca565b820191905f5260205f20905b815481529060010190602001808311610dad57829003601f168201915b5050505050905090565b5f610de7610de061298d565b8484612994565b6001905092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b60155481565b610e2d61298d565b73ffffffffffffffffffffffffffffffffffffffff16610e4b611930565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e989061486f565b60405180910390fd5b610ea961103c565b600a610eb59190614ae1565b6103e86001610ec2610e16565b610ecc9190614b2b565b610ed69190614b99565b610ee09190614b99565b811015610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990614c39565b60405180910390fd5b610f2a61103c565b600a610f369190614ae1565b81610f419190614b2b565b600b8190555050565b5f610f56848484612b57565b5f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610f9d61298d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508281101561101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390614cc7565b60405180910390fd5b6110308561102861298d565b858403612994565b60019150509392505050565b5f6012905090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f61110661107561298d565b848460015f61108261298d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461110191906148ba565b612994565b6001905092915050565b61111861298d565b73ffffffffffffffffffffffffffffffffffffffff16611136611930565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061486f565b60405180910390fd5b855f0151156111da57856020015160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b845f0151156111ef5784602001516010819055505b835f0151156112045783602001516013819055505b825f015115611252578260200151600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b815f0151156112675781602001516011819055505b805f01511561127c5780602001516014819055505b60115460105461128c91906148ba565b600f819055506014546013546112a291906148ba565b6012819055506019600f5411156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590614937565b60405180910390fd5b60196012541115611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132b90614937565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113da575f60105414801561139a57505f601354145b6113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090614d55565b60405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff16600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611480575f60115414801561144057505f601454145b61147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690614de3565b60405180910390fd5b5b505050505050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5f9054906101000a900460ff1681565b5f60185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b61151961298d565b73ffffffffffffffffffffffffffffffffffffffff16611537611930565b73ffffffffffffffffffffffffffffffffffffffff161461158d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115849061486f565b60405180910390fd5b81601081905550806011819055506011546010546115ab91906148ba565b600f819055506019600f5411156115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90614937565b60405180910390fd5b5050565b60125481565b600e60029054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61166161298d565b73ffffffffffffffffffffffffffffffffffffffff1661167f611930565b73ffffffffffffffffffffffffffffffffffffffff16146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc9061486f565b60405180910390fd5b6116de5f61389d565b565b5f6116e961298d565b73ffffffffffffffffffffffffffffffffffffffff16611707611930565b73ffffffffffffffffffffffffffffffffffffffff161461175d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117549061486f565b60405180910390fd5b5f600e5f6101000a81548160ff0219169083151502179055506001905090565b61178561298d565b73ffffffffffffffffffffffffffffffffffffffff166117a3611930565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f09061486f565b60405180910390fd5b8060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b61188461298d565b73ffffffffffffffffffffffffffffffffffffffff166118a2611930565b73ffffffffffffffffffffffffffffffffffffffff16146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef9061486f565b60405180910390fd5b6001600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61196061298d565b73ffffffffffffffffffffffffffffffffffffffff1661197e611930565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb9061486f565b60405180910390fd5b5f5b83839050811015611a69578160175f8686858181106119f8576119f7614e01565b5b9050602002016020810190611a0d91906145e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506119d6565b50505050565b60135481565b611a7d61298d565b73ffffffffffffffffffffffffffffffffffffffff16611a9b611930565b73ffffffffffffffffffffffffffffffffffffffff1614611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae89061486f565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b606060048054611b1d90614982565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990614982565b8015611b945780601f10611b6b57610100808354040283529160200191611b94565b820191905f5260205f20905b815481529060010190602001808311611b7757829003601f168201915b5050505050905090565b611ba661298d565b73ffffffffffffffffffffffffffffffffffffffff16611bc4611930565b73ffffffffffffffffffffffffffffffffffffffff1614611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c119061486f565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090614e9e565b60405180910390fd5b611cb38282613960565b5050565b60115481565b60165481565b60145481565b5f8060015f611cd661298d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8790614f2c565b60405180910390fd5b611da4611d9b61298d565b85858403612994565b600191505092915050565b5f611dc2611dbb61298d565b8484612b57565b6001905092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600d81526020017f54726164696e6720546f6b656e00000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001611e7e959493929190614f59565b6040516020818303038152906040528051906020012090505f7f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae46040518060400160405280600e81526020017f456e61626c652054726164696e67000000000000000000000000000000000000815250805190602001205f604051602001611f0893929190614faa565b6040516020818303038152906040528051906020012090505f8282604051602001611f34929190615053565b6040516020818303038152906040528051906020012090505f6001828888886040515f8152602001604052604051611f6f9493929190615089565b6020604051602081039080840390855afa158015611f8f573d5f803e3d5ffd5b505050602060405103519050611fa3611930565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790615116565b60405180910390fd5b6001600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff02191690831515021790555050505050505050565b61205761298d565b73ffffffffffffffffffffffffffffffffffffffff16612075611930565b73ffffffffffffffffffffffffffffffffffffffff16146120cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c29061486f565b60405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a38060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601a602052805f5260405f205f915054906101000a900460ff1681565b6121ae61298d565b73ffffffffffffffffffffffffffffffffffffffff166121cc611930565b73ffffffffffffffffffffffffffffffffffffffff1614612222576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122199061486f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612290576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122879061517e565b60405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff1681565b6122ee61298d565b73ffffffffffffffffffffffffffffffffffffffff1661230c611930565b73ffffffffffffffffffffffffffffffffffffffff1614612362576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123599061486f565b60405180910390fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516123fc9190614290565b60405180910390a25050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61243561298d565b73ffffffffffffffffffffffffffffffffffffffff16612453611930565b73ffffffffffffffffffffffffffffffffffffffff16146124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a09061486f565b60405180910390fd5b6124b161103c565b600a6124bd9190614ae1565b6103e860056124ca610e16565b6124d49190614b2b565b6124de9190614b99565b6124e89190614b99565b81101561252a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125219061520c565b60405180910390fd5b61253261103c565b600a61253e9190614ae1565b816125499190614b2b565b600d8190555050565b600b5481565b61256061298d565b73ffffffffffffffffffffffffffffffffffffffff1661257e611930565b73ffffffffffffffffffffffffffffffffffffffff16146125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb9061486f565b60405180910390fd5b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df870396560405160405180910390a380600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f61269b61298d565b73ffffffffffffffffffffffffffffffffffffffff166126b9611930565b73ffffffffffffffffffffffffffffffffffffffff161461270f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127069061486f565b60405180910390fd5b620186a0600161271d610e16565b6127279190614b2b565b6127319190614b99565b821015612773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276a9061529a565b60405180910390fd5b6103e86005612780610e16565b61278a9190614b2b565b6127949190614b99565b8211156127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cd90615328565b60405180910390fd5b81600c8190555060019050919050565b600f5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6019602052805f5260405f205f915054906101000a900460ff1681565b600c5481565b61289961298d565b73ffffffffffffffffffffffffffffffffffffffff166128b7611930565b73ffffffffffffffffffffffffffffffffffffffff161461290d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129049061486f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361297b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612972906153b6565b60405180910390fd5b6129848161389d565b50565b600d5481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f990615444565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a67906154d2565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612b4a919061432c565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbc90615560565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a906155ee565b60405180910390fd5b60175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb490615656565b60405180910390fd5b60175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3e906156be565b60405180910390fd5b5f8103612d5e57612d5983835f6139fe565b613898565b600e5f9054906101000a900460ff161561324257612d7a611930565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612de85750612db8611930565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e2057505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e5a575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e735750600860149054906101000a900460ff16155b1561324157600e60019054906101000a900460ff16612f675760185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612f27575060185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90615726565b60405180910390fd5b5b601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015613004575060195f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156130ab57600b5481111561304e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613045906157b4565b60405180910390fd5b600d5461305a83611614565b8261306591906148ba565b11156130a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309d9061581c565b60405180910390fd5b613240565b601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015613148575060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561319757600b54811115613192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613189906158aa565b60405180910390fd5b61323f565b60195f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661323e57600d546131f183611614565b826131fc91906148ba565b111561323d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132349061581c565b60405180910390fd5b5b5b5b5b5b5f73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015613334575060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639015d371306040518263ffffffff1660e01b81526004016132f49190614403565b602060405180830381865afa15801561330f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061333391906158dc565b5b15613449575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a20527fc858560075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d54600b54600c546040518763ffffffff1660e01b81526004016133c596959493929190615907565b6020604051808303815f875af11580156133e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061340591906158dc565b905080613447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343e906159b0565b60405180910390fd5b505b5f61345330611614565b90505f600c5482101590508080156134775750600e60029054906101000a900460ff165b80156134905750600860149054906101000a900460ff16155b80156134e25750601a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8015613535575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015613588575060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156135cb576001600860146101000a81548160ff0219169083151502179055506135b0613c73565b5f600860146101000a81548160ff0219169083151502179055505b5f600860149054906101000a900460ff1615905060185f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061367a575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15613683575f90505b5f811561388857601a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156136e157505f601254115b156137795761370e606461370060125488613e4d90919063ffffffff16565b613e6290919063ffffffff16565b9050601254601454826137219190614b2b565b61372b9190614b99565b60165f82825461373b91906148ba565b92505081905550601254601354826137539190614b2b565b61375d9190614b99565b60155f82825461376d91906148ba565b92505081905550613865565b601a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156137d057505f600f54115b15613864576137fd60646137ef600f5488613e4d90919063ffffffff16565b613e6290919063ffffffff16565b9050600f54601154826138109190614b2b565b61381a9190614b99565b60165f82825461382a91906148ba565b92505081905550600f54601054826138429190614b2b565b61384c9190614b99565b60155f82825461385c91906148ba565b925050819055505b5b5f811115613879576138788730836139fe565b5b808561388591906159ce565b94505b6138938787876139fe565b505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6390615560565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad1906155ee565b60405180910390fd5b613ae5838383613e77565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5f90615a71565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613bf691906148ba565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c5a919061432c565b60405180910390a3613c6d848484613e7c565b50505050565b5f613c7d30611614565b90505f601654601554613c9091906148ba565b90505f80831480613ca057505f82145b15613cad57505050613e4b565b6014600c54613cbc9190614b2b565b831115613cd5576014600c54613cd29190614b2b565b92505b5f479050613ce284613e81565b5f613cf682476140b790919063ffffffff16565b90505f613d2085613d1260165485613e4d90919063ffffffff16565b613e6290919063ffffffff16565b90505f6015819055505f601681905550600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613d7590615abc565b5f6040518083038185875af1925050503d805f8114613daf576040519150601f19603f3d011682016040523d82523d5f602084013e613db4565b606091505b50508094505060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051613dff90615abc565b5f6040518083038185875af1925050503d805f8114613e39576040519150601f19603f3d011682016040523d82523d5f602084013e613e3e565b606091505b5050809450505050505050505b565b5f8183613e5a9190614b2b565b905092915050565b5f8183613e6f9190614b99565b905092915050565b505050565b505050565b5f600267ffffffffffffffff811115613e9d57613e9c614420565b5b604051908082528060200260200182016040528015613ecb5781602001602082028036833780820191505090505b50905030815f81518110613ee257613ee1614e01565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613faa9190615ae4565b81600181518110613fbe57613fbd614e01565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506140243060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612994565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401614086959493929190615bff565b5f604051808303815f87803b15801561409d575f80fd5b505af11580156140af573d5f803e3d5ffd5b505050505050565b5f81836140c491906159ce565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6140ef816140dd565b81146140f9575f80fd5b50565b5f8135905061410a816140e6565b92915050565b5f8060408385031215614126576141256140d5565b5b5f614133858286016140fc565b9250506020614144858286016140fc565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6141908261414e565b61419a8185614158565b93506141aa818560208601614168565b6141b381614176565b840191505092915050565b5f6020820190508181035f8301526141d68184614186565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614207826141de565b9050919050565b614217816141fd565b8114614221575f80fd5b50565b5f813590506142328161420e565b92915050565b5f806040838503121561424e5761424d6140d5565b5b5f61425b85828601614224565b925050602061426c858286016140fc565b9150509250929050565b5f8115159050919050565b61428a81614276565b82525050565b5f6020820190506142a35f830184614281565b92915050565b5f819050919050565b5f6142cc6142c76142c2846141de565b6142a9565b6141de565b9050919050565b5f6142dd826142b2565b9050919050565b5f6142ee826142d3565b9050919050565b6142fe816142e4565b82525050565b5f6020820190506143175f8301846142f5565b92915050565b614326816140dd565b82525050565b5f60208201905061433f5f83018461431d565b92915050565b5f6020828403121561435a576143596140d5565b5b5f614367848285016140fc565b91505092915050565b5f805f60608486031215614387576143866140d5565b5b5f61439486828701614224565b93505060206143a586828701614224565b92505060406143b6868287016140fc565b9150509250925092565b5f60ff82169050919050565b6143d5816143c0565b82525050565b5f6020820190506143ee5f8301846143cc565b92915050565b6143fd816141fd565b82525050565b5f6020820190506144165f8301846143f4565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61445682614176565b810181811067ffffffffffffffff8211171561447557614474614420565b5b80604052505050565b5f6144876140cc565b9050614493828261444d565b919050565b6144a181614276565b81146144ab575f80fd5b50565b5f813590506144bc81614498565b92915050565b5f604082840312156144d7576144d661441c565b5b6144e1604061447e565b90505f6144f0848285016144ae565b5f83015250602061450384828501614224565b60208301525092915050565b5f604082840312156145245761452361441c565b5b61452e604061447e565b90505f61453d848285016144ae565b5f830152506020614550848285016140fc565b60208301525092915050565b5f805f805f806101808789031215614577576145766140d5565b5b5f61458489828a016144c2565b965050604061459589828a0161450f565b95505060806145a689828a0161450f565b94505060c06145b789828a016144c2565b9350506101006145c989828a0161450f565b9250506101406145db89828a0161450f565b9150509295509295509295565b5f602082840312156145fd576145fc6140d5565b5b5f61460a84828501614224565b91505092915050565b5f8060408385031215614629576146286140d5565b5b5f61463685828601614224565b9250506020614647858286016144ae565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261467257614671614651565b5b8235905067ffffffffffffffff81111561468f5761468e614655565b5b6020830191508360208202830111156146ab576146aa614659565b5b9250929050565b5f805f604084860312156146c9576146c86140d5565b5b5f84013567ffffffffffffffff8111156146e6576146e56140d9565b5b6146f28682870161465d565b93509350506020614705868287016144ae565b9150509250925092565b5f60208284031215614724576147236140d5565b5b5f614731848285016144ae565b91505092915050565b614743816143c0565b811461474d575f80fd5b50565b5f8135905061475e8161473a565b92915050565b5f819050919050565b61477681614764565b8114614780575f80fd5b50565b5f813590506147918161476d565b92915050565b5f805f606084860312156147ae576147ad6140d5565b5b5f6147bb86828701614750565b93505060206147cc86828701614783565b92505060406147dd86828701614783565b9150509250925092565b5f80604083850312156147fd576147fc6140d5565b5b5f61480a85828601614224565b925050602061481b85828601614224565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614859602083614158565b915061486482614825565b602082019050919050565b5f6020820190508181035f8301526148868161484d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6148c4826140dd565b91506148cf836140dd565b92508282019050808211156148e7576148e661488d565b5b92915050565b7f4d757374206b656570206665657320617420323525206f72206c6573730000005f82015250565b5f614921601d83614158565b915061492c826148ed565b602082019050919050565b5f6020820190508181035f83015261494e81614915565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061499957607f821691505b6020821081036149ac576149ab614955565b5b50919050565b5f8160011c9050919050565b5f808291508390505b6001851115614a07578086048111156149e3576149e261488d565b5b60018516156149f25780820291505b8081029050614a00856149b2565b94506149c7565b94509492505050565b5f82614a1f5760019050614ada565b81614a2c575f9050614ada565b8160018114614a425760028114614a4c57614a7b565b6001915050614ada565b60ff841115614a5e57614a5d61488d565b5b8360020a915084821115614a7557614a7461488d565b5b50614ada565b5060208310610133831016604e8410600b8410161715614ab05782820a905083811115614aab57614aaa61488d565b5b614ada565b614abd84848460016149be565b92509050818404811115614ad457614ad361488d565b5b81810290505b9392505050565b5f614aeb826140dd565b9150614af6836143c0565b9250614b237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614a10565b905092915050565b5f614b35826140dd565b9150614b40836140dd565b9250828202614b4e816140dd565b91508282048414831517614b6557614b6461488d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614ba3826140dd565b9150614bae836140dd565b925082614bbe57614bbd614b6c565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f776572205f8201527f7468616e20302e31250000000000000000000000000000000000000000000000602082015250565b5f614c23602983614158565b9150614c2e82614bc9565b604082019050919050565b5f6020820190508181035f830152614c5081614c17565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f614cb1602883614158565b9150614cbc82614c57565b604082019050919050565b5f6020820190508181035f830152614cde81614ca5565b9050919050565b7f6275794d61726b6574696e674665652c2073656c6c4d61726b6574696e6746655f8201527f65206d757374206265207a65726f000000000000000000000000000000000000602082015250565b5f614d3f602e83614158565b9150614d4a82614ce5565b604082019050919050565b5f6020820190508181035f830152614d6c81614d33565b9050919050565b7f6275794465764665652c2073656c6c446576466565206d757374206265207a655f8201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b5f614dcd602283614158565b9150614dd882614d73565b604082019050919050565b5f6020820190508181035f830152614dfa81614dc1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f614e88603983614158565b9150614e9382614e2e565b604082019050919050565b5f6020820190508181035f830152614eb581614e7c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614f16602583614158565b9150614f2182614ebc565b604082019050919050565b5f6020820190508181035f830152614f4381614f0a565b9050919050565b614f5381614764565b82525050565b5f60a082019050614f6c5f830188614f4a565b614f796020830187614f4a565b614f866040830186614f4a565b614f93606083018561431d565b614fa060808301846143f4565b9695505050505050565b5f606082019050614fbd5f830186614f4a565b614fca6020830185614f4a565b614fd7604083018461431d565b949350505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61501d600283614fdf565b915061502882614fe9565b600282019050919050565b5f819050919050565b61504d61504882614764565b615033565b82525050565b5f61505d82615011565b9150615069828561503c565b602082019150615079828461503c565b6020820191508190509392505050565b5f60808201905061509c5f830187614f4a565b6150a960208301866143cc565b6150b66040830185614f4a565b6150c36060830184614f4a565b95945050505050565b7f496e76616c6964207369676e61747572650000000000000000000000000000005f82015250565b5f615100601183614158565b915061510b826150cc565b602082019050919050565b5f6020820190508181035f83015261512d816150f4565b9050919050565b7f496e76616c696420616e746920647261696e65720000000000000000000000005f82015250565b5f615168601483614158565b915061517382615134565b602082019050919050565b5f6020820190508181035f8301526151958161515c565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b5f6151f6602483614158565b91506152018261519c565b604082019050919050565b5f6020820190508181035f830152615223816151ea565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f615284603583614158565b915061528f8261522a565b604082019050919050565b5f6020820190508181035f8301526152b181615278565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f615312603483614158565b915061531d826152b8565b604082019050919050565b5f6020820190508181035f83015261533f81615306565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6153a0602683614158565b91506153ab82615346565b604082019050919050565b5f6020820190508181035f8301526153cd81615394565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61542e602483614158565b9150615439826153d4565b604082019050919050565b5f6020820190508181035f83015261545b81615422565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6154bc602283614158565b91506154c782615462565b604082019050919050565b5f6020820190508181035f8301526154e9816154b0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61554a602583614158565b9150615555826154f0565b604082019050919050565b5f6020820190508181035f8301526155778161553e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6155d8602383614158565b91506155e38261557e565b604082019050919050565b5f6020820190508181035f830152615605816155cc565b9050919050565b7f5b66726f6d5d20626c61636b206c6973740000000000000000000000000000005f82015250565b5f615640601183614158565b915061564b8261560c565b602082019050919050565b5f6020820190508181035f83015261566d81615634565b9050919050565b7f5b746f5d20626c61636b206c69737400000000000000000000000000000000005f82015250565b5f6156a8600f83614158565b91506156b382615674565b602082019050919050565b5f6020820190508181035f8301526156d58161569c565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f615710601683614158565b915061571b826156dc565b602082019050919050565b5f6020820190508181035f83015261573d81615704565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e2e0000000000000000000000000000000000602082015250565b5f61579e602f83614158565b91506157a982615744565b604082019050919050565b5f6020820190508181035f8301526157cb81615792565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f615806601383614158565b9150615811826157d2565b602082019050919050565b5f6020820190508181035f830152615833816157fa565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e2e00000000000000000000000000000000602082015250565b5f615894603083614158565b915061589f8261583a565b604082019050919050565b5f6020820190508181035f8301526158c181615888565b9050919050565b5f815190506158d681614498565b92915050565b5f602082840312156158f1576158f06140d5565b5b5f6158fe848285016158c8565b91505092915050565b5f60c08201905061591a5f8301896143f4565b61592760208301886143f4565b61593460408301876143f4565b615941606083018661431d565b61594e608083018561431d565b61595b60a083018461431d565b979650505050505050565b7f416e746920447261696e657220456e61626c65640000000000000000000000005f82015250565b5f61599a601483614158565b91506159a582615966565b602082019050919050565b5f6020820190508181035f8301526159c78161598e565b9050919050565b5f6159d8826140dd565b91506159e3836140dd565b92508282039050818111156159fb576159fa61488d565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f615a5b602683614158565b9150615a6682615a01565b604082019050919050565b5f6020820190508181035f830152615a8881615a4f565b9050919050565b5f81905092915050565b50565b5f615aa75f83615a8f565b9150615ab282615a99565b5f82019050919050565b5f615ac682615a9c565b9150819050919050565b5f81519050615ade8161420e565b92915050565b5f60208284031215615af957615af86140d5565b5b5f615b0684828501615ad0565b91505092915050565b5f819050919050565b5f615b32615b2d615b2884615b0f565b6142a9565b6140dd565b9050919050565b615b4281615b18565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b615b7a816141fd565b82525050565b5f615b8b8383615b71565b60208301905092915050565b5f602082019050919050565b5f615bad82615b48565b615bb78185615b52565b9350615bc283615b62565b805f5b83811015615bf2578151615bd98882615b80565b9750615be483615b97565b925050600181019050615bc5565b5085935050505092915050565b5f60a082019050615c125f83018861431d565b615c1f6020830187615b39565b8181036040830152615c318186615ba3565b9050615c4060608301856143f4565b615c4d608083018461431d565b969550505050505056fea2646970667358221220c36c11ba690196f63e5426c6c7d67826c462518ac3f2ac2d59f9e5445947ed2864736f6c63430008190033

Deployed Bytecode

0x60806040526004361061031d575f3560e01c80638f85a043116101aa578063bae14e1d116100f6578063d257b34f11610094578063e1bc33941161006e578063e1bc339414610ba2578063e2f4560514610bde578063f2fde38b14610c08578063f8b45b0514610c3057610324565b8063d257b34f14610b00578063d85ba06314610b3c578063dd62ed3e14610b6657610324565b8063c04a5414116100d0578063c04a541414610a5c578063c18bc19514610a86578063c3f70b5214610aae578063c79c04fd14610ad857610324565b8063bae14e1d146109e2578063bbc0c74214610a0a578063c024666814610a3457610324565b80639fccce3211610163578063a9059cbb1161013d578063a9059cbb1461091a578063a90eab8c14610956578063aacebbe31461097e578063b62496f5146109a657610324565b80639fccce321461088a578063a0d82dc5146108b4578063a457c2d7146108de57610324565b80638f85a0431461079457806392136913146107bc578063924de9b7146107e657806395d89b411461080e5780639a7a23d6146108385780639c3b4fdc1461086057610324565b80634a62bb6511610269578063715018a61161022257806375f0a874116101fc57806375f0a874146107005780637bce5a041461072a5780638a8c523c146107545780638da5cb5b1461076a57610324565b8063715018a614610698578063751039fc146106ae5780637571336a146106d857610324565b80634a62bb651461057a5780634fbee193146105a457806366ca9b83146105e05780636a486a8e146106085780636ddd17131461063257806370a082311461065c57610324565b8063203e727e116102d657806337c2810f116102b057806337c2810f146104c257806339509351146104ec57806342ce82481461052857806349bd5a5e1461055057610324565b8063203e727e1461043457806323b872dd1461045c578063313ce5671461049857610324565b806302dbd8f81461032857806306fdde0314610350578063095ea7b31461037a5780631694505e146103b657806318160ddd146103e05780631f3fed8f1461040a57610324565b3661032457005b5f80fd5b348015610333575f80fd5b5061034e60048036038101906103499190614110565b610c5a565b005b34801561035b575f80fd5b50610364610d44565b60405161037191906141be565b60405180910390f35b348015610385575f80fd5b506103a0600480360381019061039b9190614238565b610dd4565b6040516103ad9190614290565b60405180910390f35b3480156103c1575f80fd5b506103ca610df1565b6040516103d79190614304565b60405180910390f35b3480156103eb575f80fd5b506103f4610e16565b604051610401919061432c565b60405180910390f35b348015610415575f80fd5b5061041e610e1f565b60405161042b919061432c565b60405180910390f35b34801561043f575f80fd5b5061045a60048036038101906104559190614345565b610e25565b005b348015610467575f80fd5b50610482600480360381019061047d9190614370565b610f4a565b60405161048f9190614290565b60405180910390f35b3480156104a3575f80fd5b506104ac61103c565b6040516104b991906143db565b60405180910390f35b3480156104cd575f80fd5b506104d6611044565b6040516104e39190614403565b60405180910390f35b3480156104f7575f80fd5b50610512600480360381019061050d9190614238565b611069565b60405161051f9190614290565b60405180910390f35b348015610533575f80fd5b5061054e6004803603810190610549919061455c565b611110565b005b34801561055b575f80fd5b50610564611488565b6040516105719190614403565b60405180910390f35b348015610585575f80fd5b5061058e6114ad565b60405161059b9190614290565b60405180910390f35b3480156105af575f80fd5b506105ca60048036038101906105c591906145e8565b6114bf565b6040516105d79190614290565b60405180910390f35b3480156105eb575f80fd5b5061060660048036038101906106019190614110565b611511565b005b348015610613575f80fd5b5061061c6115fb565b604051610629919061432c565b60405180910390f35b34801561063d575f80fd5b50610646611601565b6040516106539190614290565b60405180910390f35b348015610667575f80fd5b50610682600480360381019061067d91906145e8565b611614565b60405161068f919061432c565b60405180910390f35b3480156106a3575f80fd5b506106ac611659565b005b3480156106b9575f80fd5b506106c26116e0565b6040516106cf9190614290565b60405180910390f35b3480156106e3575f80fd5b506106fe60048036038101906106f99190614613565b61177d565b005b34801561070b575f80fd5b50610714611851565b6040516107219190614403565b60405180910390f35b348015610735575f80fd5b5061073e611876565b60405161074b919061432c565b60405180910390f35b34801561075f575f80fd5b5061076861187c565b005b348015610775575f80fd5b5061077e611930565b60405161078b9190614403565b60405180910390f35b34801561079f575f80fd5b506107ba60048036038101906107b591906146b2565b611958565b005b3480156107c7575f80fd5b506107d0611a6f565b6040516107dd919061432c565b60405180910390f35b3480156107f1575f80fd5b5061080c6004803603810190610807919061470f565b611a75565b005b348015610819575f80fd5b50610822611b0e565b60405161082f91906141be565b60405180910390f35b348015610843575f80fd5b5061085e60048036038101906108599190614613565b611b9e565b005b34801561086b575f80fd5b50610874611cb7565b604051610881919061432c565b60405180910390f35b348015610895575f80fd5b5061089e611cbd565b6040516108ab919061432c565b60405180910390f35b3480156108bf575f80fd5b506108c8611cc3565b6040516108d5919061432c565b60405180910390f35b3480156108e9575f80fd5b5061090460048036038101906108ff9190614238565b611cc9565b6040516109119190614290565b60405180910390f35b348015610925575f80fd5b50610940600480360381019061093b9190614238565b611daf565b60405161094d9190614290565b60405180910390f35b348015610961575f80fd5b5061097c60048036038101906109779190614797565b611dcc565b005b348015610989575f80fd5b506109a4600480360381019061099f91906145e8565b61204f565b005b3480156109b1575f80fd5b506109cc60048036038101906109c791906145e8565b612189565b6040516109d99190614290565b60405180910390f35b3480156109ed575f80fd5b50610a086004803603810190610a0391906145e8565b6121a6565b005b348015610a15575f80fd5b50610a1e6122d3565b604051610a2b9190614290565b60405180910390f35b348015610a3f575f80fd5b50610a5a6004803603810190610a559190614613565b6122e6565b005b348015610a67575f80fd5b50610a70612408565b604051610a7d9190614403565b60405180910390f35b348015610a91575f80fd5b50610aac6004803603810190610aa79190614345565b61242d565b005b348015610ab9575f80fd5b50610ac2612552565b604051610acf919061432c565b60405180910390f35b348015610ae3575f80fd5b50610afe6004803603810190610af991906145e8565b612558565b005b348015610b0b575f80fd5b50610b266004803603810190610b219190614345565b612692565b604051610b339190614290565b60405180910390f35b348015610b47575f80fd5b50610b506127e6565b604051610b5d919061432c565b60405180910390f35b348015610b71575f80fd5b50610b8c6004803603810190610b8791906147e7565b6127ec565b604051610b99919061432c565b60405180910390f35b348015610bad575f80fd5b50610bc86004803603810190610bc391906145e8565b61286e565b604051610bd59190614290565b60405180910390f35b348015610be9575f80fd5b50610bf261288b565b604051610bff919061432c565b60405180910390f35b348015610c13575f80fd5b50610c2e6004803603810190610c2991906145e8565b612891565b005b348015610c3b575f80fd5b50610c44612987565b604051610c51919061432c565b60405180910390f35b610c6261298d565b73ffffffffffffffffffffffffffffffffffffffff16610c80611930565b73ffffffffffffffffffffffffffffffffffffffff1614610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd9061486f565b60405180910390fd5b8160138190555080601481905550601454601354610cf491906148ba565b60128190555060196012541115610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3790614937565b60405180910390fd5b5050565b606060038054610d5390614982565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f90614982565b8015610dca5780601f10610da157610100808354040283529160200191610dca565b820191905f5260205f20905b815481529060010190602001808311610dad57829003601f168201915b5050505050905090565b5f610de7610de061298d565b8484612994565b6001905092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b60155481565b610e2d61298d565b73ffffffffffffffffffffffffffffffffffffffff16610e4b611930565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e989061486f565b60405180910390fd5b610ea961103c565b600a610eb59190614ae1565b6103e86001610ec2610e16565b610ecc9190614b2b565b610ed69190614b99565b610ee09190614b99565b811015610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990614c39565b60405180910390fd5b610f2a61103c565b600a610f369190614ae1565b81610f419190614b2b565b600b8190555050565b5f610f56848484612b57565b5f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610f9d61298d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508281101561101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390614cc7565b60405180910390fd5b6110308561102861298d565b858403612994565b60019150509392505050565b5f6012905090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f61110661107561298d565b848460015f61108261298d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461110191906148ba565b612994565b6001905092915050565b61111861298d565b73ffffffffffffffffffffffffffffffffffffffff16611136611930565b73ffffffffffffffffffffffffffffffffffffffff161461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061486f565b60405180910390fd5b855f0151156111da57856020015160095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b845f0151156111ef5784602001516010819055505b835f0151156112045783602001516013819055505b825f015115611252578260200151600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b815f0151156112675781602001516011819055505b805f01511561127c5780602001516014819055505b60115460105461128c91906148ba565b600f819055506014546013546112a291906148ba565b6012819055506019600f5411156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590614937565b60405180910390fd5b60196012541115611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132b90614937565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113da575f60105414801561139a57505f601354145b6113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090614d55565b60405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff16600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611480575f60115414801561144057505f601454145b61147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690614de3565b60405180910390fd5b5b505050505050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5f9054906101000a900460ff1681565b5f60185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b61151961298d565b73ffffffffffffffffffffffffffffffffffffffff16611537611930565b73ffffffffffffffffffffffffffffffffffffffff161461158d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115849061486f565b60405180910390fd5b81601081905550806011819055506011546010546115ab91906148ba565b600f819055506019600f5411156115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90614937565b60405180910390fd5b5050565b60125481565b600e60029054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61166161298d565b73ffffffffffffffffffffffffffffffffffffffff1661167f611930565b73ffffffffffffffffffffffffffffffffffffffff16146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc9061486f565b60405180910390fd5b6116de5f61389d565b565b5f6116e961298d565b73ffffffffffffffffffffffffffffffffffffffff16611707611930565b73ffffffffffffffffffffffffffffffffffffffff161461175d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117549061486f565b60405180910390fd5b5f600e5f6101000a81548160ff0219169083151502179055506001905090565b61178561298d565b73ffffffffffffffffffffffffffffffffffffffff166117a3611930565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f09061486f565b60405180910390fd5b8060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b61188461298d565b73ffffffffffffffffffffffffffffffffffffffff166118a2611930565b73ffffffffffffffffffffffffffffffffffffffff16146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef9061486f565b60405180910390fd5b6001600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61196061298d565b73ffffffffffffffffffffffffffffffffffffffff1661197e611930565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb9061486f565b60405180910390fd5b5f5b83839050811015611a69578160175f8686858181106119f8576119f7614e01565b5b9050602002016020810190611a0d91906145e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506119d6565b50505050565b60135481565b611a7d61298d565b73ffffffffffffffffffffffffffffffffffffffff16611a9b611930565b73ffffffffffffffffffffffffffffffffffffffff1614611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae89061486f565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b606060048054611b1d90614982565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990614982565b8015611b945780601f10611b6b57610100808354040283529160200191611b94565b820191905f5260205f20905b815481529060010190602001808311611b7757829003601f168201915b5050505050905090565b611ba661298d565b73ffffffffffffffffffffffffffffffffffffffff16611bc4611930565b73ffffffffffffffffffffffffffffffffffffffff1614611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c119061486f565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090614e9e565b60405180910390fd5b611cb38282613960565b5050565b60115481565b60165481565b60145481565b5f8060015f611cd661298d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8790614f2c565b60405180910390fd5b611da4611d9b61298d565b85858403612994565b600191505092915050565b5f611dc2611dbb61298d565b8484612b57565b6001905092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600d81526020017f54726164696e6720546f6b656e00000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001611e7e959493929190614f59565b6040516020818303038152906040528051906020012090505f7f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae46040518060400160405280600e81526020017f456e61626c652054726164696e67000000000000000000000000000000000000815250805190602001205f604051602001611f0893929190614faa565b6040516020818303038152906040528051906020012090505f8282604051602001611f34929190615053565b6040516020818303038152906040528051906020012090505f6001828888886040515f8152602001604052604051611f6f9493929190615089565b6020604051602081039080840390855afa158015611f8f573d5f803e3d5ffd5b505050602060405103519050611fa3611930565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790615116565b60405180910390fd5b6001600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff02191690831515021790555050505050505050565b61205761298d565b73ffffffffffffffffffffffffffffffffffffffff16612075611930565b73ffffffffffffffffffffffffffffffffffffffff16146120cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c29061486f565b60405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a38060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601a602052805f5260405f205f915054906101000a900460ff1681565b6121ae61298d565b73ffffffffffffffffffffffffffffffffffffffff166121cc611930565b73ffffffffffffffffffffffffffffffffffffffff1614612222576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122199061486f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612290576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122879061517e565b60405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff1681565b6122ee61298d565b73ffffffffffffffffffffffffffffffffffffffff1661230c611930565b73ffffffffffffffffffffffffffffffffffffffff1614612362576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123599061486f565b60405180910390fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516123fc9190614290565b60405180910390a25050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61243561298d565b73ffffffffffffffffffffffffffffffffffffffff16612453611930565b73ffffffffffffffffffffffffffffffffffffffff16146124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a09061486f565b60405180910390fd5b6124b161103c565b600a6124bd9190614ae1565b6103e860056124ca610e16565b6124d49190614b2b565b6124de9190614b99565b6124e89190614b99565b81101561252a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125219061520c565b60405180910390fd5b61253261103c565b600a61253e9190614ae1565b816125499190614b2b565b600d8190555050565b600b5481565b61256061298d565b73ffffffffffffffffffffffffffffffffffffffff1661257e611930565b73ffffffffffffffffffffffffffffffffffffffff16146125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb9061486f565b60405180910390fd5b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df870396560405160405180910390a380600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f61269b61298d565b73ffffffffffffffffffffffffffffffffffffffff166126b9611930565b73ffffffffffffffffffffffffffffffffffffffff161461270f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127069061486f565b60405180910390fd5b620186a0600161271d610e16565b6127279190614b2b565b6127319190614b99565b821015612773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276a9061529a565b60405180910390fd5b6103e86005612780610e16565b61278a9190614b2b565b6127949190614b99565b8211156127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cd90615328565b60405180910390fd5b81600c8190555060019050919050565b600f5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6019602052805f5260405f205f915054906101000a900460ff1681565b600c5481565b61289961298d565b73ffffffffffffffffffffffffffffffffffffffff166128b7611930565b73ffffffffffffffffffffffffffffffffffffffff161461290d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129049061486f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361297b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612972906153b6565b60405180910390fd5b6129848161389d565b50565b600d5481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f990615444565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a67906154d2565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612b4a919061432c565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbc90615560565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2a906155ee565b60405180910390fd5b60175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb490615656565b60405180910390fd5b60175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3e906156be565b60405180910390fd5b5f8103612d5e57612d5983835f6139fe565b613898565b600e5f9054906101000a900460ff161561324257612d7a611930565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612de85750612db8611930565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e2057505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e5a575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e735750600860149054906101000a900460ff16155b1561324157600e60019054906101000a900460ff16612f675760185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612f27575060185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90615726565b60405180910390fd5b5b601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015613004575060195f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156130ab57600b5481111561304e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613045906157b4565b60405180910390fd5b600d5461305a83611614565b8261306591906148ba565b11156130a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309d9061581c565b60405180910390fd5b613240565b601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015613148575060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561319757600b54811115613192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613189906158aa565b60405180910390fd5b61323f565b60195f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661323e57600d546131f183611614565b826131fc91906148ba565b111561323d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132349061581c565b60405180910390fd5b5b5b5b5b5b5f73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015613334575060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639015d371306040518263ffffffff1660e01b81526004016132f49190614403565b602060405180830381865afa15801561330f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061333391906158dc565b5b15613449575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a20527fc858560075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d54600b54600c546040518763ffffffff1660e01b81526004016133c596959493929190615907565b6020604051808303815f875af11580156133e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061340591906158dc565b905080613447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343e906159b0565b60405180910390fd5b505b5f61345330611614565b90505f600c5482101590508080156134775750600e60029054906101000a900460ff165b80156134905750600860149054906101000a900460ff16155b80156134e25750601a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8015613535575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015613588575060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156135cb576001600860146101000a81548160ff0219169083151502179055506135b0613c73565b5f600860146101000a81548160ff0219169083151502179055505b5f600860149054906101000a900460ff1615905060185f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061367a575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15613683575f90505b5f811561388857601a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156136e157505f601254115b156137795761370e606461370060125488613e4d90919063ffffffff16565b613e6290919063ffffffff16565b9050601254601454826137219190614b2b565b61372b9190614b99565b60165f82825461373b91906148ba565b92505081905550601254601354826137539190614b2b565b61375d9190614b99565b60155f82825461376d91906148ba565b92505081905550613865565b601a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156137d057505f600f54115b15613864576137fd60646137ef600f5488613e4d90919063ffffffff16565b613e6290919063ffffffff16565b9050600f54601154826138109190614b2b565b61381a9190614b99565b60165f82825461382a91906148ba565b92505081905550600f54601054826138429190614b2b565b61384c9190614b99565b60155f82825461385c91906148ba565b925050819055505b5b5f811115613879576138788730836139fe565b5b808561388591906159ce565b94505b6138938787876139fe565b505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6390615560565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad1906155ee565b60405180910390fd5b613ae5838383613e77565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5f90615a71565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613bf691906148ba565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c5a919061432c565b60405180910390a3613c6d848484613e7c565b50505050565b5f613c7d30611614565b90505f601654601554613c9091906148ba565b90505f80831480613ca057505f82145b15613cad57505050613e4b565b6014600c54613cbc9190614b2b565b831115613cd5576014600c54613cd29190614b2b565b92505b5f479050613ce284613e81565b5f613cf682476140b790919063ffffffff16565b90505f613d2085613d1260165485613e4d90919063ffffffff16565b613e6290919063ffffffff16565b90505f6015819055505f601681905550600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613d7590615abc565b5f6040518083038185875af1925050503d805f8114613daf576040519150601f19603f3d011682016040523d82523d5f602084013e613db4565b606091505b50508094505060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051613dff90615abc565b5f6040518083038185875af1925050503d805f8114613e39576040519150601f19603f3d011682016040523d82523d5f602084013e613e3e565b606091505b5050809450505050505050505b565b5f8183613e5a9190614b2b565b905092915050565b5f8183613e6f9190614b99565b905092915050565b505050565b505050565b5f600267ffffffffffffffff811115613e9d57613e9c614420565b5b604051908082528060200260200182016040528015613ecb5781602001602082028036833780820191505090505b50905030815f81518110613ee257613ee1614e01565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613faa9190615ae4565b81600181518110613fbe57613fbd614e01565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506140243060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612994565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401614086959493929190615bff565b5f604051808303815f87803b15801561409d575f80fd5b505af11580156140af573d5f803e3d5ffd5b505050505050565b5f81836140c491906159ce565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6140ef816140dd565b81146140f9575f80fd5b50565b5f8135905061410a816140e6565b92915050565b5f8060408385031215614126576141256140d5565b5b5f614133858286016140fc565b9250506020614144858286016140fc565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6141908261414e565b61419a8185614158565b93506141aa818560208601614168565b6141b381614176565b840191505092915050565b5f6020820190508181035f8301526141d68184614186565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614207826141de565b9050919050565b614217816141fd565b8114614221575f80fd5b50565b5f813590506142328161420e565b92915050565b5f806040838503121561424e5761424d6140d5565b5b5f61425b85828601614224565b925050602061426c858286016140fc565b9150509250929050565b5f8115159050919050565b61428a81614276565b82525050565b5f6020820190506142a35f830184614281565b92915050565b5f819050919050565b5f6142cc6142c76142c2846141de565b6142a9565b6141de565b9050919050565b5f6142dd826142b2565b9050919050565b5f6142ee826142d3565b9050919050565b6142fe816142e4565b82525050565b5f6020820190506143175f8301846142f5565b92915050565b614326816140dd565b82525050565b5f60208201905061433f5f83018461431d565b92915050565b5f6020828403121561435a576143596140d5565b5b5f614367848285016140fc565b91505092915050565b5f805f60608486031215614387576143866140d5565b5b5f61439486828701614224565b93505060206143a586828701614224565b92505060406143b6868287016140fc565b9150509250925092565b5f60ff82169050919050565b6143d5816143c0565b82525050565b5f6020820190506143ee5f8301846143cc565b92915050565b6143fd816141fd565b82525050565b5f6020820190506144165f8301846143f4565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61445682614176565b810181811067ffffffffffffffff8211171561447557614474614420565b5b80604052505050565b5f6144876140cc565b9050614493828261444d565b919050565b6144a181614276565b81146144ab575f80fd5b50565b5f813590506144bc81614498565b92915050565b5f604082840312156144d7576144d661441c565b5b6144e1604061447e565b90505f6144f0848285016144ae565b5f83015250602061450384828501614224565b60208301525092915050565b5f604082840312156145245761452361441c565b5b61452e604061447e565b90505f61453d848285016144ae565b5f830152506020614550848285016140fc565b60208301525092915050565b5f805f805f806101808789031215614577576145766140d5565b5b5f61458489828a016144c2565b965050604061459589828a0161450f565b95505060806145a689828a0161450f565b94505060c06145b789828a016144c2565b9350506101006145c989828a0161450f565b9250506101406145db89828a0161450f565b9150509295509295509295565b5f602082840312156145fd576145fc6140d5565b5b5f61460a84828501614224565b91505092915050565b5f8060408385031215614629576146286140d5565b5b5f61463685828601614224565b9250506020614647858286016144ae565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261467257614671614651565b5b8235905067ffffffffffffffff81111561468f5761468e614655565b5b6020830191508360208202830111156146ab576146aa614659565b5b9250929050565b5f805f604084860312156146c9576146c86140d5565b5b5f84013567ffffffffffffffff8111156146e6576146e56140d9565b5b6146f28682870161465d565b93509350506020614705868287016144ae565b9150509250925092565b5f60208284031215614724576147236140d5565b5b5f614731848285016144ae565b91505092915050565b614743816143c0565b811461474d575f80fd5b50565b5f8135905061475e8161473a565b92915050565b5f819050919050565b61477681614764565b8114614780575f80fd5b50565b5f813590506147918161476d565b92915050565b5f805f606084860312156147ae576147ad6140d5565b5b5f6147bb86828701614750565b93505060206147cc86828701614783565b92505060406147dd86828701614783565b9150509250925092565b5f80604083850312156147fd576147fc6140d5565b5b5f61480a85828601614224565b925050602061481b85828601614224565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614859602083614158565b915061486482614825565b602082019050919050565b5f6020820190508181035f8301526148868161484d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6148c4826140dd565b91506148cf836140dd565b92508282019050808211156148e7576148e661488d565b5b92915050565b7f4d757374206b656570206665657320617420323525206f72206c6573730000005f82015250565b5f614921601d83614158565b915061492c826148ed565b602082019050919050565b5f6020820190508181035f83015261494e81614915565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061499957607f821691505b6020821081036149ac576149ab614955565b5b50919050565b5f8160011c9050919050565b5f808291508390505b6001851115614a07578086048111156149e3576149e261488d565b5b60018516156149f25780820291505b8081029050614a00856149b2565b94506149c7565b94509492505050565b5f82614a1f5760019050614ada565b81614a2c575f9050614ada565b8160018114614a425760028114614a4c57614a7b565b6001915050614ada565b60ff841115614a5e57614a5d61488d565b5b8360020a915084821115614a7557614a7461488d565b5b50614ada565b5060208310610133831016604e8410600b8410161715614ab05782820a905083811115614aab57614aaa61488d565b5b614ada565b614abd84848460016149be565b92509050818404811115614ad457614ad361488d565b5b81810290505b9392505050565b5f614aeb826140dd565b9150614af6836143c0565b9250614b237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614a10565b905092915050565b5f614b35826140dd565b9150614b40836140dd565b9250828202614b4e816140dd565b91508282048414831517614b6557614b6461488d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614ba3826140dd565b9150614bae836140dd565b925082614bbe57614bbd614b6c565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f776572205f8201527f7468616e20302e31250000000000000000000000000000000000000000000000602082015250565b5f614c23602983614158565b9150614c2e82614bc9565b604082019050919050565b5f6020820190508181035f830152614c5081614c17565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f614cb1602883614158565b9150614cbc82614c57565b604082019050919050565b5f6020820190508181035f830152614cde81614ca5565b9050919050565b7f6275794d61726b6574696e674665652c2073656c6c4d61726b6574696e6746655f8201527f65206d757374206265207a65726f000000000000000000000000000000000000602082015250565b5f614d3f602e83614158565b9150614d4a82614ce5565b604082019050919050565b5f6020820190508181035f830152614d6c81614d33565b9050919050565b7f6275794465764665652c2073656c6c446576466565206d757374206265207a655f8201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b5f614dcd602283614158565b9150614dd882614d73565b604082019050919050565b5f6020820190508181035f830152614dfa81614dc1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f614e88603983614158565b9150614e9382614e2e565b604082019050919050565b5f6020820190508181035f830152614eb581614e7c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614f16602583614158565b9150614f2182614ebc565b604082019050919050565b5f6020820190508181035f830152614f4381614f0a565b9050919050565b614f5381614764565b82525050565b5f60a082019050614f6c5f830188614f4a565b614f796020830187614f4a565b614f866040830186614f4a565b614f93606083018561431d565b614fa060808301846143f4565b9695505050505050565b5f606082019050614fbd5f830186614f4a565b614fca6020830185614f4a565b614fd7604083018461431d565b949350505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61501d600283614fdf565b915061502882614fe9565b600282019050919050565b5f819050919050565b61504d61504882614764565b615033565b82525050565b5f61505d82615011565b9150615069828561503c565b602082019150615079828461503c565b6020820191508190509392505050565b5f60808201905061509c5f830187614f4a565b6150a960208301866143cc565b6150b66040830185614f4a565b6150c36060830184614f4a565b95945050505050565b7f496e76616c6964207369676e61747572650000000000000000000000000000005f82015250565b5f615100601183614158565b915061510b826150cc565b602082019050919050565b5f6020820190508181035f83015261512d816150f4565b9050919050565b7f496e76616c696420616e746920647261696e65720000000000000000000000005f82015250565b5f615168601483614158565b915061517382615134565b602082019050919050565b5f6020820190508181035f8301526151958161515c565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b5f6151f6602483614158565b91506152018261519c565b604082019050919050565b5f6020820190508181035f830152615223816151ea565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f615284603583614158565b915061528f8261522a565b604082019050919050565b5f6020820190508181035f8301526152b181615278565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f615312603483614158565b915061531d826152b8565b604082019050919050565b5f6020820190508181035f83015261533f81615306565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6153a0602683614158565b91506153ab82615346565b604082019050919050565b5f6020820190508181035f8301526153cd81615394565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61542e602483614158565b9150615439826153d4565b604082019050919050565b5f6020820190508181035f83015261545b81615422565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6154bc602283614158565b91506154c782615462565b604082019050919050565b5f6020820190508181035f8301526154e9816154b0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61554a602583614158565b9150615555826154f0565b604082019050919050565b5f6020820190508181035f8301526155778161553e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6155d8602383614158565b91506155e38261557e565b604082019050919050565b5f6020820190508181035f830152615605816155cc565b9050919050565b7f5b66726f6d5d20626c61636b206c6973740000000000000000000000000000005f82015250565b5f615640601183614158565b915061564b8261560c565b602082019050919050565b5f6020820190508181035f83015261566d81615634565b9050919050565b7f5b746f5d20626c61636b206c69737400000000000000000000000000000000005f82015250565b5f6156a8600f83614158565b91506156b382615674565b602082019050919050565b5f6020820190508181035f8301526156d58161569c565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f615710601683614158565b915061571b826156dc565b602082019050919050565b5f6020820190508181035f83015261573d81615704565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e2e0000000000000000000000000000000000602082015250565b5f61579e602f83614158565b91506157a982615744565b604082019050919050565b5f6020820190508181035f8301526157cb81615792565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f615806601383614158565b9150615811826157d2565b602082019050919050565b5f6020820190508181035f830152615833816157fa565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e2e00000000000000000000000000000000602082015250565b5f615894603083614158565b915061589f8261583a565b604082019050919050565b5f6020820190508181035f8301526158c181615888565b9050919050565b5f815190506158d681614498565b92915050565b5f602082840312156158f1576158f06140d5565b5b5f6158fe848285016158c8565b91505092915050565b5f60c08201905061591a5f8301896143f4565b61592760208301886143f4565b61593460408301876143f4565b615941606083018661431d565b61594e608083018561431d565b61595b60a083018461431d565b979650505050505050565b7f416e746920447261696e657220456e61626c65640000000000000000000000005f82015250565b5f61599a601483614158565b91506159a582615966565b602082019050919050565b5f6020820190508181035f8301526159c78161598e565b9050919050565b5f6159d8826140dd565b91506159e3836140dd565b92508282039050818111156159fb576159fa61488d565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f615a5b602683614158565b9150615a6682615a01565b604082019050919050565b5f6020820190508181035f830152615a8881615a4f565b9050919050565b5f81905092915050565b50565b5f615aa75f83615a8f565b9150615ab282615a99565b5f82019050919050565b5f615ac682615a9c565b9150819050919050565b5f81519050615ade8161420e565b92915050565b5f60208284031215615af957615af86140d5565b5b5f615b0684828501615ad0565b91505092915050565b5f819050919050565b5f615b32615b2d615b2884615b0f565b6142a9565b6140dd565b9050919050565b615b4281615b18565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b615b7a816141fd565b82525050565b5f615b8b8383615b71565b60208301905092915050565b5f602082019050919050565b5f615bad82615b48565b615bb78185615b52565b9350615bc283615b62565b805f5b83811015615bf2578151615bd98882615b80565b9750615be483615b97565b925050600181019050615bc5565b5085935050505092915050565b5f60a082019050615c125f83018861431d565b615c1f6020830187615b39565b8181036040830152615c318186615ba3565b9050615c4060608301856143f4565b615c4d608083018461431d565b969550505050505056fea2646970667358221220c36c11ba690196f63e5426c6c7d67826c462518ac3f2ac2d59f9e5445947ed2864736f6c63430008190033

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.