ETH Price: $2,269.22 (+2.36%)

Token

MUSK (MUSK)
 

Overview

Max Total Supply

100,000,000 MUSK

Holders

39

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000000001 MUSK

Value
$0.00
0x54044f5b0b95ad7f93dbe6a1045880759397d924
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:
MUSK

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-21
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

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

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

    function tryMul(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

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

    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                0,
                "Address: low-level call failed"
            );
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

    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"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(
        bytes memory returndata,
        string memory errorMessage
    ) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

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

    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(
            nonceAfter == nonceBefore + 1,
            "SafeERC20: permit did not succeed"
        );
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

abstract contract Auth {
    address public owner;
    mapping(address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }

    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED");
        _;
    }

    function authorize(address adr) public authorized {
        authorizations[adr] = true;
    }

    function unauthorize(address adr) public authorized {
        authorizations[adr] = false;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    function transferOwnership(address payable adr) public authorized {
        require(adr != address(0), "Zero Address");
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);
    }

    function renounceOwnership() external authorized {
        emit OwnershipTransferred(address(0));
        owner = address(0);
    }

    event OwnershipTransferred(address owner);
}

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

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

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

    function WETH() external pure returns (address);

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

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

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

interface IPair {
    function sync() external;
}

interface IWeth {
    function deposit() external payable;
}

