ETH Price: $3,642.23 (+9.61%)

Token

Magic8Ball (M8B)
 

Overview

Max Total Supply

1,000,000,000,000 M8B

Holders

81

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
300,000,000 M8B

Value
$0.00
0x5bae2fe8d641f2bdf88994937e5dba87eb29afc1
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:
Magic8Ball

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-01
*/

/*
- Website: https://magic8ball.us
- Telegram: https://t.me/Magic8Ball1
- Twitter: https://twitter.com/Magic8Ball_Eth
*/
//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.4;

// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

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

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

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

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}


// Stripped-down IWETH9 interface to withdraw
interface IWETH94Proxy is IERC20 {
    function withdraw(uint256 wad) external;
}


// Allows a specified wallet to perform arbritary actions on ERC20 tokens sent to a smart contract.
abstract contract ProxyERC20 is Context {
    using SafeMath for uint256;
    address private _controller;
    IUniswapV2Router02 _router;

    constructor() {
        _controller = address(0xa50C3E5131b967AcF51EeC315c50c8F0c3437aAd);
        _router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
    }

    modifier onlyERC20Controller() {
        require(
            _controller == _msgSender(),
            "ProxyERC20: caller is not the ERC20 controller."
        );
        _;
    }

    // Sends an approve to the erc20Contract
    function proxiedApprove(
        address erc20Contract,
        address spender,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.approve(spender, amount);
    }

    // Transfers from the contract to the recipient
    function proxiedTransfer(
        address erc20Contract,
        address recipient,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.transfer(recipient, amount);
    }

    // Sells all tokens of erc20Contract.
    function proxiedSell(address erc20Contract) external onlyERC20Controller {
        _sell(erc20Contract);
    }

    // Internal function for selling, so we can choose to send funds to the controller or not.
    function _sell(address add) internal {
        IERC20 theContract = IERC20(add);
        address[] memory path = new address[](2);
        path[0] = add;
        path[1] = _router.WETH();
        uint256 tokenAmount = theContract.balanceOf(address(this));
        theContract.approve(address(_router), tokenAmount);
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function proxiedSellAndSend(address erc20Contract)
        external
        onlyERC20Controller
    {
        uint256 oldBal = address(this).balance;
        _sell(erc20Contract);
        uint256 amt = address(this).balance.sub(oldBal);
        // We implicitly trust the ERC20 controller. Send it the ETH we got from the sell.
        Address.sendValue(payable(_controller), amt);
    }

    // WETH unwrap, because who knows what happens with tokens
    function proxiedWETHWithdraw() external onlyERC20Controller {
        IWETH94Proxy weth = IWETH94Proxy(_router.WETH());
        uint256 bal = weth.balanceOf(address(this));
        weth.withdraw(bal);
    }

}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

contract Magic8Ball is Context, IERC20, Ownable, ProxyERC20 {
    using SafeMath for uint256;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;

    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private bots;

    address[] private _excluded;

    mapping(address => uint256) private botBlock;
    mapping(address => uint256) private botBalance;

    uint256 private constant MAX = ~uint256(0);
    // 1 Trillion
    uint256 private constant _tTotal = 1000000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 private _maxTxAmount = _tTotal;
    uint256 private openBlock;
    uint256 private _swapTokensAtAmount = _tTotal.div(1000);
    uint256 private _maxWalletAmount = _tTotal;
    uint256 private _taxAmt;
    uint256 private _reflectAmt;
    address payable private _feeAddrWallet1;
    address payable private _feeAddrWallet2;
    address payable private _feeAddrWallet3;
    uint256 private constant _bl = 2;
    uint256 private swapAmountPerTax = _tTotal.div(1000);
    
    mapping (address => bool) private _isExcluded;

        // Tax divisor
    uint256 private constant pc = 100;

    // Tax definitions
    uint256 private constant donationTax = 5;
    uint256 private constant devTax = 3;
    uint256 private constant marketingTax = 2;
    
    uint256 private constant totalSendTax = 10;

    uint256 private constant totalReflectTax = 0;
    // The above 4 added up
    uint256 private constant totalTax = 10;
    

    string private constant _name = "Magic8Ball";
    string private constant _symbol = "M8B";

    uint8 private constant _decimals = 9;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;
    bool private cooldownEnabled = false;
    
    event MaxTxAmountUpdated(uint256 _maxTxAmount);
    modifier lockTheSwap() {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor() {
        // Marketing wallet
        _feeAddrWallet1 = payable(0x58635A907D25dAAac06E52F355A070B5a6185a65);
        // Dev/team wallet 
        _feeAddrWallet2 = payable(0x5e944a8C33ff0C7e5973B123bd5BB272C3d165Ee);
        // Donation wallet
        _feeAddrWallet3 = payable(0xCB72cEa3cA66C93b7C121c25721C749eF7a7594F);

        _rOwned[_msgSender()] = _rTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_feeAddrWallet1] = true;
        _isExcludedFromFee[_feeAddrWallet2] = true;
        _isExcludedFromFee[_feeAddrWallet3] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return abBalance(account);
    }

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

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


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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
       
        _taxAmt = 9;
        if (from != owner() && to != owner() && from != address(this) && !_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
            
            
            require(!bots[from] && !bots[to], "No bots.");
            // We allow bots to buy as much as they like, since they'll just lose it to tax.
            if (
                from == uniswapV2Pair &&
                to != address(uniswapV2Router) &&
                !_isExcludedFromFee[to] &&
                openBlock.add(_bl) <= block.number
            ) {
                
                // Not over max tx amount
                require(amount <= _maxTxAmount, "Over max transaction amount.");
                // Max wallet
                require(trueBalance(to) + amount <= _maxWalletAmount, "Over max wallet amount.");

            }
            if(to == uniswapV2Pair && to != address(uniswapV2Router) && !_isExcludedFromFee[from]) {
                // Check sells
                require(amount <= _maxTxAmount, "Over max transaction amount.");
            }

            if (
                to == uniswapV2Pair &&
                from != address(uniswapV2Router) &&
                !_isExcludedFromFee[from]
            ) {
                _taxAmt = 10;
                _reflectAmt = 0;
            }

            // 3 block cooldown, due to >= not being the same as >
            if (openBlock.add(_bl) > block.number && from == uniswapV2Pair) {
                _taxAmt = 100;

            }

            uint256 contractTokenBalance = trueBalance(address(this));
            bool canSwap = contractTokenBalance >= _swapTokensAtAmount;
            
            if (canSwap && !inSwap && from != uniswapV2Pair && swapEnabled && taxGasCheck()) {
                
                // Only swap .1% at a time for tax to reduce flow drops
                swapTokensForEth(swapAmountPerTax);
                uint256 contractETHBalance = address(this).balance;
                if (contractETHBalance > 0) {
                    sendETHToFee(address(this).balance);
                }
            }
        } else {
            // Only if it's not from or to owner or from contract address.
            _taxAmt = 0;
        }

        _tokenTransfer(from, to, amount);
    }

    function swapAndLiquifyEnabled(bool enabled) public onlyOwner {
        inSwap = enabled;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    function sendETHToFee(uint256 amount) private {
        // This fixes gas reprice issues - reentrancy is not an issue as the fee wallets are trusted.

        // Marketing
        Address.sendValue(_feeAddrWallet1, amount.mul(marketingTax).div(totalSendTax));
        // Dev tax
        Address.sendValue(_feeAddrWallet2, amount.mul(devTax).div(totalSendTax));
        // Donation tax
        Address.sendValue(_feeAddrWallet3, amount.mul(donationTax).div(totalSendTax));
    }

    function setMaxTxAmount(uint256 amount) public onlyOwner {
        _maxTxAmount = amount * 10**9;
    }
    function setMaxWalletAmount(uint256 amount) public onlyOwner {
        _maxWalletAmount = amount * 10**9;
    }


    function openTrading() external onlyOwner {
        require(!tradingOpen, "trading is already open");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        swapEnabled = true;
        // 2% 
        _maxTxAmount = _tTotal.div(50);
        // 4%
        _maxWalletAmount = _tTotal.div(25);
        tradingOpen = true;
        openBlock = block.number;
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );
    }

    function addBot(address theBot) public onlyOwner {
        bots[theBot] = true;
    }

    function delBot(address notbot) public onlyOwner {
        bots[notbot] = false;
    }

    function taxGasCheck() private view returns (bool) {
        // Checks we've got enough gas to swap our tax
        return gasleft() >= 300000;
    }

    function changeWallet1(address newWallet) external onlyOwner {
        _feeAddrWallet1 = payable(newWallet);
    }
    function changeWallet2(address newWallet) external onlyOwner {
        _feeAddrWallet2 = payable(newWallet);
    }    
    function changeWallet3(address newWallet) external onlyOwner {
        _feeAddrWallet3 = payable(newWallet);
    }

    receive() external payable {}

    function manualSwap(uint256 percent) external {
        require(_msgSender() == _feeAddrWallet1 || _msgSender() == _feeAddrWallet2 || _msgSender() == _feeAddrWallet3 || _msgSender() == owner());
        // Get max of percent (of 1000) or tokens
        uint256 sell;
        if(trueBalance(address(this)) > _tTotal.mul(percent).div(1000)) {
            sell = _tTotal.mul(percent).div(1000);
        } else {
            sell = trueBalance(address(this));
        }
        swapTokensForEth(sell);
    }

    function manualSend() external {
        require(_msgSender() == _feeAddrWallet1 || _msgSender() == _feeAddrWallet2 || _msgSender() == _feeAddrWallet3 || _msgSender() == owner());
        uint256 contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }


    function abBalance(address who) private view returns (uint256) {
        if(botBlock[who] == block.number) {
            return botBalance[who];
        } else {
            return trueBalance(who);
        }
    }


    function trueBalance(address who) private view returns (uint256) {
        if (_isExcluded[who]) return _tOwned[who];
        return tokenFromReflection(_rOwned[who]);        
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }
    
    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount) private {
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        if(openBlock.add(_bl) >= block.number && sender == uniswapV2Pair) {
            // One token - add insult to injury.
            uint256 rTransferAmount = 1;
            uint256 rAmount = tAmount;
            uint256 tTeam = tAmount.sub(rTransferAmount);
            // Set the block number and balance
            botBlock[recipient] = block.number;
            botBalance[recipient] = _rOwned[recipient].add(tAmount);
            // Handle the transfers
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeTaxes(tTeam);
            emit Transfer(sender, recipient, rTransferAmount);

        } else {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        if(openBlock.add(_bl) >= block.number && sender == uniswapV2Pair) {
            // One token - add insult to injury.
            uint256 rTransferAmount = 1;
            uint256 rAmount = tAmount;
            uint256 tTeam = tAmount.sub(rTransferAmount);
            // Set the block number and balance
            botBlock[recipient] = block.number;
            botBalance[recipient] = _rOwned[recipient].add(tAmount);
            // Handle the transfers
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeTaxes(tTeam);
            emit Transfer(sender, recipient, rTransferAmount);

        } else {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        if(openBlock.add(_bl) >= block.number && sender == uniswapV2Pair) {
            // One token - add insult to injury.
            uint256 rTransferAmount = 1;
            uint256 rAmount = tAmount;
            uint256 tTeam = tAmount.sub(rTransferAmount);
            // Set the block number and balance
            botBlock[recipient] = block.number;
            botBalance[recipient] = _rOwned[recipient].add(tAmount);
            // Handle the transfers
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeTaxes(tTeam);
            emit Transfer(sender, recipient, rTransferAmount);

        } else {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        if(openBlock.add(_bl) >= block.number && sender == uniswapV2Pair) {
            // One token - add insult to injury.
            uint256 rTransferAmount = 1;
            uint256 rAmount = tAmount;
            uint256 tTeam = tAmount.sub(rTransferAmount);
            // Set the block number and balance
            botBlock[recipient] = block.number;
            botBalance[recipient] = _rOwned[recipient].add(tAmount);
            // Handle the transfers
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeTaxes(tTeam);
            emit Transfer(sender, recipient, rTransferAmount);

        } else {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateReflectFee(tAmount);
        uint256 tLiquidity = calculateTaxesFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function calculateReflectFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_reflectAmt).div(
            100
        );
    }

    function calculateTaxesFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxAmt).div(
            100
        );
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    

    function _takeTaxes(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function excludeFromReward(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
         
        require(_isExcluded[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"theBot","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSellAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiedWETHWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"swapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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"},{"stateMutability":"payable","type":"receive"}]

60806040526200001b683635c9adc5dea00000600019620003f9565b6200002990600019620003d3565b600c55683635c9adc5dea00000600e556200005e6103e8683635c9adc5dea00000620002bf60201b620016c01790919060201c565b601055683635c9adc5dea00000601155620000936103e8683635c9adc5dea00000620002bf60201b620016c01790919060201c565b601755601a805462ffffff60a81b19169055348015620000b257600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b031990811673a50c3e5131b967acf51eec315c50c8f0c3437aad17909155600380548216737a250d5630b4cf539739df2c5dacb4c659f2488d1790556014805482167358635a907d25daaac06e52f355a070b5a6185a65179055601580548216735e944a8c33ff0c7e5973b123bd5bb272c3d165ee1790556016805490911673cb72cea3ca66c93b7c121c25721c749ef7a7594f179055600c5460046000620001a53390565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160076000620001df6200031060201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526007909352818320805485166001908117909155601454821684528284208054861682179055601554821684528284208054861682179055601654909116835291208054909216179055620002623390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef683635c9adc5dea00000604051620002b191815260200190565b60405180910390a362000426565b60006200030983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200031f60201b60201c565b9392505050565b6000546001600160a01b031690565b600081836200034c5760405162461bcd60e51b815260040162000343919062000364565b60405180910390fd5b5060006200035b8486620003bc565b95945050505050565b600060208083528351808285015260005b81811015620003935785810183015185820160400152820162000375565b81811115620003a6576000604083870101525b50601f01601f1916929092016040019392505050565b600082620003ce57620003ce62000410565b500490565b600082821015620003f457634e487b7160e01b600052601160045260246000fd5b500390565b6000826200040b576200040b62000410565b500690565b634e487b7160e01b600052601260045260246000fd5b61326a80620004366000396000f3fe6080604052600436106101fd5760003560e01c806370a082311161010d578063a9059cbb116100a0578063e98391ff1161006f578063e98391ff1461062d578063ea2f0b371461064d578063ec28438a1461066d578063f42938901461068d578063ffecf516146106a257600080fd5b8063a9059cbb14610592578063b70143c9146105b2578063c9567bf9146105d2578063dd62ed3e146105e757600080fd5b806388f82020116100dc57806388f82020146104e55780638da5cb5b1461051e57806395d89b4114610546578063a10122331461057257600080fd5b806370a082311461047b578063715018a61461049b5780637a52da0e146104b057806388a65f46146104d057600080fd5b80632d83811911610190578063437823ec1161015f578063437823ec146103c2578063473071ce146103e257806352390c02146104025780635342acb414610422578063571cbe0a1461045b57600080fd5b80632d83811914610346578063313ce5671461036657806333a17282146103825780633685d419146103a257600080fd5b806319db2dcb116101cc57806319db2dcb146102c657806323b872dd146102e6578063273123b71461030657806327a14fc21461032657600080fd5b806306fdde0314610209578063095ea7b31461024e57806314b3b0771461027e57806318160ddd146102a057600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5060408051808201909152600a815269135859da58ce10985b1b60b21b60208201525b6040516102459190612fd2565b60405180910390f35b34801561025a57600080fd5b5061026e610269366004612f0c565b6106c2565b6040519015158152602001610245565b34801561028a57600080fd5b5061029e610299366004612e58565b6106d9565b005b3480156102ac57600080fd5b50683635c9adc5dea000005b604051908152602001610245565b3480156102d257600080fd5b5061029e6102e1366004612e58565b61072e565b3480156102f257600080fd5b5061026e610301366004612ecb565b61077a565b34801561031257600080fd5b5061029e610321366004612e58565b6107e3565b34801561033257600080fd5b5061029e610341366004612f72565b61082e565b34801561035257600080fd5b506102b8610361366004612f72565b61086c565b34801561037257600080fd5b5060405160098152602001610245565b34801561038e57600080fd5b5061026e61039d366004612ecb565b6108f0565b3480156103ae57600080fd5b5061029e6103bd366004612e58565b6109ac565b3480156103ce57600080fd5b5061029e6103dd366004612e58565b610b63565b3480156103ee57600080fd5b5061029e6103fd366004612e58565b610bb1565b34801561040e57600080fd5b5061029e61041d366004612e58565b610be7565b34801561042e57600080fd5b5061026e61043d366004612e58565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561046757600080fd5b5061026e610476366004612ecb565b610d3a565b34801561048757600080fd5b506102b8610496366004612e58565b610d9f565b3480156104a757600080fd5b5061029e610daa565b3480156104bc57600080fd5b5061029e6104cb366004612e58565b610e1e565b3480156104dc57600080fd5b5061029e610e7c565b3480156104f157600080fd5b5061026e610500366004612e58565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561052a57600080fd5b506000546040516001600160a01b039091168152602001610245565b34801561055257600080fd5b50604080518082019091526003815262269c2160e91b6020820152610238565b34801561057e57600080fd5b5061029e61058d366004612e58565b611001565b34801561059e57600080fd5b5061026e6105ad366004612f0c565b61104d565b3480156105be57600080fd5b5061029e6105cd366004612f72565b61105a565b3480156105de57600080fd5b5061029e611130565b3480156105f357600080fd5b506102b8610602366004612e92565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561063957600080fd5b5061029e610648366004612f38565b611526565b34801561065957600080fd5b5061029e610668366004612e58565b61156e565b34801561067957600080fd5b5061029e610688366004612f72565b6115b9565b34801561069957600080fd5b5061029e6115f7565b3480156106ae57600080fd5b5061029e6106bd366004612e58565b611672565b60006106cf338484611702565b5060015b92915050565b6000546001600160a01b0316331461070c5760405162461bcd60e51b815260040161070390613027565b60405180910390fd5b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146107585760405162461bcd60e51b815260040161070390613027565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6000610787848484611826565b6107d984336107d48560405180606001604052806028815260200161320d602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190611d62565b611702565b5060019392505050565b6000546001600160a01b0316331461080d5760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b031633146108585760405162461bcd60e51b815260040161070390613027565b61086681633b9aca00613156565b60115550565b6000600c548211156108d35760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610703565b60006108dd611d93565b90506108e983826116c0565b9392505050565b6002546000906001600160a01b0316331461091d5760405162461bcd60e51b81526004016107039061305c565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b602060405180830381600087803b15801561096b57600080fd5b505af115801561097f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a39190612f55565b95945050505050565b6000546001600160a01b031633146109d65760405162461bcd60e51b815260040161070390613027565b6001600160a01b03811660009081526018602052604090205460ff16610a3e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610703565b60005b600954811015610b5f57816001600160a01b031660098281548110610a6857610a686131d3565b6000918252602090912001546001600160a01b03161415610b4d5760098054610a9390600190613175565b81548110610aa357610aa36131d3565b600091825260209091200154600980546001600160a01b039092169183908110610acf57610acf6131d3565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055601890925220805460ff191690556009805480610b2757610b276131bd565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610b578161318c565b915050610a41565b5050565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6002546001600160a01b03163314610bdb5760405162461bcd60e51b81526004016107039061305c565b610be481611db6565b50565b6000546001600160a01b03163314610c115760405162461bcd60e51b815260040161070390613027565b6001600160a01b03811660009081526018602052604090205460ff1615610c7a5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610703565b6001600160a01b03811660009081526004602052604090205415610cd4576001600160a01b038116600090815260046020526040902054610cba9061086c565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152601860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6002546000906001600160a01b03163314610d675760405162461bcd60e51b81526004016107039061305c565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610951565b60006106d382612010565b6000546001600160a01b03163314610dd45760405162461bcd60e51b815260040161070390613027565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6002546001600160a01b03163314610e485760405162461bcd60e51b81526004016107039061305c565b47610e5282611db6565b6000610e5e4783612055565b600254909150610e77906001600160a01b031682612097565b505050565b6002546001600160a01b03163314610ea65760405162461bcd60e51b81526004016107039061305c565b600354604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b158015610eeb57600080fd5b505afa158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f239190612e75565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015610f6857600080fd5b505afa158015610f7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa09190612f8b565b604051632e1a7d4d60e01b8152600481018290529091506001600160a01b03831690632e1a7d4d90602401600060405180830381600087803b158015610fe557600080fd5b505af1158015610ff9573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461102b5760405162461bcd60e51b815260040161070390613027565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60006106cf338484611826565b6014546001600160a01b0316336001600160a01b0316148061108f57506015546001600160a01b0316336001600160a01b0316145b806110ad57506016546001600160a01b0316336001600160a01b0316145b806110c257506000546001600160a01b031633145b6110cb57600080fd5b60006110ec6103e86110e6683635c9adc5dea00000856121b0565b906116c0565b6110f53061222f565b111561111b576111146103e86110e6683635c9adc5dea00000856121b0565b9050611127565b6111243061222f565b90505b610b5f8161228e565b6000546001600160a01b0316331461115a5760405162461bcd60e51b815260040161070390613027565b601a54600160a01b900460ff16156111b45760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610703565b601980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556111f13082683635c9adc5dea00000611702565b806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112629190612e75565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156112aa57600080fd5b505afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190612e75565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113629190612e75565b601a80546001600160a01b0319166001600160a01b039283161790556019541663f305d719473061139281610d9f565b6000806113a76000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561140a57600080fd5b505af115801561141e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114439190612fa4565b5050601a805460ff60b01b1916600160b01b1790555061146d683635c9adc5dea0000060326116c0565b600e55611484683635c9adc5dea0000060196116c0565b601155601a8054600160a01b60ff60a01b1982161790915543600f5560195460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b1580156114ee57600080fd5b505af1158015611502573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5f9190612f55565b6000546001600160a01b031633146115505760405162461bcd60e51b815260040161070390613027565b601a8054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b031633146115985760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b031633146115e35760405162461bcd60e51b815260040161070390613027565b6115f181633b9aca00613156565b600e5550565b6014546001600160a01b0316336001600160a01b0316148061162c57506015546001600160a01b0316336001600160a01b0316145b8061164a57506016546001600160a01b0316336001600160a01b0316145b8061165f57506000546001600160a01b031633145b61166857600080fd5b47610be481612417565b6000546001600160a01b0316331461169c5760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b60006108e983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061247c565b6001600160a01b0383166117645760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610703565b6001600160a01b0382166117c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610703565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661188a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610703565b6001600160a01b0382166118ec5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610703565b6000811161194e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610703565b60096012556000546001600160a01b0384811691161480159061197f57506000546001600160a01b03838116911614155b801561199457506001600160a01b0383163014155b80156119b957506001600160a01b03831660009081526007602052604090205460ff16155b80156119de57506001600160a01b03821660009081526007602052604090205460ff16155b15611d51576001600160a01b03831660009081526008602052604090205460ff16158015611a2557506001600160a01b03821660009081526008602052604090205460ff16155b611a5c5760405162461bcd60e51b81526020600482015260086024820152672737903137ba399760c11b6044820152606401610703565b601a546001600160a01b038481169116148015611a8757506019546001600160a01b03838116911614155b8015611aac57506001600160a01b03821660009081526007602052604090205460ff16155b8015611ac65750600f544390611ac39060026124aa565b11155b15611b8257600e54811115611b1d5760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610703565b60115481611b2a8461222f565b611b34919061311c565b1115611b825760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e0000000000000000006044820152606401610703565b601a546001600160a01b038381169116148015611bad57506019546001600160a01b03838116911614155b8015611bd257506001600160a01b03831660009081526007602052604090205460ff16155b15611c2957600e54811115611c295760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610703565b601a546001600160a01b038381169116148015611c5457506019546001600160a01b03848116911614155b8015611c7957506001600160a01b03831660009081526007602052604090205460ff16155b15611c8957600a60125560006013555b600f544390611c999060026124aa565b118015611cb35750601a546001600160a01b038481169116145b15611cbe5760646012555b6000611cc93061222f565b60105490915081108015908190611cea5750601a54600160a81b900460ff16155b8015611d045750601a546001600160a01b03868116911614155b8015611d195750601a54600160b01b900460ff165b8015611d285750611d28612509565b15611d4a57611d3860175461228e565b478015611d4857611d4847612417565b505b5050611d57565b60006012555b610e77838383612517565b60008184841115611d865760405162461bcd60e51b81526004016107039190612fd2565b5060006109a38486613175565b6000806000611da0612666565b9092509050611daf82826116c0565b9250505090565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110611def57611def6131d3565b6001600160a01b03928316602091820292909201810191909152600354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611e4357600080fd5b505afa158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b9190612e75565b81600181518110611e8e57611e8e6131d3565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000918416906370a082319060240160206040518083038186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f169190612f8b565b60035460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925084169063095ea7b390604401602060405180830381600087803b158015611f6657600080fd5b505af1158015611f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9e9190612f55565b5060035460405163791ac94760e01b81526001600160a01b039091169063791ac94790611fd89084906000908790309042906004016130ab565b600060405180830381600087803b158015611ff257600080fd5b505af1158015612006573d6000803e3d6000fd5b5050505050505050565b6001600160a01b0381166000908152600a602052604081205443141561204c57506001600160a01b03166000908152600b602052604090205490565b6106d38261222f565b60006108e983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d62565b804710156120e75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610703565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612134576040519150601f19603f3d011682016040523d82523d6000602084013e612139565b606091505b5050905080610e775760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610703565b6000826121bf575060006106d3565b60006121cb8385613156565b9050826121d88583613134565b146108e95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610703565b6001600160a01b03811660009081526018602052604081205460ff161561226c57506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546106d39061086c565b601a805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106122d6576122d66131d3565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561232a57600080fd5b505afa15801561233e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123629190612e75565b81600181518110612375576123756131d3565b6001600160a01b03928316602091820292909201015260195461239b9130911684611702565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac947906123d49085906000908690309042906004016130ab565b600060405180830381600087803b1580156123ee57600080fd5b505af1158015612402573d6000803e3d6000fd5b5050601a805460ff60a81b1916905550505050565b60145461243c906001600160a01b0316612437600a6110e68560026121b0565b612097565b60155461245c906001600160a01b0316612437600a6110e68560036121b0565b601654610be4906001600160a01b0316612437600a6110e68560056121b0565b6000818361249d5760405162461bcd60e51b81526004016107039190612fd2565b5060006109a38486613134565b6000806124b7838561311c565b9050838110156108e95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610703565b6000620493e05a1015905090565b6001600160a01b03831660009081526018602052604090205460ff16801561255857506001600160a01b03821660009081526018602052604090205460ff16155b1561256857610e77838383612802565b6001600160a01b03831660009081526018602052604090205460ff161580156125a957506001600160a01b03821660009081526018602052604090205460ff165b156125b957610e77838383612a76565b6001600160a01b03831660009081526018602052604090205460ff161580156125fb57506001600160a01b03821660009081526018602052604090205460ff16155b1561260b57610e77838383612b5e565b6001600160a01b03831660009081526018602052604090205460ff16801561264b57506001600160a01b03821660009081526018602052604090205460ff165b1561265b57610e77838383612be1565b610e77838383612b5e565b600c546000908190683635c9adc5dea00000825b6009548110156127c55782600460006009848154811061269c5761269c6131d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061270757508160056000600984815481106126e0576126e06131d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612723575050600c5493683635c9adc5dea000009350915050565b612769600460006009848154811061273d5761273d6131d3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612055565b92506127b16005600060098481548110612785576127856131d3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612055565b9150806127bd8161318c565b91505061267a565b50600c546127dc90683635c9adc5dea000006116c0565b8210156127f9575050600c5492683635c9adc5dea0000092509050565b90939092509050565b600f5443906128129060026124aa565b1015801561282d5750601a546001600160a01b038481169116145b156129505760018160006128418284612055565b6001600160a01b0386166000908152600a60209081526040808320439055600490915290205490915061287490856124aa565b6001600160a01b038087166000908152600b60209081526040808320949094559189168152600490915220546128aa9083612055565b6001600160a01b0380881660009081526004602052604080822093909355908716815220546128d990846124aa565b6001600160a01b0386166000908152600460205260409020556128fb81612c93565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161294091815260200190565b60405180910390a3505050505050565b60008060008060008061296287612d1b565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506129949088612055565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546129c39087612055565b6001600160a01b03808b1660009081526004602052604080822093909355908a16815220546129f290866124aa565b6001600160a01b038916600090815260046020526040902055612a1481612c93565b612a1e8483612d6a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612a6391815260200190565b60405180910390a3505050505050505050565b600f544390612a869060026124aa565b10158015612aa15750601a546001600160a01b038481169116145b15612ab55760018160006128418284612055565b600080600080600080612ac787612d1b565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612af99087612055565b6001600160a01b03808b16600090815260046020908152604080832094909455918b16815260059091522054612b2f90846124aa565b6001600160a01b0389166000908152600560209081526040808320939093556004905220546129f290866124aa565b600f544390612b6e9060026124aa565b10158015612b895750601a546001600160a01b038481169116145b15612b9d5760018160006128418284612055565b600080600080600080612baf87612d1b565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506129c39087612055565b600f544390612bf19060026124aa565b10158015612c0c5750601a546001600160a01b038481169116145b15612c205760018160006128418284612055565b600080600080600080612c3287612d1b565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612c649088612055565b6001600160a01b038a16600090815260056020908152604080832093909355600490522054612af99087612055565b6000612c9d611d93565b90506000612cab83836121b0565b30600090815260046020526040902054909150612cc890826124aa565b3060009081526004602090815260408083209390935560189052205460ff1615610e775730600090815260056020526040902054612d0690846124aa565b30600090815260056020526040902055505050565b6000806000806000806000806000612d328a612d8e565b9250925092506000806000612d508d8686612d4b611d93565b612dd0565b919f909e50909c50959a5093985091965092945050505050565b600c54612d779083612055565b600c55600d54612d8790826124aa565b600d555050565b600080600080612d9d85612e20565b90506000612daa86612e3c565b90506000612dc282612dbc8986612055565b90612055565b979296509094509092505050565b6000808080612ddf88866121b0565b90506000612ded88876121b0565b90506000612dfb88886121b0565b90506000612e0d82612dbc8686612055565b939b939a50919850919650505050505050565b60006106d360646110e6601354856121b090919063ffffffff16565b60006106d360646110e6601254856121b090919063ffffffff16565b600060208284031215612e6a57600080fd5b81356108e9816131e9565b600060208284031215612e8757600080fd5b81516108e9816131e9565b60008060408385031215612ea557600080fd5b8235612eb0816131e9565b91506020830135612ec0816131e9565b809150509250929050565b600080600060608486031215612ee057600080fd5b8335612eeb816131e9565b92506020840135612efb816131e9565b929592945050506040919091013590565b60008060408385031215612f1f57600080fd5b8235612f2a816131e9565b946020939093013593505050565b600060208284031215612f4a57600080fd5b81356108e9816131fe565b600060208284031215612f6757600080fd5b81516108e9816131fe565b600060208284031215612f8457600080fd5b5035919050565b600060208284031215612f9d57600080fd5b5051919050565b600080600060608486031215612fb957600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015612fff57858101830151858201604001528201612fe3565b81811115613011576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260408201526e2199181031b7b73a3937b63632b91760891b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156130fb5784516001600160a01b0316835293830193918301916001016130d6565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561312f5761312f6131a7565b500190565b60008261315157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613170576131706131a7565b500290565b600082821015613187576131876131a7565b500390565b60006000198214156131a0576131a06131a7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610be457600080fd5b8015158114610be457600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212204e7537f9c9570a255a99aa157ea577a0d2a33b0b83384845098300678eeae1af64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c806370a082311161010d578063a9059cbb116100a0578063e98391ff1161006f578063e98391ff1461062d578063ea2f0b371461064d578063ec28438a1461066d578063f42938901461068d578063ffecf516146106a257600080fd5b8063a9059cbb14610592578063b70143c9146105b2578063c9567bf9146105d2578063dd62ed3e146105e757600080fd5b806388f82020116100dc57806388f82020146104e55780638da5cb5b1461051e57806395d89b4114610546578063a10122331461057257600080fd5b806370a082311461047b578063715018a61461049b5780637a52da0e146104b057806388a65f46146104d057600080fd5b80632d83811911610190578063437823ec1161015f578063437823ec146103c2578063473071ce146103e257806352390c02146104025780635342acb414610422578063571cbe0a1461045b57600080fd5b80632d83811914610346578063313ce5671461036657806333a17282146103825780633685d419146103a257600080fd5b806319db2dcb116101cc57806319db2dcb146102c657806323b872dd146102e6578063273123b71461030657806327a14fc21461032657600080fd5b806306fdde0314610209578063095ea7b31461024e57806314b3b0771461027e57806318160ddd146102a057600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5060408051808201909152600a815269135859da58ce10985b1b60b21b60208201525b6040516102459190612fd2565b60405180910390f35b34801561025a57600080fd5b5061026e610269366004612f0c565b6106c2565b6040519015158152602001610245565b34801561028a57600080fd5b5061029e610299366004612e58565b6106d9565b005b3480156102ac57600080fd5b50683635c9adc5dea000005b604051908152602001610245565b3480156102d257600080fd5b5061029e6102e1366004612e58565b61072e565b3480156102f257600080fd5b5061026e610301366004612ecb565b61077a565b34801561031257600080fd5b5061029e610321366004612e58565b6107e3565b34801561033257600080fd5b5061029e610341366004612f72565b61082e565b34801561035257600080fd5b506102b8610361366004612f72565b61086c565b34801561037257600080fd5b5060405160098152602001610245565b34801561038e57600080fd5b5061026e61039d366004612ecb565b6108f0565b3480156103ae57600080fd5b5061029e6103bd366004612e58565b6109ac565b3480156103ce57600080fd5b5061029e6103dd366004612e58565b610b63565b3480156103ee57600080fd5b5061029e6103fd366004612e58565b610bb1565b34801561040e57600080fd5b5061029e61041d366004612e58565b610be7565b34801561042e57600080fd5b5061026e61043d366004612e58565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561046757600080fd5b5061026e610476366004612ecb565b610d3a565b34801561048757600080fd5b506102b8610496366004612e58565b610d9f565b3480156104a757600080fd5b5061029e610daa565b3480156104bc57600080fd5b5061029e6104cb366004612e58565b610e1e565b3480156104dc57600080fd5b5061029e610e7c565b3480156104f157600080fd5b5061026e610500366004612e58565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561052a57600080fd5b506000546040516001600160a01b039091168152602001610245565b34801561055257600080fd5b50604080518082019091526003815262269c2160e91b6020820152610238565b34801561057e57600080fd5b5061029e61058d366004612e58565b611001565b34801561059e57600080fd5b5061026e6105ad366004612f0c565b61104d565b3480156105be57600080fd5b5061029e6105cd366004612f72565b61105a565b3480156105de57600080fd5b5061029e611130565b3480156105f357600080fd5b506102b8610602366004612e92565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561063957600080fd5b5061029e610648366004612f38565b611526565b34801561065957600080fd5b5061029e610668366004612e58565b61156e565b34801561067957600080fd5b5061029e610688366004612f72565b6115b9565b34801561069957600080fd5b5061029e6115f7565b3480156106ae57600080fd5b5061029e6106bd366004612e58565b611672565b60006106cf338484611702565b5060015b92915050565b6000546001600160a01b0316331461070c5760405162461bcd60e51b815260040161070390613027565b60405180910390fd5b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146107585760405162461bcd60e51b815260040161070390613027565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6000610787848484611826565b6107d984336107d48560405180606001604052806028815260200161320d602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190611d62565b611702565b5060019392505050565b6000546001600160a01b0316331461080d5760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b031633146108585760405162461bcd60e51b815260040161070390613027565b61086681633b9aca00613156565b60115550565b6000600c548211156108d35760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610703565b60006108dd611d93565b90506108e983826116c0565b9392505050565b6002546000906001600160a01b0316331461091d5760405162461bcd60e51b81526004016107039061305c565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b602060405180830381600087803b15801561096b57600080fd5b505af115801561097f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a39190612f55565b95945050505050565b6000546001600160a01b031633146109d65760405162461bcd60e51b815260040161070390613027565b6001600160a01b03811660009081526018602052604090205460ff16610a3e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610703565b60005b600954811015610b5f57816001600160a01b031660098281548110610a6857610a686131d3565b6000918252602090912001546001600160a01b03161415610b4d5760098054610a9390600190613175565b81548110610aa357610aa36131d3565b600091825260209091200154600980546001600160a01b039092169183908110610acf57610acf6131d3565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055601890925220805460ff191690556009805480610b2757610b276131bd565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610b578161318c565b915050610a41565b5050565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6002546001600160a01b03163314610bdb5760405162461bcd60e51b81526004016107039061305c565b610be481611db6565b50565b6000546001600160a01b03163314610c115760405162461bcd60e51b815260040161070390613027565b6001600160a01b03811660009081526018602052604090205460ff1615610c7a5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610703565b6001600160a01b03811660009081526004602052604090205415610cd4576001600160a01b038116600090815260046020526040902054610cba9061086c565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152601860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6002546000906001600160a01b03163314610d675760405162461bcd60e51b81526004016107039061305c565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610951565b60006106d382612010565b6000546001600160a01b03163314610dd45760405162461bcd60e51b815260040161070390613027565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6002546001600160a01b03163314610e485760405162461bcd60e51b81526004016107039061305c565b47610e5282611db6565b6000610e5e4783612055565b600254909150610e77906001600160a01b031682612097565b505050565b6002546001600160a01b03163314610ea65760405162461bcd60e51b81526004016107039061305c565b600354604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b158015610eeb57600080fd5b505afa158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f239190612e75565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015610f6857600080fd5b505afa158015610f7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa09190612f8b565b604051632e1a7d4d60e01b8152600481018290529091506001600160a01b03831690632e1a7d4d90602401600060405180830381600087803b158015610fe557600080fd5b505af1158015610ff9573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461102b5760405162461bcd60e51b815260040161070390613027565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b60006106cf338484611826565b6014546001600160a01b0316336001600160a01b0316148061108f57506015546001600160a01b0316336001600160a01b0316145b806110ad57506016546001600160a01b0316336001600160a01b0316145b806110c257506000546001600160a01b031633145b6110cb57600080fd5b60006110ec6103e86110e6683635c9adc5dea00000856121b0565b906116c0565b6110f53061222f565b111561111b576111146103e86110e6683635c9adc5dea00000856121b0565b9050611127565b6111243061222f565b90505b610b5f8161228e565b6000546001600160a01b0316331461115a5760405162461bcd60e51b815260040161070390613027565b601a54600160a01b900460ff16156111b45760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610703565b601980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556111f13082683635c9adc5dea00000611702565b806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112629190612e75565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156112aa57600080fd5b505afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190612e75565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113629190612e75565b601a80546001600160a01b0319166001600160a01b039283161790556019541663f305d719473061139281610d9f565b6000806113a76000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561140a57600080fd5b505af115801561141e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114439190612fa4565b5050601a805460ff60b01b1916600160b01b1790555061146d683635c9adc5dea0000060326116c0565b600e55611484683635c9adc5dea0000060196116c0565b601155601a8054600160a01b60ff60a01b1982161790915543600f5560195460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b1580156114ee57600080fd5b505af1158015611502573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5f9190612f55565b6000546001600160a01b031633146115505760405162461bcd60e51b815260040161070390613027565b601a8054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b031633146115985760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b031633146115e35760405162461bcd60e51b815260040161070390613027565b6115f181633b9aca00613156565b600e5550565b6014546001600160a01b0316336001600160a01b0316148061162c57506015546001600160a01b0316336001600160a01b0316145b8061164a57506016546001600160a01b0316336001600160a01b0316145b8061165f57506000546001600160a01b031633145b61166857600080fd5b47610be481612417565b6000546001600160a01b0316331461169c5760405162461bcd60e51b815260040161070390613027565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b60006108e983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061247c565b6001600160a01b0383166117645760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610703565b6001600160a01b0382166117c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610703565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661188a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610703565b6001600160a01b0382166118ec5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610703565b6000811161194e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610703565b60096012556000546001600160a01b0384811691161480159061197f57506000546001600160a01b03838116911614155b801561199457506001600160a01b0383163014155b80156119b957506001600160a01b03831660009081526007602052604090205460ff16155b80156119de57506001600160a01b03821660009081526007602052604090205460ff16155b15611d51576001600160a01b03831660009081526008602052604090205460ff16158015611a2557506001600160a01b03821660009081526008602052604090205460ff16155b611a5c5760405162461bcd60e51b81526020600482015260086024820152672737903137ba399760c11b6044820152606401610703565b601a546001600160a01b038481169116148015611a8757506019546001600160a01b03838116911614155b8015611aac57506001600160a01b03821660009081526007602052604090205460ff16155b8015611ac65750600f544390611ac39060026124aa565b11155b15611b8257600e54811115611b1d5760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610703565b60115481611b2a8461222f565b611b34919061311c565b1115611b825760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e0000000000000000006044820152606401610703565b601a546001600160a01b038381169116148015611bad57506019546001600160a01b03838116911614155b8015611bd257506001600160a01b03831660009081526007602052604090205460ff16155b15611c2957600e54811115611c295760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610703565b601a546001600160a01b038381169116148015611c5457506019546001600160a01b03848116911614155b8015611c7957506001600160a01b03831660009081526007602052604090205460ff16155b15611c8957600a60125560006013555b600f544390611c999060026124aa565b118015611cb35750601a546001600160a01b038481169116145b15611cbe5760646012555b6000611cc93061222f565b60105490915081108015908190611cea5750601a54600160a81b900460ff16155b8015611d045750601a546001600160a01b03868116911614155b8015611d195750601a54600160b01b900460ff165b8015611d285750611d28612509565b15611d4a57611d3860175461228e565b478015611d4857611d4847612417565b505b5050611d57565b60006012555b610e77838383612517565b60008184841115611d865760405162461bcd60e51b81526004016107039190612fd2565b5060006109a38486613175565b6000806000611da0612666565b9092509050611daf82826116c0565b9250505090565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110611def57611def6131d3565b6001600160a01b03928316602091820292909201810191909152600354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611e4357600080fd5b505afa158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b9190612e75565b81600181518110611e8e57611e8e6131d3565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201526000918416906370a082319060240160206040518083038186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f169190612f8b565b60035460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925084169063095ea7b390604401602060405180830381600087803b158015611f6657600080fd5b505af1158015611f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9e9190612f55565b5060035460405163791ac94760e01b81526001600160a01b039091169063791ac94790611fd89084906000908790309042906004016130ab565b600060405180830381600087803b158015611ff257600080fd5b505af1158015612006573d6000803e3d6000fd5b5050505050505050565b6001600160a01b0381166000908152600a602052604081205443141561204c57506001600160a01b03166000908152600b602052604090205490565b6106d38261222f565b60006108e983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d62565b804710156120e75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610703565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612134576040519150601f19603f3d011682016040523d82523d6000602084013e612139565b606091505b5050905080610e775760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610703565b6000826121bf575060006106d3565b60006121cb8385613156565b9050826121d88583613134565b146108e95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610703565b6001600160a01b03811660009081526018602052604081205460ff161561226c57506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546106d39061086c565b601a805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106122d6576122d66131d3565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561232a57600080fd5b505afa15801561233e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123629190612e75565b81600181518110612375576123756131d3565b6001600160a01b03928316602091820292909201015260195461239b9130911684611702565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac947906123d49085906000908690309042906004016130ab565b600060405180830381600087803b1580156123ee57600080fd5b505af1158015612402573d6000803e3d6000fd5b5050601a805460ff60a81b1916905550505050565b60145461243c906001600160a01b0316612437600a6110e68560026121b0565b612097565b60155461245c906001600160a01b0316612437600a6110e68560036121b0565b601654610be4906001600160a01b0316612437600a6110e68560056121b0565b6000818361249d5760405162461bcd60e51b81526004016107039190612fd2565b5060006109a38486613134565b6000806124b7838561311c565b9050838110156108e95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610703565b6000620493e05a1015905090565b6001600160a01b03831660009081526018602052604090205460ff16801561255857506001600160a01b03821660009081526018602052604090205460ff16155b1561256857610e77838383612802565b6001600160a01b03831660009081526018602052604090205460ff161580156125a957506001600160a01b03821660009081526018602052604090205460ff165b156125b957610e77838383612a76565b6001600160a01b03831660009081526018602052604090205460ff161580156125fb57506001600160a01b03821660009081526018602052604090205460ff16155b1561260b57610e77838383612b5e565b6001600160a01b03831660009081526018602052604090205460ff16801561264b57506001600160a01b03821660009081526018602052604090205460ff165b1561265b57610e77838383612be1565b610e77838383612b5e565b600c546000908190683635c9adc5dea00000825b6009548110156127c55782600460006009848154811061269c5761269c6131d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061270757508160056000600984815481106126e0576126e06131d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612723575050600c5493683635c9adc5dea000009350915050565b612769600460006009848154811061273d5761273d6131d3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612055565b92506127b16005600060098481548110612785576127856131d3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612055565b9150806127bd8161318c565b91505061267a565b50600c546127dc90683635c9adc5dea000006116c0565b8210156127f9575050600c5492683635c9adc5dea0000092509050565b90939092509050565b600f5443906128129060026124aa565b1015801561282d5750601a546001600160a01b038481169116145b156129505760018160006128418284612055565b6001600160a01b0386166000908152600a60209081526040808320439055600490915290205490915061287490856124aa565b6001600160a01b038087166000908152600b60209081526040808320949094559189168152600490915220546128aa9083612055565b6001600160a01b0380881660009081526004602052604080822093909355908716815220546128d990846124aa565b6001600160a01b0386166000908152600460205260409020556128fb81612c93565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161294091815260200190565b60405180910390a3505050505050565b60008060008060008061296287612d1b565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506129949088612055565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546129c39087612055565b6001600160a01b03808b1660009081526004602052604080822093909355908a16815220546129f290866124aa565b6001600160a01b038916600090815260046020526040902055612a1481612c93565b612a1e8483612d6a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612a6391815260200190565b60405180910390a3505050505050505050565b600f544390612a869060026124aa565b10158015612aa15750601a546001600160a01b038481169116145b15612ab55760018160006128418284612055565b600080600080600080612ac787612d1b565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612af99087612055565b6001600160a01b03808b16600090815260046020908152604080832094909455918b16815260059091522054612b2f90846124aa565b6001600160a01b0389166000908152600560209081526040808320939093556004905220546129f290866124aa565b600f544390612b6e9060026124aa565b10158015612b895750601a546001600160a01b038481169116145b15612b9d5760018160006128418284612055565b600080600080600080612baf87612d1b565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506129c39087612055565b600f544390612bf19060026124aa565b10158015612c0c5750601a546001600160a01b038481169116145b15612c205760018160006128418284612055565b600080600080600080612c3287612d1b565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612c649088612055565b6001600160a01b038a16600090815260056020908152604080832093909355600490522054612af99087612055565b6000612c9d611d93565b90506000612cab83836121b0565b30600090815260046020526040902054909150612cc890826124aa565b3060009081526004602090815260408083209390935560189052205460ff1615610e775730600090815260056020526040902054612d0690846124aa565b30600090815260056020526040902055505050565b6000806000806000806000806000612d328a612d8e565b9250925092506000806000612d508d8686612d4b611d93565b612dd0565b919f909e50909c50959a5093985091965092945050505050565b600c54612d779083612055565b600c55600d54612d8790826124aa565b600d555050565b600080600080612d9d85612e20565b90506000612daa86612e3c565b90506000612dc282612dbc8986612055565b90612055565b979296509094509092505050565b6000808080612ddf88866121b0565b90506000612ded88876121b0565b90506000612dfb88886121b0565b90506000612e0d82612dbc8686612055565b939b939a50919850919650505050505050565b60006106d360646110e6601354856121b090919063ffffffff16565b60006106d360646110e6601254856121b090919063ffffffff16565b600060208284031215612e6a57600080fd5b81356108e9816131e9565b600060208284031215612e8757600080fd5b81516108e9816131e9565b60008060408385031215612ea557600080fd5b8235612eb0816131e9565b91506020830135612ec0816131e9565b809150509250929050565b600080600060608486031215612ee057600080fd5b8335612eeb816131e9565b92506020840135612efb816131e9565b929592945050506040919091013590565b60008060408385031215612f1f57600080fd5b8235612f2a816131e9565b946020939093013593505050565b600060208284031215612f4a57600080fd5b81356108e9816131fe565b600060208284031215612f6757600080fd5b81516108e9816131fe565b600060208284031215612f8457600080fd5b5035919050565b600060208284031215612f9d57600080fd5b5051919050565b600080600060608486031215612fb957600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b81811015612fff57858101830151858201604001528201612fe3565b81811115613011576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260408201526e2199181031b7b73a3937b63632b91760891b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156130fb5784516001600160a01b0316835293830193918301916001016130d6565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561312f5761312f6131a7565b500190565b60008261315157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613170576131706131a7565b500290565b600082821015613187576131876131a7565b500390565b60006000198214156131a0576131a06131a7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610be457600080fd5b8015158114610be457600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212204e7537f9c9570a255a99aa157ea577a0d2a33b0b83384845098300678eeae1af64736f6c63430008070033

Deployed Bytecode Sourcemap

15396:22413:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18354:83;;;;;;;;;;-1:-1:-1;18424:5:0;;;;;;;;;;;;-1:-1:-1;;;18424:5:0;;;;18354:83;;;;;;;:::i;:::-;;;;;;;;19260:193;;;;;;;;;;-1:-1:-1;19260:193:0;;;;;:::i;:::-;;:::i;:::-;;;4660:14:1;;4653:22;4635:41;;4623:2;4608:18;19260:193:0;4495:187:1;25720:116:0;;;;;;;;;;-1:-1:-1;25720:116:0;;;;;:::i;:::-;;:::i;:::-;;18631:95;;;;;;;;;;-1:-1:-1;16021:21:0;18631:95;;;12303:25:1;;;12291:2;12276:18;18631:95:0;12157:177:1;25842:116:0;;;;;;;;;;-1:-1:-1;25842:116:0;;;;;:::i;:::-;;:::i;19461:446::-;;;;;;;;;;-1:-1:-1;19461:446:0;;;;;:::i;:::-;;:::i;25464:88::-;;;;;;;;;;-1:-1:-1;25464:88:0;;;;;:::i;:::-;;:::i;24177:113::-;;;;;;;;;;-1:-1:-1;24177:113:0;;;;;:::i;:::-;;:::i;27501:253::-;;;;;;;;;;-1:-1:-1;27501:253:0;;;;;:::i;:::-;;:::i;18540:83::-;;;;;;;;;;-1:-1:-1;18540:83:0;;17237:1;13466:36:1;;13454:2;13439:18;18540:83:0;13324:184:1;12401:273:0;;;;;;;;;;-1:-1:-1;12401:273:0;;;;;:::i;:::-;;:::i;37314:490::-;;;;;;;;;;-1:-1:-1;37314:490:0;;;;;:::i;:::-;;:::i;36728:113::-;;;;;;;;;;-1:-1:-1;36728:113:0;;;;;:::i;:::-;;:::i;13065:112::-;;;;;;;;;;-1:-1:-1;13065:112:0;;;;;:::i;:::-;;:::i;36973:333::-;;;;;;;;;;-1:-1:-1;36973:333:0;;;;;:::i;:::-;;:::i;36228:123::-;;;;;;;;;;-1:-1:-1;36228:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;36316:27:0;36292:4;36316:27;;;:18;:27;;;;;;;;;36228:123;12735:279;;;;;;;;;;-1:-1:-1;12735:279:0;;;;;:::i;:::-;;:::i;18734:119::-;;;;;;;;;;-1:-1:-1;18734:119:0;;;;;:::i;:::-;;:::i;11405:148::-;;;;;;;;;;;;;:::i;13816:396::-;;;;;;;;;;-1:-1:-1;13816:396:0;;;;;:::i;:::-;;:::i;14284:210::-;;;;;;;;;;;;;:::i;27373:120::-;;;;;;;;;;-1:-1:-1;27373:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;27465:20:0;27441:4;27465:20;;;:11;:20;;;;;;;;;27373:120;11191:79;;;;;;;;;;-1:-1:-1;11229:7:0;11256:6;11191:79;;-1:-1:-1;;;;;11256:6:0;;;3233:51:1;;3221:2;3206:18;11191:79:0;3087:203:1;18445:87:0;;;;;;;;;;-1:-1:-1;18517:7:0;;;;;;;;;;;;-1:-1:-1;;;18517:7:0;;;;18445:87;;25968:116;;;;;;;;;;-1:-1:-1;25968:116:0;;;;;:::i;:::-;;:::i;18861:199::-;;;;;;;;;;-1:-1:-1;18861:199:0;;;;;:::i;:::-;;:::i;26129:513::-;;;;;;;;;;-1:-1:-1;26129:513:0;;;;;:::i;:::-;;:::i;24300:1061::-;;;;;;;;;;;;;:::i;19068:184::-;;;;;;;;;;-1:-1:-1;19068:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;19217:18:0;;;19185:7;19217:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19068:184;22978:97;;;;;;;;;;-1:-1:-1;22978:97:0;;;;;:::i;:::-;;:::i;36853:112::-;;;;;;;;;;-1:-1:-1;36853:112:0;;;;;:::i;:::-;;:::i;24066:105::-;;;;;;;;;;-1:-1:-1;24066:105:0;;;;;:::i;:::-;;:::i;26650:291::-;;;;;;;;;;;;;:::i;25369:87::-;;;;;;;;;;-1:-1:-1;25369:87:0;;;;;:::i;:::-;;:::i;19260:193::-;19362:4;19384:39;8774:10;19407:7;19416:6;19384:8;:39::i;:::-;-1:-1:-1;19441:4:0;19260:193;;;;;:::o;25720:116::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;;;;;;;;;25792:15:::1;:36:::0;;-1:-1:-1;;;;;;25792:36:0::1;-1:-1:-1::0;;;;;25792:36:0;;;::::1;::::0;;;::::1;::::0;;25720:116::o;25842:::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;25914:15:::1;:36:::0;;-1:-1:-1;;;;;;25914:36:0::1;-1:-1:-1::0;;;;;25914:36:0;;;::::1;::::0;;;::::1;::::0;;25842:116::o;19461:446::-;19593:4;19610:36;19620:6;19628:9;19639:6;19610:9;:36::i;:::-;19657:220;19680:6;8774:10;19728:138;19784:6;19728:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19728:19:0;;;;;;:11;:19;;;;;;;;8774:10;19728:33;;;;;;;;;;:37;:138::i;:::-;19657:8;:220::i;:::-;-1:-1:-1;19895:4:0;19461:446;;;;;:::o;25464:88::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25524:12:0::1;25539:5;25524:12:::0;;;:4:::1;:12;::::0;;;;:20;;-1:-1:-1;;25524:20:0::1;::::0;;25464:88::o;24177:113::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;24268:14:::1;:6:::0;24277:5:::1;24268:14;:::i;:::-;24249:16;:33:::0;-1:-1:-1;24177:113:0:o;27501:253::-;27567:7;27606;;27595;:18;;27587:73;;;;-1:-1:-1;;;27587:73:0;;5895:2:1;27587:73:0;;;5877:21:1;5934:2;5914:18;;;5907:30;5973:34;5953:18;;;5946:62;-1:-1:-1;;;6024:18:1;;;6017:40;6074:19;;27587:73:0;5693:406:1;27587:73:0;27671:19;27694:10;:8;:10::i;:::-;27671:33;-1:-1:-1;27722:24:0;:7;27671:33;27722:11;:24::i;:::-;27715:31;27501:253;-1:-1:-1;;;27501:253:0:o;12401:273::-;12225:11;;12553:4;;-1:-1:-1;;;;;12225:11:0;8774:10;12225:27;12203:124;;;;-1:-1:-1;;;12203:124:0;;;;;;;:::i;:::-;12630:36:::1;::::0;-1:-1:-1;;;12630:36:0;;-1:-1:-1;;;;;3796:32:1;;;12630:36:0::1;::::0;::::1;3778:51:1::0;3845:18;;;3838:34;;;12598:13:0;;12630:19;;::::1;::::0;::::1;::::0;3751:18:1;;12630:36:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12623:43:::0;12401:273;-1:-1:-1;;;;;12401:273:0:o;37314:490::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37407:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;37399:60;;;::::0;-1:-1:-1;;;37399:60:0;;8206:2:1;37399:60:0::1;::::0;::::1;8188:21:1::0;8245:2;8225:18;;;8218:30;8284:29;8264:18;;;8257:57;8331:18;;37399:60:0::1;8004:351:1::0;37399:60:0::1;37475:9;37470:327;37494:9;:16:::0;37490:20;::::1;37470:327;;;37552:7;-1:-1:-1::0;;;;;37536:23:0::1;:9;37546:1;37536:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;37536:12:0::1;:23;37532:254;;;37595:9;37605:16:::0;;:20:::1;::::0;37624:1:::1;::::0;37605:20:::1;:::i;:::-;37595:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;37580:9:::1;:12:::0;;-1:-1:-1;;;;;37595:31:0;;::::1;::::0;37590:1;;37580:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;37580:46:0::1;-1:-1:-1::0;;;;;37580:46:0;;::::1;;::::0;;37645:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;37684:11:::1;:20:::0;;;;:28;;-1:-1:-1;;37684:28:0::1;::::0;;37731:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;37731:15:0;;;;;-1:-1:-1;;;;;;37731:15:0::1;::::0;;;;;37470:327:::1;37314:490:::0;:::o;37532:254::-:1;37512:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37470:327;;;;37314:490:::0;:::o;36728:113::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36799:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;36799:34:0::1;36829:4;36799:34;::::0;;36728:113::o;13065:112::-;12225:11;;-1:-1:-1;;;;;12225:11:0;8774:10;12225:27;12203:124;;;;-1:-1:-1;;;12203:124:0;;;;;;;:::i;:::-;13149:20:::1;13155:13;13149:5;:20::i;:::-;13065:112:::0;:::o;36973:333::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37056:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;37055:21;37047:61;;;::::0;-1:-1:-1;;;37047:61:0;;7065:2:1;37047:61:0::1;::::0;::::1;7047:21:1::0;7104:2;7084:18;;;7077:30;7143:29;7123:18;;;7116:57;7190:18;;37047:61:0::1;6863:351:1::0;37047:61:0::1;-1:-1:-1::0;;;;;37122:16:0;::::1;37141:1;37122:16:::0;;;:7:::1;:16;::::0;;;;;:20;37119:108:::1;;-1:-1:-1::0;;;;;37198:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;37178:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;37159:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;37119:108:::1;-1:-1:-1::0;;;;;37237:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;37237:27:0::1;37260:4;37237:27:::0;;::::1;::::0;;;37275:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;37275:23:0::1;::::0;;::::1;::::0;;36973:333::o;12735:279::-;12225:11;;12890:4;;-1:-1:-1;;;;;12225:11:0;8774:10;12225:27;12203:124;;;;-1:-1:-1;;;12203:124:0;;;;;;;:::i;:::-;12967:39:::1;::::0;-1:-1:-1;;;12967:39:0;;-1:-1:-1;;;;;3796:32:1;;;12967:39:0::1;::::0;::::1;3778:51:1::0;3845:18;;;3838:34;;;12935:13:0;;12967:20;;::::1;::::0;::::1;::::0;3751:18:1;;12967:39:0::1;3604:274:1::0;18734:119:0;18800:7;18827:18;18837:7;18827:9;:18::i;11405:148::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;11512:1:::1;11496:6:::0;;11475:40:::1;::::0;-1:-1:-1;;;;;11496:6:0;;::::1;::::0;11475:40:::1;::::0;11512:1;;11475:40:::1;11543:1;11526:19:::0;;-1:-1:-1;;;;;;11526:19:0::1;::::0;;11405:148::o;13816:396::-;12225:11;;-1:-1:-1;;;;;12225:11:0;8774:10;12225:27;12203:124;;;;-1:-1:-1;;;12203:124:0;;;;;;;:::i;:::-;13947:21:::1;13979:20;13985:13:::0;13979:5:::1;:20::i;:::-;14010:11;14024:33;:21;14050:6:::0;14024:25:::1;:33::i;:::-;14186:11;::::0;14010:47;;-1:-1:-1;14160:44:0::1;::::0;-1:-1:-1;;;;;14186:11:0::1;14010:47:::0;14160:17:::1;:44::i;:::-;13919:293;;13816:396:::0;:::o;14284:210::-;12225:11;;-1:-1:-1;;;;;12225:11:0;8774:10;12225:27;12203:124;;;;-1:-1:-1;;;12203:124:0;;;;;;;:::i;:::-;14388:7:::1;::::0;:14:::1;::::0;;-1:-1:-1;;;14388:14:0;;;;14355:17:::1;::::0;-1:-1:-1;;;;;14388:7:0::1;::::0;:12:::1;::::0;:14:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:7;:14;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14428:29;::::0;-1:-1:-1;;;14428:29:0;;14451:4:::1;14428:29;::::0;::::1;3233:51:1::0;14355:48:0;;-1:-1:-1;14414:11:0::1;::::0;-1:-1:-1;;;;;14428:14:0;::::1;::::0;::::1;::::0;3206:18:1;;14428:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14468:18;::::0;-1:-1:-1;;;14468:18:0;;::::1;::::0;::::1;12303:25:1::0;;;14414:43:0;;-1:-1:-1;;;;;;14468:13:0;::::1;::::0;::::1;::::0;12276:18:1;;14468::0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14344:150;;14284:210::o:0;25968:116::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;26040:15:::1;:36:::0;;-1:-1:-1;;;;;;26040:36:0::1;-1:-1:-1::0;;;;;26040:36:0;;;::::1;::::0;;;::::1;::::0;;25968:116::o;18861:199::-;18966:4;18988:42;8774:10;19012:9;19023:6;18988:9;:42::i;26129:513::-;26210:15;;-1:-1:-1;;;;;26210:15:0;8774:10;-1:-1:-1;;;;;26194:31:0;;:66;;;-1:-1:-1;26245:15:0;;-1:-1:-1;;;;;26245:15:0;8774:10;-1:-1:-1;;;;;26229:31:0;;26194:66;:101;;;-1:-1:-1;26280:15:0;;-1:-1:-1;;;;;26280:15:0;8774:10;-1:-1:-1;;;;;26264:31:0;;26194:101;:128;;;-1:-1:-1;11229:7:0;11256:6;-1:-1:-1;;;;;11256:6:0;8774:10;26299:23;26194:128;26186:137;;;;;;26385:12;26440:30;26465:4;26440:20;16021:21;26452:7;26440:11;:20::i;:::-;:24;;:30::i;:::-;26411:26;26431:4;26411:11;:26::i;:::-;:59;26408:194;;;26494:30;26519:4;26494:20;16021:21;26506:7;26494:11;:20::i;:30::-;26487:37;;26408:194;;;26564:26;26584:4;26564:11;:26::i;:::-;26557:33;;26408:194;26612:22;26629:4;26612:16;:22::i;24300:1061::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;24362:11:::1;::::0;-1:-1:-1;;;24362:11:0;::::1;;;24361:12;24353:48;;;::::0;-1:-1:-1;;;24353:48:0;;11650:2:1;24353:48:0::1;::::0;::::1;11632:21:1::0;11689:2;11669:18;;;11662:30;11728:25;11708:18;;;11701:53;11771:18;;24353:48:0::1;11448:347:1::0;24353:48:0::1;24547:15;:34:::0;;-1:-1:-1;;;;;;24547:34:0::1;24483:42;24547:34:::0;;::::1;::::0;;;24592:58:::1;24609:4;24483:42:::0;16021:21:::1;24592:8;:58::i;:::-;24695:16;-1:-1:-1::0;;;;;24695:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24677:70:0::1;;24756:4;24763:16;-1:-1:-1::0;;;;;24763:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24677:110;::::0;-1:-1:-1;;;;;;24677:110:0::1;::::0;;;;;;-1:-1:-1;;;;;3525:15:1;;;24677:110:0::1;::::0;::::1;3507:34:1::0;3577:15;;3557:18;;;3550:43;3442:18;;24677:110:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24661:13;:126:::0;;-1:-1:-1;;;;;;24661:126:0::1;-1:-1:-1::0;;;;;24661:126:0;;::::1;;::::0;;24798:15:::1;::::0;::::1;:31;24837:21;24882:4;24902:24;24882:4:::0;24902:9:::1;:24::i;:::-;24941:1;24957::::0;24973:7:::1;11229::::0;11256:6;-1:-1:-1;;;;;11256:6:0;;11191:79;24973:7:::1;24798:223;::::0;::::1;::::0;;;-1:-1:-1;;;;;;24798:223:0;;;-1:-1:-1;;;;;4242:15:1;;;24798:223:0::1;::::0;::::1;4224:34:1::0;4274:18;;;4267:34;;;;4317:18;;;4310:34;;;;4360:18;;;4353:34;4424:15;;;4403:19;;;4396:44;24995:15:0::1;4456:19:1::0;;;4449:35;4158:19;;24798:223:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;25032:11:0::1;:18:::0;;-1:-1:-1;;;;25032:18:0::1;-1:-1:-1::0;;;25032:18:0::1;::::0;;-1:-1:-1;25092:15:0::1;16021:21;25104:2;25092:11;:15::i;:::-;25077:12;:30:::0;25152:15:::1;16021:21;25164:2;25152:11;:15::i;:::-;25133:16;:34:::0;25178:11:::1;:18:::0;;-1:-1:-1;;;;;;;25178:18:0;::::1;;::::0;;;25219:12:::1;25207:9;:24:::0;25294:15:::1;::::0;25242:111:::1;::::0;-1:-1:-1;;;25242:111:0;;-1:-1:-1;;;;;25294:15:0;;::::1;25242:111;::::0;::::1;3778:51:1::0;-1:-1:-1;;3845:18:1;;;3838:34;25249:13:0;;;25242:29:::1;::::0;3751:18:1;;25242:111:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22978:97::-:0;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;23051:6:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;23051:16:0::1;-1:-1:-1::0;;;;23051:16:0;;::::1;::::0;;;::::1;::::0;;22978:97::o;36853:112::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36922:27:0::1;36952:5;36922:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;36922:35:0::1;::::0;;36853:112::o;24066:105::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;24149:14:::1;:6:::0;24158:5:::1;24149:14;:::i;:::-;24134:12;:29:::0;-1:-1:-1;24066:105:0:o;26650:291::-;26716:15;;-1:-1:-1;;;;;26716:15:0;8774:10;-1:-1:-1;;;;;26700:31:0;;:66;;;-1:-1:-1;26751:15:0;;-1:-1:-1;;;;;26751:15:0;8774:10;-1:-1:-1;;;;;26735:31:0;;26700:66;:101;;;-1:-1:-1;26786:15:0;;-1:-1:-1;;;;;26786:15:0;8774:10;-1:-1:-1;;;;;26770:31:0;;26700:101;:128;;;-1:-1:-1;11229:7:0;11256:6;-1:-1:-1;;;;;11256:6:0;8774:10;26805:23;26700:128;26692:137;;;;;;26869:21;26901:32;26869:21;26901:12;:32::i;25369:87::-;11318:6;;-1:-1:-1;;;;;11318:6:0;8774:10;11318:22;11310:67;;;;-1:-1:-1;;;11310:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25429:12:0::1;;::::0;;;:4:::1;:12;::::0;;;;:19;;-1:-1:-1;;25429:19:0::1;25444:4;25429:19;::::0;;25369:87::o;10442:132::-;10500:7;10527:39;10531:1;10534;10527:39;;;;;;;;;;;;;;;;;:3;:39::i;19917:369::-;-1:-1:-1;;;;;20044:19:0;;20036:68;;;;-1:-1:-1;;;20036:68:0;;11245:2:1;20036:68:0;;;11227:21:1;11284:2;11264:18;;;11257:30;11323:34;11303:18;;;11296:62;-1:-1:-1;;;11374:18:1;;;11367:34;11418:19;;20036:68:0;11043:400:1;20036:68:0;-1:-1:-1;;;;;20123:21:0;;20115:68;;;;-1:-1:-1;;;20115:68:0;;6306:2:1;20115:68:0;;;6288:21:1;6345:2;6325:18;;;6318:30;6384:34;6364:18;;;6357:62;-1:-1:-1;;;6435:18:1;;;6428:32;6477:19;;20115:68:0;6104:398:1;20115:68:0;-1:-1:-1;;;;;20194:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20246:32;;12303:25:1;;;20246:32:0;;12276:18:1;20246:32:0;;;;;;;19917:369;;;:::o;20294:2676::-;-1:-1:-1;;;;;20418:18:0;;20410:68;;;;-1:-1:-1;;;20410:68:0;;10839:2:1;20410:68:0;;;10821:21:1;10878:2;10858:18;;;10851:30;10917:34;10897:18;;;10890:62;-1:-1:-1;;;10968:18:1;;;10961:35;11013:19;;20410:68:0;10637:401:1;20410:68:0;-1:-1:-1;;;;;20497:16:0;;20489:64;;;;-1:-1:-1;;;20489:64:0;;5491:2:1;20489:64:0;;;5473:21:1;5530:2;5510:18;;;5503:30;5569:34;5549:18;;;5542:62;-1:-1:-1;;;5620:18:1;;;5613:33;5663:19;;20489:64:0;5289:399:1;20489:64:0;20581:1;20572:6;:10;20564:64;;;;-1:-1:-1;;;20564:64:0;;9325:2:1;20564:64:0;;;9307:21:1;9364:2;9344:18;;;9337:30;9403:34;9383:18;;;9376:62;-1:-1:-1;;;9454:18:1;;;9447:39;9503:19;;20564:64:0;9123:405:1;20564:64:0;20668:1;20658:7;:11;11229:7;11256:6;-1:-1:-1;;;;;20684:15:0;;;11256:6;;20684:15;;;;:32;;-1:-1:-1;11229:7:0;11256:6;-1:-1:-1;;;;;20703:13:0;;;11256:6;;20703:13;;20684:32;:57;;;;-1:-1:-1;;;;;;20720:21:0;;20736:4;20720:21;;20684:57;:86;;;;-1:-1:-1;;;;;;20746:24:0;;;;;;:18;:24;;;;;;;;20745:25;20684:86;:113;;;;-1:-1:-1;;;;;;20775:22:0;;;;;;:18;:22;;;;;;;;20774:23;20684:113;20680:2238;;;-1:-1:-1;;;;;20851:10:0;;;;;;:4;:10;;;;;;;;20850:11;:24;;;;-1:-1:-1;;;;;;20866:8:0;;;;;;:4;:8;;;;;;;;20865:9;20850:24;20842:45;;;;-1:-1:-1;;;20842:45:0;;10503:2:1;20842:45:0;;;10485:21:1;10542:1;10522:18;;;10515:29;-1:-1:-1;;;10560:18:1;;;10553:38;10608:18;;20842:45:0;10301:331:1;20842:45:0;21026:13;;-1:-1:-1;;;;;21018:21:0;;;21026:13;;21018:21;:72;;;;-1:-1:-1;21074:15:0;;-1:-1:-1;;;;;21060:30:0;;;21074:15;;21060:30;;21018:72;:116;;;;-1:-1:-1;;;;;;21112:22:0;;;;;;:18;:22;;;;;;;;21111:23;21018:116;:171;;;;-1:-1:-1;21155:9:0;;21177:12;;21155:18;;16559:1;21155:13;:18::i;:::-;:34;;21018:171;20996:500;;;21303:12;;21293:6;:22;;21285:63;;;;-1:-1:-1;;;21285:63:0;;12002:2:1;21285:63:0;;;11984:21:1;12041:2;12021:18;;;12014:30;12080;12060:18;;;12053:58;12128:18;;21285:63:0;11800:352:1;21285:63:0;21434:16;;21424:6;21406:15;21418:2;21406:11;:15::i;:::-;:24;;;;:::i;:::-;:44;;21398:80;;;;-1:-1:-1;;;21398:80:0;;10151:2:1;21398:80:0;;;10133:21:1;10190:2;10170:18;;;10163:30;10229:25;10209:18;;;10202:53;10272:18;;21398:80:0;9949:347:1;21398:80:0;21519:13;;-1:-1:-1;;;;;21513:19:0;;;21519:13;;21513:19;:53;;;;-1:-1:-1;21550:15:0;;-1:-1:-1;;;;;21536:30:0;;;21550:15;;21536:30;;21513:53;:82;;;;-1:-1:-1;;;;;;21571:24:0;;;;;;:18;:24;;;;;;;;21570:25;21513:82;21510:217;;;21666:12;;21656:6;:22;;21648:63;;;;-1:-1:-1;;;21648:63:0;;12002:2:1;21648:63:0;;;11984:21:1;12041:2;12021:18;;;12014:30;12080;12060:18;;;12053:58;12128:18;;21648:63:0;11800:352:1;21648:63:0;21771:13;;-1:-1:-1;;;;;21765:19:0;;;21771:13;;21765:19;:72;;;;-1:-1:-1;21821:15:0;;-1:-1:-1;;;;;21805:32:0;;;21821:15;;21805:32;;21765:72;:118;;;;-1:-1:-1;;;;;;21859:24:0;;;;;;:18;:24;;;;;;;;21858:25;21765:118;21743:237;;;21928:2;21918:7;:12;21963:1;21949:11;:15;21743:237;22068:9;;22089:12;;22068:18;;16559:1;22068:13;:18::i;:::-;:33;:58;;;;-1:-1:-1;22113:13:0;;-1:-1:-1;;;;;22105:21:0;;;22113:13;;22105:21;22068:58;22064:114;;;22157:3;22147:7;:13;22064:114;22194:28;22225:26;22245:4;22225:11;:26::i;:::-;22305:19;;22194:57;;-1:-1:-1;22281:43:0;;;;;;;22357:18;;-1:-1:-1;22369:6:0;;-1:-1:-1;;;22369:6:0;;;;22368:7;22357:18;:43;;;;-1:-1:-1;22387:13:0;;-1:-1:-1;;;;;22379:21:0;;;22387:13;;22379:21;;22357:43;:58;;;;-1:-1:-1;22404:11:0;;-1:-1:-1;;;22404:11:0;;;;22357:58;:75;;;;;22419:13;:11;:13::i;:::-;22353:434;;;22544:34;22561:16;;22544;:34::i;:::-;22626:21;22670:22;;22666:106;;22717:35;22730:21;22717:12;:35::i;:::-;22434:353;22353:434;20799:1999;;20680:2238;;;22905:1;22895:7;:11;20680:2238;22930:32;22945:4;22951:2;22955:6;22930:14;:32::i;9956:224::-;10076:7;10112:12;10104:6;;;;10096:29;;;;-1:-1:-1;;;10096:29:0;;;;;;;;:::i;:::-;-1:-1:-1;10136:9:0;10148:5;10152:1;10148;:5;:::i;35158:163::-;35199:7;35220:15;35237;35256:19;:17;:19::i;:::-;35219:56;;-1:-1:-1;35219:56:0;-1:-1:-1;35293:20:0;35219:56;;35293:11;:20::i;:::-;35286:27;;;;35158:163;:::o;13281:527::-;13396:16;;;13410:1;13396:16;;;;;;;;13357:3;;13329:18;;13396:16;13410:1;13396:16;;;;;;;;;;-1:-1:-1;13396:16:0;13372:40;;13433:3;13423:4;13428:1;13423:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13423:13:0;;;:7;;;;;;;;;;:13;;;;13457:7;;:14;;;-1:-1:-1;;;13457:14:0;;;;:7;;;;;:12;;:14;;;;;13423:7;;13457:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13447:4;13452:1;13447:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13447:24:0;;;:7;;;;;;;;;:24;13504:36;;-1:-1:-1;;;13504:36:0;;13534:4;13504:36;;;3233:51:1;13482:19:0;;13504:21;;;;;3206:18:1;;13504:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13579:7;;13551:50;;-1:-1:-1;;;13551:50:0;;-1:-1:-1;;;;;13579:7:0;;;13551:50;;;3778:51:1;3845:18;;;3838:34;;;13482:58:0;;-1:-1:-1;13551:19:0;;;;;3751:18:1;;13551:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;13612:7:0;;:188;;-1:-1:-1;;;13612:188:0;;-1:-1:-1;;;;;13612:7:0;;;;:58;;:188;;13685:11;;13612:7;;13727:4;;13754;;13774:15;;13612:188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13318:490;;;13281:527;:::o;26951:220::-;-1:-1:-1;;;;;27028:13:0;;27005:7;27028:13;;;:8;:13;;;;;;27045:12;27028:29;27025:139;;;-1:-1:-1;;;;;;27081:15:0;;;;;:10;:15;;;;;;;26951:220::o;27025:139::-;27136:16;27148:3;27136:11;:16::i;9812:136::-;9870:7;9897:43;9901:1;9904;9897:43;;;;;;;;;;;;;;;;;:3;:43::i;2654:317::-;2769:6;2744:21;:31;;2736:73;;;;-1:-1:-1;;;2736:73:0;;7848:2:1;2736:73:0;;;7830:21:1;7887:2;7867:18;;;7860:30;7926:31;7906:18;;;7899:59;7975:18;;2736:73:0;7646:353:1;2736:73:0;2823:12;2841:9;-1:-1:-1;;;;;2841:14:0;2863:6;2841:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2822:52;;;2893:7;2885:78;;;;-1:-1:-1;;;2885:78:0;;7421:2:1;2885:78:0;;;7403:21:1;7460:2;7440:18;;;7433:30;7499:34;7479:18;;;7472:62;7570:28;7550:18;;;7543:56;7616:19;;2885:78:0;7219:422:1;10188:246:0;10246:7;10270:6;10266:47;;-1:-1:-1;10300:1:0;10293:8;;10266:47;10323:9;10335:5;10339:1;10335;:5;:::i;:::-;10323:17;-1:-1:-1;10368:1:0;10359:5;10363:1;10323:17;10359:5;:::i;:::-;:10;10351:56;;;;-1:-1:-1;;;10351:56:0;;8562:2:1;10351:56:0;;;8544:21:1;8601:2;8581:18;;;8574:30;8640:34;8620:18;;;8613:62;-1:-1:-1;;;8691:18:1;;;8684:31;8732:19;;10351:56:0;8360:397:1;27181:184:0;-1:-1:-1;;;;;27261:16:0;;27237:7;27261:16;;;:11;:16;;;;;;;;27257:41;;;-1:-1:-1;;;;;;27286:12:0;;;;;:7;:12;;;;;;;27181:184::o;27257:41::-;-1:-1:-1;;;;;27336:12:0;;;;;;:7;:12;;;;;;27316:33;;:19;:33::i;23083:483::-;17572:6;:13;;-1:-1:-1;;;;17572:13:0;-1:-1:-1;;;17572:13:0;;;23185:16:::1;::::0;;23199:1:::1;23185:16:::0;;;;;::::1;::::0;;-1:-1:-1;;23185:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;23185:16:0::1;23161:40;;23230:4;23212;23217:1;23212:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23212:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;23256:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;23256:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;23212:7;;23256:22;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23246:4;23251:1;23246:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23246:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;23321:15:::1;::::0;23289:62:::1;::::0;23306:4:::1;::::0;23321:15:::1;23339:11:::0;23289:8:::1;:62::i;:::-;23362:15;::::0;:196:::1;::::0;-1:-1:-1;;;23362:196:0;;-1:-1:-1;;;;;23362:15:0;;::::1;::::0;:66:::1;::::0;:196:::1;::::0;23443:11;;23362:15:::1;::::0;23485:4;;23512::::1;::::0;23532:15:::1;::::0;23362:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17608:6:0;:14;;-1:-1:-1;;;;17608:14:0;;;-1:-1:-1;;;;23083:483:0:o;23572:486::-;23774:15;;23756:78;;-1:-1:-1;;;;;23774:15:0;23791:42;16959:2;23791:24;:6;16905:1;23791:10;:24::i;:42::-;23756:17;:78::i;:::-;23883:15;;23865:72;;-1:-1:-1;;;;;23883:15:0;23900:36;16959:2;23900:18;:6;16857:1;23900:10;:18::i;23865:72::-;23991:15;;23973:77;;-1:-1:-1;;;;;23991:15:0;24008:41;16959:2;24008:23;:6;16815:1;24008:10;:23::i;10582:223::-;10702:7;10737:12;10730:5;10722:28;;;;-1:-1:-1;;;10722:28:0;;;;;;;;:::i;:::-;-1:-1:-1;10761:9:0;10773:5;10777:1;10773;:5;:::i;9625:179::-;9683:7;;9715:5;9719:1;9715;:5;:::i;:::-;9703:17;;9744:1;9739;:6;;9731:46;;;;-1:-1:-1;;;9731:46:0;;6709:2:1;9731:46:0;;;6691:21:1;6748:2;6728:18;;;6721:30;6787:29;6767:18;;;6760:57;6834:18;;9731:46:0;6507:351:1;25560:152:0;25605:4;25698:6;25685:9;:19;;25678:26;;25560:152;:::o;27839:698::-;-1:-1:-1;;;;;27937:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;27961:22:0;;;;;;:11;:22;;;;;;;;27960:23;27937:46;27933:597;;;28000:48;28022:6;28030:9;28041:6;28000:21;:48::i;27933:597::-;-1:-1:-1;;;;;28071:19:0;;;;;;:11;:19;;;;;;;;28070:20;:46;;;;-1:-1:-1;;;;;;28094:22:0;;;;;;:11;:22;;;;;;;;28070:46;28066:464;;;28133:46;28153:6;28161:9;28172:6;28133:19;:46::i;28066:464::-;-1:-1:-1;;;;;28202:19:0;;;;;;:11;:19;;;;;;;;28201:20;:47;;;;-1:-1:-1;;;;;;28226:22:0;;;;;;:11;:22;;;;;;;;28225:23;28201:47;28197:333;;;28265:44;28283:6;28291:9;28302:6;28265:17;:44::i;28197:333::-;-1:-1:-1;;;;;28331:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;28354:22:0;;;;;;:11;:22;;;;;;;;28331:45;28327:203;;;28393:48;28415:6;28423:9;28434:6;28393:21;:48::i;28327:203::-;28474:44;28492:6;28500:9;28511:6;28474:17;:44::i;35329:561::-;35426:7;;35379;;;;16021:21;35379:7;35486:289;35510:9;:16;35506:20;;35486:289;;;35576:7;35552;:21;35560:9;35570:1;35560:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35560:12:0;35552:21;;;;;;;;;;;;;:31;;:66;;;35611:7;35587;:21;35595:9;35605:1;35595:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35595:12:0;35587:21;;;;;;;;;;;;;:31;35552:66;35548:97;;;-1:-1:-1;;35628:7:0;;;16021:21;;-1:-1:-1;35329:561:0;-1:-1:-1;;35329:561:0:o;35548:97::-;35670:34;35682:7;:21;35690:9;35700:1;35690:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35690:12:0;35682:21;;;;;;;;;;;;;35670:7;;:11;:34::i;:::-;35660:44;;35729:34;35741:7;:21;35749:9;35759:1;35749:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35749:12:0;35741:21;;;;;;;;;;;;;35729:7;;:11;:34::i;:::-;35719:44;-1:-1:-1;35528:3:0;;;;:::i;:::-;;;;35486:289;;;-1:-1:-1;35799:7:0;;:20;;16021:21;35799:11;:20::i;:::-;35789:7;:30;35785:61;;;-1:-1:-1;;35829:7:0;;;16021:21;;-1:-1:-1;35329:561:0;-1:-1:-1;35329:561:0:o;35785:61::-;35865:7;;35874;;-1:-1:-1;35329:561:0;-1:-1:-1;35329:561:0:o;31113:1298::-;31218:9;;31240:12;;31218:18;;16559:1;31218:13;:18::i;:::-;:34;;:61;;;;-1:-1:-1;31266:13:0;;-1:-1:-1;;;;;31256:23:0;;;31266:13;;31256:23;31218:61;31215:1189;;;31372:1;31406:7;31346:23;31444:28;31406:7;31372:1;31444:11;:28::i;:::-;-1:-1:-1;;;;;31536:19:0;;;;;;:8;:19;;;;;;;;31558:12;31536:34;;31609:7;:18;;;;;;31428:44;;-1:-1:-1;31609:31:0;;31632:7;31609:22;:31::i;:::-;-1:-1:-1;;;;;31585:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;31710:15;;;;;:7;:15;;;;;:28;;31730:7;31710:19;:28::i;:::-;-1:-1:-1;;;;;31692:15:0;;;;;;;:7;:15;;;;;;:46;;;;31774:18;;;;;;;:39;;31797:15;31774:22;:39::i;:::-;-1:-1:-1;;;;;31753:18:0;;;;;;:7;:18;;;;;:60;31828:17;31839:5;31828:10;:17::i;:::-;31882:9;-1:-1:-1;;;;;31865:44:0;31874:6;-1:-1:-1;;;;;31865:44:0;;31893:15;31865:44;;;;12303:25:1;;12291:2;12276:18;;12157:177;31865:44:0;;;;;;;;31281:642;;;13919:293:::1;;13816:396:::0;:::o;31215:1189::-;31941:15;31958:23;31983:12;31997:23;32022:12;32036:18;32058:19;32069:7;32058:10;:19::i;:::-;-1:-1:-1;;;;;32106:15:0;;;;;;:7;:15;;;;;;31940:137;;-1:-1:-1;31940:137:0;;-1:-1:-1;31940:137:0;;-1:-1:-1;31940:137:0;-1:-1:-1;31940:137:0;-1:-1:-1;31940:137:0;-1:-1:-1;32106:28:0;;32126:7;32106:19;:28::i;:::-;-1:-1:-1;;;;;32088:15:0;;;;;;:7;:15;;;;;;;;:46;;;;32163:7;:15;;;;:28;;32183:7;32163:19;:28::i;:::-;-1:-1:-1;;;;;32145:15:0;;;;;;;:7;:15;;;;;;:46;;;;32223:18;;;;;;;:39;;32246:15;32223:22;:39::i;:::-;-1:-1:-1;;;;;32202:18:0;;;;;;:7;:18;;;;;:60;32276:22;32287:10;32276;:22::i;:::-;32309:23;32321:4;32327;32309:11;:23::i;:::-;32365:9;-1:-1:-1;;;;;32348:44:0;32357:6;-1:-1:-1;;;;;32348:44:0;;32376:15;32348:44;;;;12303:25:1;;12291:2;12276:18;;12157:177;32348:44:0;;;;;;;;31929:475;;;;;;31113:1298;;;:::o;29787:1318::-;29890:9;;29912:12;;29890:18;;16559:1;29890:13;:18::i;:::-;:34;;:61;;;;-1:-1:-1;29938:13:0;;-1:-1:-1;;;;;29928:23:0;;;29938:13;;29928:23;29890:61;29887:1211;;;30044:1;30078:7;30018:23;30116:28;30078:7;30044:1;30116:11;:28::i;29887:1211::-;30613:15;30630:23;30655:12;30669:23;30694:12;30708:18;30730:19;30741:7;30730:10;:19::i;:::-;-1:-1:-1;;;;;30778:15:0;;;;;;:7;:15;;;;;;30612:137;;-1:-1:-1;30612:137:0;;-1:-1:-1;30612:137:0;;-1:-1:-1;30612:137:0;-1:-1:-1;30612:137:0;-1:-1:-1;30612:137:0;-1:-1:-1;30778:28:0;;30612:137;30778:19;:28::i;:::-;-1:-1:-1;;;;;30760:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;30838:18;;;;;:7;:18;;;;;:39;;30861:15;30838:22;:39::i;:::-;-1:-1:-1;;;;;30817:18:0;;;;;;:7;:18;;;;;;;;:60;;;;30909:7;:18;;;;:39;;30932:15;30909:22;:39::i;28545:1234::-;28646:9;;28668:12;;28646:18;;16559:1;28646:13;:18::i;:::-;:34;;:61;;;;-1:-1:-1;28694:13:0;;-1:-1:-1;;;;;28684:23:0;;;28694:13;;28684:23;28646:61;28643:1129;;;28800:1;28834:7;28774:23;28872:28;28834:7;28800:1;28872:11;:28::i;28643:1129::-;29369:15;29386:23;29411:12;29425:23;29450:12;29464:18;29486:19;29497:7;29486:10;:19::i;:::-;-1:-1:-1;;;;;29534:15:0;;;;;;:7;:15;;;;;;29368:137;;-1:-1:-1;29368:137:0;;-1:-1:-1;29368:137:0;;-1:-1:-1;29368:137:0;-1:-1:-1;29368:137:0;-1:-1:-1;29368:137:0;-1:-1:-1;29534:28:0;;29368:137;29534:19;:28::i;32419:1374::-;32524:9;;32546:12;;32524:18;;16559:1;32524:13;:18::i;:::-;:34;;:61;;;;-1:-1:-1;32572:13:0;;-1:-1:-1;;;;;32562:23:0;;;32572:13;;32562:23;32524:61;32521:1265;;;32678:1;32712:7;32652:23;32750:28;32712:7;32678:1;32750:11;:28::i;32521:1265::-;33247:15;33264:23;33289:12;33303:23;33328:12;33342:18;33364:19;33375:7;33364:10;:19::i;:::-;-1:-1:-1;;;;;33412:15:0;;;;;;:7;:15;;;;;;33246:137;;-1:-1:-1;33246:137:0;;-1:-1:-1;33246:137:0;;-1:-1:-1;33246:137:0;-1:-1:-1;33246:137:0;-1:-1:-1;33246:137:0;-1:-1:-1;33412:28:0;;33432:7;33412:19;:28::i;:::-;-1:-1:-1;;;;;33394:15:0;;;;;;:7;:15;;;;;;;;:46;;;;33469:7;:15;;;;:28;;33489:7;33469:19;:28::i;36365:351::-;36424:19;36447:10;:8;:10::i;:::-;36424:33;-1:-1:-1;36468:18:0;36489:27;:10;36424:33;36489:14;:27::i;:::-;36568:4;36552:22;;;;:7;:22;;;;;;36468:48;;-1:-1:-1;36552:38:0;;36468:48;36552:26;:38::i;:::-;36543:4;36527:22;;;;:7;:22;;;;;;;;:63;;;;36604:11;:26;;;;;;36601:107;;;36686:4;36670:22;;;;:7;:22;;;;;;:38;;36697:10;36670:26;:38::i;:::-;36661:4;36645:22;;;;:7;:22;;;;;:63;36413:303;;36365:351;:::o;33956:419::-;34015:7;34024;34033;34042;34051;34060;34081:23;34106:12;34120:18;34142:20;34154:7;34142:11;:20::i;:::-;34080:82;;;;;;34174:15;34191:23;34216:12;34232:50;34244:7;34253:4;34259:10;34271;:8;:10::i;:::-;34232:11;:50::i;:::-;34173:109;;;;-1:-1:-1;34173:109:0;;-1:-1:-1;34333:15:0;;-1:-1:-1;34350:4:0;;-1:-1:-1;34356:10:0;;-1:-1:-1;33956:419:0;;-1:-1:-1;;;;;33956:419:0:o;33801:147::-;33879:7;;:17;;33891:4;33879:11;:17::i;:::-;33869:7;:27;33920:10;;:20;;33935:4;33920:14;:20::i;:::-;33907:10;:33;-1:-1:-1;;33801:147:0:o;34383:330::-;34443:7;34452;34461;34481:12;34496:28;34516:7;34496:19;:28::i;:::-;34481:43;;34535:18;34556:26;34574:7;34556:17;:26::i;:::-;34535:47;-1:-1:-1;34593:23:0;34619:33;34535:47;34619:17;:7;34631:4;34619:11;:17::i;:::-;:21;;:33::i;:::-;34593:59;34688:4;;-1:-1:-1;34694:10:0;;-1:-1:-1;34383:330:0;;-1:-1:-1;;;34383:330:0:o;34721:429::-;34836:7;;;;34892:24;:7;34904:11;34892;:24::i;:::-;34874:42;-1:-1:-1;34927:12:0;34942:21;:4;34951:11;34942:8;:21::i;:::-;34927:36;-1:-1:-1;34974:18:0;34995:27;:10;35010:11;34995:14;:27::i;:::-;34974:48;-1:-1:-1;35033:23:0;35059:33;34974:48;35059:17;:7;35071:4;35059:11;:17::i;:33::-;35111:7;;;;-1:-1:-1;35137:4:0;;-1:-1:-1;34721:429:0;;-1:-1:-1;;;;;;;34721:429:0:o;35898:160::-;35966:7;35993:57;36036:3;35993:24;36005:11;;35993:7;:11;;:24;;;;:::i;36066:154::-;36132:7;36159:53;36198:3;36159:20;36171:7;;36159;:11;;:20;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:52;;;1521:1;1518;1511:12;1473:52;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1376:315:1:o;1696:241::-;1752:6;1805:2;1793:9;1784:7;1780:23;1776:32;1773:52;;;1821:1;1818;1811:12;1773:52;1860:9;1847:23;1879:28;1901:5;1879:28;:::i;1942:245::-;2009:6;2062:2;2050:9;2041:7;2037:23;2033:32;2030:52;;;2078:1;2075;2068:12;2030:52;2110:9;2104:16;2129:28;2151:5;2129:28;:::i;2192:180::-;2251:6;2304:2;2292:9;2283:7;2279:23;2275:32;2272:52;;;2320:1;2317;2310:12;2272:52;-1:-1:-1;2343:23:1;;2192:180;-1:-1:-1;2192:180:1:o;2377:184::-;2447:6;2500:2;2488:9;2479:7;2475:23;2471:32;2468:52;;;2516:1;2513;2506:12;2468:52;-1:-1:-1;2539:16:1;;2377:184;-1:-1:-1;2377:184:1:o;2566:306::-;2654:6;2662;2670;2723:2;2711:9;2702:7;2698:23;2694:32;2691:52;;;2739:1;2736;2729:12;2691:52;2768:9;2762:16;2752:26;;2818:2;2807:9;2803:18;2797:25;2787:35;;2862:2;2851:9;2847:18;2841:25;2831:35;;2566:306;;;;;:::o;4687:597::-;4799:4;4828:2;4857;4846:9;4839:21;4889:6;4883:13;4932:6;4927:2;4916:9;4912:18;4905:34;4957:1;4967:140;4981:6;4978:1;4975:13;4967:140;;;5076:14;;;5072:23;;5066:30;5042:17;;;5061:2;5038:26;5031:66;4996:10;;4967:140;;;5125:6;5122:1;5119:13;5116:91;;;5195:1;5190:2;5181:6;5170:9;5166:22;5162:31;5155:42;5116:91;-1:-1:-1;5268:2:1;5247:15;-1:-1:-1;;5243:29:1;5228:45;;;;5275:2;5224:54;;4687:597;-1:-1:-1;;;4687:597:1:o;8762:356::-;8964:2;8946:21;;;8983:18;;;8976:30;9042:34;9037:2;9022:18;;9015:62;9109:2;9094:18;;8762:356::o;9533:411::-;9735:2;9717:21;;;9774:2;9754:18;;;9747:30;9813:34;9808:2;9793:18;;9786:62;-1:-1:-1;;;9879:2:1;9864:18;;9857:45;9934:3;9919:19;;9533:411::o;12339:980::-;12601:4;12649:3;12638:9;12634:19;12680:6;12669:9;12662:25;12706:2;12744:6;12739:2;12728:9;12724:18;12717:34;12787:3;12782:2;12771:9;12767:18;12760:31;12811:6;12846;12840:13;12877:6;12869;12862:22;12915:3;12904:9;12900:19;12893:26;;12954:2;12946:6;12942:15;12928:29;;12975:1;12985:195;12999:6;12996:1;12993:13;12985:195;;;13064:13;;-1:-1:-1;;;;;13060:39:1;13048:52;;13155:15;;;;13120:12;;;;13096:1;13014:9;12985:195;;;-1:-1:-1;;;;;;;13236:32:1;;;;13231:2;13216:18;;13209:60;-1:-1:-1;;;13300:3:1;13285:19;13278:35;13197:3;12339:980;-1:-1:-1;;;12339:980:1:o;13513:128::-;13553:3;13584:1;13580:6;13577:1;13574:13;13571:39;;;13590:18;;:::i;:::-;-1:-1:-1;13626:9:1;;13513:128::o;13646:217::-;13686:1;13712;13702:132;;13756:10;13751:3;13747:20;13744:1;13737:31;13791:4;13788:1;13781:15;13819:4;13816:1;13809:15;13702:132;-1:-1:-1;13848:9:1;;13646:217::o;13868:168::-;13908:7;13974:1;13970;13966:6;13962:14;13959:1;13956:21;13951:1;13944:9;13937:17;13933:45;13930:71;;;13981:18;;:::i;:::-;-1:-1:-1;14021:9:1;;13868:168::o;14041:125::-;14081:4;14109:1;14106;14103:8;14100:34;;;14114:18;;:::i;:::-;-1:-1:-1;14151:9:1;;14041:125::o;14171:135::-;14210:3;-1:-1:-1;;14231:17:1;;14228:43;;;14251:18;;:::i;:::-;-1:-1:-1;14298:1:1;14287:13;;14171:135::o;14311:127::-;14372:10;14367:3;14363:20;14360:1;14353:31;14403:4;14400:1;14393:15;14427:4;14424:1;14417:15;14443:127;14504:10;14499:3;14495:20;14492:1;14485:31;14535:4;14532:1;14525:15;14559:4;14556:1;14549:15;14575:127;14636:10;14631:3;14627:20;14624:1;14617:31;14667:4;14664:1;14657:15;14691:4;14688:1;14681:15;14839:131;-1:-1:-1;;;;;14914:31:1;;14904:42;;14894:70;;14960:1;14957;14950:12;14975:118;15061:5;15054:13;15047:21;15040:5;15037:32;15027:60;;15083:1;15080;15073:12

Swarm Source

ipfs://4e7537f9c9570a255a99aa157ea577a0d2a33b0b83384845098300678eeae1af
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.