contract MUSK is IERC20, Auth {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    string private constant _name = "MUSK";
    string private constant _symbol = "MUSK";

    uint8 private constant _decimals = 9;
    uint256 private constant _totalSupply = 100_000_000_000_000_000;

    mapping(address => uint256) _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) _isBot;
    mapping(address => bool) isWhitelisted;
    mapping(address => bool) isBlacklisted;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _maxTxAmount = (_totalSupply * 10000) / 10000;
    uint256 public _maxWalletAmount = (_totalSupply * 10000) / 10000;

    IRouter public immutable router;
    address public immutable pair;
    bool tradingEnabled = false;
    uint256 startedTime;

    uint256 constant feeDenominator = 10000;

    struct Fee {
        uint256 marketingFee;
        uint256 burnFee;
        uint256 liquidFee;
        uint256 totalFee;
    }

    enum TransactionType {
        BUY,
        SELL,
        TRANSFER
    }

    mapping(TransactionType => Fee) public fees;

    bool swapAndLiquifyEnabled = false;
    uint256 swapTimes;
    uint256 minTransactionsBeforeSwap = 7;
    bool swapping;
    bool antiBotEnabled = true;

    uint256 swapThreshold = (_totalSupply * 300) / 100000;
    uint256 _minTokenAmount = (_totalSupply * 15) / 100000;

    uint256 marketing_divisor = 0;
    uint256 liquidity_divisor = 100;
    uint256 total_divisor = 100;

    address liquidity_receiver;
    address staking_receiver;
    address marketing_receiver;

    event FeesUpdated(
        TransactionType indexed transactionType,
        uint256 burnFee,
        uint256 marketingFee,
        uint256 swapAndLiquifyFee
    );
    event FeesAddressesUpdated(
        address marketing,
        address liquidity,
        address staking
    );
    event ForceAdjustedLP(bool indexed musk, uint256 amount, bool indexed add);
    event TokensAirdroped(
        address indexed sender,
        uint256 length,
        uint256 airdropedAmount
    );
    event WhitelistUpdated(address indexed account, bool indexed whitelisted);
    event BotUpdated(address indexed account, bool indexed isBot);
    event BlacklistedUpdated(address indexed account, bool indexed blacklisted);
    event AntiBotStateUpdated(bool indexed enabled);
    event TradingEnabled();
    event TradingDisabled();
    event SwapBackSettingsUpdated(
        bool indexed enabled,
        uint256 threshold,
        uint256 minLimit,
        uint256 _minTransactions
    );
    event MaxLimitsUpdated(uint256 maxTxAmount, uint256 maxWalletAmount);
    event UnsupportedTokensRecoverd(
        address indexed token,
        address receiver,
        uint256 amount
    );
    event DivisorsUpdated(uint256 liquidity, uint256 marketing);

    modifier lockTheSwap() {
        swapping = true;
        _;
        swapping = false;
    }

    constructor() Auth(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // eth - 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        address _pair = IFactory(_router.factory()).createPair(
            address(this),
            _router.WETH()
        );
        router = _router;
        pair = _pair;

        // initilasing Fees
        fees[TransactionType.SELL] = Fee(200, 0, 0, 0);
        fees[TransactionType.BUY] = Fee(200, 0, 0, 0);
        fees[TransactionType.TRANSFER] = Fee(0, 0, 0, 0);

        isBlacklisted[address(0)] = true;

        isWhitelisted[msg.sender] = true;
        isWhitelisted[address(this)] = true;

        liquidity_receiver = address(this);
        staking_receiver = msg.sender;
        marketing_receiver = msg.sender;

        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

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

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

    function isBot(address _address) public view returns (bool) {
        return _isBot[_address];
    }

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

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

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

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

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD));
    }

    function whitelistAddress(
        address _address,
        bool _whitelist
    ) external authorized {
        require(isWhitelisted[_address] != _whitelist, "Already set");
        isWhitelisted[_address] = _whitelist;

        emit WhitelistUpdated(_address, _whitelist);
    }

    function blacklistAddress(
        address _address,
        bool _blacklist
    ) external authorized {
        require(isBlacklisted[_address] != _blacklist, "Already set");
        isBlacklisted[_address] = _blacklist;

        emit BlacklistedUpdated(_address, _blacklist);
    }

    function updateBot(address _address, bool isBot_) external authorized {
        require(_isBot[_address] != isBot_, "Already set");
        _isBot[_address] = isBot_;

        emit BotUpdated(_address, isBot_);
    }

    function enableAntiBot(bool _enable) external authorized {
        require(antiBotEnabled != _enable, "Already set");
        antiBotEnabled = _enable;

        emit AntiBotStateUpdated(_enable);
    }

    function enableTrading(uint256 _input) external authorized {
        require(!tradingEnabled, "Already Enabled!");
        tradingEnabled = true;
        if (startedTime == 0)
            // initialise only once
            startedTime = block.timestamp.add(_input);

        emit TradingEnabled();
    }

    function updateSwapBackSettings(
        bool _enabled,
        uint256 _threshold,
        uint256 _minLimit,
        uint256 _minTransactionsBeforeSwap
    ) external authorized {
        swapAndLiquifyEnabled = _enabled;
        swapThreshold = _threshold;
        _minTokenAmount = _minLimit;
        minTransactionsBeforeSwap = _minTransactionsBeforeSwap;

        emit SwapBackSettingsUpdated(
            _enabled,
            _threshold,
            _minLimit,
            _minTransactionsBeforeSwap
        );
    }

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

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            msg.sender,
            spender,
            allowance(msg.sender, spender) + addedValue
        );
        return true;
    }

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

        return true;
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        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 _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        preTxCheck(sender, recipient, amount);

        bool takeFee = true;
        if (isWhitelisted[sender] || isWhitelisted[recipient]) {
            takeFee = false;
        } else {
            require(tradingEnabled, "Trading is Paused");
            require(
                amount <= _maxTxAmount,
                "Transfer amount exceeds the maxTxAmount."
            );
            if (recipient != pair) {
                require(
                    _balances[recipient] + amount <= _maxWalletAmount,
                    "Wallet amount exceeds limit"
                );
            }
        }

        TransactionType transactionType;

        if (sender == pair) {
            transactionType = TransactionType.BUY;
            if (
                recipient != address(router) && block.timestamp <= startedTime
            ) {
                _isBot[recipient] = true;
            }
        } else if (recipient == pair) {
            transactionType = TransactionType.SELL;
        } else {
            transactionType = TransactionType.TRANSFER;
        }

        swapTimes = swapTimes.add(1);
        if (shouldSwapBack(sender, amount)) {
            swapAndLiquify(swapThreshold);
            swapTimes = 0;
        }

        _balances[sender] = _balances[sender].sub(amount);
        uint256 amountReceived = takeFee
            ? takeTotalFee(sender, amount, transactionType)
            : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
    }

    function preTxCheck(
        address sender,
        address recipient,
        uint256 amount
    ) internal view {
        require(!isBlacklisted[sender], "Blackisted");
        require(!isBlacklisted[recipient], "Blackisted");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            amount <= balanceOf(sender),
            "You are trying to transfer more than your balance"
        );
    }

    function takeTotalFee(
        address sender,
        uint256 amount,
        TransactionType transactionType
    ) internal returns (uint256) {
        Fee memory fee = fees[transactionType];
        uint256 totalFees = _isBot[sender] && antiBotEnabled
            ? (feeDenominator - 100)
            : fee.totalFee; // 99% fees if bot
        if (totalFees == 0) {
            return amount;
        }
        uint256 feeAmount = (amount.mul(totalFees)).div(feeDenominator);
        uint256 burnAmount = (feeAmount.mul(fee.burnFee)).div(totalFees);
        uint256 marketingAmount = (feeAmount.mul(fee.marketingFee)).div(
            totalFees
        );

        uint256 liquidAmount = feeAmount.sub(burnAmount).sub(marketingAmount);

        if (burnAmount > 0) {
            _balances[address(DEAD)] = _balances[address(DEAD)].add(burnAmount);
            emit Transfer(sender, address(DEAD), burnAmount);
        }
        if (marketingAmount > 0) {
            _balances[address(staking_receiver)] = _balances[
                address(staking_receiver)
            ].add(marketingAmount);
            emit Transfer(sender, address(staking_receiver), marketingAmount);
        }
        if (liquidAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(
                liquidAmount
            );
            emit Transfer(sender, address(this), liquidAmount);
        }
        return amount.sub(feeAmount);
    }

    function updateMaxLimits(
        uint256 _transaction,
        uint256 _wallet
    ) external authorized {
        require(
            _transaction >= 1,
            "Max txn limit cannot be less than 0.00001%"
        );
        require(_wallet >= 500000, "Max Wallet limit cannot be less than 5%");
        uint256 newTxLimit = (_totalSupply * _transaction) / 10000000;
        uint256 newWalletLimit = (_totalSupply * _wallet) / 10000000;
        _maxTxAmount = newTxLimit;
        _maxWalletAmount = newWalletLimit;

        emit MaxLimitsUpdated(_maxTxAmount, _maxWalletAmount);
    }

    function updateFee(
        TransactionType transactionType,
        uint256 _burnFee,
        uint256 _marketingFee,
        uint256 _swapAndLiquifyFee
    ) external authorized {
        require(
            _burnFee.add(_marketingFee).add(_swapAndLiquifyFee) <=
                feeDenominator.mul(3).div(20),
            "Tax cannot be more than 15%"
        );
        Fee storage fee = fees[transactionType];
        fee.burnFee = _burnFee;
        fee.marketingFee = _marketingFee;
        fee.liquidFee = _swapAndLiquifyFee;
        fee.totalFee = _burnFee.add(_marketingFee).add(_swapAndLiquifyFee);

        emit FeesUpdated(
            transactionType,
            _burnFee,
            _marketingFee,
            _swapAndLiquifyFee
        );
    }

    function updateFeesAddresses(
        address _marketing,
        address _liquidity,
        address _staking
    ) external authorized {
        require(_marketing != address(0), "Zero Address");
        require(_liquidity != address(0), "Zero Address");
        require(_staking != address(0), "Zero Address");
        marketing_receiver = _marketing;
        liquidity_receiver = _liquidity;
        staking_receiver = _staking;

        emit FeesAddressesUpdated(_marketing, _liquidity, _staking);
    }

    function shouldSwapBack(
        address sender,
        uint256 amount
    ) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return
            !swapping &&
            swapAndLiquifyEnabled &&
            aboveMin &&
            swapTimes >= minTransactionsBeforeSwap &&
            aboveThreshold &&
            sender != pair;
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 amountToLiquify = tokens
            .mul(liquidity_divisor)
            .div(total_divisor)
            .div(2);
        uint256 amountToSwap = tokens.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForETH(amountToSwap);

        uint256 deltaBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = total_divisor.sub(liquidity_divisor.div(2));

        if (amountToLiquify > 0) {
            addLiquidity(
                amountToLiquify,
                deltaBalance.mul(liquidity_divisor).div(totalETHFee).div(2)
            );
        }
        // transfer ETH to marketing, teamFunds stay in contract for future distribution.
        transferETH(
            marketing_receiver,
            deltaBalance.mul(marketing_divisor).div(totalETHFee)
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidity_receiver,
            block.timestamp
        );
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function transferETH(address recipient, uint256 amount) private {
        if (amount == 0) return;
        (bool success, ) = payable(recipient).call{value: amount}("");
        require(success, "Unable to send ETH");
    }

    function airdropTokens(
        address[] calldata accounts,
        uint256[] calldata amounts
    ) external authorized {
        uint256 length = accounts.length;
        require(length == amounts.length, "array length mismatched");
        uint256 airdropAmount = 0;

        for (uint256 i = 0; i < length; i++) {
            // updating balance directly instead of calling transfer to save gas
            _balances[accounts[i]] += amounts[i];
            airdropAmount += amounts[i];
            emit Transfer(msg.sender, accounts[i], amounts[i]);
        }
        _balances[msg.sender] -= airdropAmount;

        emit TokensAirdroped(msg.sender, length, airdropAmount);
    }

    function AdjustLP(
        bool musk,
        uint256 amount,
        bool add
    ) external payable authorized {
        if (!musk) {
            require(add, "Cant withdraw bnb from pool");
            amount = msg.value;
            IWeth(router.WETH()).deposit{value: amount}();
            IERC20(router.WETH()).safeTransfer(pair, amount);
        } else {
            if (add) {
                _balances[msg.sender] -= amount;
                _balances[pair] += amount;
                emit Transfer(msg.sender, pair, amount);
            } else {
                _balances[pair] -= amount;
                _balances[msg.sender] += amount;
                emit Transfer(pair, msg.sender, amount);
            }
        }
        IPair(pair).sync();
        emit ForceAdjustedLP(musk, amount, add);
    }

    function recoverUnsupportedTokens(
        address _token,
        address _receiver,
        uint256 _percentage
    ) external authorized {
        uint256 amount = IERC20(_token).balanceOf(address(this));
        uint256 amountToWithdraw = amount.mul(_percentage).div(10000);
        IERC20(_token).safeTransfer(_receiver, amountToWithdraw);

        emit UnsupportedTokensRecoverd(_token, _receiver, amountToWithdraw);
    }

    function updateDivisors(
        uint256 _liquidity,
        uint256 _marketing
    ) external authorized {
        liquidity_divisor = _liquidity;
        marketing_divisor = _marketing;
        total_divisor = _liquidity.add(_marketing);

        emit DivisorsUpdated(_liquidity, _marketing);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AntiBotStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"BlacklistedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isBot","type":"bool"}],"name":"BotUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"DivisorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketing","type":"address"},{"indexed":false,"internalType":"address","name":"liquidity","type":"address"},{"indexed":false,"internalType":"address","name":"staking","type":"address"}],"name":"FeesAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum MUSK.TransactionType","name":"transactionType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapAndLiquifyFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"musk","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"add","type":"bool"}],"name":"ForceAdjustedLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"MaxLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minTransactions","type":"uint256"}],"name":"SwapBackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"airdropedAmount","type":"uint256"}],"name":"TokensAirdroped","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnsupportedTokensRecoverd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[{"internalType":"bool","name":"musk","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"add","type":"bool"}],"name":"AdjustLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropTokens","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":"adr","type":"address"}],"name":"authorize","outputs":[],"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":"_address","type":"address"},{"internalType":"bool","name":"_blacklist","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum MUSK.TransactionType","name":"","type":"uint8"}],"name":"fees","outputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"liquidFee","type":"uint256"},{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"recoverUnsupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"isBot_","type":"bool"}],"name":"updateBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"}],"name":"updateDivisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum MUSK.TransactionType","name":"transactionType","type":"uint8"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_swapAndLiquifyFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"updateFeesAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transaction","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"updateMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_minLimit","type":"uint256"},{"internalType":"uint256","name":"_minTransactionsBeforeSwap","type":"uint256"}],"name":"updateSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelist","type":"bool"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526127106200001b67016345785d8a0000826200057c565b620000279190620005aa565b6007556127106200004167016345785d8a0000826200057c565b6200004d9190620005aa565b6008556009805460ff19908116909155600c805490911690556007600e55600f805461ff001916610100179055620186a06200009467016345785d8a000061012c6200057c565b620000a09190620005aa565b601055620186a0620000bc67016345785d8a0000600f6200057c565b620000c89190620005aa565b601155600060125560646013556064601455348015620000e757600080fd5b50600080546001600160a01b0319163390811782558152600160208181526040808420805460ff1916909317909255815163c45a015560e01b81529151737a250d5630b4cf539739df2c5dacb4c659f2488d9392849263c45a0155926004808401938290030181865afa15801562000163573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001899190620005cd565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fd9190620005cd565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200024b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002719190620005cd565b6001600160a01b03838116608090815290821660a05260408051808301825260c88082526000602080840182815284860183815260608087018581526001808752600b80875298517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5593517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d05591517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d15590517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d2558651808901885294855284830184815285880185815286830186815286805288865296517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765590517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7755517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f785593517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f795585519687018652828752868201838152878701848152948801848152600280865296845297517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba9163455517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916355592517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916365594517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91637557f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8805460ff19908116841790915533808352600587528583208054831685179055308084528684208054909316909417909155601580546001600160a01b031990811690941790556016805484168217905560178054909316811790925581815291845282822067016345785d8a000090819055835190815292519495509390927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef928290030190a35050620005ff565b6000816000190483118215151615620005a557634e487b7160e01b600052601160045260246000fd5b500290565b600082620005c857634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620005e057600080fd5b81516001600160a01b0381168114620005f857600080fd5b9392505050565b60805160a051613200620006a3600039600081816105e40152818161143e0152818161152901528181611574015281816115c9015281816116420152818161168101528181611d4701528181611df701528181611ea6015261223901526000818161072b015281816113660152818161146001528181611e340152818161274d0152818161280601528181612842015281816128bc015261292401526132006000f3fe6080604052600436106102295760003560e01c80637d1db4a511610123578063b9a45aac116100ab578063f2fde38b1161006f578063f2fde38b146106d9578063f319ae77146106f9578063f887ea4014610719578063fac1b9bc1461074d578063fe9fbb801461076d57600080fd5b8063b9a45aac14610646578063dd62ed3e14610666578063ea7b91ec14610686578063eb42f193146106a6578063f0b37c04146106b957600080fd5b806395d89b41116100f257806395d89b4114610235578063a457c2d7146105b2578063a8aa1b31146105d2578063a9059cbb14610606578063b6a5d7de1461062657600080fd5b80637d1db4a51461052457806382aa7c681461053a5780638da5cb5b1461055a5780638e5c3ad31461059257600080fd5b806339264b66116101b15780636b7f8b90116101755780636b7f8b90146104835780636c0a24eb146104a3578063706f6937146104b957806370a08231146104d9578063715018a61461050f57600080fd5b806339264b66146103ca57806339509351146103ea5780633bbac5791461040a57806340005fbe14610443578063455a43961461046357600080fd5b806323b872dd116101f857806323b872dd146102e85780632b112e49146103085780632f54bf6e1461031d578063313ce5671461034c578063357c13541461036857600080fd5b806306fdde0314610235578063095ea7b3146102715780630eefe44b146102a157806318160ddd146102c357600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5060408051808201825260048152634d55534b60e01b602082015290516102689190612bfc565b60405180910390f35b34801561027d57600080fd5b5061029161028c366004612c47565b61078d565b6040519015158152602001610268565b3480156102ad57600080fd5b506102c16102bc366004612c87565b6107a3565b005b3480156102cf57600080fd5b5067016345785d8a00005b604051908152602001610268565b3480156102f457600080fd5b50610291610303366004612cc0565b610905565b34801561031457600080fd5b506102da610928565b34801561032957600080fd5b50610291610338366004612d01565b6000546001600160a01b0391821691161490565b34801561035857600080fd5b5060405160098152602001610268565b34801561037457600080fd5b506103aa610383366004612d1e565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610268565b3480156103d657600080fd5b506102c16103e5366004612cc0565b61096f565b3480156103f657600080fd5b50610291610405366004612c47565b610a6c565b34801561041657600080fd5b50610291610425366004612d01565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561044f57600080fd5b506102c161045e366004612d39565b610a8d565b34801561046f57600080fd5b506102c161047e366004612d92565b610ba8565b34801561048f57600080fd5b506102c161049e366004612dcb565b610c61565b3480156104af57600080fd5b506102da60085481565b3480156104c557600080fd5b506102c16104d4366004612e34565b610cfd565b3480156104e557600080fd5b506102da6104f4366004612d01565b6001600160a01b031660009081526002602052604090205490565b34801561051b57600080fd5b506102c1610f07565b34801561053057600080fd5b506102da60075481565b34801561054657600080fd5b506102c1610555366004612ea0565b610f72565b34801561056657600080fd5b5060005461057a906001600160a01b031681565b6040516001600160a01b039091168152602001610268565b34801561059e57600080fd5b506102c16105ad366004612eb9565b61102e565b3480156105be57600080fd5b506102916105cd366004612c47565b6110ba565b3480156105de57600080fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561061257600080fd5b50610291610621366004612c47565b611134565b34801561063257600080fd5b506102c1610641366004612d01565b611141565b34801561065257600080fd5b506102c1610661366004612d92565b61118d565b34801561067257600080fd5b506102da610681366004612eda565b611246565b34801561069257600080fd5b506102c16106a1366004612f08565b611271565b6102c16106b4366004612f2a565b6112ea565b3480156106c557600080fd5b506102c16106d4366004612d01565b611736565b3480156106e557600080fd5b506102c16106f4366004612d01565b61177c565b34801561070557600080fd5b506102c1610714366004612f08565b611833565b34801561072557600080fd5b5061057a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561075957600080fd5b506102c1610768366004612d92565b6119b1565b34801561077957600080fd5b50610291610788366004612d01565b611a6a565b600061079a338484611a88565b50600192915050565b6107ac33611a6a565b6107d15760405162461bcd60e51b81526004016107c890612f61565b60405180910390fd5b6107e960146107e36127106003611ba4565b90611bb0565b6107fd826107f78686611bbc565b90611bbc565b111561084b5760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e20313525000000000060448201526064016107c8565b6000600b600086600281111561086357610863612f86565b600281111561087457610874612f86565b81526020810191909152604001600020600181018590558381556002810183905590506108a5826107f78686611bbc565b60038201558460028111156108bc576108bc612f86565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b6000610912843384611bc8565b61091d848484611c42565b5060015b9392505050565b61dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc5461096a9067016345785d8a000090611fe7565b905090565b61097833611a6a565b6109945760405162461bcd60e51b81526004016107c890612f61565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156109db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ff9190612f9c565b90506000610a136127106107e38486611ba4565b9050610a296001600160a01b0386168583611ff3565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b891016108f6565b600061079a338484610a7e3388611246565b610a889190612fcb565b611a88565b610a9633611a6a565b610ab25760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b038316610ad85760405162461bcd60e51b81526004016107c890612fe3565b6001600160a01b038216610afe5760405162461bcd60e51b81526004016107c890612fe3565b6001600160a01b038116610b245760405162461bcd60e51b81526004016107c890612fe3565b601780546001600160a01b038581166001600160a01b0319928316811790935560158054868316908416811790915560168054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c9060600160405180910390a1505050565b610bb133611a6a565b610bcd5760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503610c0d5760405162461bcd60e51b81526004016107c890613009565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610c6a33611a6a565b610c865760405162461bcd60e51b81526004016107c890612f61565b801515600f60019054906101000a900460ff16151503610cb85760405162461bcd60e51b81526004016107c890613009565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b610d0633611a6a565b610d225760405162461bcd60e51b81526004016107c890612f61565b82818114610d725760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d61746368656400000000000000000060448201526064016107c8565b6000805b82811015610e9f57848482818110610d9057610d9061302e565b9050602002013560026000898985818110610dad57610dad61302e565b9050602002016020810190610dc29190612d01565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610df19190612fcb565b909155508590508482818110610e0957610e0961302e565b9050602002013582610e1b9190612fcb565b9150868682818110610e2f57610e2f61302e565b9050602002016020810190610e449190612d01565b6001600160a01b0316336000805160206131ab833981519152878785818110610e6f57610e6f61302e565b90506020020135604051610e8591815260200190565b60405180910390a380610e9781613044565b915050610d76565b503360009081526002602052604081208054839290610ebf90849061305d565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b610f1033611a6a565b610f2c5760405162461bcd60e51b81526004016107c890612f61565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b610f7b33611a6a565b610f975760405162461bcd60e51b81526004016107c890612f61565b60095460ff1615610fdd5760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b60448201526064016107c8565b6009805460ff19166001179055600a5460000361100257610ffe4282611bbc565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b61103733611a6a565b6110535760405162461bcd60e51b81526004016107c890612f61565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b6000806110c73385611246565b9050828110156111275760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107c8565b61091d3385858403611a88565b600061079a338484611c42565b61114a33611a6a565b6111665760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61119633611a6a565b6111b25760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03821660009081526005602052604090205481151560ff9091161515036111f25760405162461bcd60e51b81526004016107c890613009565b6001600160a01b038216600081815260056020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61127a33611a6a565b6112965760405162461bcd60e51b81526004016107c890612f61565b601382905560128190556112aa8282611bbc565b60145560408051838152602081018390527fc47e67f6e0d0627200bd21b8c292cc95284420e11df6a67d8a4e128b6b58a8e2910160405180910390a15050565b6112f333611a6a565b61130f5760405162461bcd60e51b81526004016107c890612f61565b826114f557806113615760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c000000000060448201526064016107c8565b3491507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190613074565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b50505050506114f07f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e09190613074565b6001600160a01b03169190611ff3565b61167f565b80156115bf57336000908152600260205260408120805484929061151a90849061305d565b90915550506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660009081526002602052604081208054849290611567908490612fcb565b90915550506040518281527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169033906000805160206131ab8339815191529060200160405180910390a361167f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600260205260408120805484929061160790849061305d565b9091555050336000908152600260205260408120805484929061162b908490612fcb565b909155505060405182815233906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906000805160206131ab8339815191529060200160405180910390a35b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d8460405161172991815260200190565b60405180910390a3505050565b61173f33611a6a565b61175b5760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03166000908152600160205260409020805460ff19169055565b61178533611a6a565b6117a15760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b0381166117c75760405162461bcd60e51b81526004016107c890612fe3565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b61183c33611a6a565b6118585760405162461bcd60e51b81526004016107c890612f61565b60018210156118bc5760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b60648201526084016107c8565b6207a12081101561191f5760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b60648201526084016107c8565b6000629896806119378467016345785d8a0000613091565b61194191906130b0565b905060006298968061195b8467016345785d8a0000613091565b61196591906130b0565b6007839055600881905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c229910160405180910390a150505050565b6119ba33611a6a565b6119d65760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03821660009081526004602052604090205481151560ff909116151503611a165760405162461bcd60e51b81526004016107c890613009565b6001600160a01b038216600081815260046020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611aea5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107c8565b6001600160a01b038216611b4b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107c8565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611729565b60006109218284613091565b600061092182846130b0565b60006109218284612fcb565b6000611bd48484611246565b90506000198114611c3c5781811015611c2f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107c8565b611c3c8484848403611a88565b50505050565b611c4d83838361204a565b6001600160a01b03831660009081526005602052604090205460019060ff1680611c8f57506001600160a01b03831660009081526005602052604090205460ff165b15611c9c57506000611df3565b60095460ff16611ce25760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b60448201526064016107c8565b600754821115611d455760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016107c8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611df3576008546001600160a01b038416600090815260026020526040902054611da5908490612fcb565b1115611df35760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d6974000000000060448201526064016107c8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603611ea457600090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614158015611e765750600a544211155b15611e9f576001600160a01b0384166000908152600460205260409020805460ff191660011790555b611ee9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603611ee557506001611ee9565b5060025b600d54611ef7906001611bbc565b600d55611f0485846121da565b15611f1a57611f14601054612277565b6000600d555b6001600160a01b038516600090815260026020526040902054611f3d9084611fe7565b6001600160a01b03861660009081526002602052604081209190915582611f645783611f6f565b611f6f868584612358565b6001600160a01b038616600090815260026020526040902054909150611f959082611bbc565b6001600160a01b0380871660008181526002602052604090819020939093559151908816906000805160206131ab83398151915290611fd79085815260200190565b60405180910390a3505050505050565b6000610921828461305d565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612045908490612624565b505050565b6001600160a01b03831660009081526006602052604090205460ff16156120a05760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b60448201526064016107c8565b6001600160a01b03821660009081526006602052604090205460ff16156120f65760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b60448201526064016107c8565b600081116121585760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016107c8565b6001600160a01b0383166000908152600260205260409020548111156120455760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b60648201526084016107c8565b60115460105430600090815260026020526040812054600f5491938510159211159060ff1615801561220e5750600c5460ff165b80156122175750815b80156122275750600e54600d5410155b80156122305750805b801561226e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff191660011790556014546013546000916122a1916002916107e39182908790611ba4565b905060006122af8383611fe7565b9050476122bb826126f6565b60006122c74783611fe7565b905060006122ed6122e46002601354611bb090919063ffffffff16565b60145490611fe7565b9050841561231c5761231c8561231760026107e3856107e360135489611ba490919063ffffffff16565b6128b6565b601754601254612346916001600160a01b0316906123419084906107e3908790611ba4565b61299c565b5050600f805460ff1916905550505050565b600080600b600084600281111561237157612371612f86565b600281111561238257612382612f86565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526004909352908120549192509060ff1680156123ef5750600f54610100900460ff165b6123fd57816060015161240a565b61240a606461271061305d565b90508060000361241e578492505050610921565b60006124306127106107e38885611ba4565b9050600061244f836107e3866020015185611ba490919063ffffffff16565b9050600061246e846107e3876000015186611ba490919063ffffffff16565b90506000612486826124808686611fe7565b90611fe7565b9050821561252b5761dead60005260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc546124c59084611bbc565b61dead600081905260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc919091556040516001600160a01b038c16906000805160206131ab833981519152906125229087815260200190565b60405180910390a35b81156125a4576016546001600160a01b03166000908152600260205260409020546125569083611bbc565b601680546001600160a01b03908116600090815260026020908152604091829020949094559154915185815291811692908d16916000805160206131ab833981519152910160405180910390a35b801561260c57306000908152600260205260409020546125c49082611bbc565b30600081815260026020526040908190209290925590516001600160a01b038c16906000805160206131ab833981519152906126039085815260200190565b60405180910390a35b6126168985611fe7565b9a9950505050505050505050565b6000612679826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a409092919063ffffffff16565b805190915015612045578080602001905181019061269791906130d2565b6120455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061272b5761272b61302e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127cd9190613074565b816001815181106127e0576127e061302e565b60200260200101906001600160a01b031690816001600160a01b03168152505061282b307f000000000000000000000000000000000000000000000000000000000000000084611a88565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906128809085906000908690309042906004016130ef565b600060405180830381600087803b15801561289a57600080fd5b505af11580156128ae573d6000803e3d6000fd5b505050505050565b6128e1307f000000000000000000000000000000000000000000000000000000000000000084611a88565b60155460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015612970573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129959190613160565b5050505050565b806000036129a8575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146129f5576040519150601f19603f3d011682016040523d82523d6000602084013e6129fa565b606091505b50509050806120455760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b60448201526064016107c8565b6060612a4f8484600085612a57565b949350505050565b606082471015612ab85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c8565b600080866001600160a01b03168587604051612ad4919061318e565b60006040518083038185875af1925050503d8060008114612b11576040519150601f19603f3d011682016040523d82523d6000602084013e612b16565b606091505b5091509150612b2787838387612b32565b979650505050505050565b60608315612ba1578251600003612b9a576001600160a01b0385163b612b9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c8565b5081612a4f565b612a4f8383815115612bb65781518083602001fd5b8060405162461bcd60e51b81526004016107c89190612bfc565b60005b83811015612beb578181015183820152602001612bd3565b83811115611c3c5750506000910152565b6020815260008251806020840152612c1b816040850160208701612bd0565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612c4457600080fd5b50565b60008060408385031215612c5a57600080fd5b8235612c6581612c2f565b946020939093013593505050565b803560038110612c8257600080fd5b919050565b60008060008060808587031215612c9d57600080fd5b612ca685612c73565b966020860135965060408601359560600135945092505050565b600080600060608486031215612cd557600080fd5b8335612ce081612c2f565b92506020840135612cf081612c2f565b929592945050506040919091013590565b600060208284031215612d1357600080fd5b813561092181612c2f565b600060208284031215612d3057600080fd5b61092182612c73565b600080600060608486031215612d4e57600080fd5b8335612d5981612c2f565b92506020840135612d6981612c2f565b91506040840135612d7981612c2f565b809150509250925092565b8015158114612c4457600080fd5b60008060408385031215612da557600080fd5b8235612db081612c2f565b91506020830135612dc081612d84565b809150509250929050565b600060208284031215612ddd57600080fd5b813561092181612d84565b60008083601f840112612dfa57600080fd5b50813567ffffffffffffffff811115612e1257600080fd5b6020830191508360208260051b8501011115612e2d57600080fd5b9250929050565b60008060008060408587031215612e4a57600080fd5b843567ffffffffffffffff80821115612e6257600080fd5b612e6e88838901612de8565b90965094506020870135915080821115612e8757600080fd5b50612e9487828801612de8565b95989497509550505050565b600060208284031215612eb257600080fd5b5035919050565b60008060008060808587031215612ecf57600080fd5b8435612ca681612d84565b60008060408385031215612eed57600080fd5b8235612ef881612c2f565b91506020830135612dc081612c2f565b60008060408385031215612f1b57600080fd5b50508035926020909101359150565b600080600060608486031215612f3f57600080fd5b8335612f4a81612d84565b9250602084013591506040840135612d7981612d84565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b600060208284031215612fae57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115612fde57612fde612fb5565b500190565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161305657613056612fb5565b5060010190565b60008282101561306f5761306f612fb5565b500390565b60006020828403121561308657600080fd5b815161092181612c2f565b60008160001904831182151516156130ab576130ab612fb5565b500290565b6000826130cd57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156130e457600080fd5b815161092181612d84565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561313f5784516001600160a01b03168352938301939183019160010161311a565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561317557600080fd5b8351925060208401519150604084015190509250925092565b600082516131a0818460208701612bd0565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220314d39271e362c03e8c7e69ee8d2591461027f10aa2aa48388c60c2683eb841564736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106102295760003560e01c80637d1db4a511610123578063b9a45aac116100ab578063f2fde38b1161006f578063f2fde38b146106d9578063f319ae77146106f9578063f887ea4014610719578063fac1b9bc1461074d578063fe9fbb801461076d57600080fd5b8063b9a45aac14610646578063dd62ed3e14610666578063ea7b91ec14610686578063eb42f193146106a6578063f0b37c04146106b957600080fd5b806395d89b41116100f257806395d89b4114610235578063a457c2d7146105b2578063a8aa1b31146105d2578063a9059cbb14610606578063b6a5d7de1461062657600080fd5b80637d1db4a51461052457806382aa7c681461053a5780638da5cb5b1461055a5780638e5c3ad31461059257600080fd5b806339264b66116101b15780636b7f8b90116101755780636b7f8b90146104835780636c0a24eb146104a3578063706f6937146104b957806370a08231146104d9578063715018a61461050f57600080fd5b806339264b66146103ca57806339509351146103ea5780633bbac5791461040a57806340005fbe14610443578063455a43961461046357600080fd5b806323b872dd116101f857806323b872dd146102e85780632b112e49146103085780632f54bf6e1461031d578063313ce5671461034c578063357c13541461036857600080fd5b806306fdde0314610235578063095ea7b3146102715780630eefe44b146102a157806318160ddd146102c357600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5060408051808201825260048152634d55534b60e01b602082015290516102689190612bfc565b60405180910390f35b34801561027d57600080fd5b5061029161028c366004612c47565b61078d565b6040519015158152602001610268565b3480156102ad57600080fd5b506102c16102bc366004612c87565b6107a3565b005b3480156102cf57600080fd5b5067016345785d8a00005b604051908152602001610268565b3480156102f457600080fd5b50610291610303366004612cc0565b610905565b34801561031457600080fd5b506102da610928565b34801561032957600080fd5b50610291610338366004612d01565b6000546001600160a01b0391821691161490565b34801561035857600080fd5b5060405160098152602001610268565b34801561037457600080fd5b506103aa610383366004612d1e565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610268565b3480156103d657600080fd5b506102c16103e5366004612cc0565b61096f565b3480156103f657600080fd5b50610291610405366004612c47565b610a6c565b34801561041657600080fd5b50610291610425366004612d01565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561044f57600080fd5b506102c161045e366004612d39565b610a8d565b34801561046f57600080fd5b506102c161047e366004612d92565b610ba8565b34801561048f57600080fd5b506102c161049e366004612dcb565b610c61565b3480156104af57600080fd5b506102da60085481565b3480156104c557600080fd5b506102c16104d4366004612e34565b610cfd565b3480156104e557600080fd5b506102da6104f4366004612d01565b6001600160a01b031660009081526002602052604090205490565b34801561051b57600080fd5b506102c1610f07565b34801561053057600080fd5b506102da60075481565b34801561054657600080fd5b506102c1610555366004612ea0565b610f72565b34801561056657600080fd5b5060005461057a906001600160a01b031681565b6040516001600160a01b039091168152602001610268565b34801561059e57600080fd5b506102c16105ad366004612eb9565b61102e565b3480156105be57600080fd5b506102916105cd366004612c47565b6110ba565b3480156105de57600080fd5b5061057a7f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e3681565b34801561061257600080fd5b50610291610621366004612c47565b611134565b34801561063257600080fd5b506102c1610641366004612d01565b611141565b34801561065257600080fd5b506102c1610661366004612d92565b61118d565b34801561067257600080fd5b506102da610681366004612eda565b611246565b34801561069257600080fd5b506102c16106a1366004612f08565b611271565b6102c16106b4366004612f2a565b6112ea565b3480156106c557600080fd5b506102c16106d4366004612d01565b611736565b3480156106e557600080fd5b506102c16106f4366004612d01565b61177c565b34801561070557600080fd5b506102c1610714366004612f08565b611833565b34801561072557600080fd5b5061057a7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561075957600080fd5b506102c1610768366004612d92565b6119b1565b34801561077957600080fd5b50610291610788366004612d01565b611a6a565b600061079a338484611a88565b50600192915050565b6107ac33611a6a565b6107d15760405162461bcd60e51b81526004016107c890612f61565b60405180910390fd5b6107e960146107e36127106003611ba4565b90611bb0565b6107fd826107f78686611bbc565b90611bbc565b111561084b5760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e20313525000000000060448201526064016107c8565b6000600b600086600281111561086357610863612f86565b600281111561087457610874612f86565b81526020810191909152604001600020600181018590558381556002810183905590506108a5826107f78686611bbc565b60038201558460028111156108bc576108bc612f86565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b6000610912843384611bc8565b61091d848484611c42565b5060015b9392505050565b61dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc5461096a9067016345785d8a000090611fe7565b905090565b61097833611a6a565b6109945760405162461bcd60e51b81526004016107c890612f61565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156109db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ff9190612f9c565b90506000610a136127106107e38486611ba4565b9050610a296001600160a01b0386168583611ff3565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b891016108f6565b600061079a338484610a7e3388611246565b610a889190612fcb565b611a88565b610a9633611a6a565b610ab25760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b038316610ad85760405162461bcd60e51b81526004016107c890612fe3565b6001600160a01b038216610afe5760405162461bcd60e51b81526004016107c890612fe3565b6001600160a01b038116610b245760405162461bcd60e51b81526004016107c890612fe3565b601780546001600160a01b038581166001600160a01b0319928316811790935560158054868316908416811790915560168054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c9060600160405180910390a1505050565b610bb133611a6a565b610bcd5760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503610c0d5760405162461bcd60e51b81526004016107c890613009565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610c6a33611a6a565b610c865760405162461bcd60e51b81526004016107c890612f61565b801515600f60019054906101000a900460ff16151503610cb85760405162461bcd60e51b81526004016107c890613009565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b610d0633611a6a565b610d225760405162461bcd60e51b81526004016107c890612f61565b82818114610d725760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d61746368656400000000000000000060448201526064016107c8565b6000805b82811015610e9f57848482818110610d9057610d9061302e565b9050602002013560026000898985818110610dad57610dad61302e565b9050602002016020810190610dc29190612d01565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610df19190612fcb565b909155508590508482818110610e0957610e0961302e565b9050602002013582610e1b9190612fcb565b9150868682818110610e2f57610e2f61302e565b9050602002016020810190610e449190612d01565b6001600160a01b0316336000805160206131ab833981519152878785818110610e6f57610e6f61302e565b90506020020135604051610e8591815260200190565b60405180910390a380610e9781613044565b915050610d76565b503360009081526002602052604081208054839290610ebf90849061305d565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b610f1033611a6a565b610f2c5760405162461bcd60e51b81526004016107c890612f61565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b610f7b33611a6a565b610f975760405162461bcd60e51b81526004016107c890612f61565b60095460ff1615610fdd5760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b60448201526064016107c8565b6009805460ff19166001179055600a5460000361100257610ffe4282611bbc565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b61103733611a6a565b6110535760405162461bcd60e51b81526004016107c890612f61565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b6000806110c73385611246565b9050828110156111275760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107c8565b61091d3385858403611a88565b600061079a338484611c42565b61114a33611a6a565b6111665760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61119633611a6a565b6111b25760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03821660009081526005602052604090205481151560ff9091161515036111f25760405162461bcd60e51b81526004016107c890613009565b6001600160a01b038216600081815260056020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61127a33611a6a565b6112965760405162461bcd60e51b81526004016107c890612f61565b601382905560128190556112aa8282611bbc565b60145560408051838152602081018390527fc47e67f6e0d0627200bd21b8c292cc95284420e11df6a67d8a4e128b6b58a8e2910160405180910390a15050565b6112f333611a6a565b61130f5760405162461bcd60e51b81526004016107c890612f61565b826114f557806113615760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c000000000060448201526064016107c8565b3491507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190613074565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b50505050506114f07f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e36837f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e09190613074565b6001600160a01b03169190611ff3565b61167f565b80156115bf57336000908152600260205260408120805484929061151a90849061305d565b90915550506001600160a01b037f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e361660009081526002602052604081208054849290611567908490612fcb565b90915550506040518281527f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e366001600160a01b03169033906000805160206131ab8339815191529060200160405180910390a361167f565b6001600160a01b037f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e36166000908152600260205260408120805484929061160790849061305d565b9091555050336000908152600260205260408120805484929061162b908490612fcb565b909155505060405182815233906001600160a01b037f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e3616906000805160206131ab8339815191529060200160405180910390a35b7f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e366001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116da57600080fd5b505af11580156116ee573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d8460405161172991815260200190565b60405180910390a3505050565b61173f33611a6a565b61175b5760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03166000908152600160205260409020805460ff19169055565b61178533611a6a565b6117a15760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b0381166117c75760405162461bcd60e51b81526004016107c890612fe3565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b61183c33611a6a565b6118585760405162461bcd60e51b81526004016107c890612f61565b60018210156118bc5760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b60648201526084016107c8565b6207a12081101561191f5760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b60648201526084016107c8565b6000629896806119378467016345785d8a0000613091565b61194191906130b0565b905060006298968061195b8467016345785d8a0000613091565b61196591906130b0565b6007839055600881905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c229910160405180910390a150505050565b6119ba33611a6a565b6119d65760405162461bcd60e51b81526004016107c890612f61565b6001600160a01b03821660009081526004602052604090205481151560ff909116151503611a165760405162461bcd60e51b81526004016107c890613009565b6001600160a01b038216600081815260046020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611aea5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107c8565b6001600160a01b038216611b4b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107c8565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611729565b60006109218284613091565b600061092182846130b0565b60006109218284612fcb565b6000611bd48484611246565b90506000198114611c3c5781811015611c2f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107c8565b611c3c8484848403611a88565b50505050565b611c4d83838361204a565b6001600160a01b03831660009081526005602052604090205460019060ff1680611c8f57506001600160a01b03831660009081526005602052604090205460ff165b15611c9c57506000611df3565b60095460ff16611ce25760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b60448201526064016107c8565b600754821115611d455760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016107c8565b7f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e366001600160a01b0316836001600160a01b031614611df3576008546001600160a01b038416600090815260026020526040902054611da5908490612fcb565b1115611df35760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d6974000000000060448201526064016107c8565b60007f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e366001600160a01b0316856001600160a01b031603611ea457600090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b031614158015611e765750600a544211155b15611e9f576001600160a01b0384166000908152600460205260409020805460ff191660011790555b611ee9565b7f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e366001600160a01b0316846001600160a01b031603611ee557506001611ee9565b5060025b600d54611ef7906001611bbc565b600d55611f0485846121da565b15611f1a57611f14601054612277565b6000600d555b6001600160a01b038516600090815260026020526040902054611f3d9084611fe7565b6001600160a01b03861660009081526002602052604081209190915582611f645783611f6f565b611f6f868584612358565b6001600160a01b038616600090815260026020526040902054909150611f959082611bbc565b6001600160a01b0380871660008181526002602052604090819020939093559151908816906000805160206131ab83398151915290611fd79085815260200190565b60405180910390a3505050505050565b6000610921828461305d565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612045908490612624565b505050565b6001600160a01b03831660009081526006602052604090205460ff16156120a05760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b60448201526064016107c8565b6001600160a01b03821660009081526006602052604090205460ff16156120f65760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b60448201526064016107c8565b600081116121585760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016107c8565b6001600160a01b0383166000908152600260205260409020548111156120455760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b60648201526084016107c8565b60115460105430600090815260026020526040812054600f5491938510159211159060ff1615801561220e5750600c5460ff165b80156122175750815b80156122275750600e54600d5410155b80156122305750805b801561226e57507f0000000000000000000000006958253613fd22fe52f66d04e83559ae6d9b8e366001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff191660011790556014546013546000916122a1916002916107e39182908790611ba4565b905060006122af8383611fe7565b9050476122bb826126f6565b60006122c74783611fe7565b905060006122ed6122e46002601354611bb090919063ffffffff16565b60145490611fe7565b9050841561231c5761231c8561231760026107e3856107e360135489611ba490919063ffffffff16565b6128b6565b601754601254612346916001600160a01b0316906123419084906107e3908790611ba4565b61299c565b5050600f805460ff1916905550505050565b600080600b600084600281111561237157612371612f86565b600281111561238257612382612f86565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526004909352908120549192509060ff1680156123ef5750600f54610100900460ff165b6123fd57816060015161240a565b61240a606461271061305d565b90508060000361241e578492505050610921565b60006124306127106107e38885611ba4565b9050600061244f836107e3866020015185611ba490919063ffffffff16565b9050600061246e846107e3876000015186611ba490919063ffffffff16565b90506000612486826124808686611fe7565b90611fe7565b9050821561252b5761dead60005260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc546124c59084611bbc565b61dead600081905260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc919091556040516001600160a01b038c16906000805160206131ab833981519152906125229087815260200190565b60405180910390a35b81156125a4576016546001600160a01b03166000908152600260205260409020546125569083611bbc565b601680546001600160a01b03908116600090815260026020908152604091829020949094559154915185815291811692908d16916000805160206131ab833981519152910160405180910390a35b801561260c57306000908152600260205260409020546125c49082611bbc565b30600081815260026020526040908190209290925590516001600160a01b038c16906000805160206131ab833981519152906126039085815260200190565b60405180910390a35b6126168985611fe7565b9a9950505050505050505050565b6000612679826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a409092919063ffffffff16565b805190915015612045578080602001905181019061269791906130d2565b6120455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107c8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061272b5761272b61302e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127cd9190613074565b816001815181106127e0576127e061302e565b60200260200101906001600160a01b031690816001600160a01b03168152505061282b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611a88565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906128809085906000908690309042906004016130ef565b600060405180830381600087803b15801561289a57600080fd5b505af11580156128ae573d6000803e3d6000fd5b505050505050565b6128e1307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611a88565b60155460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612970573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129959190613160565b5050505050565b806000036129a8575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146129f5576040519150601f19603f3d011682016040523d82523d6000602084013e6129fa565b606091505b50509050806120455760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b60448201526064016107c8565b6060612a4f8484600085612a57565b949350505050565b606082471015612ab85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107c8565b600080866001600160a01b03168587604051612ad4919061318e565b60006040518083038185875af1925050503d8060008114612b11576040519150601f19603f3d011682016040523d82523d6000602084013e612b16565b606091505b5091509150612b2787838387612b32565b979650505050505050565b60608315612ba1578251600003612b9a576001600160a01b0385163b612b9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107c8565b5081612a4f565b612a4f8383815115612bb65781518083602001fd5b8060405162461bcd60e51b81526004016107c89190612bfc565b60005b83811015612beb578181015183820152602001612bd3565b83811115611c3c5750506000910152565b6020815260008251806020840152612c1b816040850160208701612bd0565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612c4457600080fd5b50565b60008060408385031215612c5a57600080fd5b8235612c6581612c2f565b946020939093013593505050565b803560038110612c8257600080fd5b919050565b60008060008060808587031215612c9d57600080fd5b612ca685612c73565b966020860135965060408601359560600135945092505050565b600080600060608486031215612cd557600080fd5b8335612ce081612c2f565b92506020840135612cf081612c2f565b929592945050506040919091013590565b600060208284031215612d1357600080fd5b813561092181612c2f565b600060208284031215612d3057600080fd5b61092182612c73565b600080600060608486031215612d4e57600080fd5b8335612d5981612c2f565b92506020840135612d6981612c2f565b91506040840135612d7981612c2f565b809150509250925092565b8015158114612c4457600080fd5b60008060408385031215612da557600080fd5b8235612db081612c2f565b91506020830135612dc081612d84565b809150509250929050565b600060208284031215612ddd57600080fd5b813561092181612d84565b60008083601f840112612dfa57600080fd5b50813567ffffffffffffffff811115612e1257600080fd5b6020830191508360208260051b8501011115612e2d57600080fd5b9250929050565b60008060008060408587031215612e4a57600080fd5b843567ffffffffffffffff80821115612e6257600080fd5b612e6e88838901612de8565b90965094506020870135915080821115612e8757600080fd5b50612e9487828801612de8565b95989497509550505050565b600060208284031215612eb257600080fd5b5035919050565b60008060008060808587031215612ecf57600080fd5b8435612ca681612d84565b60008060408385031215612eed57600080fd5b8235612ef881612c2f565b91506020830135612dc081612c2f565b60008060408385031215612f1b57600080fd5b50508035926020909101359150565b600080600060608486031215612f3f57600080fd5b8335612f4a81612d84565b9250602084013591506040840135612d7981612d84565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b600060208284031215612fae57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115612fde57612fde612fb5565b500190565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161305657613056612fb5565b5060010190565b60008282101561306f5761306f612fb5565b500390565b60006020828403121561308657600080fd5b815161092181612c2f565b60008160001904831182151516156130ab576130ab612fb5565b500290565b6000826130cd57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156130e457600080fd5b815161092181612d84565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561313f5784516001600160a01b03168352938301939183019160010161311a565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561317557600080fd5b8351925060208401519150604084015190509250925092565b600082516131a0818460208701612bd0565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220314d39271e362c03e8c7e69ee8d2591461027f10aa2aa48388c60c2683eb841564736f6c634300080e0033

Deployed Bytecode Sourcemap

15364:19599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19459:83;;;;;;;;;;-1:-1:-1;19529:5:0;;;;;;;;;;;-1:-1:-1;;;19529:5:0;;;;19459:83;;;;19529:5;19459:83;:::i;:::-;;;;;;;;19836:184;;;;;;;;;;-1:-1:-1;19836:184:0;;;;;:::i;:::-;;:::i;:::-;;;1286:14:1;;1279:22;1261:41;;1249:2;1234:18;19836:184:0;1121:187:1;28863:783:0;;;;;;;;;;-1:-1:-1;28863:783:0;;;;;:::i;:::-;;:::i;:::-;;20214:100;;;;;;;;;;-1:-1:-1;15646:23:0;20214:100;;;2049:25:1;;;2037:2;2022:18;20214:100:0;1903:177:1;22684:249:0;;;;;;;;;;-1:-1:-1;22684:249:0;;;;;:::i;:::-;;:::i;20647:121::-;;;;;;;;;;;;;:::i;13473:103::-;;;;;;;;;;-1:-1:-1;13473:103:0;;;;;:::i;:::-;13528:4;13563:5;-1:-1:-1;;;;;13552:16:0;;;13563:5;;13552:16;;13473:103;20123:83;;;;;;;;;;-1:-1:-1;20123:83:0;;15598:1;2940:36:1;;2928:2;2913:18;20123:83:0;2798:184:1;16546:43:0;;;;;;;;;;-1:-1:-1;16546:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3442:25:1;;;3498:2;3483:18;;3476:34;;;;3526:18;;;3519:34;3584:2;3569:18;;3562:34;3429:3;3414:19;16546:43:0;3211:391:1;34205:438:0;;;;;;;;;;-1:-1:-1;34205:438:0;;;;;:::i;:::-;;:::i;22941:284::-;;;;;;;;;;-1:-1:-1;22941:284:0;;;;;:::i;:::-;;:::i;19726:102::-;;;;;;;;;;-1:-1:-1;19726:102:0;;;;;:::i;:::-;-1:-1:-1;;;;;19804:16:0;19780:4;19804:16;;;:6;:16;;;;;;;;;19726:102;29654:521;;;;;;;;;;-1:-1:-1;29654:521:0;;;;;:::i;:::-;;:::i;21073:291::-;;;;;;;;;;-1:-1:-1;21073:291:0;;;;;:::i;:::-;;:::i;21601:206::-;;;;;;;;;;-1:-1:-1;21601:206:0;;;;;:::i;:::-;;:::i;16066:64::-;;;;;;;;;;;;;;;;32654:701;;;;;;;;;;-1:-1:-1;32654:701:0;;;;;:::i;:::-;;:::i;20322:119::-;;;;;;;;;;-1:-1:-1;20322:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;20415:18:0;20388:7;20415:18;;;:9;:18;;;;;;;20322:119;13934:134;;;;;;;;;;;;;:::i;15999:60::-;;;;;;;;;;;;;;;;21815:312;;;;;;;;;;-1:-1:-1;21815:312:0;;;;;:::i;:::-;;:::i;12864:20::-;;;;;;;;;;-1:-1:-1;12864:20:0;;;;-1:-1:-1;;;;;12864:20:0;;;;;;-1:-1:-1;;;;;6396:32:1;;;6378:51;;6366:2;6351:18;12864:20:0;6232:203:1;22135:541:0;;;;;;;;;;-1:-1:-1;22135:541:0;;;;;:::i;:::-;;:::i;23233:469::-;;;;;;;;;;-1:-1:-1;23233:469:0;;;;;:::i;:::-;;:::i;16177:29::-;;;;;;;;;;;;;;;20449:190;;;;;;;;;;-1:-1:-1;20449:190:0;;;;;:::i;:::-;;:::i;13264:95::-;;;;;;;;;;-1:-1:-1;13264:95:0;;;;;:::i;:::-;;:::i;20776:289::-;;;;;;;;;;-1:-1:-1;20776:289:0;;;;;:::i;:::-;;:::i;19550:168::-;;;;;;;;;;-1:-1:-1;19550:168:0;;;;;:::i;:::-;;:::i;34651:309::-;;;;;;;;;;-1:-1:-1;34651:309:0;;;;;:::i;:::-;;:::i;33363:834::-;;;;;;:::i;:::-;;:::i;13367:98::-;;;;;;;;;;-1:-1:-1;13367:98:0;;;;;:::i;:::-;;:::i;13699:227::-;;;;;;;;;;-1:-1:-1;13699:227:0;;;;;:::i;:::-;;:::i;28249:606::-;;;;;;;;;;-1:-1:-1;28249:606:0;;;;;:::i;:::-;;:::i;16139:31::-;;;;;;;;;;;;;;;21372:221;;;;;;;;;;-1:-1:-1;21372:221:0;;;;;:::i;:::-;;:::i;13584:107::-;;;;;;;;;;-1:-1:-1;13584:107:0;;;;;:::i;:::-;;:::i;19836:184::-;19936:4;19953:37;19962:10;19974:7;19983:6;19953:8;:37::i;:::-;-1:-1:-1;20008:4:0;19836:184;;;;:::o;28863:783::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;;;;;;;;;29152:29:::1;29178:2;29152:21;16309:5;29171:1;29152:18;:21::i;:::-;:25:::0;::::1;:29::i;:::-;29080:51;29112:18:::0;29080:27:::1;:8:::0;29093:13;29080:12:::1;:27::i;:::-;:31:::0;::::1;:51::i;:::-;:101;;29058:178;;;::::0;-1:-1:-1;;;29058:178:0;;9012:2:1;29058:178:0::1;::::0;::::1;8994:21:1::0;9051:2;9031:18;;;9024:30;9090:29;9070:18;;;9063:57;9137:18;;29058:178:0::1;8810:351:1::0;29058:178:0::1;29247:15;29265:4;:21;29270:15;29265:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;29265:21:0;29297:11:::1;::::0;::::1;:22:::0;;;29330:32;;;29373:13:::1;::::0;::::1;:34:::0;;;29265:21;-1:-1:-1;29433:51:0::1;29389:18:::0;29433:27:::1;29311:8:::0;29349:13;29433:12:::1;:27::i;:51::-;29418:12;::::0;::::1;:66:::0;29528:15;29502:136:::1;::::0;::::1;;;;;;:::i;:::-;;::::0;;9500:25:1;;;9556:2;9541:18;;9534:34;;;9584:18;;;9577:34;;;29502:136:0::1;::::0;9488:2:1;9473:18;29502:136:0::1;;;;;;;;29047:599;28863:783:::0;;;;:::o;22684:249::-;22807:4;22824:41;22840:4;22846:10;22858:6;22824:15;:41::i;:::-;22876:27;22886:4;22892:2;22896:6;22876:9;:27::i;:::-;-1:-1:-1;22921:4:0;22684:249;;;;;;:::o;20647:121::-;15950:42;20700:7;20415:18;;;:9;:18;;;;20727:33;;15646:23;;20727:16;:33::i;:::-;20720:40;;20647:121;:::o;34205:438::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;34377:39:::1;::::0;-1:-1:-1;;;34377:39:0;;34410:4:::1;34377:39;::::0;::::1;6378:51:1::0;34360:14:0::1;::::0;-1:-1:-1;;;;;34377:24:0;::::1;::::0;::::1;::::0;6351:18:1;;34377:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34360:56:::0;-1:-1:-1;34427:24:0::1;34454:34;34482:5;34454:23;34360:56:::0;34465:11;34454:10:::1;:23::i;:34::-;34427:61:::0;-1:-1:-1;34499:56:0::1;-1:-1:-1::0;;;;;34499:27:0;::::1;34527:9:::0;34427:61;34499:27:::1;:56::i;:::-;34573:62;::::0;;-1:-1:-1;;;;;10003:32:1;;;9985:51;;10067:2;10052:18;;10045:34;;;34573:62:0;::::1;::::0;::::1;::::0;9958:18:1;34573:62:0::1;9811:274:1::0;22941:284:0;23054:4;23071:124;23094:10;23119:7;23174:10;23141:30;23151:10;23163:7;23141:9;:30::i;:::-;:43;;;;:::i;:::-;23071:8;:124::i;29654:521::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29814:24:0;::::1;29806:49;;;;-1:-1:-1::0;;;29806:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29874:24:0;::::1;29866:49;;;;-1:-1:-1::0;;;29866:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29934:22:0;::::1;29926:47;;;;-1:-1:-1::0;;;29926:47:0::1;;;;;;;:::i;:::-;29984:18;:31:::0;;-1:-1:-1;;;;;29984:31:0;;::::1;-1:-1:-1::0;;;;;;29984:31:0;;::::1;::::0;::::1;::::0;;;30026:18:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;30068:16:::1;:27:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;30113:54:::1;::::0;;10936:34:1;;;11001:2;10986:18;;10979:43;;;;11038:18;;;11031:43;30113:54:0::1;::::0;10886:2:1;10871:18;30113:54:0::1;;;;;;;29654:521:::0;;;:::o;21073:291::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21198:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;21190:61:::1;;;;-1:-1:-1::0;;;21190:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21262:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;21262:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21316:40;;21262:36;;:23;21316:40:::1;::::0;::::1;21073:291:::0;;:::o;21601:206::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;21695:7:::1;21677:25;;:14;;;;;;;;;;;:25;;::::0;21669:49:::1;;;;-1:-1:-1::0;;;21669:49:0::1;;;;;;;:::i;:::-;21729:14;:24:::0;;-1:-1:-1;;21729:24:0::1;;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;21771:28:::1;::::0;::::1;::::0;-1:-1:-1;;21771:28:0::1;21601:206:::0;:::o;32654:701::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;32807:8;32841:24;;::::1;32833:60;;;::::0;-1:-1:-1;;;32833:60:0;;11627:2:1;32833:60:0::1;::::0;::::1;11609:21:1::0;11666:2;11646:18;;;11639:30;11705:25;11685:18;;;11678:53;11748:18;;32833:60:0::1;11425:347:1::0;32833:60:0::1;32904:21;32947:9:::0;32942:289:::1;32966:6;32962:1;:10;32942:289;;;33102:7;;33110:1;33102:10;;;;;;;:::i;:::-;;;;;;;33076:9;:22;33086:8;;33095:1;33086:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33076:22:0::1;-1:-1:-1::0;;;;;33076:22:0::1;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;33144:7:0;;-1:-1:-1;33144:7:0;33152:1;33144:10;;::::1;;;;;:::i;:::-;;;;;;;33127:27;;;;;:::i;:::-;;;33195:8;;33204:1;33195:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33174:45:0::1;33183:10;-1:-1:-1::0;;;;;;;;;;;33208:7:0;;33216:1;33208:10;;::::1;;;;;:::i;:::-;;;;;;;33174:45;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;33174:45:0::1;;;;;;;;32974:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32942:289;;;-1:-1:-1::0;33251:10:0::1;33241:21;::::0;;;:9:::1;:21;::::0;;;;:38;;33266:13;;33241:21;:38:::1;::::0;33266:13;;33241:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;33297:50:0::1;::::0;;12353:25:1;;;12409:2;12394:18;;12387:34;;;33313:10:0::1;::::0;33297:50:::1;::::0;12326:18:1;33297:50:0::1;;;;;;;32779:576;;32654:701:::0;;;;:::o;13934:134::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;13999:32:::1;::::0;14028:1:::1;6378:51:1::0;;13999:32:0::1;::::0;6366:2:1;6351:18;13999:32:0::1;;;;;;;14058:1;14042:18:::0;;-1:-1:-1;;;;;;14042:18:0::1;::::0;;13934:134::o;21815:312::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;21894:14:::1;::::0;::::1;;21893:15;21885:44;;;::::0;-1:-1:-1;;;21885:44:0;;12634:2:1;21885:44:0::1;::::0;::::1;12616:21:1::0;12673:2;12653:18;;;12646:30;-1:-1:-1;;;12692:18:1;;;12685:46;12748:18;;21885:44:0::1;12432:340:1::0;21885:44:0::1;21940:14;:21:::0;;-1:-1:-1;;21940:21:0::1;21957:4;21940:21;::::0;;21976:11:::1;::::0;21940:14:::1;21976:16:::0;21972:113:::1;;22058:27;:15;22078:6:::0;22058:19:::1;:27::i;:::-;22044:11;:41:::0;21972:113:::1;22103:16;::::0;::::1;::::0;;;::::1;21815:312:::0;:::o;22135:541::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;22331:21:::1;:32:::0;;-1:-1:-1;;22331:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22374:13:::1;:26:::0;;;22411:15:::1;:27:::0;;;22449:25:::1;:54:::0;;;22521:147:::1;::::0;;9500:25:1;;;9556:2;9541:18;;9534:34;;;9584:18;;;9577:34;;;22521:147:0::1;::::0;9488:2:1;9473:18;22521:147:0::1;;;;;;;22135:541:::0;;;;:::o;23233:469::-;23351:4;23368:24;23395:30;23405:10;23417:7;23395:9;:30::i;:::-;23368:57;;23478:15;23458:16;:35;;23436:122;;;;-1:-1:-1;;;23436:122:0;;12979:2:1;23436:122:0;;;12961:21:1;13018:2;12998:18;;;12991:30;13057:34;13037:18;;;13030:62;-1:-1:-1;;;13108:18:1;;;13101:35;13153:19;;23436:122:0;12777:401:1;23436:122:0;23594:65;23603:10;23615:7;23643:15;23624:16;:34;23594:8;:65::i;20449:190::-;20552:4;20569:40;20579:10;20591:9;20602:6;20569:9;:40::i;13264:95::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13325:19:0::1;;::::0;;;13347:4:::1;13325:19;::::0;;;;;;;:26;;-1:-1:-1;;13325:26:0::1;::::0;;::::1;::::0;;13264:95::o;20776:289::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20901:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;20893:61:::1;;;;-1:-1:-1::0;;;20893:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20965:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;20965:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21019:38;;20965:36;;:23;21019:38:::1;::::0;::::1;20776:289:::0;;:::o;19550:168::-;-1:-1:-1;;;;;19683:18:0;;;19656:7;19683:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19550:168::o;34651:309::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;34771:17:::1;:30:::0;;;34812:17:::1;:30:::0;;;34869:26:::1;34791:10:::0;34832;34869:14:::1;:26::i;:::-;34853:13;:42:::0;34913:39:::1;::::0;;12353:25:1;;;12409:2;12394:18;;12387:34;;;34913:39:0::1;::::0;12326:18:1;34913:39:0::1;;;;;;;34651:309:::0;;:::o;33363:834::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;33496:4:::1;33491:620;;33525:3;33517:43;;;::::0;-1:-1:-1;;;33517:43:0;;13385:2:1;33517:43:0::1;::::0;::::1;13367:21:1::0;13424:2;13404:18;;;13397:30;13463:29;13443:18;;;13436:57;13510:18;;33517:43:0::1;13183:351:1::0;33517:43:0::1;33584:9;33575:18;;33614:6;-1:-1:-1::0;;;;;33614:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33608:28:0::1;;33644:6;33608:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;33668:48;33703:4;33709:6;33675;-1:-1:-1::0;;;;;33675:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33668:34:0::1;::::0;:48;:34:::1;:48::i;:::-;33491:620;;;33753:3;33749:351;;;33787:10;33777:21;::::0;;;:9:::1;:21;::::0;;;;:31;;33802:6;;33777:21;:31:::1;::::0;33802:6;;33777:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;33837:4:0::1;33827:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33846:6;;33827:15;:25:::1;::::0;33846:6;;33827:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;33876:34:0::1;::::0;2049:25:1;;;33897:4:0::1;-1:-1:-1::0;;;;;33876:34:0::1;::::0;33885:10:::1;::::0;-1:-1:-1;;;;;;;;;;;33876:34:0;2037:2:1;2022:18;33876:34:0::1;;;;;;;33749:351;;;-1:-1:-1::0;;;;;33961:4:0::1;33951:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33970:6;;33951:15;:25:::1;::::0;33970:6;;33951:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;34005:10:0::1;33995:21;::::0;;;:9:::1;:21;::::0;;;;:31;;34020:6;;33995:21;:31:::1;::::0;34020:6;;33995:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;34050:34:0::1;::::0;2049:25:1;;;34065:10:0::1;::::0;-1:-1:-1;;;;;34059:4:0::1;34050:34;::::0;-1:-1:-1;;;;;;;;;;;34050:34:0;2037:2:1;2022:18;34050:34:0::1;;;;;;;33749:351;34127:4;-1:-1:-1::0;;;;;34121:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34185:3;34155:34;;34171:4;34155:34;;;34177:6;34155:34;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;34155:34:0::1;;;;;;;;33363:834:::0;;;:::o;13367:98::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13430:19:0::1;13452:5;13430:19:::0;;;:14:::1;:19;::::0;;;;:27;;-1:-1:-1;;13430:27:0::1;::::0;;13367:98::o;13699:227::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13784:17:0;::::1;13776:42;;;;-1:-1:-1::0;;;13776:42:0::1;;;;;;;:::i;:::-;13829:5;:11:::0;;-1:-1:-1;;;;;;13829:11:0::1;-1:-1:-1::0;;;;;13829:11:0;::::1;::::0;;::::1;::::0;;13851:19;;;-1:-1:-1;13851:19:0::1;::::0;;;;;;;;:26;;-1:-1:-1;;13851:26:0::1;::::0;;::::1;::::0;;;13893:25;;6378:51:1;;;13893:25:0::1;::::0;6351:18:1;13893:25:0::1;;;;;;;13699:227:::0;:::o;28249:606::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;28407:1:::1;28391:12;:17;;28369:109;;;::::0;-1:-1:-1;;;28369:109:0;;14213:2:1;28369:109:0::1;::::0;::::1;14195:21:1::0;14252:2;14232:18;;;14225:30;14291:34;14271:18;;;14264:62;-1:-1:-1;;;14342:18:1;;;14335:40;14392:19;;28369:109:0::1;14011:406:1::0;28369:109:0::1;28508:6;28497:7;:17;;28489:69;;;::::0;-1:-1:-1;;;28489:69:0;;14624:2:1;28489:69:0::1;::::0;::::1;14606:21:1::0;14663:2;14643:18;;;14636:30;14702:34;14682:18;;;14675:62;-1:-1:-1;;;14753:18:1;;;14746:37;14800:19;;28489:69:0::1;14422:403:1::0;28489:69:0::1;28569:18;28622:8;28591:27;28606:12:::0;15646:23:::1;28591:27;:::i;:::-;28590:40;;;;:::i;:::-;28569:61:::0;-1:-1:-1;28641:22:0::1;28693:8;28667:22;28682:7:::0;15646:23:::1;28667:22;:::i;:::-;28666:35;;;;:::i;:::-;28712:12;:25:::0;;;28748:16:::1;:33:::0;;;28799:48:::1;::::0;;12353:25:1;;;12409:2;12394:18;;12387:34;;;28748:33:0;;-1:-1:-1;28799:48:0::1;::::0;12326:18:1;28799:48:0::1;;;;;;;28358:497;;28249:606:::0;;:::o;21372:221::-;13196:24;13209:10;13196:12;:24::i;:::-;13188:48;;;;-1:-1:-1;;;13188:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21461:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:26;::::1;;:16;::::0;;::::1;:26;;::::0;21453:50:::1;;;;-1:-1:-1::0;;;21453:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21514:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:25;;-1:-1:-1;;21514:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21557:28;;21514:25;;:16;21557:28:::1;::::0;::::1;21372:221:::0;;:::o;13584:107::-;-1:-1:-1;;;;;13664:19:0;13640:4;13664:19;;;:14;:19;;;;;;;;;13584:107::o;23710:338::-;-1:-1:-1;;;;;23804:19:0;;23796:68;;;;-1:-1:-1;;;23796:68:0;;15427:2:1;23796:68:0;;;15409:21:1;15466:2;15446:18;;;15439:30;15505:34;15485:18;;;15478:62;-1:-1:-1;;;15556:18:1;;;15549:34;15600:19;;23796:68:0;15225:400:1;23796:68:0;-1:-1:-1;;;;;23883:21:0;;23875:68;;;;-1:-1:-1;;;23875:68:0;;15832:2:1;23875:68:0;;;15814:21:1;15871:2;15851:18;;;15844:30;15910:34;15890:18;;;15883:62;-1:-1:-1;;;15961:18:1;;;15954:32;16003:19;;23875:68:0;15630:398:1;23875:68:0;-1:-1:-1;;;;;23956:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24008:32;;2049:25:1;;;24008:32:0;;2022:18:1;24008:32:0;1903:177:1;2539:98:0;2597:7;2624:5;2628:1;2624;:5;:::i;2645:98::-;2703:7;2730:5;2734:1;2730;:5;:::i;2327:98::-;2385:7;2412:5;2416:1;2412;:5;:::i;24056:502::-;24191:24;24218:25;24228:5;24235:7;24218:9;:25::i;:::-;24191:52;;-1:-1:-1;;24258:16:0;:37;24254:297;;24358:6;24338:16;:26;;24312:117;;;;-1:-1:-1;;;24312:117:0;;16235:2:1;24312:117:0;;;16217:21:1;16274:2;16254:18;;;16247:30;16313:31;16293:18;;;16286:59;16362:18;;24312:117:0;16033:353:1;24312:117:0;24473:51;24482:5;24489:7;24517:6;24498:16;:25;24473:8;:51::i;:::-;24180:378;24056:502;;;:::o;24566:1719::-;24689:37;24700:6;24708:9;24719:6;24689:10;:37::i;:::-;-1:-1:-1;;;;;24773:21:0;;24739:12;24773:21;;;:13;:21;;;;;;24754:4;;24773:21;;;:49;;-1:-1:-1;;;;;;24798:24:0;;;;;;:13;:24;;;;;;;;24773:49;24769:535;;;-1:-1:-1;24849:5:0;24769:535;;;24895:14;;;;24887:44;;;;-1:-1:-1;;;24887:44:0;;16593:2:1;24887:44:0;;;16575:21:1;16632:2;16612:18;;;16605:30;-1:-1:-1;;;16651:18:1;;;16644:47;16708:18;;24887:44:0;16391:341:1;24887:44:0;24982:12;;24972:6;:22;;24946:124;;;;-1:-1:-1;;;24946:124:0;;16939:2:1;24946:124:0;;;16921:21:1;16978:2;16958:18;;;16951:30;17017:34;16997:18;;;16990:62;-1:-1:-1;;;17068:18:1;;;17061:38;17116:19;;24946:124:0;16737:404:1;24946:124:0;25102:4;-1:-1:-1;;;;;25089:17:0;:9;-1:-1:-1;;;;;25089:17:0;;25085:208;;25190:16;;-1:-1:-1;;;;;25157:20:0;;;;;;:9;:20;;;;;;:29;;25180:6;;25157:29;:::i;:::-;:49;;25127:150;;;;-1:-1:-1;;;25127:150:0;;17348:2:1;25127:150:0;;;17330:21:1;17387:2;17367:18;;;17360:30;17426:29;17406:18;;;17399:57;17473:18;;25127:150:0;17146:351:1;25127:150:0;25316:31;25374:4;-1:-1:-1;;;;;25364:14:0;:6;-1:-1:-1;;;;;25364:14:0;;25360:426;;25413:19;25395:37;;25490:6;-1:-1:-1;;;;;25469:28:0;:9;-1:-1:-1;;;;;25469:28:0;;;:62;;;;;25520:11;;25501:15;:30;;25469:62;25447:159;;;-1:-1:-1;;;;;25566:17:0;;;;;;:6;:17;;;;;:24;;-1:-1:-1;;25566:24:0;25586:4;25566:24;;;25447:159;25360:426;;;25640:4;-1:-1:-1;;;;;25627:17:0;:9;-1:-1:-1;;;;;25627:17:0;;25623:163;;-1:-1:-1;25679:20:0;25623:163;;;-1:-1:-1;25750:24:0;25623:163;25810:9;;:16;;25824:1;25810:13;:16::i;:::-;25798:9;:28;25841:30;25856:6;25864;25841:14;:30::i;:::-;25837:120;;;25888:29;25903:13;;25888:14;:29::i;:::-;25944:1;25932:9;:13;25837:120;-1:-1:-1;;;;;25989:17:0;;;;;;:9;:17;;;;;;:29;;26011:6;25989:21;:29::i;:::-;-1:-1:-1;;;;;25969:17:0;;;;;;:9;:17;;;;;:49;;;;26054:7;:90;;26138:6;26054:90;;;26077:45;26090:6;26098;26106:15;26077:12;:45::i;:::-;-1:-1:-1;;;;;26178:20:0;;;;;;:9;:20;;;;;;26029:115;;-1:-1:-1;26178:40:0;;26029:115;26178:24;:40::i;:::-;-1:-1:-1;;;;;26155:20:0;;;;;;;:9;:20;;;;;;;:63;;;;26234:43;;;;;;-1:-1:-1;;;;;;;;;;;26234:43:0;;;26262:14;2049:25:1;;2037:2;2022:18;;1903:177;26234:43:0;;;;;;;;24678:1607;;;24566:1719;;;:::o;2433:98::-;2491:7;2518:5;2522:1;2518;:5;:::i;9205:214::-;9342:58;;;-1:-1:-1;;;;;10003:32:1;;9342:58:0;;;9985:51:1;10052:18;;;;10045:34;;;9342:58:0;;;;;;;;;;9958:18:1;;;;9342:58:0;;;;;;;;-1:-1:-1;;;;;9342:58:0;-1:-1:-1;;;9342:58:0;;;9288:123;;9322:5;;9288:19;:123::i;:::-;9205:214;;;:::o;26293:454::-;-1:-1:-1;;;;;26432:21:0;;;;;;:13;:21;;;;;;;;26431:22;26423:45;;;;-1:-1:-1;;;26423:45:0;;17704:2:1;26423:45:0;;;17686:21:1;17743:2;17723:18;;;17716:30;-1:-1:-1;;;17762:18:1;;;17755:40;17812:18;;26423:45:0;17502:334:1;26423:45:0;-1:-1:-1;;;;;26488:24:0;;;;;;:13;:24;;;;;;;;26487:25;26479:48;;;;-1:-1:-1;;;26479:48:0;;17704:2:1;26479:48:0;;;17686:21:1;17743:2;17723:18;;;17716:30;-1:-1:-1;;;17762:18:1;;;17755:40;17812:18;;26479:48:0;17502:334:1;26479:48:0;26555:1;26546:6;:10;26538:64;;;;-1:-1:-1;;;26538:64:0;;18043:2:1;26538:64:0;;;18025:21:1;18082:2;18062:18;;;18055:30;18121:34;18101:18;;;18094:62;-1:-1:-1;;;18172:18:1;;;18165:39;18221:19;;26538:64:0;17841:405:1;26538:64:0;-1:-1:-1;;;;;20415:18:0;;20388:7;20415:18;;;:9;:18;;;;;;26635:6;:27;;26613:126;;;;-1:-1:-1;;;26613:126:0;;18453:2:1;26613:126:0;;;18435:21:1;18492:2;18472:18;;;18465:30;18531:34;18511:18;;;18504:62;-1:-1:-1;;;18582:18:1;;;18575:47;18639:19;;26613:126:0;18251:413:1;30183:464:0;30330:15;;30406:13;;30396:4;30287;20415:18;;;:9;:18;;;;;;30451:8;;30287:4;;30320:25;;;;-1:-1:-1;30378:41:0;;30451:8;;30450:9;:47;;;;-1:-1:-1;30476:21:0;;;;30450:47;:72;;;;;30514:8;30450:72;:127;;;;;30552:25;;30539:9;;:38;;30450:127;:158;;;;;30594:14;30450:158;:189;;;;;30635:4;-1:-1:-1;;;;;30625:14:0;:6;-1:-1:-1;;;;;30625:14:0;;;30450:189;30430:209;30183:464;-1:-1:-1;;;;;30183:464:0:o;30655:943::-;18411:8;:15;;-1:-1:-1;;18411:15:0;18422:4;18411:15;;;30814:13:::1;::::0;30777:17:::1;::::0;18411:8;;30752:97:::1;::::0;30847:1:::1;::::0;30752:76:::1;::::0;;;:6;;:24:::1;:43::i;:97::-;30726:123:::0;-1:-1:-1;30860:20:0::1;30883:27;:6:::0;30726:123;30883:10:::1;:27::i;:::-;30860:50:::0;-1:-1:-1;30948:21:0::1;30980:30;30860:50:::0;30980:16:::1;:30::i;:::-;31023:20;31046:41;:21;31072:14:::0;31046:25:::1;:41::i;:::-;31023:64;;31098:19;31120:43;31138:24;31160:1;31138:17;;:21;;:24;;;;:::i;:::-;31120:13;::::0;;:17:::1;:43::i;:::-;31098:65:::0;-1:-1:-1;31180:19:0;;31176:191:::1;;31216:139;31247:15;31281:59;31338:1;31281:52;31321:11;31281:35;31298:17;;31281:12;:16;;:35;;;;:::i;:59::-;31216:12;:139::i;:::-;31494:18;::::0;31544:17:::1;::::0;31468:122:::1;::::0;-1:-1:-1;;;;;31494:18:0::1;::::0;31527:52:::1;::::0;31567:11;;31527:35:::1;::::0;:12;;:16:::1;:35::i;:52::-;31468:11;:122::i;:::-;-1:-1:-1::0;;18449:8:0;:16;;-1:-1:-1;;18449:16:0;;;-1:-1:-1;;;;30655:943:0:o;26755:1486::-;26894:7;26914:14;26931:4;:21;26936:15;26931:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;26931:21:0;;;26914:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26983:14:0;;;;:6;:14;;;;;;;26914:38;;-1:-1:-1;;26983:14:0;;:32;;;;-1:-1:-1;27001:14:0;;;;;;;26983:32;:98;;27069:3;:12;;;26983:98;;;27032:20;27049:3;16309:5;27032:20;:::i;:::-;26963:118;;27115:9;27128:1;27115:14;27111:60;;27153:6;27146:13;;;;;;27111:60;27181:17;27201:43;16309:5;27202:21;:6;27213:9;27202:10;:21::i;27201:43::-;27181:63;;27255:18;27276:43;27309:9;27277:26;27291:3;:11;;;27277:9;:13;;:26;;;;:::i;27276:43::-;27255:64;;27330:23;27356:72;27408:9;27357:31;27371:3;:16;;;27357:9;:13;;:31;;;;:::i;27356:72::-;27330:98;-1:-1:-1;27441:20:0;27464:46;27330:98;27464:25;:9;27478:10;27464:13;:25::i;:::-;:29;;:46::i;:::-;27441:69;-1:-1:-1;27527:14:0;;27523:177;;15950:42;27585:24;;:9;:24;;;;:40;;27614:10;27585:28;:40::i;:::-;15950:42;27558:24;;;;:9;:24;;;:67;;;;:24;27645:43;-1:-1:-1;;;;;27645:43:0;;;-1:-1:-1;;;;;;;;;;;27645:43:0;;;27677:10;2049:25:1;;2037:2;2022:18;;1903:177;27645:43:0;;;;;;;;27523:177;27714:19;;27710:260;;27825:16;;-1:-1:-1;;;;;27825:16:0;27789:68;;;;:9;:68;;;;;;:89;;27862:15;27789:72;:89::i;:::-;27768:16;;;-1:-1:-1;;;;;27768:16:0;;;27750:36;;;;:9;:36;;;;;;;;;:128;;;;27923:16;;27898:60;;2049:25:1;;;27923:16:0;;;;27898:60;;;;-1:-1:-1;;;;;;;;;;;27898:60:0;2022:18:1;27898:60:0;;;;;;;27710:260;27984:16;;27980:215;;28062:4;28044:24;;;;:9;:24;;;;;;:74;;28091:12;28044:28;:74::i;:::-;28035:4;28017:24;;;;:9;:24;;;;;;;:101;;;;28138:45;;-1:-1:-1;;;;;28138:45:0;;;-1:-1:-1;;;;;;;;;;;28138:45:0;;;28170:12;2049:25:1;;2037:2;2022:18;;1903:177;28138:45:0;;;;;;;;27980:215;28212:21;:6;28223:9;28212:10;:21::i;:::-;28205:28;26755:1486;-1:-1:-1;;;;;;;;;;26755:1486:0:o;12025:802::-;12449:23;12475:106;12517:4;12475:106;;;;;;;;;;;;;;;;;12483:5;-1:-1:-1;;;;;12475:27:0;;;:106;;;;;:::i;:::-;12596:17;;12449:132;;-1:-1:-1;12596:21:0;12592:228;;12711:10;12700:30;;;;;;;;;;;;:::i;:::-;12674:134;;;;-1:-1:-1;;;12674:134:0;;19121:2:1;12674:134:0;;;19103:21:1;19160:2;19140:18;;;19133:30;19199:34;19179:18;;;19172:62;-1:-1:-1;;;19250:18:1;;;19243:40;19300:19;;12674:134:0;18919:406:1;31967:444:0;32057:16;;;32071:1;32057:16;;;;;;;;32033:21;;32057:16;;;;;;;;;;-1:-1:-1;32057:16:0;32033:40;;32102:4;32084;32089:1;32084:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;32084:23:0;;;-1:-1:-1;;;;;32084:23:0;;;;;32128:6;-1:-1:-1;;;;;32128:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32118:4;32123:1;32118:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;32118:23:0;;;-1:-1:-1;;;;;32118:23:0;;;;;32152:53;32169:4;32184:6;32193:11;32152:8;:53::i;:::-;32216:187;;-1:-1:-1;;;32216:187:0;;-1:-1:-1;;;;;32216:6:0;:57;;;;:187;;32288:11;;32314:1;;32330:4;;32357;;32377:15;;32216:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32022:389;31967:444;:::o;31606:353::-;31687:53;31704:4;31719:6;31728:11;31687:8;:53::i;:::-;31892:18;;31751:200;;-1:-1:-1;;;31751:200:0;;31814:4;31751:200;;;20788:34:1;20838:18;;;20831:34;;;31860:1:0;20881:18:1;;;20874:34;;;20924:18;;;20917:34;-1:-1:-1;;;;;31892:18:0;;;20967:19:1;;;20960:44;31925:15:0;21020:19:1;;;21013:35;31751:6:0;:22;;;;;;31781:9;;20722:19:1;;31751:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;31606:353;;:::o;32419:227::-;32498:6;32508:1;32498:11;32494:24;;32419:227;;:::o;32494:24::-;32529:12;32555:9;-1:-1:-1;;;;;32547:23:0;32578:6;32547:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32528:61;;;32608:7;32600:38;;;;-1:-1:-1;;;32600:38:0;;21782:2:1;32600:38:0;;;21764:21:1;21821:2;21801:18;;;21794:30;-1:-1:-1;;;21840:18:1;;;21833:48;21898:18;;32600:38:0;21580:342:1;4459:229:0;4596:12;4628:52;4650:6;4658:4;4664:1;4667:12;4628:21;:52::i;:::-;4621:59;4459:229;-1:-1:-1;;;;4459:229:0:o;5060:612::-;5230:12;5302:5;5277:21;:30;;5255:118;;;;-1:-1:-1;;;5255:118:0;;22129:2:1;5255:118:0;;;22111:21:1;22168:2;22148:18;;;22141:30;22207:34;22187:18;;;22180:62;-1:-1:-1;;;22258:18:1;;;22251:36;22304:19;;5255:118:0;21927:402:1;5255:118:0;5385:12;5399:23;5426:6;-1:-1:-1;;;;;5426:11:0;5445:5;5466:4;5426:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5384:97;;;;5512:152;5557:6;5582:7;5608:10;5637:12;5512:26;:152::i;:::-;5492:172;5060:612;-1:-1:-1;;;;;;;5060:612:0:o;7176:644::-;7361:12;7390:7;7386:427;;;7418:10;:17;7439:1;7418:22;7414:290;;-1:-1:-1;;;;;3705:19:0;;;7628:60;;;;-1:-1:-1;;;7628:60:0;;22815:2:1;7628:60:0;;;22797:21:1;22854:2;22834:18;;;22827:30;22893:31;22873:18;;;22866:59;22942:18;;7628:60:0;22613:353:1;7628:60:0;-1:-1:-1;7725:10:0;7718:17;;7386:427;7768:33;7776:10;7788:12;8327:17;;:21;8323:388;;8559:10;8553:17;8616:15;8603:10;8599:2;8595:19;8588:44;8323:388;8686:12;8679:20;;-1:-1:-1;;;8679:20:0;;;;;;;;:::i;14:258:1:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;720:70;665:131;:::o;801:315::-;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;1106:2;1091:18;;;;1078:32;;-1:-1:-1;;;801:315:1:o;1313:156::-;1394:20;;1443:1;1433:12;;1423:40;;1459:1;1456;1449:12;1423:40;1313:156;;;:::o;1474:424::-;1580:6;1588;1596;1604;1657:3;1645:9;1636:7;1632:23;1628:33;1625:53;;;1674:1;1671;1664:12;1625:53;1697:42;1729:9;1697:42;:::i;:::-;1687:52;1786:2;1771:18;;1758:32;;-1:-1:-1;1837:2:1;1822:18;;1809:32;;1888:2;1873:18;1860:32;;-1:-1:-1;1474:424:1;-1:-1:-1;;;1474:424:1:o;2085:456::-;2162:6;2170;2178;2231:2;2219:9;2210:7;2206:23;2202:32;2199:52;;;2247:1;2244;2237:12;2199:52;2286:9;2273:23;2305:31;2330:5;2305:31;:::i;:::-;2355:5;-1:-1:-1;2412:2:1;2397:18;;2384:32;2425:33;2384:32;2425:33;:::i;:::-;2085:456;;2477:7;;-1:-1:-1;;;2531:2:1;2516:18;;;;2503:32;;2085:456::o;2546:247::-;2605:6;2658:2;2646:9;2637:7;2633:23;2629:32;2626:52;;;2674:1;2671;2664:12;2626:52;2713:9;2700:23;2732:31;2757:5;2732:31;:::i;2987:219::-;3066:6;3119:2;3107:9;3098:7;3094:23;3090:32;3087:52;;;3135:1;3132;3125:12;3087:52;3158:42;3190:9;3158:42;:::i;3607:529::-;3684:6;3692;3700;3753:2;3741:9;3732:7;3728:23;3724:32;3721:52;;;3769:1;3766;3759:12;3721:52;3808:9;3795:23;3827:31;3852:5;3827:31;:::i;:::-;3877:5;-1:-1:-1;3934:2:1;3919:18;;3906:32;3947:33;3906:32;3947:33;:::i;:::-;3999:7;-1:-1:-1;4058:2:1;4043:18;;4030:32;4071:33;4030:32;4071:33;:::i;:::-;4123:7;4113:17;;;3607:529;;;;;:::o;4141:118::-;4227:5;4220:13;4213:21;4206:5;4203:32;4193:60;;4249:1;4246;4239:12;4264:382;4329:6;4337;4390:2;4378:9;4369:7;4365:23;4361:32;4358:52;;;4406:1;4403;4396:12;4358:52;4445:9;4432:23;4464:31;4489:5;4464:31;:::i;:::-;4514:5;-1:-1:-1;4571:2:1;4556:18;;4543:32;4584:30;4543:32;4584:30;:::i;:::-;4633:7;4623:17;;;4264:382;;;;;:::o;4651:241::-;4707:6;4760:2;4748:9;4739:7;4735:23;4731:32;4728:52;;;4776:1;4773;4766:12;4728:52;4815:9;4802:23;4834:28;4856:5;4834:28;:::i;4897:367::-;4960:8;4970:6;5024:3;5017:4;5009:6;5005:17;5001:27;4991:55;;5042:1;5039;5032:12;4991:55;-1:-1:-1;5065:20:1;;5108:18;5097:30;;5094:50;;;5140:1;5137;5130:12;5094:50;5177:4;5169:6;5165:17;5153:29;;5237:3;5230:4;5220:6;5217:1;5213:14;5205:6;5201:27;5197:38;5194:47;5191:67;;;5254:1;5251;5244:12;5191:67;4897:367;;;;;:::o;5269:773::-;5391:6;5399;5407;5415;5468:2;5456:9;5447:7;5443:23;5439:32;5436:52;;;5484:1;5481;5474:12;5436:52;5524:9;5511:23;5553:18;5594:2;5586:6;5583:14;5580:34;;;5610:1;5607;5600:12;5580:34;5649:70;5711:7;5702:6;5691:9;5687:22;5649:70;:::i;:::-;5738:8;;-1:-1:-1;5623:96:1;-1:-1:-1;5826:2:1;5811:18;;5798:32;;-1:-1:-1;5842:16:1;;;5839:36;;;5871:1;5868;5861:12;5839:36;;5910:72;5974:7;5963:8;5952:9;5948:24;5910:72;:::i;:::-;5269:773;;;;-1:-1:-1;6001:8:1;-1:-1:-1;;;;5269:773:1:o;6047:180::-;6106:6;6159:2;6147:9;6138:7;6134:23;6130:32;6127:52;;;6175:1;6172;6165:12;6127:52;-1:-1:-1;6198:23:1;;6047:180;-1:-1:-1;6047:180:1:o;6440:446::-;6523:6;6531;6539;6547;6600:3;6588:9;6579:7;6575:23;6571:33;6568:53;;;6617:1;6614;6607:12;6568:53;6656:9;6643:23;6675:28;6697:5;6675:28;:::i;6891:388::-;6959:6;6967;7020:2;7008:9;6999:7;6995:23;6991:32;6988:52;;;7036:1;7033;7026:12;6988:52;7075:9;7062:23;7094:31;7119:5;7094:31;:::i;:::-;7144:5;-1:-1:-1;7201:2:1;7186:18;;7173:32;7214:33;7173:32;7214:33;:::i;7284:248::-;7352:6;7360;7413:2;7401:9;7392:7;7388:23;7384:32;7381:52;;;7429:1;7426;7419:12;7381:52;-1:-1:-1;;7452:23:1;;;7522:2;7507:18;;;7494:32;;-1:-1:-1;7284:248:1:o;7537:444::-;7608:6;7616;7624;7677:2;7665:9;7656:7;7652:23;7648:32;7645:52;;;7693:1;7690;7683:12;7645:52;7732:9;7719:23;7751:28;7773:5;7751:28;:::i;:::-;7798:5;-1:-1:-1;7850:2:1;7835:18;;7822:32;;-1:-1:-1;7906:2:1;7891:18;;7878:32;7919:30;7878:32;7919:30;:::i;8470:335::-;8672:2;8654:21;;;8711:2;8691:18;;;8684:30;-1:-1:-1;;;8745:2:1;8730:18;;8723:41;8796:2;8781:18;;8470:335::o;9166:127::-;9227:10;9222:3;9218:20;9215:1;9208:31;9258:4;9255:1;9248:15;9282:4;9279:1;9272:15;9622:184;9692:6;9745:2;9733:9;9724:7;9720:23;9716:32;9713:52;;;9761:1;9758;9751:12;9713:52;-1:-1:-1;9784:16:1;;9622:184;-1:-1:-1;9622:184:1:o;10090:127::-;10151:10;10146:3;10142:20;10139:1;10132:31;10182:4;10179:1;10172:15;10206:4;10203:1;10196:15;10222:128;10262:3;10293:1;10289:6;10286:1;10283:13;10280:39;;;10299:18;;:::i;:::-;-1:-1:-1;10335:9:1;;10222:128::o;10355:336::-;10557:2;10539:21;;;10596:2;10576:18;;;10569:30;-1:-1:-1;;;10630:2:1;10615:18;;10608:42;10682:2;10667:18;;10355:336::o;11085:335::-;11287:2;11269:21;;;11326:2;11306:18;;;11299:30;-1:-1:-1;;;11360:2:1;11345:18;;11338:41;11411:2;11396:18;;11085:335::o;11777:127::-;11838:10;11833:3;11829:20;11826:1;11819:31;11869:4;11866:1;11859:15;11893:4;11890:1;11883:15;11909:135;11948:3;11969:17;;;11966:43;;11989:18;;:::i;:::-;-1:-1:-1;12036:1:1;12025:13;;11909:135::o;12049:125::-;12089:4;12117:1;12114;12111:8;12108:34;;;12122:18;;:::i;:::-;-1:-1:-1;12159:9:1;;12049:125::o;13539:251::-;13609:6;13662:2;13650:9;13641:7;13637:23;13633:32;13630:52;;;13678:1;13675;13668:12;13630:52;13710:9;13704:16;13729:31;13754:5;13729:31;:::i;14830:168::-;14870:7;14936:1;14932;14928:6;14924:14;14921:1;14918:21;14913:1;14906:9;14899:17;14895:45;14892:71;;;14943:18;;:::i;:::-;-1:-1:-1;14983:9:1;;14830:168::o;15003:217::-;15043:1;15069;15059:132;;15113:10;15108:3;15104:20;15101:1;15094:31;15148:4;15145:1;15138:15;15176:4;15173:1;15166:15;15059:132;-1:-1:-1;15205:9:1;;15003:217::o;18669:245::-;18736:6;18789:2;18777:9;18768:7;18764:23;18760:32;18757:52;;;18805:1;18802;18795:12;18757:52;18837:9;18831:16;18856:28;18878:5;18856:28;:::i;19462:980::-;19724:4;19772:3;19761:9;19757:19;19803:6;19792:9;19785:25;19829:2;19867:6;19862:2;19851:9;19847:18;19840:34;19910:3;19905:2;19894:9;19890:18;19883:31;19934:6;19969;19963:13;20000:6;19992;19985:22;20038:3;20027:9;20023:19;20016:26;;20077:2;20069:6;20065:15;20051:29;;20098:1;20108:195;20122:6;20119:1;20116:13;20108:195;;;20187:13;;-1:-1:-1;;;;;20183:39:1;20171:52;;20278:15;;;;20243:12;;;;20219:1;20137:9;20108:195;;;-1:-1:-1;;;;;;;20359:32:1;;;;20354:2;20339:18;;20332:60;-1:-1:-1;;;20423:3:1;20408:19;20401:35;20320:3;19462:980;-1:-1:-1;;;19462:980:1:o;21059:306::-;21147:6;21155;21163;21216:2;21204:9;21195:7;21191:23;21187:32;21184:52;;;21232:1;21229;21222:12;21184:52;21261:9;21255:16;21245:26;;21311:2;21300:9;21296:18;21290:25;21280:35;;21355:2;21344:9;21340:18;21334:25;21324:35;;21059:306;;;;;:::o;22334:274::-;22463:3;22501:6;22495:13;22517:53;22563:6;22558:3;22551:4;22543:6;22539:17;22517:53;:::i;:::-;22586:16;;;;;22334:274;-1:-1:-1;;22334:274:1:o

Swarm Source

ipfs://314d39271e362c03e8c7e69ee8d2591461027f10aa2aa48388c60c2683eb8415
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.