BNB Price: $697.02 (-1.82%)
Gas: 1 GWei
 

Overview

Max Total Supply

1,000,000ARN

Holders

1,639

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
BscScan: Donate
Balance
0.009612185460340222 ARN

Value
$0.00
0x71c7656ec7ab88b098defb751b7401b5f6d8976f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x0979323F...F05E9d2E9
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
SafeSuperV2

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-11-28
*/

/**
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.4;

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

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

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

library SafeMath {
    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;
        }
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 functionCall(target, data, "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"
        );
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return _verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

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

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

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

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

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    function unlock() public virtual {
        require(
            _previousOwner == msg.sender,
            "Only the previous owner can unlock onwership"
        );
        require(block.timestamp > _lockTime, "The contract is still locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

abstract contract Manageable is Context {
    address private _manager;
    event ManagementTransferred(
        address indexed previousManager,
        address indexed newManager
    );

    constructor() {
        address msgSender = _msgSender();
        _manager = msgSender;
        emit ManagementTransferred(address(0), msgSender);
    }

    function manager() public view returns (address) {
        return _manager;
    }

    modifier onlyManager() {
        require(
            _manager == _msgSender(),
            "Manageable: caller is not the manager"
        );
        _;
    }

    function transferManagement(address newManager)
        external
        virtual
        onlyManager
    {
        emit ManagementTransferred(_manager, newManager);
        _manager = newManager;
    }
}

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

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

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

    function WETH() external pure returns (address);

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

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

interface IPayable {
    function pay(string memory serviceName) external payable;
}

/**
 * @title ServicePayer
 * @dev Implementation of the ServicePayer
 */
abstract contract ServicePayer {
    constructor(address payable receiver, string memory serviceName) payable {
        IPayable(receiver).pay{value: msg.value}(serviceName);
    }
}

abstract contract Fees {
    struct TokenFee {
        uint256 _rfifee;
        uint256 _burnfee;
        uint256 _liquidityfee;
        uint256 _charityfee;
        uint256 _marketingfee;
    }

    TokenFee tokenFees;

    constructor(
        uint256 rfifee_,
        uint256 burnfee_,
        uint256 liquidityfee_,
        uint256 charityfee_,
        uint256 marketingfee_
    ) {
        tokenFees = TokenFee(
            rfifee_,
            burnfee_,
            liquidityfee_,
            charityfee_,
            marketingfee_
        );
    }
}

abstract contract Tokenomics is Fees {
    using SafeMath for uint256;

    string internal NAME;
    string internal SYMBOL;

    uint16 internal FEES_DIVISOR = 10**3;
    uint8 internal DECIMAL = 18;
    uint256 internal ZEROES;

    uint256 private MAX = ~uint256(0);
    uint256 internal TOTAL_SUPPLY;
    uint256 internal _reflectedSupply;

    /**
     * @dev Set the maximum transaction amount allowed in a transfer.
     *
     * The default value is 1% of the total supply.
     *
     * NOTE: set the value to `TOTAL_SUPPLY` to have an unlimited max, i.e.
     * `maxTransactionAmount = TOTAL_SUPPLY;`
     */
    uint256 internal maxTransactionAmount;

    /**
     * @dev Set the maximum allowed balance in a wallet.
     *
     * The default value is 2% of the total supply.
     *
     * NOTE: set the value to 0 to have an unlimited max.
     *
     * IMPORTANT: This value MUST be greater than `numberOfTokensToSwapToLiquidity` set below,
     * otherwise the liquidity swap will never be executed
     */
    uint256 internal maxWalletBalance;
    // = TOTAL_SUPPLY / 50; // 2% of the total supply

    /**
     * @dev Set the number of tokens to swap and add to liquidity.
     *
     * Whenever the contract's balance reaches this number of tokens, swap & liquify will be
     * executed in the very next transfer (via the `_beforeTokenTransfer`)
     *
     * If the `FeeType.Liquidity` is enabled in `FeesSettings`, the given % of each transaction will be first
     * sent to the contract address. Once the contract's balance reaches `numberOfTokensToSwapToLiquidity` the
     * `swapAndLiquify` of `Liquifier` will be executed. Half of the tokens will be swapped for ETH
     * (or BNB on BSC) and together with the other half converted into a Token-ETH/Token-BNB LP Token.
     *
     * See: `Liquifier`
     */
    uint256 internal numberOfTokensToSwapToLiquidity; // = TOTAL_SUPPLY / 1000; // 0.1% of the total supply

    // --------------------- Fees Settings ------------------- //

    /**
     * @dev To add/edit/remove fees scroll down to the `addFees` function below
     */

    address internal charityAddress;
    // =0x3De92b2308f4acBA823fA58A0C02633380d570eE;
    address internal marketingAddress;
    //0x65b4eF486971839517d6FF08Af90fD69F26FbB1B;

    /**
     * @dev You can change the value of the burn address to pretty much anything
     * that's (clearly) a non-random address, i.e. for which the probability of
     * someone having the private key is (virtually) 0. For example, 0x00.....1,
     * 0x111...111, 0x12345.....12345, etc.
     *
     * NOTE: This does NOT need to be the zero address, adress(0) = 0x000...000;
     *
     * Trasfering tokens to the burn address is good for optics/marketing. Nevertheless
     * if the burn address is excluded from rewards (unlike in Safemoon), sending tokens
     * to the burn address actually improves redistribution to holders (as they will
     * have a larger % of tokens in non-excluded accounts)
     *
     * p.s. the address below is the speed of light in vacuum in m/s (expressed in decimals),
     * the hex value is 0x0000000000000000000000000000000011dE784A; :)
     *
     * Here are the values of some other fundamental constants to use:
     * 0x0000000000000000000000000000000602214076 (Avogardo constant)
     * 0x0000000000000000000000000000000001380649 (Boltzmann constant)
     * 0x2718281828459045235360287471352662497757 (e)
     * 0x0000000000000000000000000000001602176634 (elementary charge)
     * 0x0000000000000000000000000200231930436256 (electron g-factor)
     * 0x0000000000000000000000000000091093837015 (electron mass)
     * 0x0000000000000000000000000000137035999084 (fine structure constant)
     * 0x0577215664901532860606512090082402431042 (Euler-Mascheroni constant)
     * 0x1618033988749894848204586834365638117720 (golden ratio)
     * 0x0000000000000000000000000000009192631770 (hyperfine transition fq)
     * 0x0000000000000000000000000000010011659208 (muom g-2)
     * 0x3141592653589793238462643383279502884197 (pi)
     * 0x0000000000000000000000000000000662607015 (Planck's constant)
     * 0x0000000000000000000000000000001054571817 (reduced Planck's constant)
     * 0x1414213562373095048801688724209698078569 (sqrt(2))
     */
    address internal burnAddress = 0x000000000000000000000000000000000000dEaD;

    enum FeeType {
        Antiwhale,
        Burn,
        Liquidity,
        Rfi,
        External,
        ExternalToETH
    }
    struct Fee {
        FeeType name;
        address recipient;
        uint256 value;
        uint256 total;
    }

    Fee[] internal fees;
    uint256 internal sumOfFees;

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _totalSupply,
        uint256 _maxTransactionAmount,
        address _charityAddress,
        address _marketingAddress
    ) {
        NAME = _name;
        SYMBOL = _symbol;
        ZEROES = 10**DECIMAL;
        TOTAL_SUPPLY = _totalSupply * ZEROES;

        maxTransactionAmount = TOTAL_SUPPLY / 100;
        numberOfTokensToSwapToLiquidity = TOTAL_SUPPLY / 1000;
        charityAddress = _charityAddress;
        marketingAddress = _marketingAddress;
        _reflectedSupply = (MAX - (MAX % TOTAL_SUPPLY));
        maxWalletBalance = TOTAL_SUPPLY;

        _addFees(
            tokenFees._rfifee,
            tokenFees._burnfee,
            tokenFees._liquidityfee,
            tokenFees._charityfee,
            tokenFees._marketingfee
        );
    }

    function _addFee(
        FeeType name,
        address recipient,
        uint256 value
    ) private {
        fees.push(Fee(name, recipient, value, 0));
        sumOfFees += value;
    }

    function _addFees(
        uint256 _rfifee,
        uint256 _burnfee,
        uint256 _liquidityfee,
        uint256 _charityfee,
        uint256 _marketingfee
    ) private {
        /**
         * The RFI recipient is ignored but we need to give a valid address value
         *
         * CAUTION: If you don't want to use RFI this implementation isn't really for you!
         *      There are much more efficient and cleaner token contracts without RFI
         *      so you should use one of those
         *
         * The value of fees is given in part per 1000 (based on the value of FEES_DIVISOR),
         * e.g. for 5% use 50, for 3.5% use 35, etc.
         */
        _addFee(FeeType.Rfi, address(this), _rfifee);

        _addFee(FeeType.Burn, burnAddress, _burnfee);
        _addFee(FeeType.Liquidity, address(this), _liquidityfee);
        _addFee(FeeType.External, charityAddress, _charityfee);
        _addFee(FeeType.External, marketingAddress, _marketingfee);

        // 0.1% as a tip to the dev; feel free to remove this!
        // _addFee(FeeType.ExternalToETH, 1, tipToTheDev);
    }

    function _getFeesCount() internal view returns (uint256) {
        return fees.length;
    }

    function _getFeeStruct(uint256 index) private view returns (Fee storage) {
        require(
            index >= 0 && index < fees.length,
            "FeesSettings._getFeeStruct: Fee index out of bounds"
        );
        return fees[index];
    }

    function _getFee(uint256 index)
        internal
        view
        returns (
            FeeType,
            address,
            uint256,
            uint256
        )
    {
        Fee memory fee = _getFeeStruct(index);
        return (fee.name, fee.recipient, fee.value, fee.total);
    }

    function _addFeeCollectedAmount(uint256 index, uint256 amount) internal {
        Fee storage fee = _getFeeStruct(index);
        fee.total = fee.total.add(amount);
    }

    // function getCollectedFeeTotal(uint256 index) external view returns (uint256){
    function getCollectedFeeTotal(uint256 index)
        internal
        view
        returns (uint256)
    {
        Fee memory fee = _getFeeStruct(index);
        return fee.total;
    }
}

abstract contract Presaleable is Manageable {
    bool internal isInPresale;

    function setPreseableEnabled(bool value) external onlyManager {
        isInPresale = value;
    }
}

abstract contract BaseRfiToken is
    IERC20,
    IERC20Metadata,
    Ownable,
    Presaleable,
    Tokenomics
{
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) internal _reflectedBalances;
    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal _allowances;

    mapping(address => bool) internal _isExcludedFromFee;
    mapping(address => bool) internal _isExcludedFromRewards;
    address[] private _excluded;

    constructor() {
        _reflectedBalances[owner()] = _reflectedSupply;

        // exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        // exclude the owner and this contract from rewards
        _exclude(owner());
        _exclude(address(this));

        emit Transfer(address(0), owner(), TOTAL_SUPPLY);
    }

    /** Functions required by IERC20Metadat **/
    function name() external view override returns (string memory) {
        return NAME;
    }

    function symbol() external view override returns (string memory) {
        return SYMBOL;
    }

    function decimals() external view override returns (uint8) {
        return DECIMAL;
    }

    /** Functions required by IERC20Metadat - END **/
    /** Functions required by IERC20 **/
    function totalSupply() external view override returns (uint256) {
        return TOTAL_SUPPLY;
    }

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

    function transfer(address recipient, uint256 amount)
        external
        override
        returns (bool)
    {
        //
        //

        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

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

    /** Functions required by IERC20 - END **/

    /**
     * @dev this is really a "soft" burn (total supply is not reduced). RFI holders
     * get two benefits from burning tokens:
     *
     * 1) Tokens in the burn address increase the % of tokens held by holders not
     *    excluded from rewards (assuming the burn address is excluded)
     * 2) Tokens in the burn address cannot be sold (which in turn draing the
     *    liquidity pool)
     *
     *
     * In RFI holders already get % of each transaction so the value of their tokens
     * increases (in a way). Therefore there is really no need to do a "hard" burn
     * (reduce the total supply). What matters (in RFI) is to make sure that a large
     * amount of tokens cannot be sold = draining the liquidity pool = lowering the
     * value of tokens holders own. For this purpose, transfering tokens to a (vanity)
     * burn address is the most appropriate way to "burn".
     *
     * There is an extra check placed into the `transfer` function to make sure the
     * burn address cannot withdraw the tokens is has (although the chance of someone
     * having/finding the private key is virtually zero).
     */
    function burn(uint256 amount) external {
        address sender = _msgSender();
        require(
            sender != address(0),
            "BaseRfiToken: burn from the zero address"
        );
        require(
            sender != address(burnAddress),
            "BaseRfiToken: burn from the burn address"
        );

        uint256 balance = balanceOf(sender);
        require(balance >= amount, "BaseRfiToken: burn amount exceeds balance");

        uint256 reflectedAmount = amount.mul(_getCurrentRate());

        // remove the amount from the sender's balance first
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(
            reflectedAmount
        );
        if (_isExcludedFromRewards[sender])
            _balances[sender] = _balances[sender].sub(amount);

        _burnTokens(sender, amount, reflectedAmount);
    }

    /**
     * @dev "Soft" burns the specified amount of tokens by sending them
     * to the burn address
     */
    function _burnTokens(
        address sender,
        uint256 tBurn,
        uint256 rBurn
    ) internal {
        /**
         * @dev Do not reduce _totalSupply and/or _reflectedSupply. (soft) burning by sending
         * tokens to the burn address (which should be excluded from rewards) is sufficient
         * in RFI
         */
        _reflectedBalances[burnAddress] = _reflectedBalances[burnAddress].add(
            rBurn
        );
        if (_isExcludedFromRewards[burnAddress])
            _balances[burnAddress] = _balances[burnAddress].add(tBurn);

        /**
         * @dev Emit the event so that the burn address balance is updated (on bscscan)
         */
        emit Transfer(sender, burnAddress, tBurn);
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function isExcludedFromReward(address account)
        external
        view
        returns (bool)
    {
        return _isExcludedFromRewards[account];
    }

    /**
     * @dev Calculates and returns the reflected amount for the given amount with or without
     * the transfer fees (deductTransferFee true/false)
     */
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= TOTAL_SUPPLY, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , ) = _getValues(tAmount, 0);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , ) = _getValues(
                tAmount,
                _getSumOfFees(_msgSender(), tAmount)
            );
            return rTransferAmount;
        }
    }

    /**
     * @dev Calculates and returns the amount of tokens corresponding to the given reflected amount.
     */
    function tokenFromReflection(uint256 rAmount)
        internal
        view
        returns (uint256)
    {
        require(
            rAmount <= _reflectedSupply,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getCurrentRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) external onlyOwner {
        require(!_isExcludedFromRewards[account], "Account is not included");
        _exclude(account);
    }

    function _exclude(address account) internal {
        if (_reflectedBalances[account] > 0) {
            _balances[account] = tokenFromReflection(
                _reflectedBalances[account]
            );
        }
        _isExcludedFromRewards[account] = true;
        _excluded.push(account);
    }

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

    function setExcludedFromFee(address account, bool value)
        external
        onlyOwner
    {
        _isExcludedFromFee[account] = value;
    }

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

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        require(
            owner != address(0),
            "BaseRfiToken: approve from the zero address"
        );
        require(
            spender != address(0),
            "BaseRfiToken: approve to the zero address"
        );

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     */
    function _isUnlimitedSender(address account) internal view returns (bool) {
        // the owner should be the only whitelisted sender
        return (account == owner());
    }

    /**
     */
    function _isUnlimitedRecipient(address account)
        internal
        view
        returns (bool)
    {
        // the owner should be a white-listed recipient
        // and anyone should be able to burn as many tokens as
        // he/she wants
        return (account == owner() || account == burnAddress);
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(
            sender != address(0),
            "BaseRfiToken: transfer from the zero address"
        );
        require(
            recipient != address(0),
            "BaseRfiToken: transfer to the zero address"
        );
        require(
            sender != address(burnAddress),
            "BaseRfiToken: transfer from the burn address"
        );
        require(amount > 0, "Transfer amount must be greater than zero");

        // indicates whether or not feee should be deducted from the transfer
        bool takeFee = true;

        if (isInPresale) {
            takeFee = false;
        } else {
            /**
             * Check the amount is within the max allowed limit as long as a
             * unlimited sender/recepient is not involved in the transaction
             */
            if (
                amount > maxTransactionAmount &&
                !_isUnlimitedSender(sender) &&
                !_isUnlimitedRecipient(recipient)
            ) {
                revert("Transfer amount exceeds the maxTxAmount.");
            }
            /**
             * The pair needs to excluded from the max wallet balance check;
             * selling tokens is sending them back to the pair (without this
             * check, selling tokens would not work if the pair's balance
             * was over the allowed max)
             *
             * Note: This does NOT take into account the fees which will be deducted
             *       from the amount. As such it could be a bit confusing
             */
            if (
                maxWalletBalance > 0 &&
                !_isUnlimitedSender(sender) &&
                !_isUnlimitedRecipient(recipient) &&
                !_isV2Pair(recipient)
            ) {
                uint256 recipientBalance = balanceOf(recipient);
                require(
                    recipientBalance + amount <= maxWalletBalance,
                    "New balance would exceed the maxWalletBalance"
                );
            }
        }

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

        _beforeTokenTransfer(sender, recipient, amount, takeFee);
        _transferTokens(sender, recipient, amount, takeFee);
    }

    function _transferTokens(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        uint256 sumOfFees = _getSumOfFees(sender, amount);
        if (!takeFee) {
            sumOfFees = 0;
        }

        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 tAmount,
            uint256 tTransferAmount,
            uint256 currentRate
        ) = _getValues(amount, sumOfFees);

        /**
         * Sender's and Recipient's reflected balances must be always updated regardless of
         * whether they are excluded from rewards or not.
         */
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount);
        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(
            rTransferAmount
        );

        /**
         * Update the true/nominal balances for excluded accounts
         */
        if (_isExcludedFromRewards[sender]) {
            _balances[sender] = _balances[sender].sub(tAmount);
        }
        if (_isExcludedFromRewards[recipient]) {
            _balances[recipient] = _balances[recipient].add(tTransferAmount);
        }

        _takeFees(amount, currentRate, sumOfFees);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _takeFees(
        uint256 amount,
        uint256 currentRate,
        uint256 sumOfFees
    ) private {
        if (sumOfFees > 0 && !isInPresale) {
            _takeTransactionFees(amount, currentRate);
        }
    }

    function _getValues(uint256 tAmount, uint256 feesSum)
        internal
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR);
        uint256 tTransferAmount = tAmount.sub(tTotalFees);
        uint256 currentRate = _getCurrentRate();
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rTotalFees = tTotalFees.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rTotalFees);

        return (
            rAmount,
            rTransferAmount,
            tAmount,
            tTransferAmount,
            currentRate
        );
    }

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

    function _getCurrentSupply() internal view returns (uint256, uint256) {
        uint256 rSupply = _reflectedSupply;
        uint256 tSupply = TOTAL_SUPPLY;

        /**
         * The code below removes balances of addresses excluded from rewards from
         * rSupply and tSupply, which effectively increases the % of transaction fees
         * delivered to non-excluded holders
         */
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _reflectedBalances[_excluded[i]] > rSupply ||
                _balances[_excluded[i]] > tSupply
            ) return (_reflectedSupply, TOTAL_SUPPLY);
            rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]);
            tSupply = tSupply.sub(_balances[_excluded[i]]);
        }
        if (tSupply == 0 || rSupply < _reflectedSupply.div(TOTAL_SUPPLY))
            return (_reflectedSupply, TOTAL_SUPPLY);
        return (rSupply, tSupply);
    }

    /**
     * @dev Hook that is called before any transfer of tokens.
     */
    function _beforeTokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) internal virtual;

    /**
     * @dev Returns the total sum of fees to be processed in each transaction.
     *
     * To separate concerns this contract (class) will take care of ONLY handling RFI, i.e.
     * changing the rates and updating the holder's balance (via `_redistribute`).
     * It is the responsibility of the dev/user to handle all other fees and taxes
     * in the appropriate contracts (classes).
     */
    function _getSumOfFees(address sender, uint256 amount)
        internal
        view
        virtual
        returns (uint256);

    /**
     * @dev A delegate which should return true if the given address is the V2 Pair and false otherwise
     */
    function _isV2Pair(address account) internal view virtual returns (bool);

    /**
     * @dev Redistributes the specified amount among the current holders via the reflect.finance
     * algorithm, i.e. by updating the _reflectedSupply (_rSupply) which ultimately adjusts the
     * current rate used by `tokenFromReflection` and, in turn, the value returns from `balanceOf`.
     * This is the bit of clever math which allows rfi to redistribute the fee without
     * having to iterate through all holders.
     *
     * Visit our discord at https://discord.gg/dAmr6eUTpM
     */
    function _redistribute(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        uint256 index
    ) internal {
        uint256 tFee = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rFee = tFee.mul(currentRate);

        _reflectedSupply = _reflectedSupply.sub(rFee);
        _addFeeCollectedAmount(index, tFee);
    }

    /**
     * @dev Hook that is called before the `Transfer` event is emitted if fees are enabled for the transfer
     */
    function _takeTransactionFees(uint256 amount, uint256 currentRate)
        internal
        virtual;
}

abstract contract Liquifier is Ownable, Manageable {
    using SafeMath for uint256;

    uint256 private withdrawableBalance;

    enum Env {
        Testnet,
        MainnetV1,
        MainnetV2
    }
    Env private _env;

    // PancakeSwap V1
    address private _mainnetRouterV1Address =
        0x05fF2B0DB69458A0750badebc4f9e13aDd608C7F;
    // PancakeSwap V2
    address private _mainnetRouterV2Address =
        0x10ED43C718714eb63d5aA57B78B54704E256024E;
    // Testnet
    // address private _testnetRouterAddress = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1;
    // PancakeSwap Testnet = https://pancake.kiemtienonline360.com/
    address private _testnetRouterAddress =
        0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;

    IPancakeV2Router internal _router;
    address internal _pair;

    bool private inSwapAndLiquify;
    bool private swapAndLiquifyEnabled = true;

    uint256 private maxTransactionAmount;
    uint256 private numberOfTokensToSwapToLiquidity;

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

    event RouterSet(address indexed router);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event LiquidityAdded(
        uint256 tokenAmountSent,
        uint256 ethAmountSent,
        uint256 liquidity
    );

    receive() external payable {}

    function initializeLiquiditySwapper(
        Env env,
        uint256 maxTx,
        uint256 liquifyAmount
    ) internal {
        _env = env;
        if (_env == Env.MainnetV1) {
            _setRouterAddress(_mainnetRouterV1Address);
        } else if (_env == Env.MainnetV2) {
            _setRouterAddress(_mainnetRouterV2Address);
        }
        /*(_env == Env.Testnet)*/
        else {
            _setRouterAddress(_testnetRouterAddress);
        }

        maxTransactionAmount = maxTx;
        numberOfTokensToSwapToLiquidity = liquifyAmount;
    }

    /**
     * NOTE: passing the `contractTokenBalance` here is preferred to creating `balanceOfDelegate`
     */
    function liquify(uint256 contractTokenBalance, address sender) internal {
        if (contractTokenBalance >= maxTransactionAmount)
            contractTokenBalance = maxTransactionAmount;

        bool isOverRequiredTokenBalance = (contractTokenBalance >=
            numberOfTokensToSwapToLiquidity);

        /**
         * - first check if the contract has collected enough tokens to swap and liquify
         * - then check swap and liquify is enabled
         * - then make sure not to get caught in a circular liquidity event
         * - finally, don't swap & liquify if the sender is the uniswap pair
         */
        if (
            isOverRequiredTokenBalance &&
            swapAndLiquifyEnabled &&
            !inSwapAndLiquify &&
            (sender != _pair)
        ) {
            // TODO check if the `(sender != _pair)` is necessary because that basically
            // stops swap and liquify for all "buy" transactions
            _swapAndLiquify(contractTokenBalance);
        }
    }

    /**
     * @dev sets the router address and created the router, factory pair to enable
     * swapping and liquifying (contract) tokens
     */
    function _setRouterAddress(address router) private {
        IPancakeV2Router _newPancakeRouter = IPancakeV2Router(router);
        _pair = IPancakeV2Factory(_newPancakeRouter.factory()).createPair(
            address(this),
            _newPancakeRouter.WETH()
        );
        _router = _newPancakeRouter;
        emit RouterSet(router);
    }

    function _swapAndLiquify(uint256 amount) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = amount.div(2);
        uint256 otherHalf = amount.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        _swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        _addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

        _approveDelegate(address(this), address(_router), tokenAmount);

        // make the swap
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            // The minimum amount of output tokens that must be received for the transaction not to revert.
            // 0 = accept any amount (slippage is inevitable)
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approveDelegate(address(this), address(_router), tokenAmount);

        // add tahe liquidity
        (uint256 tokenAmountSent, uint256 ethAmountSent, uint256 liquidity) = _router
            .addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            // Bounds the extent to which the WETH/token price can go up before the transaction reverts.
            // Must be <= amountTokenDesired; 0 = accept any amount (slippage is inevitable)
            0,
            // Bounds the extent to which the token/WETH price can go up before the transaction reverts.
            // 0 = accept any amount (slippage is inevitable)
            0,
            // this is a centralized risk if the owner's account is ever compromised (see Certik SSL-04)
            owner(),
            block.timestamp
        );

        // fix the forever locked BNBs as per the certik's audit
        /**
         * The swapAndLiquify function converts half of the contractTokenBalance SafeMoon tokens to BNB.
         * For every swapAndLiquify function call, a small amount of BNB remains in the contract.
         * This amount grows over time with the swapAndLiquify function being called throughout the life
         * of the contract. The Safemoon contract does not contain a method to withdraw these funds,
         * and the BNB will be locked in the Safemoon contract forever.
         */
        withdrawableBalance = address(this).balance;
        emit LiquidityAdded(tokenAmountSent, ethAmountSent, liquidity);
    }

    /**
     * @dev Sets the uniswapV2 pair (router & factory) for swapping and liquifying tokens
     */
    function setRouterAddress(address router) external onlyManager {
        _setRouterAddress(router);
    }

    /**
     * @dev Sends the swap and liquify flag to the provided value. If set to `false` tokens collected in the contract will
     * NOT be converted into liquidity.
     */
    function setSwapAndLiquifyEnabled(bool enabled) external onlyManager {
        swapAndLiquifyEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(swapAndLiquifyEnabled);
    }

    /**
     * @dev The owner can withdraw ETH(BNB) collected in the contract from `swapAndLiquify`
     * or if someone (accidentally) sends ETH/BNB directly to the contract.
     *
     * Note: This addresses the contract flaw pointed out in the Certik Audit of Safemoon (SSL-03):
     *
     * The swapAndLiquify function converts half of the contractTokenBalance SafeMoon tokens to BNB.
     * For every swapAndLiquify function call, a small amount of BNB remains in the contract.
     * This amount grows over time with the swapAndLiquify function being called
     * throughout the life of the contract. The Safemoon contract does not contain a method
     * to withdraw these funds, and the BNB will be locked in the Safemoon contract forever.
     * https://www.certik.org/projects/safemoon
     */
    function withdrawLockedEth(address payable recipient) external onlyManager {
        require(
            recipient != address(0),
            "Cannot withdraw the ETH balance to the zero address"
        );
        require(
            withdrawableBalance > 0,
            "The ETH balance must be greater than 0"
        );

        // prevent re-entrancy attacks
        uint256 amount = withdrawableBalance;
        withdrawableBalance = 0;
        recipient.transfer(amount);
    }

    /**
     * @dev Use this delegate instead of having (unnecessarily) extend `BaseRfiToken` to gained access
     * to the `_approve` function.
     */
    function _approveDelegate(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual;
}

//////////////////////////////////////////////////////////////////////////
abstract contract Antiwhale is Tokenomics {
    /**
     * @dev Returns the total sum of fees (in percents / per-mille - this depends on the FEES_DIVISOR value)
     *
     * NOTE: Currently this is just a placeholder. The parameters passed to this function are the
     *      sender's token balance and the transfer amount. An *antiwhale* mechanics can use these
     *      values to adjust the fees total for each tx
     */
    // function _getAntiwhaleFees(uint256 sendersBalance, uint256 amount) internal view returns (uint256){
    function _getAntiwhaleFees(uint256, uint256)
        internal
        view
        returns (uint256)
    {
        return sumOfFees;
    }
}

//////////////////////////////////////////////////////////////////////////

abstract contract SafeSuper is BaseRfiToken, Liquifier, Antiwhale {
    using SafeMath for uint256;

    // constructor(string memory _name, string memory _symbol, uint8 _decimals){

    constructor(Env _env) {
        initializeLiquiditySwapper(
            _env,
            maxTransactionAmount,
            numberOfTokensToSwapToLiquidity
        );

        // exclude the pair address from rewards - we don't want to redistribute
        // tx fees to these two; redistribution is only for holders, dah!
        _exclude(_pair);
        _exclude(burnAddress);
    }

    function _isV2Pair(address account) internal view override returns (bool) {
        return (account == _pair);
    }

    function _getSumOfFees(address sender, uint256 amount)
        internal
        view
        override
        returns (uint256)
    {
        return _getAntiwhaleFees(balanceOf(sender), amount);
    }

    function _beforeTokenTransfer(
        address sender,
        address,
        uint256,
        bool
    ) internal override {
        if (!isInPresale) {
            uint256 contractTokenBalance = balanceOf(address(this));
            liquify(contractTokenBalance, sender);
        }
    }

    function _takeTransactionFees(uint256 amount, uint256 currentRate)
        internal
        override
    {
        if (isInPresale) {
            return;
        }

        uint256 feesCount = _getFeesCount();
        for (uint256 index = 0; index < feesCount; index++) {
            (FeeType name, address recipient, uint256 value, ) = _getFee(index);
            // no need to check value < 0 as the value is uint (i.e. from 0 to 2^256-1)
            if (value == 0) continue;

            if (name == FeeType.Rfi) {
                _redistribute(amount, currentRate, value, index);
            } else if (name == FeeType.Burn) {
                _burn(amount, currentRate, value, index);
            } else if (name == FeeType.Antiwhale) {
                // TODO
            } else if (name == FeeType.ExternalToETH) {
                _takeFeeToETH(amount, currentRate, value, recipient, index);
            } else {
                _takeFee(amount, currentRate, value, recipient, index);
            }
        }
    }

    function _burn(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        uint256 index
    ) private {
        uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rBurn = tBurn.mul(currentRate);

        _burnTokens(address(this), tBurn, rBurn);
        _addFeeCollectedAmount(index, tBurn);
    }

    function _takeFee(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        address recipient,
        uint256 index
    ) private {
        uint256 tAmount = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rAmount = tAmount.mul(currentRate);

        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(
            rAmount
        );
        if (_isExcludedFromRewards[recipient])
            _balances[recipient] = _balances[recipient].add(tAmount);

        _addFeeCollectedAmount(index, tAmount);
    }

    /**
     * @dev When implemented this will convert the fee amount of tokens into ETH/BNB
     * and send to the recipient's wallet. Note that this reduces liquidity so it
     * might be a good idea to add a % into the liquidity fee for % you take our through
     * this method (just a suggestions)
     */
    function _takeFeeToETH(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        address recipient,
        uint256 index
    ) private {
        _takeFee(amount, currentRate, fee, recipient, index);
    }

    function _approveDelegate(
        address owner,
        address spender,
        uint256 amount
    ) internal override {
        _approve(owner, spender, amount);
    }
}

contract SafeSuperV2 is SafeSuper, ServicePayer {
    address payable service =
        payable(0x56137d275b1EbD98C54D91e1D16C011D14CD59d9);

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _totalSupply,
        uint256 _maxTransactionAmount,
        address _charityAddress,
        address _marketingAddress,
        uint256 _rfifee,
        uint256 _burnfee,
        uint256 _liquidityfee,
        uint256 _charityfee,
        uint256 _marketingfee
    )
        payable
        ServicePayer(service, "SafeSuperNCV3")
        Fees(_rfifee, _burnfee, _liquidityfee, _charityfee, _marketingfee)
        Tokenomics(
            _name,
            _symbol,
            _totalSupply,
            _maxTransactionAmount,
            _charityAddress,
            _marketingAddress
        )
        SafeSuper(Env.MainnetV2)
    {
        // pre-approve the initial liquidity supply (to safe a bit of time)
        _approve(owner(), address(_router), ~uint256(0));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"},{"internalType":"address","name":"_charityAddress","type":"address"},{"internalType":"address","name":"_marketingAddress","type":"address"},{"internalType":"uint256","name":"_rfifee","type":"uint256"},{"internalType":"uint256","name":"_burnfee","type":"uint256"},{"internalType":"uint256","name":"_liquidityfee","type":"uint256"},{"internalType":"uint256","name":"_charityfee","type":"uint256"},{"internalType":"uint256","name":"_marketingfee","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"ManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"RouterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPreseableEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newManager","type":"address"}],"name":"transferManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawLockedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040819052600b8054621203e862ffffff19909116179055600019600d55601580546001600160a01b031990811661dead17909155601f80547405ff2b0db69458a0750badebc4f9e13add608c7f00610100600160a81b03199091161790556020805482167310ed43c718714eb63d5aa57b78b54704e256024e179055602180548216739ac64cc6e4415144c455bd8e4837fea55603e5c31790556023805460ff60a81b1916600160a81b179055602680549091167356137d275b1ebd98c54d91e1d16c011d14cd59d91790556200406638819003908190833981016040819052620000ed9162000f98565b60265460408051808201909152600d81526c5361666553757065724e43563360981b60208201526001600160a01b039091169060028d8d8d8d8d8d8d8d8d8d8d600033600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600380546001600160a01b0319163390811790915560405181906000907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a3506040805160a081018252868152602080820187905291810185905260608101849052608001829052600495909555600593909355600691909155600755600855865162000211916009919089019062000e29565b5084516200022790600a90602088019062000e29565b50600b54620002419062010000900460ff16600a62001121565b600c819055620002529085620011e0565b600e8190556200026590606490620010c1565b601055600e546200027a906103e890620010c1565b601255601380546001600160a01b038085166001600160a01b0319928316179092556014805492841692909116919091179055600e54600d54620002bf9190620012aa565b600d54620002ce919062001202565b600f55600e54601155600454600554600654600754600854620002f59493929190620004f6565b505050505050600f5460186000620003126200056a60201b60201c565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506001601b60006200034c6200056a60201b60201c565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601b909252902080549091166001179055620003a9620003a36000546001600160a01b031690565b62000579565b620003b43062000579565b6000546001600160a01b03166001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600e546040516200040891815260200190565b60405180910390a362000427816010546012546200063c60201b60201c565b6023546200043e906001600160a01b031662000579565b60155462000455906001600160a01b031662000579565b506040516315b36b9760e11b81526001600160a01b03831690632b66d72e9034906200048690859060040162001071565b6000604051808303818588803b158015620004a057600080fd5b505af1158015620004b5573d6000803e3d6000fd5b50505050505050620004e5620004d06200056a60201b60201c565b6022546001600160a01b031660001962000729565b505050505050505050505062001303565b620005046003308762000864565b6015546200051f906001906001600160a01b03168662000864565b6200052d6002308562000864565b60135462000548906004906001600160a01b03168462000864565b60145462000563906004906001600160a01b03168362000864565b5050505050565b6000546001600160a01b031690565b6001600160a01b03811660009081526018602052604090205415620005d6576001600160a01b038116600090815260186020526040902054620005bc9062000960565b6001600160a01b0382166000908152601960205260409020555b6001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b601f805484919060ff191660018360028111156200066a57634e487b7160e01b600052602160045260246000fd5b02179055506001601f5460ff1660028111156200069757634e487b7160e01b600052602160045260246000fd5b1415620006c057601f54620006ba9061010090046001600160a01b0316620009f8565b6200071d565b6002601f5460ff166002811115620006e857634e487b7160e01b600052602160045260246000fd5b14156200070657602054620006ba906001600160a01b0316620009f8565b6021546200071d906001600160a01b0316620009f8565b60249190915560255550565b6001600160a01b038316620007995760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b6001600160a01b038216620008035760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b606482015260840162000790565b6001600160a01b038381166000818152601a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601660405180608001604052808560058111156200089257634e487b7160e01b600052602160045260246000fd5b81526001600160a01b038516602080830191909152604082018590526000606090920182905283546001818101865594835291208251600390920201805492939092839160ff1990911690836005811115620008fe57634e487b7160e01b600052602160045260246000fd5b0217905550602082015181546001600160a01b0390911661010002610100600160a81b0319909116178155604082015160018201556060909101516002909101556017805482919060009062000956908490620010a6565b9091555050505050565b6000600f54821115620009c95760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840162000790565b6000620009d562000bd7565b9050620009f1818462000c0a60201b6200131e1790919060201c565b9392505050565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a3757600080fd5b505afa15801562000a4c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a72919062000f7b565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801562000abb57600080fd5b505afa15801562000ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000af6919062000f7b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801562000b3f57600080fd5b505af115801562000b54573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b7a919062000f7b565b602380546001600160a01b03199081166001600160a01b039384161790915560228054909116838316179055604051908316907fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1590600090a25050565b6000808062000be562000c21565b9150915062000c03818362000c0a60201b6200131e1790919060201c565b9250505090565b600062000c188284620010c1565b90505b92915050565b600f54600e546000918291825b601d5481101562000dd1578260186000601d848154811062000c6057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000cdb57508160196000601d848154811062000cb457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000cf257600f54600e54945094505050509091565b62000d5560186000601d848154811062000d1c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205485916200133162000e1b821b17901c565b925062000dba60196000601d848154811062000d8157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205484916200133162000e1b821b17901c565b91508062000dc8816200128c565b91505062000c2e565b5080158062000dfc575062000df9600e54600f5462000c0a60201b6200131e1790919060201c565b82105b1562000e1257600f54600e549350935050509091565b90939092509050565b600062000c18828462001202565b82805462000e37906200124f565b90600052602060002090601f01602090048101928262000e5b576000855562000ea6565b82601f1062000e7657805160ff191683800117855562000ea6565b8280016001018555821562000ea6579182015b8281111562000ea657825182559160200191906001019062000e89565b5062000eb492915062000eb8565b5090565b5b8082111562000eb4576000815560010162000eb9565b80516001600160a01b038116811462000ee757600080fd5b919050565b600082601f83011262000efd578081fd5b81516001600160401b038082111562000f1a5762000f1a620012ed565b604051601f8301601f19908116603f0116810190828211818310171562000f455762000f45620012ed565b8160405283815286602085880101111562000f5e578485fd5b62000f718460208301602089016200121c565b9695505050505050565b60006020828403121562000f8d578081fd5b62000c188262000ecf565b60008060008060008060008060008060006101608c8e03121562000fba578687fd5b8b516001600160401b0381111562000fd0578788fd5b62000fde8e828f0162000eec565b60208e0151909c5090506001600160401b0381111562000ffc578788fd5b6200100a8e828f0162000eec565b9a505060408c0151985060608c015197506200102960808d0162000ecf565b96506200103960a08d0162000ecf565b955060c08c0151945060e08c015193506101008c015192506101208c015191506101408c015190509295989b509295989b9093969950565b6020815260008251806020840152620010928160408501602087016200121c565b601f01601f19169190910160400192915050565b60008219821115620010bc57620010bc620012c1565b500190565b600082620010d357620010d3620012d7565b500490565b600181815b8085111562001119578160001904821115620010fd57620010fd620012c1565b808516156200110b57918102915b93841c9390800290620010dd565b509250929050565b600062000c1860ff8416836000826200113d5750600162000c1b565b816200114c5750600062000c1b565b8160018114620011655760028114620011705762001190565b600191505062000c1b565b60ff841115620011845762001184620012c1565b50506001821b62000c1b565b5060208310610133831016604e8410600b8410161715620011b5575081810a62000c1b565b620011c18383620010d8565b8060001904821115620011d857620011d8620012c1565b029392505050565b6000816000190483118215151615620011fd57620011fd620012c1565b500290565b600082821015620012175762001217620012c1565b500390565b60005b83811015620012395781810151838201526020016200121f565b8381111562001249576000848401525b50505050565b600181811c908216806200126457607f821691505b602082108114156200128657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620012a357620012a3620012c1565b5060010190565b600082620012bc57620012bc620012d7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b612d5380620013136000396000f3fe6080604052600436106101d15760003560e01c806370a08231116100f7578063a69df4b511610095578063dd46706411610064578063dd4670641461055a578063dd62ed3e1461057a578063e4edf852146105c0578063f2fde38b146105e057600080fd5b8063a69df4b5146104e5578063a9059cbb146104fa578063b7671a0d1461051a578063c49b9a801461053a57600080fd5b806388f82020116100d157806388f82020146104595780638da5cb5b1461049257806395d89b41146104b0578063a457c2d7146104c557600080fd5b806370a0823114610404578063715018a61461042457806374778cdc1461043957600080fd5b806341cb87fc1161016f57806352390c021161013e57806352390c02146103765780635342acb414610396578063602bc62b146103cf5780636612e66f146103e457600080fd5b806341cb87fc146102e457806342966c68146103045780634549b03914610324578063481c6a751461034457600080fd5b806323b872dd116101ab57806323b872dd14610257578063313ce567146102775780633685d419146102a257806339509351146102c457600080fd5b806306fdde03146101dd578063095ea7b31461020857806318160ddd1461023857600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101f2610600565b6040516101ff9190612a84565b60405180910390f35b34801561021457600080fd5b506102286102233660046129d8565b610692565b60405190151581526020016101ff565b34801561024457600080fd5b50600e545b6040519081526020016101ff565b34801561026357600080fd5b50610228610272366004612964565b6106a9565b34801561028357600080fd5b50600b5462010000900460ff1660405160ff90911681526020016101ff565b3480156102ae57600080fd5b506102c26102bd3660046128f4565b610712565b005b3480156102d057600080fd5b506102286102df3660046129d8565b61090a565b3480156102f057600080fd5b506102c26102ff3660046128f4565b610940565b34801561031057600080fd5b506102c261031f366004612a1d565b610976565b34801561033057600080fd5b5061024961033f366004612a35565b610b68565b34801561035057600080fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b34801561038257600080fd5b506102c26103913660046128f4565b610bff565b3480156103a257600080fd5b506102286103b13660046128f4565b6001600160a01b03166000908152601b602052604090205460ff1690565b3480156103db57600080fd5b50600254610249565b3480156103f057600080fd5b506102c26103ff3660046129a4565b610c9b565b34801561041057600080fd5b5061024961041f3660046128f4565b610cf0565b34801561043057600080fd5b506102c2610d4f565b34801561044557600080fd5b506102c2610454366004612a03565b610db1565b34801561046557600080fd5b506102286104743660046128f4565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561049e57600080fd5b506000546001600160a01b031661035e565b3480156104bc57600080fd5b506101f2610df9565b3480156104d157600080fd5b506102286104e03660046129d8565b610e08565b3480156104f157600080fd5b506102c2610e57565b34801561050657600080fd5b506102286105153660046129d8565b610f66565b34801561052657600080fd5b506102c26105353660046128f4565b610f73565b34801561054657600080fd5b506102c2610555366004612a03565b6110b6565b34801561056657600080fd5b506102c2610575366004612a1d565b61113b565b34801561058657600080fd5b5061024961059536600461292c565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b3480156105cc57600080fd5b506102c26105db3660046128f4565b6111c0565b3480156105ec57600080fd5b506102c26105fb3660046128f4565b611246565b60606009805461060f90612c2f565b80601f016020809104026020016040519081016040528092919081815260200182805461063b90612c2f565b80156106885780601f1061065d57610100808354040283529160200191610688565b820191906000526020600020905b81548152906001019060200180831161066b57829003601f168201915b5050505050905090565b600061069f33848461133d565b5060015b92915050565b60006106b6848484611471565b610708843361070385604051806060016040528060288152602001612cb1602891396001600160a01b038a166000908152601a6020908152604080832033845290915290205491906117f8565b61133d565b5060019392505050565b6000546001600160a01b031633146107455760405162461bcd60e51b815260040161073c90612ad7565b60405180910390fd5b6001600160a01b0381166000908152601c602052604090205460ff166107ad5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c75646564000000000000000000604482015260640161073c565b60005b601d5481101561090657816001600160a01b0316601d82815481106107e557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156108f457601d805461081090600190612c18565b8154811061082e57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601d80546001600160a01b03909216918390811061086857634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601982526040808220829055601c90925220805460ff19169055601d8054806108ce57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108fe81612c6a565b9150506107b0565b5050565b336000818152601a602090815260408083206001600160a01b0387168452909152812054909161069f9185906107039086611824565b6003546001600160a01b0316331461096a5760405162461bcd60e51b815260040161073c90612b0c565b61097381611830565b50565b33806109d55760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f604482015267206164647265737360c01b606482015260840161073c565b6015546001600160a01b0382811691161415610a445760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e604482015267206164647265737360c01b606482015260840161073c565b6000610a4f82610cf0565b905082811015610ab35760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a206275726e20616d6f756e7420657863656564604482015268732062616c616e636560b81b606482015260840161073c565b6000610ac7610ac0611a03565b8590611a26565b6001600160a01b038416600090815260186020526040902054909150610aed9082611331565b6001600160a01b038416600090815260186020908152604080832093909355601c9052205460ff1615610b57576001600160a01b038316600090815260196020526040902054610b3d9085611331565b6001600160a01b0384166000908152601960205260409020555b610b62838583611a32565b50505050565b6000600e54831115610bbc5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015260640161073c565b81610bdc576000610bce846000611b14565b509294506106a39350505050565b6000610bf184610bec3387611b95565b611b14565b509194506106a39350505050565b6000546001600160a01b03163314610c295760405162461bcd60e51b815260040161073c90612ad7565b6001600160a01b0381166000908152601c602052604090205460ff1615610c925760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c75646564000000000000000000604482015260640161073c565b61097381611baa565b6000546001600160a01b03163314610cc55760405162461bcd60e51b815260040161073c90612ad7565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152601c602052604081205460ff1615610d2d57506001600160a01b031660009081526019602052604090205490565b6001600160a01b0382166000908152601860205260409020546106a390611c6a565b6000546001600160a01b03163314610d795760405162461bcd60e51b815260040161073c90612ad7565b600080546040516001600160a01b0390911690600080516020612cd9833981519152908390a3600080546001600160a01b0319169055565b6003546001600160a01b03163314610ddb5760405162461bcd60e51b815260040161073c90612b0c565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060600a805461060f90612c2f565b600061069f338461070385604051806060016040528060258152602001612cf960259139336000908152601a602090815260408083206001600160a01b038d16845290915290205491906117f8565b6001546001600160a01b03163314610ec65760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60448201526b0636b206f6e776572736869760a41b606482015260840161073c565b6002544211610f175760405162461bcd60e51b815260206004820152601c60248201527f54686520636f6e7472616374206973207374696c6c206c6f636b656400000000604482015260640161073c565b600154600080546040516001600160a01b039384169390911691600080516020612cd983398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061069f338484611471565b6003546001600160a01b03163314610f9d5760405162461bcd60e51b815260040161073c90612b0c565b6001600160a01b03811661100f5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015272746f20746865207a65726f206164647265737360681b606482015260840161073c565b6000601e54116110705760405162461bcd60e51b815260206004820152602660248201527f546865204554482062616c616e6365206d75737420626520677265617465722060448201526507468616e20360d41b606482015260840161073c565b601e805460009182905560405190916001600160a01b0384169183156108fc0291849190818181858888f193505050501580156110b1573d6000803e3d6000fd5b505050565b6003546001600160a01b031633146110e05760405162461bcd60e51b815260040161073c90612b0c565b6023805460ff60a81b1916600160a81b8315158102919091179182905560405160ff9190920416151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a150565b6000546001600160a01b031633146111655760405162461bcd60e51b815260040161073c90612ad7565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556111948142612bc1565b600255600080546040516001600160a01b0390911690600080516020612cd9833981519152908390a350565b6003546001600160a01b031633146111ea5760405162461bcd60e51b815260040161073c90612b0c565b6003546040516001600160a01b038084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146112705760405162461bcd60e51b815260040161073c90612ad7565b6001600160a01b0381166112d55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161073c565b600080546040516001600160a01b0380851693921691600080516020612cd983398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061132a8284612bd9565b9392505050565b600061132a8284612c18565b6001600160a01b0383166113a75760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b606482015260840161073c565b6001600160a01b03821661140f5760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b606482015260840161073c565b6001600160a01b038381166000818152601a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166114dc5760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b606482015260840161073c565b6001600160a01b0382166115455760405162461bcd60e51b815260206004820152602a60248201527f42617365526669546f6b656e3a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b606482015260840161073c565b6015546001600160a01b03848116911614156115b85760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b6275726e206164647265737360a01b606482015260840161073c565b6000811161161a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161073c565b600354600190600160a01b900460ff161561163757506000611798565b6010548211801561165657506000546001600160a01b03858116911614155b8015611668575061166683611ce7565b155b156116c65760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b606482015260840161073c565b60006011541180156116e657506000546001600160a01b03858116911614155b80156116f857506116f683611ce7565b155b801561171257506023546001600160a01b03848116911614155b1561179857600061172284610cf0565b6011549091506117328483612bc1565b11156117965760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b606482015260840161073c565b505b6001600160a01b0384166000908152601b602052604090205460ff16806117d757506001600160a01b0383166000908152601b602052604090205460ff165b156117e0575060005b6117ec84848484611d14565b610b6284848484611d43565b6000818484111561181c5760405162461bcd60e51b815260040161073c9190612a84565b505050900390565b600061132a8284612bc1565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561186e57600080fd5b505afa158015611882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a69190612910565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156118ee57600080fd5b505afa158015611902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119269190612910565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561196e57600080fd5b505af1158015611982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a69190612910565b602380546001600160a01b03199081166001600160a01b039384161790915560228054909116838316179055604051908316907fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1590600090a25050565b6000806000611a10611efe565b9092509050611a1f828261131e565b9250505090565b600061132a8284612bf9565b6015546001600160a01b0316600090815260186020526040902054611a579082611824565b601580546001600160a01b0390811660009081526018602090815260408083209590955592549091168152601c909152205460ff1615611ad2576015546001600160a01b0316600090815260196020526040902054611ab69083611824565b6015546001600160a01b03166000908152601960205260409020555b6015546040518381526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611464565b600b5460009081908190819081908190611b3c9061ffff16611b368a8a611a26565b9061131e565b90506000611b4a8983611331565b90506000611b56611a03565b90506000611b648b83611a26565b90506000611b728584611a26565b90506000611b808383611331565b929d929c9b5093995091975095505050505050565b600061132a611ba384610cf0565b5060175490565b6001600160a01b03811660009081526018602052604090205415611c04576001600160a01b038116600090815260186020526040902054611bea90611c6a565b6001600160a01b0382166000908152601960205260409020555b6001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b6000600f54821115611cd15760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161073c565b6000611cdb611a03565b905061132a838261131e565b600080546001600160a01b03838116911614806106a35750506015546001600160a01b0390811691161490565b600354600160a01b900460ff16610b62576000611d3030610cf0565b9050611d3c81866120c1565b5050505050565b6000611d4f8584611b95565b905081611d5a575060005b6000806000806000611d6c8887611b14565b6001600160a01b038f1660009081526018602052604090205494995092975090955093509150611d9c9086611331565b6001600160a01b03808c1660009081526018602052604080822093909355908b1681522054611dcb9085611824565b6001600160a01b03808b16600090815260186020908152604080832094909455918d168152601c909152205460ff1615611e3c576001600160a01b038a16600090815260196020526040902054611e229084611331565b6001600160a01b038b166000908152601960205260409020555b6001600160a01b0389166000908152601c602052604090205460ff1615611e9a576001600160a01b038916600090815260196020526040902054611e809083611824565b6001600160a01b038a166000908152601960205260409020555b611ea588828861212b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611eea91815260200190565b60405180910390a350505050505050505050565b600f54600e546000918291825b601d54811015612088578260186000601d8481548110611f3b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611fb457508160196000601d8481548110611f8d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611fca57600f54600e54945094505050509091565b61201e60186000601d8481548110611ff257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611331565b925061207460196000601d848154811061204857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611331565b91508061208081612c6a565b915050611f0b565b508015806120a35750600e54600f546120a09161131e565b82105b156120b857600f54600e549350935050509091565b90939092509050565b60245482106120d05760245491505b602554821080159081906120ed5750602354600160a81b900460ff165b80156121035750602354600160a01b900460ff16155b801561211d57506023546001600160a01b03838116911614155b156110b1576110b183612154565b6000811180156121455750600354600160a01b900460ff16155b156110b1576110b183836121fb565b6023805460ff60a01b1916600160a01b179055600061217482600261131e565b905060006121828383611331565b90504761218e83612341565b600061219a4783611331565b90506121a683826124c6565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506023805460ff60a01b19169055505050565b600354600160a01b900460ff1615612211575050565b600061221c60165490565b905060005b81811015610b62576000806000612237846125fd565b50925092509250806000141561224f5750505061232f565b600383600581111561227157634e487b7160e01b600052602160045260246000fd5b141561228857612283878783876126b6565b61232b565b60018360058111156122aa57634e487b7160e01b600052602160045260246000fd5b14156122bc57612283878783876126f9565b60008360058111156122de57634e487b7160e01b600052602160045260246000fd5b14156122e95761232b565b600583600581111561230b57634e487b7160e01b600052602160045260246000fd5b141561231e576122838787838588612736565b61232b878783858861273f565b5050505b8061233981612c6a565b915050612221565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061238457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602254604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156123d857600080fd5b505afa1580156123ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124109190612910565b8160018151811061243157634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526022546124579130911684612808565b60225460405163791ac94760e01b81526001600160a01b039091169063791ac94790612490908590600090869030904290600401612b51565b600060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050505050565b6022546124de9030906001600160a01b031684612808565b602254600090819081906001600160a01b031663f305d719853088858061250d6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561257057600080fd5b505af1158015612584573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125a99190612a57565b47601e55604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b600080600080600061260e86612813565b60408051608081019091528154909190829060ff16600581111561264257634e487b7160e01b600052602160045260246000fd5b600581111561266157634e487b7160e01b600052602160045260246000fd5b8152815461010090046001600160a01b03166020808301919091526001830154604080840191909152600290930154606092830152835190840151928401519390910151909991985091965090945092505050565b600b546000906126ce9061ffff16611b368786611a26565b905060006126dc8286611a26565b600f549091506126ec9082611331565b600f556124be83836128b8565b600b546000906127119061ffff16611b368786611a26565b9050600061271f8286611a26565b905061272c308383611a32565b6124be83836128b8565b611d3c85858585855b600b546000906127579061ffff16611b368887611a26565b905060006127658287611a26565b6001600160a01b03851660009081526018602052604090205490915061278b9082611824565b6001600160a01b038516600090815260186020908152604080832093909355601c9052205460ff16156127f5576001600160a01b0384166000908152601960205260409020546127db9083611824565b6001600160a01b0385166000908152601960205260409020555b6127ff83836128b8565b50505050505050565b6110b183838361133d565b600060165482106128825760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b606482015260840161073c565b601682815481106128a357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302019050919050565b60006128c383612813565b60028101549091506128d59083611824565b6002909101555050565b803580151581146128ef57600080fd5b919050565b600060208284031215612905578081fd5b813561132a81612c9b565b600060208284031215612921578081fd5b815161132a81612c9b565b6000806040838503121561293e578081fd5b823561294981612c9b565b9150602083013561295981612c9b565b809150509250929050565b600080600060608486031215612978578081fd5b833561298381612c9b565b9250602084013561299381612c9b565b929592945050506040919091013590565b600080604083850312156129b6578182fd5b82356129c181612c9b565b91506129cf602084016128df565b90509250929050565b600080604083850312156129ea578182fd5b82356129f581612c9b565b946020939093013593505050565b600060208284031215612a14578081fd5b61132a826128df565b600060208284031215612a2e578081fd5b5035919050565b60008060408385031215612a47578182fd5b823591506129cf602084016128df565b600080600060608486031215612a6b578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b81811015612ab057858101830151858201604001528201612a94565b81811115612ac15783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612ba05784516001600160a01b031683529383019391830191600101612b7b565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612bd457612bd4612c85565b500190565b600082612bf457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612c1357612c13612c85565b500290565b600082821015612c2a57612c2a612c85565b500390565b600181811c90821680612c4357607f821691505b60208210811415612c6457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c7e57612c7e612c85565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461097357600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207ba96a17566dc4433ce0f77a317fef3079ae213574067ad85dcf0180fb5489a164736f6c63430008040033000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000001dcd6500000000000000000000000000f19187829fe7aaadae252cc5e9c51b56179a475c0000000000000000000000007563b708298233ac03e67a8d3ca041ef260dba6600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c4c616e644c6f7264436f696e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034c4c430000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d15760003560e01c806370a08231116100f7578063a69df4b511610095578063dd46706411610064578063dd4670641461055a578063dd62ed3e1461057a578063e4edf852146105c0578063f2fde38b146105e057600080fd5b8063a69df4b5146104e5578063a9059cbb146104fa578063b7671a0d1461051a578063c49b9a801461053a57600080fd5b806388f82020116100d157806388f82020146104595780638da5cb5b1461049257806395d89b41146104b0578063a457c2d7146104c557600080fd5b806370a0823114610404578063715018a61461042457806374778cdc1461043957600080fd5b806341cb87fc1161016f57806352390c021161013e57806352390c02146103765780635342acb414610396578063602bc62b146103cf5780636612e66f146103e457600080fd5b806341cb87fc146102e457806342966c68146103045780634549b03914610324578063481c6a751461034457600080fd5b806323b872dd116101ab57806323b872dd14610257578063313ce567146102775780633685d419146102a257806339509351146102c457600080fd5b806306fdde03146101dd578063095ea7b31461020857806318160ddd1461023857600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101f2610600565b6040516101ff9190612a84565b60405180910390f35b34801561021457600080fd5b506102286102233660046129d8565b610692565b60405190151581526020016101ff565b34801561024457600080fd5b50600e545b6040519081526020016101ff565b34801561026357600080fd5b50610228610272366004612964565b6106a9565b34801561028357600080fd5b50600b5462010000900460ff1660405160ff90911681526020016101ff565b3480156102ae57600080fd5b506102c26102bd3660046128f4565b610712565b005b3480156102d057600080fd5b506102286102df3660046129d8565b61090a565b3480156102f057600080fd5b506102c26102ff3660046128f4565b610940565b34801561031057600080fd5b506102c261031f366004612a1d565b610976565b34801561033057600080fd5b5061024961033f366004612a35565b610b68565b34801561035057600080fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b34801561038257600080fd5b506102c26103913660046128f4565b610bff565b3480156103a257600080fd5b506102286103b13660046128f4565b6001600160a01b03166000908152601b602052604090205460ff1690565b3480156103db57600080fd5b50600254610249565b3480156103f057600080fd5b506102c26103ff3660046129a4565b610c9b565b34801561041057600080fd5b5061024961041f3660046128f4565b610cf0565b34801561043057600080fd5b506102c2610d4f565b34801561044557600080fd5b506102c2610454366004612a03565b610db1565b34801561046557600080fd5b506102286104743660046128f4565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561049e57600080fd5b506000546001600160a01b031661035e565b3480156104bc57600080fd5b506101f2610df9565b3480156104d157600080fd5b506102286104e03660046129d8565b610e08565b3480156104f157600080fd5b506102c2610e57565b34801561050657600080fd5b506102286105153660046129d8565b610f66565b34801561052657600080fd5b506102c26105353660046128f4565b610f73565b34801561054657600080fd5b506102c2610555366004612a03565b6110b6565b34801561056657600080fd5b506102c2610575366004612a1d565b61113b565b34801561058657600080fd5b5061024961059536600461292c565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b3480156105cc57600080fd5b506102c26105db3660046128f4565b6111c0565b3480156105ec57600080fd5b506102c26105fb3660046128f4565b611246565b60606009805461060f90612c2f565b80601f016020809104026020016040519081016040528092919081815260200182805461063b90612c2f565b80156106885780601f1061065d57610100808354040283529160200191610688565b820191906000526020600020905b81548152906001019060200180831161066b57829003601f168201915b5050505050905090565b600061069f33848461133d565b5060015b92915050565b60006106b6848484611471565b610708843361070385604051806060016040528060288152602001612cb1602891396001600160a01b038a166000908152601a6020908152604080832033845290915290205491906117f8565b61133d565b5060019392505050565b6000546001600160a01b031633146107455760405162461bcd60e51b815260040161073c90612ad7565b60405180910390fd5b6001600160a01b0381166000908152601c602052604090205460ff166107ad5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c75646564000000000000000000604482015260640161073c565b60005b601d5481101561090657816001600160a01b0316601d82815481106107e557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156108f457601d805461081090600190612c18565b8154811061082e57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601d80546001600160a01b03909216918390811061086857634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601982526040808220829055601c90925220805460ff19169055601d8054806108ce57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108fe81612c6a565b9150506107b0565b5050565b336000818152601a602090815260408083206001600160a01b0387168452909152812054909161069f9185906107039086611824565b6003546001600160a01b0316331461096a5760405162461bcd60e51b815260040161073c90612b0c565b61097381611830565b50565b33806109d55760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f604482015267206164647265737360c01b606482015260840161073c565b6015546001600160a01b0382811691161415610a445760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e604482015267206164647265737360c01b606482015260840161073c565b6000610a4f82610cf0565b905082811015610ab35760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a206275726e20616d6f756e7420657863656564604482015268732062616c616e636560b81b606482015260840161073c565b6000610ac7610ac0611a03565b8590611a26565b6001600160a01b038416600090815260186020526040902054909150610aed9082611331565b6001600160a01b038416600090815260186020908152604080832093909355601c9052205460ff1615610b57576001600160a01b038316600090815260196020526040902054610b3d9085611331565b6001600160a01b0384166000908152601960205260409020555b610b62838583611a32565b50505050565b6000600e54831115610bbc5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015260640161073c565b81610bdc576000610bce846000611b14565b509294506106a39350505050565b6000610bf184610bec3387611b95565b611b14565b509194506106a39350505050565b6000546001600160a01b03163314610c295760405162461bcd60e51b815260040161073c90612ad7565b6001600160a01b0381166000908152601c602052604090205460ff1615610c925760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c75646564000000000000000000604482015260640161073c565b61097381611baa565b6000546001600160a01b03163314610cc55760405162461bcd60e51b815260040161073c90612ad7565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152601c602052604081205460ff1615610d2d57506001600160a01b031660009081526019602052604090205490565b6001600160a01b0382166000908152601860205260409020546106a390611c6a565b6000546001600160a01b03163314610d795760405162461bcd60e51b815260040161073c90612ad7565b600080546040516001600160a01b0390911690600080516020612cd9833981519152908390a3600080546001600160a01b0319169055565b6003546001600160a01b03163314610ddb5760405162461bcd60e51b815260040161073c90612b0c565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060600a805461060f90612c2f565b600061069f338461070385604051806060016040528060258152602001612cf960259139336000908152601a602090815260408083206001600160a01b038d16845290915290205491906117f8565b6001546001600160a01b03163314610ec65760405162461bcd60e51b815260206004820152602c60248201527f4f6e6c79207468652070726576696f7573206f776e65722063616e20756e6c6f60448201526b0636b206f6e776572736869760a41b606482015260840161073c565b6002544211610f175760405162461bcd60e51b815260206004820152601c60248201527f54686520636f6e7472616374206973207374696c6c206c6f636b656400000000604482015260640161073c565b600154600080546040516001600160a01b039384169390911691600080516020612cd983398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061069f338484611471565b6003546001600160a01b03163314610f9d5760405162461bcd60e51b815260040161073c90612b0c565b6001600160a01b03811661100f5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015272746f20746865207a65726f206164647265737360681b606482015260840161073c565b6000601e54116110705760405162461bcd60e51b815260206004820152602660248201527f546865204554482062616c616e6365206d75737420626520677265617465722060448201526507468616e20360d41b606482015260840161073c565b601e805460009182905560405190916001600160a01b0384169183156108fc0291849190818181858888f193505050501580156110b1573d6000803e3d6000fd5b505050565b6003546001600160a01b031633146110e05760405162461bcd60e51b815260040161073c90612b0c565b6023805460ff60a81b1916600160a81b8315158102919091179182905560405160ff9190920416151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a150565b6000546001600160a01b031633146111655760405162461bcd60e51b815260040161073c90612ad7565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556111948142612bc1565b600255600080546040516001600160a01b0390911690600080516020612cd9833981519152908390a350565b6003546001600160a01b031633146111ea5760405162461bcd60e51b815260040161073c90612b0c565b6003546040516001600160a01b038084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146112705760405162461bcd60e51b815260040161073c90612ad7565b6001600160a01b0381166112d55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161073c565b600080546040516001600160a01b0380851693921691600080516020612cd983398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061132a8284612bd9565b9392505050565b600061132a8284612c18565b6001600160a01b0383166113a75760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b606482015260840161073c565b6001600160a01b03821661140f5760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b606482015260840161073c565b6001600160a01b038381166000818152601a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166114dc5760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b606482015260840161073c565b6001600160a01b0382166115455760405162461bcd60e51b815260206004820152602a60248201527f42617365526669546f6b656e3a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b606482015260840161073c565b6015546001600160a01b03848116911614156115b85760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b6275726e206164647265737360a01b606482015260840161073c565b6000811161161a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161073c565b600354600190600160a01b900460ff161561163757506000611798565b6010548211801561165657506000546001600160a01b03858116911614155b8015611668575061166683611ce7565b155b156116c65760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b606482015260840161073c565b60006011541180156116e657506000546001600160a01b03858116911614155b80156116f857506116f683611ce7565b155b801561171257506023546001600160a01b03848116911614155b1561179857600061172284610cf0565b6011549091506117328483612bc1565b11156117965760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b606482015260840161073c565b505b6001600160a01b0384166000908152601b602052604090205460ff16806117d757506001600160a01b0383166000908152601b602052604090205460ff165b156117e0575060005b6117ec84848484611d14565b610b6284848484611d43565b6000818484111561181c5760405162461bcd60e51b815260040161073c9190612a84565b505050900390565b600061132a8284612bc1565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561186e57600080fd5b505afa158015611882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a69190612910565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156118ee57600080fd5b505afa158015611902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119269190612910565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561196e57600080fd5b505af1158015611982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a69190612910565b602380546001600160a01b03199081166001600160a01b039384161790915560228054909116838316179055604051908316907fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1590600090a25050565b6000806000611a10611efe565b9092509050611a1f828261131e565b9250505090565b600061132a8284612bf9565b6015546001600160a01b0316600090815260186020526040902054611a579082611824565b601580546001600160a01b0390811660009081526018602090815260408083209590955592549091168152601c909152205460ff1615611ad2576015546001600160a01b0316600090815260196020526040902054611ab69083611824565b6015546001600160a01b03166000908152601960205260409020555b6015546040518381526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611464565b600b5460009081908190819081908190611b3c9061ffff16611b368a8a611a26565b9061131e565b90506000611b4a8983611331565b90506000611b56611a03565b90506000611b648b83611a26565b90506000611b728584611a26565b90506000611b808383611331565b929d929c9b5093995091975095505050505050565b600061132a611ba384610cf0565b5060175490565b6001600160a01b03811660009081526018602052604090205415611c04576001600160a01b038116600090815260186020526040902054611bea90611c6a565b6001600160a01b0382166000908152601960205260409020555b6001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b6000600f54821115611cd15760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161073c565b6000611cdb611a03565b905061132a838261131e565b600080546001600160a01b03838116911614806106a35750506015546001600160a01b0390811691161490565b600354600160a01b900460ff16610b62576000611d3030610cf0565b9050611d3c81866120c1565b5050505050565b6000611d4f8584611b95565b905081611d5a575060005b6000806000806000611d6c8887611b14565b6001600160a01b038f1660009081526018602052604090205494995092975090955093509150611d9c9086611331565b6001600160a01b03808c1660009081526018602052604080822093909355908b1681522054611dcb9085611824565b6001600160a01b03808b16600090815260186020908152604080832094909455918d168152601c909152205460ff1615611e3c576001600160a01b038a16600090815260196020526040902054611e229084611331565b6001600160a01b038b166000908152601960205260409020555b6001600160a01b0389166000908152601c602052604090205460ff1615611e9a576001600160a01b038916600090815260196020526040902054611e809083611824565b6001600160a01b038a166000908152601960205260409020555b611ea588828861212b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611eea91815260200190565b60405180910390a350505050505050505050565b600f54600e546000918291825b601d54811015612088578260186000601d8481548110611f3b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611fb457508160196000601d8481548110611f8d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611fca57600f54600e54945094505050509091565b61201e60186000601d8481548110611ff257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611331565b925061207460196000601d848154811061204857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611331565b91508061208081612c6a565b915050611f0b565b508015806120a35750600e54600f546120a09161131e565b82105b156120b857600f54600e549350935050509091565b90939092509050565b60245482106120d05760245491505b602554821080159081906120ed5750602354600160a81b900460ff165b80156121035750602354600160a01b900460ff16155b801561211d57506023546001600160a01b03838116911614155b156110b1576110b183612154565b6000811180156121455750600354600160a01b900460ff16155b156110b1576110b183836121fb565b6023805460ff60a01b1916600160a01b179055600061217482600261131e565b905060006121828383611331565b90504761218e83612341565b600061219a4783611331565b90506121a683826124c6565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506023805460ff60a01b19169055505050565b600354600160a01b900460ff1615612211575050565b600061221c60165490565b905060005b81811015610b62576000806000612237846125fd565b50925092509250806000141561224f5750505061232f565b600383600581111561227157634e487b7160e01b600052602160045260246000fd5b141561228857612283878783876126b6565b61232b565b60018360058111156122aa57634e487b7160e01b600052602160045260246000fd5b14156122bc57612283878783876126f9565b60008360058111156122de57634e487b7160e01b600052602160045260246000fd5b14156122e95761232b565b600583600581111561230b57634e487b7160e01b600052602160045260246000fd5b141561231e576122838787838588612736565b61232b878783858861273f565b5050505b8061233981612c6a565b915050612221565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061238457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602254604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156123d857600080fd5b505afa1580156123ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124109190612910565b8160018151811061243157634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526022546124579130911684612808565b60225460405163791ac94760e01b81526001600160a01b039091169063791ac94790612490908590600090869030904290600401612b51565b600060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050505050565b6022546124de9030906001600160a01b031684612808565b602254600090819081906001600160a01b031663f305d719853088858061250d6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561257057600080fd5b505af1158015612584573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125a99190612a57565b47601e55604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b600080600080600061260e86612813565b60408051608081019091528154909190829060ff16600581111561264257634e487b7160e01b600052602160045260246000fd5b600581111561266157634e487b7160e01b600052602160045260246000fd5b8152815461010090046001600160a01b03166020808301919091526001830154604080840191909152600290930154606092830152835190840151928401519390910151909991985091965090945092505050565b600b546000906126ce9061ffff16611b368786611a26565b905060006126dc8286611a26565b600f549091506126ec9082611331565b600f556124be83836128b8565b600b546000906127119061ffff16611b368786611a26565b9050600061271f8286611a26565b905061272c308383611a32565b6124be83836128b8565b611d3c85858585855b600b546000906127579061ffff16611b368887611a26565b905060006127658287611a26565b6001600160a01b03851660009081526018602052604090205490915061278b9082611824565b6001600160a01b038516600090815260186020908152604080832093909355601c9052205460ff16156127f5576001600160a01b0384166000908152601960205260409020546127db9083611824565b6001600160a01b0385166000908152601960205260409020555b6127ff83836128b8565b50505050505050565b6110b183838361133d565b600060165482106128825760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b606482015260840161073c565b601682815481106128a357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302019050919050565b60006128c383612813565b60028101549091506128d59083611824565b6002909101555050565b803580151581146128ef57600080fd5b919050565b600060208284031215612905578081fd5b813561132a81612c9b565b600060208284031215612921578081fd5b815161132a81612c9b565b6000806040838503121561293e578081fd5b823561294981612c9b565b9150602083013561295981612c9b565b809150509250929050565b600080600060608486031215612978578081fd5b833561298381612c9b565b9250602084013561299381612c9b565b929592945050506040919091013590565b600080604083850312156129b6578182fd5b82356129c181612c9b565b91506129cf602084016128df565b90509250929050565b600080604083850312156129ea578182fd5b82356129f581612c9b565b946020939093013593505050565b600060208284031215612a14578081fd5b61132a826128df565b600060208284031215612a2e578081fd5b5035919050565b60008060408385031215612a47578182fd5b823591506129cf602084016128df565b600080600060608486031215612a6b578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b81811015612ab057858101830151858201604001528201612a94565b81811115612ac15783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612ba05784516001600160a01b031683529383019391830191600101612b7b565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612bd457612bd4612c85565b500190565b600082612bf457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612c1357612c13612c85565b500290565b600082821015612c2a57612c2a612c85565b500390565b600181811c90821680612c4357607f821691505b60208210811415612c6457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c7e57612c7e612c85565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461097357600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207ba96a17566dc4433ce0f77a317fef3079ae213574067ad85dcf0180fb5489a164736f6c63430008040033

Deployed Bytecode Sourcemap

51786:1044:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20109:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21281:195;;;;;;;;;;-1:-1:-1;21281:195:0;;;;;:::i;:::-;;:::i;:::-;;;4779:14:1;;4772:22;4754:41;;4742:2;4727:18;21281:195:0;4709:92:1;20512:102:0;;;;;;;;;;-1:-1:-1;20594:12:0;;20512:102;;;14746:25:1;;;14734:2;14719:18;20512:102:0;14701:76:1;21484:448:0;;;;;;;;;;-1:-1:-1;21484:448:0;;;;;:::i;:::-;;:::i;20315:92::-;;;;;;;;;;-1:-1:-1;20392:7:0;;;;;;;20315:92;;16266:4:1;16254:17;;;16236:36;;16224:2;16209:18;20315:92:0;16191:87:1;27530:497:0;;;;;;;;;;-1:-1:-1;27530:497:0;;;;;:::i;:::-;;:::i;:::-;;24920:300;;;;;;;;;;-1:-1:-1;24920:300:0;;;;;:::i;:::-;;:::i;44844:107::-;;;;;;;;;;-1:-1:-1;44844:107:0;;;;;:::i;:::-;;:::i;23153:878::-;;;;;;;;;;-1:-1:-1;23153:878:0;;;;;:::i;:::-;;:::i;25978:572::-;;;;;;;;;;-1:-1:-1;25978:572:0;;;;;:::i;:::-;;:::i;8290:83::-;;;;;;;;;;-1:-1:-1;8357:8:0;;-1:-1:-1;;;;;8357:8:0;8290:83;;;-1:-1:-1;;;;;3649:32:1;;;3631:51;;3619:2;3604:18;8290:83:0;3586:102:1;27026:178:0;;;;;;;;;;-1:-1:-1;27026:178:0;;;;;:::i;:::-;;:::i;28196:124::-;;;;;;;;;;-1:-1:-1;28196:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;28285:27:0;28261:4;28285:27;;;:18;:27;;;;;;;;;28196:124;7240:90;;;;;;;;;;-1:-1:-1;7313:9:0;;7240:90;;28035:153;;;;;;;;;;-1:-1:-1;28035:153:0;;;;;:::i;:::-;;:::i;20622:222::-;;;;;;;;;;-1:-1:-1;20622:222:0;;;;;:::i;:::-;;:::i;6795:148::-;;;;;;;;;;;;;:::i;18988:100::-;;;;;;;;;;-1:-1:-1;18988:100:0;;;;;:::i;:::-;;:::i;25636:165::-;;;;;;;;;;-1:-1:-1;25636:165:0;;;;;:::i;:::-;-1:-1:-1;;;;;25762:31:0;25733:4;25762:31;;;:22;:31;;;;;;;;;25636:165;6581:79;;;;;;;;;;-1:-1:-1;6619:7:0;6646:6;-1:-1:-1;;;;;6646:6:0;6581:79;;20210:97;;;;;;;;;;;;;:::i;25228:400::-;;;;;;;;;;-1:-1:-1;25228:400:0;;;;;:::i;:::-;;:::i;7572:347::-;;;;;;;;;;;;;:::i;20852:227::-;;;;;;;;;;-1:-1:-1;20852:227:0;;;;;:::i;:::-;;:::i;46156:500::-;;;;;;;;;;-1:-1:-1;46156:500:0;;;;;:::i;:::-;;:::i;45142:186::-;;;;;;;;;;-1:-1:-1;45142:186:0;;;;;:::i;:::-;;:::i;7338:226::-;;;;;;;;;;-1:-1:-1;7338:226:0;;;;;:::i;:::-;;:::i;21087:186::-;;;;;;;;;;-1:-1:-1;21087:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;21238:18:0;;;21206:7;21238:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21087:186;8554:208;;;;;;;;;;-1:-1:-1;8554:208:0;;;;;:::i;:::-;;:::i;6951:281::-;;;;;;;;;;-1:-1:-1;6951:281:0;;;;;:::i;:::-;;:::i;20109:93::-;20157:13;20190:4;20183:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20109:93;:::o;21281:195::-;21385:4;21407:39;1212:10;21430:7;21439:6;21407:8;:39::i;:::-;-1:-1:-1;21464:4:0;21281:195;;;;;:::o;21484:448::-;21618:4;21635:36;21645:6;21653:9;21664:6;21635:9;:36::i;:::-;21682:220;21705:6;1212:10;21753:138;21809:6;21753:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21753:19:0;;;;;;:11;:19;;;;;;;;1212:10;21753:33;;;;;;;;;;:37;:138::i;:::-;21682:8;:220::i;:::-;-1:-1:-1;21920:4:0;21484:448;;;;;:::o;27530:497::-;6708:6;;-1:-1:-1;;;;;6708:6:0;1212:10;6708:22;6700:67;;;;-1:-1:-1;;;6700:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27610:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;27602:67;;;::::0;-1:-1:-1;;;27602:67:0;;8377:2:1;27602:67:0::1;::::0;::::1;8359:21:1::0;8416:2;8396:18;;;8389:30;8455:25;8435:18;;;8428:53;8498:18;;27602:67:0::1;8349:173:1::0;27602:67:0::1;27685:9;27680:340;27704:9;:16:::0;27700:20;::::1;27680:340;;;27762:7;-1:-1:-1::0;;;;;27746:23:0::1;:9;27756:1;27746:12;;;;;;-1:-1:-1::0;;;27746:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27746:12:0::1;:23;27742:267;;;27805:9;27815:16:::0;;:20:::1;::::0;27834:1:::1;::::0;27815:20:::1;:::i;:::-;27805:31;;;;;;-1:-1:-1::0;;;27805:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;27790:9:::1;:12:::0;;-1:-1:-1;;;;;27805:31:0;;::::1;::::0;27800:1;;27790:12;::::1;;;-1:-1:-1::0;;;27790:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;27790:46:0::1;-1:-1:-1::0;;;;;27790:46:0;;::::1;;::::0;;27855:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:22;;;27896::::1;:31:::0;;;;:39;;-1:-1:-1;;27896:39:0::1;::::0;;27954:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;27954:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;27954:15:0;;;;;-1:-1:-1;;;;;;27954:15:0::1;::::0;;;;;27680:340:::1;27530:497:::0;:::o;27742:267::-:1;27722:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27680:340;;;;27530:497:::0;:::o;24920:300::-;1212:10;25035:4;25129:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;25129:34:0;;;;;;;;;;25035:4;;25057:133;;25107:7;;25129:50;;25168:10;25129:38;:50::i;44844:107::-;8437:8;;-1:-1:-1;;;;;8437:8:0;1212:10;8437:24;8415:111;;;;-1:-1:-1;;;8415:111:0;;;;;;;:::i;:::-;44918:25:::1;44936:6;44918:17;:25::i;:::-;44844:107:::0;:::o;23153:878::-;1212:10;;23243:110;;;;-1:-1:-1;;;23243:110:0;;14393:2:1;23243:110:0;;;14375:21:1;14432:2;14412:18;;;14405:30;14471:34;14451:18;;;14444:62;-1:-1:-1;;;14522:18:1;;;14515:38;14570:19;;23243:110:0;14365:230:1;23243:110:0;23404:11;;-1:-1:-1;;;;;23386:30:0;;;23404:11;;23386:30;;23364:120;;;;-1:-1:-1;;;23364:120:0;;7968:2:1;23364:120:0;;;7950:21:1;8007:2;7987:18;;;7980:30;8046:34;8026:18;;;8019:62;-1:-1:-1;;;8097:18:1;;;8090:38;8145:19;;23364:120:0;7940:230:1;23364:120:0;23497:15;23515:17;23525:6;23515:9;:17::i;:::-;23497:35;;23562:6;23551:7;:17;;23543:71;;;;-1:-1:-1;;;23543:71:0;;10324:2:1;23543:71:0;;;10306:21:1;10363:2;10343:18;;;10336:30;10402:34;10382:18;;;10375:62;-1:-1:-1;;;10453:18:1;;;10446:39;10502:19;;23543:71:0;10296:231:1;23543:71:0;23627:23;23653:29;23664:17;:15;:17::i;:::-;23653:6;;:10;:29::i;:::-;-1:-1:-1;;;;;23786:26:0;;;;;;:18;:26;;;;;;23627:55;;-1:-1:-1;23786:71:0;;23627:55;23786:30;:71::i;:::-;-1:-1:-1;;;;;23757:26:0;;;;;;:18;:26;;;;;;;;:100;;;;23872:22;:30;;;;;;23868:98;;;-1:-1:-1;;;;;23937:17:0;;;;;;:9;:17;;;;;;:29;;23959:6;23937:21;:29::i;:::-;-1:-1:-1;;;;;23917:17:0;;;;;;:9;:17;;;;;:49;23868:98;23979:44;23991:6;23999;24007:15;23979:11;:44::i;:::-;23153:878;;;;:::o;25978:572::-;26098:7;26142:12;;26131:7;:23;;26123:67;;;;-1:-1:-1;;;26123:67:0;;9555:2:1;26123:67:0;;;9537:21:1;9594:2;9574:18;;;9567:30;9633:33;9613:18;;;9606:61;9684:18;;26123:67:0;9527:181:1;26123:67:0;26206:17;26201:342;;26241:15;26268:22;26279:7;26288:1;26268:10;:22::i;:::-;-1:-1:-1;26240:50:0;;-1:-1:-1;26305:14:0;;-1:-1:-1;;;;26305:14:0;26201:342;26355:23;26388:106;26417:7;26443:36;1212:10;26471:7;26443:13;:36::i;:::-;26388:10;:106::i;:::-;-1:-1:-1;26352:142:0;;-1:-1:-1;26509:22:0;;-1:-1:-1;;;;26509:22:0;27026:178;6708:6;;-1:-1:-1;;;;;6708:6:0;1212:10;6708:22;6700:67;;;;-1:-1:-1;;;6700:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27109:31:0;::::1;;::::0;;;:22:::1;:31;::::0;;;;;::::1;;27108:32;27100:68;;;::::0;-1:-1:-1;;;27100:68:0;;7616:2:1;27100:68:0::1;::::0;::::1;7598:21:1::0;7655:2;7635:18;;;7628:30;7694:25;7674:18;;;7667:53;7737:18;;27100:68:0::1;7588:173:1::0;27100:68:0::1;27179:17;27188:7;27179:8;:17::i;28035:153::-:0;6708:6;;-1:-1:-1;;;;;6708:6:0;1212:10;6708:22;6700:67;;;;-1:-1:-1;;;6700:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28145:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;28145:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28035:153::o;20622:222::-;-1:-1:-1;;;;;20712:31:0;;20688:7;20712:31;;;:22;:31;;;;;;;;20708:62;;;-1:-1:-1;;;;;;20752:18:0;;;;;:9;:18;;;;;;;20622:222::o;20708:62::-;-1:-1:-1;;;;;20808:27:0;;;;;;:18;:27;;;;;;20788:48;;:19;:48::i;6795:148::-;6708:6;;-1:-1:-1;;;;;6708:6:0;1212:10;6708:22;6700:67;;;;-1:-1:-1;;;6700:67:0;;;;;;;:::i;:::-;6902:1:::1;6886:6:::0;;6865:40:::1;::::0;-1:-1:-1;;;;;6886:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;6865:40:0;6902:1;;6865:40:::1;6933:1;6916:19:::0;;-1:-1:-1;;;;;;6916:19:0::1;::::0;;6795:148::o;18988:100::-;8437:8;;-1:-1:-1;;;;;8437:8:0;1212:10;8437:24;8415:111;;;;-1:-1:-1;;;8415:111:0;;;;;;;:::i;:::-;19061:11:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;19061:19:0::1;-1:-1:-1::0;;;;19061:19:0;;::::1;::::0;;;::::1;::::0;;18988:100::o;20210:97::-;20260:13;20293:6;20286:13;;;;;:::i;25228:400::-;25348:4;25370:228;1212:10;25420:7;25442:145;25499:15;25442:145;;;;;;;;;;;;;;;;;1212:10;25442:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;25442:34:0;;;;;;;;;;;;:38;:145::i;7572:347::-;7638:14;;-1:-1:-1;;;;;7638:14:0;7656:10;7638:28;7616:122;;;;-1:-1:-1;;;7616:122:0;;6385:2:1;7616:122:0;;;6367:21:1;6424:2;6404:18;;;6397:30;6463:34;6443:18;;;6436:62;-1:-1:-1;;;6514:18:1;;;6507:42;6566:19;;7616:122:0;6357:234:1;7616:122:0;7775:9;;7757:15;:27;7749:68;;;;-1:-1:-1;;;7749:68:0;;5616:2:1;7749:68:0;;;5598:21:1;5655:2;5635:18;;;5628:30;5694;5674:18;;;5667:58;5742:18;;7749:68:0;5588:178:1;7749:68:0;7862:14;;;7854:6;;7833:44;;-1:-1:-1;;;;;7862:14:0;;;;7854:6;;;;-1:-1:-1;;;;;;;;;;;7833:44:0;;7897:14;;;7888:23;;-1:-1:-1;;;;;;7888:23:0;-1:-1:-1;;;;;7897:14:0;;;7888:23;;;;;;7572:347::o;20852:227::-;20959:4;21007:42;1212:10;21031:9;21042:6;21007:9;:42::i;46156:500::-;8437:8;;-1:-1:-1;;;;;8437:8:0;1212:10;8437:24;8415:111;;;;-1:-1:-1;;;8415:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46264:23:0;::::1;46242:124;;;::::0;-1:-1:-1;;;46242:124:0;;11145:2:1;46242:124:0::1;::::0;::::1;11127:21:1::0;11184:2;11164:18;;;11157:30;11223:34;11203:18;;;11196:62;-1:-1:-1;;;11274:18:1;;;11267:49;11333:19;;46242:124:0::1;11117:241:1::0;46242:124:0::1;46421:1;46399:19;;:23;46377:111;;;::::0;-1:-1:-1;;;46377:111:0;;12336:2:1;46377:111:0::1;::::0;::::1;12318:21:1::0;12375:2;12355:18;;;12348:30;12414:34;12394:18;;;12387:62;-1:-1:-1;;;12465:18:1;;;12458:36;12511:19;;46377:111:0::1;12308:228:1::0;46377:111:0::1;46558:19;::::0;;46541:14:::1;46588:23:::0;;;;46622:26:::1;::::0;46558:19;;-1:-1:-1;;;;;46622:18:0;::::1;::::0;:26;::::1;;;::::0;46558:19;;46622:26;;46541:14;46622:26;46558:19;46622:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8537:1;46156:500:::0;:::o;45142:186::-;8437:8;;-1:-1:-1;;;;;8437:8:0;1212:10;8437:24;8415:111;;;;-1:-1:-1;;;8415:111:0;;;;;;;:::i;:::-;45222:21:::1;:31:::0;;-1:-1:-1;;;;45222:31:0::1;-1:-1:-1::0;;;45222:31:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45269:51:::1;::::0;45222:31:::1;45298:21:::0;;;::::1;;4779:14:1::0;4772:22;4754:41;;45269:51:0::1;::::0;4742:2:1;4727:18;45269:51:0::1;;;;;;;45142:186:::0;:::o;7338:226::-;6708:6;;-1:-1:-1;;;;;6708:6:0;1212:10;6708:22;6700:67;;;;-1:-1:-1;;;6700:67:0;;;;;;;:::i;:::-;7419:6:::1;::::0;;;7402:23;;-1:-1:-1;;;;;;7402:23:0;;::::1;-1:-1:-1::0;;;;;7419:6:0;::::1;7402:23;::::0;;;7436:19:::1;::::0;;7478:22:::1;7496:4:::0;7478:15:::1;:22;:::i;:::-;7466:9;:34:::0;7553:1:::1;7537:6:::0;;7516:40:::1;::::0;-1:-1:-1;;;;;7537:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;7516:40:0;7553:1;;7516:40:::1;7338:226:::0;:::o;8554:208::-;8437:8;;-1:-1:-1;;;;;8437:8:0;1212:10;8437:24;8415:111;;;;-1:-1:-1;;;8415:111:0;;;;;;;:::i;:::-;8701:8:::1;::::0;8679:43:::1;::::0;-1:-1:-1;;;;;8679:43:0;;::::1;::::0;8701:8:::1;::::0;8679:43:::1;::::0;8701:8:::1;::::0;8679:43:::1;8733:8;:21:::0;;-1:-1:-1;;;;;;8733:21:0::1;-1:-1:-1::0;;;;;8733:21:0;;;::::1;::::0;;;::::1;::::0;;8554:208::o;6951:281::-;6708:6;;-1:-1:-1;;;;;6708:6:0;1212:10;6708:22;6700:67;;;;-1:-1:-1;;;6700:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7054:22:0;::::1;7032:110;;;::::0;-1:-1:-1;;;7032:110:0;;7209:2:1;7032:110:0::1;::::0;::::1;7191:21:1::0;7248:2;7228:18;;;7221:30;7287:34;7267:18;;;7260:62;-1:-1:-1;;;7338:18:1;;;7331:36;7384:19;;7032:110:0::1;7181:228:1::0;7032:110:0::1;7179:6;::::0;;7158:38:::1;::::0;-1:-1:-1;;;;;7158:38:0;;::::1;::::0;7179:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;7158:38:0;::::1;7207:6;:17:::0;;-1:-1:-1;;;;;;7207:17:0::1;-1:-1:-1::0;;;;;7207:17:0;;;::::1;::::0;;;::::1;::::0;;6951:281::o;1703:98::-;1761:7;1788:5;1792:1;1788;:5;:::i;:::-;1781:12;1703:98;-1:-1:-1;;;1703:98:0:o;1491:::-;1549:7;1576:5;1580:1;1576;:5;:::i;28328:460::-;-1:-1:-1;;;;;28470:19:0;;28448:112;;;;-1:-1:-1;;;28448:112:0;;5973:2:1;28448:112:0;;;5955:21:1;6012:2;5992:18;;;5985:30;6051:34;6031:18;;;6024:62;-1:-1:-1;;;6102:18:1;;;6095:41;6153:19;;28448:112:0;5945:233:1;28448:112:0;-1:-1:-1;;;;;28593:21:0;;28571:112;;;;-1:-1:-1;;;28571:112:0;;13983:2:1;28571:112:0;;;13965:21:1;14022:2;14002:18;;;13995:30;14061:34;14041:18;;;14034:62;-1:-1:-1;;;14112:18:1;;;14105:39;14161:19;;28571:112:0;13955:231:1;28571:112:0;-1:-1:-1;;;;;28696:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28748:32;;14746:25:1;;;28748:32:0;;14719:18:1;28748:32:0;;;;;;;;28328:460;;;:::o;29355:2539::-;-1:-1:-1;;;;;29500:20:0;;29478:114;;;;-1:-1:-1;;;29478:114:0;;8729:2:1;29478:114:0;;;8711:21:1;8768:2;8748:18;;;8741:30;8807:34;8787:18;;;8780:62;-1:-1:-1;;;8858:18:1;;;8851:42;8910:19;;29478:114:0;8701:234:1;29478:114:0;-1:-1:-1;;;;;29625:23:0;;29603:115;;;;-1:-1:-1;;;29603:115:0;;10734:2:1;29603:115:0;;;10716:21:1;10773:2;10753:18;;;10746:30;10812:34;10792:18;;;10785:62;-1:-1:-1;;;10863:18:1;;;10856:40;10913:19;;29603:115:0;10706:232:1;29603:115:0;29769:11;;-1:-1:-1;;;;;29751:30:0;;;29769:11;;29751:30;;29729:124;;;;-1:-1:-1;;;29729:124:0;;9142:2:1;29729:124:0;;;9124:21:1;9181:2;9161:18;;;9154:30;9220:34;9200:18;;;9193:62;-1:-1:-1;;;9271:18:1;;;9264:42;9323:19;;29729:124:0;9114:234:1;29729:124:0;29881:1;29872:6;:10;29864:64;;;;-1:-1:-1;;;29864:64:0;;11926:2:1;29864:64:0;;;11908:21:1;11965:2;11945:18;;;11938:30;12004:34;11984:18;;;11977:62;-1:-1:-1;;;12055:18:1;;;12048:39;12104:19;;29864:64:0;11898:231:1;29864:64:0;30056:11;;30035:4;;-1:-1:-1;;;30056:11:0;;;;30052:1500;;;-1:-1:-1;30094:5:0;30052:1500;;;30353:20;;30344:6;:29;:77;;;;-1:-1:-1;28882:4:0;6646:6;-1:-1:-1;;;;;28967:18:0;;;6646:6;;28967:18;30394:27;30344:77;:131;;;;;30443:32;30465:9;30443:21;:32::i;:::-;30442:33;30344:131;30322:254;;;30510:50;;-1:-1:-1;;;30510:50:0;;9915:2:1;30510:50:0;;;9897:21:1;9954:2;9934:18;;;9927:30;9993:34;9973:18;;;9966:62;-1:-1:-1;;;10044:18:1;;;10037:38;10092:19;;30510:50:0;9887:230:1;30322:254:0;31115:1;31096:16;;:20;:68;;;;-1:-1:-1;28882:4:0;6646:6;-1:-1:-1;;;;;28967:18:0;;;6646:6;;28967:18;31137:27;31096:68;:122;;;;;31186:32;31208:9;31186:21;:32::i;:::-;31185:33;31096:122;:164;;;;-1:-1:-1;48507:5:0;;-1:-1:-1;;;;;48496:16:0;;;48507:5;;48496:16;31239:21;31096:164;31074:467;;;31295:24;31322:20;31332:9;31322;:20::i;:::-;31420:16;;31295:47;;-1:-1:-1;31391:25:0;31410:6;31295:47;31391:25;:::i;:::-;:45;;31361:164;;;;-1:-1:-1;;;31361:164:0;;12743:2:1;31361:164:0;;;12725:21:1;12782:2;12762:18;;;12755:30;12821:34;12801:18;;;12794:62;-1:-1:-1;;;12872:18:1;;;12865:43;12925:19;;31361:164:0;12715:235:1;31361:164:0;31074:467;;-1:-1:-1;;;;;31653:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;31683:29:0;;;;;;:18;:29;;;;;;;;31653:59;31649:107;;;-1:-1:-1;31739:5:0;31649:107;31768:56;31789:6;31797:9;31808:6;31816:7;31768:20;:56::i;:::-;31835:51;31851:6;31859:9;31870:6;31878:7;31835:15;:51::i;1915:240::-;2035:7;2096:12;2088:6;;;;2080:29;;;;-1:-1:-1;;;2080:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;2131:5:0;;;1915:240::o;1385:98::-;1443:7;1470:5;1474:1;1470;:5;:::i;40972:356::-;41034:34;41088:6;41034:61;;41132:17;-1:-1:-1;;;;;41132:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41114:57:0;;41194:4;41214:17;-1:-1:-1;;;;;41214:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41114:135;;-1:-1:-1;;;;;;41114:135:0;;;;;;;-1:-1:-1;;;;;3923:15:1;;;41114:135:0;;;3905:34:1;3975:15;;3955:18;;;3948:43;3840:18;;41114:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41106:5;:143;;-1:-1:-1;;;;;;41106:143:0;;;-1:-1:-1;;;;;41106:143:0;;;;;;;41260:7;:27;;;;;;;;;;;41303:17;;;;;;;;-1:-1:-1;;41303:17:0;40972:356;;:::o;34262:172::-;34312:7;34333:15;34350;34369:19;:17;:19::i;:::-;34332:56;;-1:-1:-1;34332:56:0;-1:-1:-1;34406:20:0;34332:56;;34406:11;:20::i;:::-;34399:27;;;;34262:172;:::o;1597:98::-;1655:7;1682:5;1686:1;1682;:5;:::i;24158:754::-;24565:11;;-1:-1:-1;;;;;24565:11:0;24546:31;;;;:18;:31;;;;;;:66;;24596:5;24546:35;:66::i;:::-;24531:11;;;-1:-1:-1;;;;;24531:11:0;;;24512:31;;;;:18;:31;;;;;;;;:100;;;;24650:11;;;;;24627:35;;:22;:35;;;;;;;24623:112;;;24712:11;;-1:-1:-1;;;;;24712:11:0;24702:22;;;;:9;:22;;;;;;:33;;24729:5;24702:26;:33::i;:::-;24687:11;;-1:-1:-1;;;;;24687:11:0;24677:22;;;;:9;:22;;;;;:58;24623:112;24885:11;;24868:36;;14746:25:1;;;-1:-1:-1;;;;;24885:11:0;;;;24868:36;;;;;14734:2:1;14719:18;24868:36:0;14701:76:1;33503:751:0;33790:12;;33621:7;;;;;;;;;;;;33765:38;;33790:12;;33765:20;:7;33777;33765:11;:20::i;:::-;:24;;:38::i;:::-;33744:59;-1:-1:-1;33814:23:0;33840;:7;33744:59;33840:11;:23::i;:::-;33814:49;;33874:19;33896:17;:15;:17::i;:::-;33874:39;-1:-1:-1;33924:15:0;33942:24;:7;33874:39;33942:11;:24::i;:::-;33924:42;-1:-1:-1;33977:18:0;33998:27;:10;34013:11;33998:14;:27::i;:::-;33977:48;-1:-1:-1;34036:23:0;34062;:7;33977:48;34062:11;:23::i;:::-;34120:7;;;;34172;-1:-1:-1;34194:15:0;;-1:-1:-1;34224:11:0;;-1:-1:-1;33503:751:0;-1:-1:-1;;;;;;33503:751:0:o;48529:207::-;48652:7;48684:44;48702:17;48712:6;48702:9;:17::i;:::-;-1:-1:-1;47706:9:0;;;47579:144;27212:310;-1:-1:-1;;;;;27271:27:0;;27301:1;27271:27;;;:18;:27;;;;;;:31;27267:165;;-1:-1:-1;;;;;27378:27:0;;;;;;:18;:27;;;;;;27340:80;;:19;:80::i;:::-;-1:-1:-1;;;;;27319:18:0;;;;;;:9;:18;;;;;:101;27267:165;-1:-1:-1;;;;;27442:31:0;;;;;:22;:31;;;;;:38;;-1:-1:-1;;27442:38:0;27476:4;27442:38;;;;;;27491:9;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;;27491:23:0;;;;;;27212:310::o;26678:340::-;26774:7;26832:16;;26821:7;:27;;26799:119;;;;-1:-1:-1;;;26799:119:0;;6798:2:1;26799:119:0;;;6780:21:1;6837:2;6817:18;;;6810:30;6876:34;6856:18;;;6849:62;-1:-1:-1;;;6927:18:1;;;6920:40;6977:19;;26799:119:0;6770:232:1;26799:119:0;26929:19;26951:17;:15;:17::i;:::-;26929:39;-1:-1:-1;26986:24:0;:7;26929:39;26986:11;:24::i;29020:327::-;29118:4;6646:6;;-1:-1:-1;;;;;29294:18:0;;;6646:6;;29294:18;;:44;;-1:-1:-1;;29327:11:0;;-1:-1:-1;;;;;29327:11:0;;;29316:22;;;;29020:327::o;48744:301::-;48891:11;;-1:-1:-1;;;48891:11:0;;;;48886:152;;48919:28;48950:24;48968:4;48950:9;:24::i;:::-;48919:55;;48989:37;48997:20;49019:6;48989:7;:37::i;:::-;48886:152;48744:301;;;;:::o;31902:1347::-;32054:17;32074:29;32088:6;32096;32074:13;:29::i;:::-;32054:49;;32119:7;32114:54;;-1:-1:-1;32155:1:0;32114:54;32195:15;32225:23;32263:15;32293:23;32331:19;32364:29;32375:6;32383:9;32364:10;:29::i;:::-;-1:-1:-1;;;;;32613:26:0;;;;;;:18;:26;;;;;;32180:213;;-1:-1:-1;32180:213:0;;-1:-1:-1;32180:213:0;;-1:-1:-1;32180:213:0;-1:-1:-1;32180:213:0;-1:-1:-1;32613:39:0;;32180:213;32613:30;:39::i;:::-;-1:-1:-1;;;;;32584:26:0;;;;;;;:18;:26;;;;;;:68;;;;32695:29;;;;;;;:74;;32743:15;32695:33;:74::i;:::-;-1:-1:-1;;;;;32663:29:0;;;;;;;:18;:29;;;;;;;;:106;;;;32879:30;;;;;:22;:30;;;;;;;32875:113;;;-1:-1:-1;;;;;32946:17:0;;;;;;:9;:17;;;;;;:30;;32968:7;32946:21;:30::i;:::-;-1:-1:-1;;;;;32926:17:0;;;;;;:9;:17;;;;;:50;32875:113;-1:-1:-1;;;;;33002:33:0;;;;;;:22;:33;;;;;;;;32998:130;;;-1:-1:-1;;;;;33075:20:0;;;;;;:9;:20;;;;;;:41;;33100:15;33075:24;:41::i;:::-;-1:-1:-1;;;;;33052:20:0;;;;;;:9;:20;;;;;:64;32998:130;33140:41;33150:6;33158:11;33171:9;33140;:41::i;:::-;33214:9;-1:-1:-1;;;;;33197:44:0;33206:6;-1:-1:-1;;;;;33197:44:0;;33225:15;33197:44;;;;14746:25:1;;14734:2;14719:18;;14701:76;33197:44:0;;;;;;;;31902:1347;;;;;;;;;;:::o;34442:962::-;34541:16;;34586:12;;34494:7;;;;;34854:378;34878:9;:16;34874:20;;34854:378;;;34973:7;34938:18;:32;34957:9;34967:1;34957:12;;;;;;-1:-1:-1;;;34957:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34957:12:0;34938:32;;;;;;;;;;;;;:42;;:96;;;35027:7;35001:9;:23;35011:9;35021:1;35011:12;;;;;;-1:-1:-1;;;35011:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35011:12:0;35001:23;;;;;;;;;;;;;:33;34938:96;34916:173;;;35058:16;;35076:12;;35050:39;;;;;;;34442:962;;:::o;34916:173::-;35114:45;35126:18;:32;35145:9;35155:1;35145:12;;;;;;-1:-1:-1;;;35145:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35145:12:0;35126:32;;;;;;;;;;;;;35114:7;;:11;:45::i;:::-;35104:55;;35184:36;35196:9;:23;35206:9;35216:1;35206:12;;;;;;-1:-1:-1;;;35206:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35206:12:0;35196:23;;;;;;;;;;;;;35184:7;;:11;:36::i;:::-;35174:46;-1:-1:-1;34896:3:0;;;;:::i;:::-;;;;34854:378;;;-1:-1:-1;35246:12:0;;;:60;;-1:-1:-1;35293:12:0;;35272:16;;:34;;:20;:34::i;:::-;35262:7;:44;35246:60;35242:118;;;35329:16;;35347:12;;35321:39;;;;;;34442:962;;:::o;35242:118::-;35379:7;;35388;;-1:-1:-1;34442:962:0;-1:-1:-1;34442:962:0:o;39780:1032::-;39891:20;;39867;:44;39863:106;;39949:20;;39926:43;;39863:106;40054:31;;40017:68;;;;;;;40441:64;;-1:-1:-1;40484:21:0;;-1:-1:-1;;;40484:21:0;;;;40441:64;:98;;;;-1:-1:-1;40523:16:0;;-1:-1:-1;;;40523:16:0;;;;40522:17;40441:98;:132;;;;-1:-1:-1;40567:5:0;;-1:-1:-1;;;;;40557:15:0;;;40567:5;;40557:15;;40441:132;40423:382;;;40756:37;40772:20;40756:15;:37::i;33257:238::-;33401:1;33389:9;:13;:29;;;;-1:-1:-1;33407:11:0;;-1:-1:-1;;;33407:11:0;;;;33406:12;33389:29;33385:103;;;33435:41;33456:6;33464:11;33435:20;:41::i;41336:938::-;38588:16;:23;;-1:-1:-1;;;;38588:23:0;-1:-1:-1;;;38588:23:0;;;;41474:13:::1;:6:::0;41485:1:::1;41474:10;:13::i;:::-;41459:28:::0;-1:-1:-1;41498:17:0::1;41518:16;:6:::0;41459:28;41518:10:::1;:16::i;:::-;41498:36:::0;-1:-1:-1;41837:21:0::1;41903:23;41921:4:::0;41903:17:::1;:23::i;:::-;42057:18;42078:41;:21;42104:14:::0;42078:25:::1;:41::i;:::-;42057:62;;42169:36;42183:9;42194:10;42169:13;:36::i;:::-;42223:43;::::0;;15972:25:1;;;16028:2;16013:18;;16006:34;;;16056:18;;;16049:34;;;42223:43:0::1;::::0;15960:2:1;15945:18;42223:43:0::1;;;;;;;-1:-1:-1::0;;38634:16:0;:24;;-1:-1:-1;;;;38634:24:0;;;-1:-1:-1;;;41336:938:0:o;49053:1047::-;49176:11;;-1:-1:-1;;;49176:11:0;;;;49172:50;;;49053:1047;;:::o;49172:50::-;49234:17;49254:15;17832:4;:11;;17757:94;49254:15;49234:35;;49285:13;49280:813;49312:9;49304:5;:17;49280:813;;;49348:12;49362:17;49381:13;49400:14;49408:5;49400:7;:14::i;:::-;49347:67;;;;;;;49522:5;49531:1;49522:10;49518:24;;;49534:8;;;;;49518:24;49571:11;49563:4;:19;;;;;;-1:-1:-1;;;49563:19:0;;;;;;;;;;49559:523;;;49603:48;49617:6;49625:11;49638:5;49645;49603:13;:48::i;:::-;49559:523;;;49685:12;49677:4;:20;;;;;;-1:-1:-1;;;49677:20:0;;;;;;;;;;49673:409;;;49718:40;49724:6;49732:11;49745:5;49752;49718;:40::i;49673:409::-;49792:17;49784:4;:25;;;;;;-1:-1:-1;;;49784:25:0;;;;;;;;;;49780:302;;;;;;49870:21;49862:4;:29;;;;;;-1:-1:-1;;;49862:29:0;;;;;;;;;;49858:224;;;49912:59;49926:6;49934:11;49947:5;49954:9;49965:5;49912:13;:59::i;49858:224::-;50012:54;50021:6;50029:11;50042:5;50049:9;50060:5;50012:8;:54::i;:::-;49280:813;;;;49323:7;;;;:::i;:::-;;;;49280:813;;42282:718;42433:16;;;42447:1;42433:16;;;;;;;;42409:21;;42433:16;;;;;;;;;;-1:-1:-1;42433:16:0;42409:40;;42478:4;42460;42465:1;42460:7;;;;;;-1:-1:-1;;;42460:7:0;;;;;;;;;-1:-1:-1;;;;;42460:23:0;;;:7;;;;;;;;;;:23;;;;42504:7;;:14;;;-1:-1:-1;;;42504:14:0;;;;:7;;;;;:12;;:14;;;;;42460:7;;42504:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42494:4;42499:1;42494:7;;;;;;-1:-1:-1;;;42494:7:0;;;;;;;;;-1:-1:-1;;;;;42494:24:0;;;:7;;;;;;;;;:24;42571:7;;42531:62;;42556:4;;42571:7;42581:11;42531:16;:62::i;:::-;42632:7;;:360;;-1:-1:-1;;;42632:360:0;;-1:-1:-1;;;;;42632:7:0;;;;:58;;:360;;42705:11;;42632:7;;42919:4;;42946;;42966:15;;42632:360;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42282:718;;:::o;43008:1719::-;43197:7;;43157:62;;43182:4;;-1:-1:-1;;;;;43197:7:0;43207:11;43157:16;:62::i;:::-;43333:7;;43264:23;;;;;;-1:-1:-1;;;;;43333:7:0;:37;43378:9;43411:4;43431:11;43264:23;;43964:7;6619;6646:6;-1:-1:-1;;;;;6646:6:0;;6581:79;43964:7;43333:679;;;;;;-1:-1:-1;;;;;;43333:679:0;;;-1:-1:-1;;;;;4361:15:1;;;43333:679:0;;;4343:34:1;4393:18;;;4386:34;;;;4436:18;;;4429:34;;;;4479:18;;;4472:34;4543:15;;;4522:19;;;4515:44;43986:15:0;4575:19:1;;;4568:35;4277:19;;43333:679:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44625:21;44603:19;:43;44662:57;;;15972:25:1;;;16028:2;16013:18;;16006:34;;;16056:18;;;16049:34;;;43263:749:0;;-1:-1:-1;43263:749:0;;-1:-1:-1;43263:749:0;-1:-1:-1;44662:57:0;;15960:2:1;15945:18;44662:57:0;;;;;;;43008:1719;;;;;:::o;18122:307::-;18218:7;18240;18262;18284;18319:14;18336:20;18350:5;18336:13;:20::i;:::-;18319:37;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18319:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;18319:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18319:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18375:8;;18385:13;;;;18400:9;;;;18411;;;;;18375:8;;18385:13;;-1:-1:-1;18400:9:0;;-1:-1:-1;18411:9:0;;-1:-1:-1;18122:307:0;-1:-1:-1;;;18122:307:0:o;36931:358::-;37117:12;;37082;;37097:33;;37117:12;;37097:15;:6;37108:3;37097:10;:15::i;:33::-;37082:48;-1:-1:-1;37141:12:0;37156:21;37082:48;37165:11;37156:8;:21::i;:::-;37209:16;;37141:36;;-1:-1:-1;37209:26:0;;37141:36;37209:20;:26::i;:::-;37190:16;:45;37246:35;37269:5;37276:4;37246:22;:35::i;50108:348::-;50286:12;;50250:13;;50266:33;;50286:12;;50266:15;:6;50277:3;50266:10;:15::i;:33::-;50250:49;-1:-1:-1;50310:13:0;50326:22;50250:49;50336:11;50326:9;:22::i;:::-;50310:38;;50361:40;50381:4;50388:5;50395;50361:11;:40::i;:::-;50412:36;50435:5;50442;50412:22;:36::i;51356:238::-;51534:52;51543:6;51551:11;51564:3;51569:9;51580:5;50464:566;50675:12;;50637:15;;50655:33;;50675:12;;50655:15;:6;50666:3;50655:10;:15::i;:33::-;50637:51;-1:-1:-1;50699:15:0;50717:24;50637:51;50729:11;50717;:24::i;:::-;-1:-1:-1;;;;;50786:29:0;;;;;;:18;:29;;;;;;50699:42;;-1:-1:-1;50786:66:0;;50699:42;50786:33;:66::i;:::-;-1:-1:-1;;;;;50754:29:0;;;;;;:18;:29;;;;;;;;:98;;;;50867:22;:33;;;;;;50863:108;;;-1:-1:-1;;;;;50938:20:0;;;;;;:9;:20;;;;;;:33;;50963:7;50938:24;:33::i;:::-;-1:-1:-1;;;;;50915:20:0;;;;;;:9;:20;;;;;:56;50863:108;50984:38;51007:5;51014:7;50984:22;:38::i;:::-;50464:566;;;;;;;:::o;51602:177::-;51739:32;51748:5;51755:7;51764:6;51739:8;:32::i;17859:255::-;17919:11;17987:4;:11;17979:19;;17943:134;;;;-1:-1:-1;;;17943:134:0;;13563:2:1;17943:134:0;;;13545:21:1;13602:2;13582:18;;;13575:30;13641:34;13621:18;;;13614:62;-1:-1:-1;;;13692:18:1;;;13685:49;13751:19;;17943:134:0;13535:241:1;17943:134:0;18095:4;18100:5;18095:11;;;;;;-1:-1:-1;;;18095:11:0;;;;;;;;;;;;;;;;;;;18088:18;;17859:255;;;:::o;18437:173::-;18520:15;18538:20;18552:5;18538:13;:20::i;:::-;18581:9;;;;18520:38;;-1:-1:-1;18581:21:0;;18595:6;18581:13;:21::i;:::-;18569:9;;;;:33;-1:-1:-1;;18437:173:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;977:398::-;1045:6;1053;1106:2;1094:9;1085:7;1081:23;1077:32;1074:2;;;1127:6;1119;1112:22;1074:2;1171:9;1158:23;1190:31;1215:5;1190:31;:::i;:::-;1240:5;-1:-1:-1;1297:2:1;1282:18;;1269:32;1310:33;1269:32;1310:33;:::i;:::-;1362:7;1352:17;;;1064:311;;;;;:::o;1380:466::-;1457:6;1465;1473;1526:2;1514:9;1505:7;1501:23;1497:32;1494:2;;;1547:6;1539;1532:22;1494:2;1591:9;1578:23;1610:31;1635:5;1610:31;:::i;:::-;1660:5;-1:-1:-1;1717:2:1;1702:18;;1689:32;1730:33;1689:32;1730:33;:::i;:::-;1484:362;;1782:7;;-1:-1:-1;;;1836:2:1;1821:18;;;;1808:32;;1484:362::o;1851:325::-;1916:6;1924;1977:2;1965:9;1956:7;1952:23;1948:32;1945:2;;;1998:6;1990;1983:22;1945:2;2042:9;2029:23;2061:31;2086:5;2061:31;:::i;:::-;2111:5;-1:-1:-1;2135:35:1;2166:2;2151:18;;2135:35;:::i;:::-;2125:45;;1935:241;;;;;:::o;2181:325::-;2249:6;2257;2310:2;2298:9;2289:7;2285:23;2281:32;2278:2;;;2331:6;2323;2316:22;2278:2;2375:9;2362:23;2394:31;2419:5;2394:31;:::i;:::-;2444:5;2496:2;2481:18;;;;2468:32;;-1:-1:-1;;;2268:238:1:o;2511:190::-;2567:6;2620:2;2608:9;2599:7;2595:23;2591:32;2588:2;;;2641:6;2633;2626:22;2588:2;2669:26;2685:9;2669:26;:::i;2706:190::-;2765:6;2818:2;2806:9;2797:7;2793:23;2789:32;2786:2;;;2839:6;2831;2824:22;2786:2;-1:-1:-1;2867:23:1;;2776:120;-1:-1:-1;2776:120:1:o;2901:258::-;2966:6;2974;3027:2;3015:9;3006:7;3002:23;2998:32;2995:2;;;3048:6;3040;3033:22;2995:2;3089:9;3076:23;3066:33;;3118:35;3149:2;3138:9;3134:18;3118:35;:::i;3164:316::-;3252:6;3260;3268;3321:2;3309:9;3300:7;3296:23;3292:32;3289:2;;;3342:6;3334;3327:22;3289:2;3376:9;3370:16;3360:26;;3426:2;3415:9;3411:18;3405:25;3395:35;;3470:2;3459:9;3455:18;3449:25;3439:35;;3279:201;;;;;:::o;4806:603::-;4918:4;4947:2;4976;4965:9;4958:21;5008:6;5002:13;5051:6;5046:2;5035:9;5031:18;5024:34;5076:4;5089:140;5103:6;5100:1;5097:13;5089:140;;;5198:14;;;5194:23;;5188:30;5164:17;;;5183:2;5160:26;5153:66;5118:10;;5089:140;;;5247:6;5244:1;5241:13;5238:2;;;5317:4;5312:2;5303:6;5292:9;5288:22;5284:31;5277:45;5238:2;-1:-1:-1;5393:2:1;5372:15;-1:-1:-1;;5368:29:1;5353:45;;;;5400:2;5349:54;;4927:482;-1:-1:-1;;;4927:482:1:o;11363:356::-;11565:2;11547:21;;;11584:18;;;11577:30;11643:34;11638:2;11623:18;;11616:62;11710:2;11695:18;;11537:182::o;12955:401::-;13157:2;13139:21;;;13196:2;13176:18;;;13169:30;13235:34;13230:2;13215:18;;13208:62;-1:-1:-1;;;13301:2:1;13286:18;;13279:35;13346:3;13331:19;;13129:227::o;14782:983::-;15044:4;15092:3;15081:9;15077:19;15123:6;15112:9;15105:25;15149:2;15187:6;15182:2;15171:9;15167:18;15160:34;15230:3;15225:2;15214:9;15210:18;15203:31;15254:6;15289;15283:13;15320:6;15312;15305:22;15358:3;15347:9;15343:19;15336:26;;15397:2;15389:6;15385:15;15371:29;;15418:4;15431:195;15445:6;15442:1;15439:13;15431:195;;;15510:13;;-1:-1:-1;;;;;15506:39:1;15494:52;;15601:15;;;;15566:12;;;;15542:1;15460:9;15431:195;;;-1:-1:-1;;;;;;;15682:32:1;;;;15677:2;15662:18;;15655:60;-1:-1:-1;;;15746:3:1;15731:19;15724:35;15643:3;15053:712;-1:-1:-1;;;15053:712:1:o;16283:128::-;16323:3;16354:1;16350:6;16347:1;16344:13;16341:2;;;16360:18;;:::i;:::-;-1:-1:-1;16396:9:1;;16331:80::o;16416:217::-;16456:1;16482;16472:2;;-1:-1:-1;;;16507:31:1;;16561:4;16558:1;16551:15;16589:4;16514:1;16579:15;16472:2;-1:-1:-1;16618:9:1;;16462:171::o;16638:168::-;16678:7;16744:1;16740;16736:6;16732:14;16729:1;16726:21;16721:1;16714:9;16707:17;16703:45;16700:2;;;16751:18;;:::i;:::-;-1:-1:-1;16791:9:1;;16690:116::o;16811:125::-;16851:4;16879:1;16876;16873:8;16870:2;;;16884:18;;:::i;:::-;-1:-1:-1;16921:9:1;;16860:76::o;16941:380::-;17020:1;17016:12;;;;17063;;;17084:2;;17138:4;17130:6;17126:17;17116:27;;17084:2;17191;17183:6;17180:14;17160:18;17157:38;17154:2;;;17237:10;17232:3;17228:20;17225:1;17218:31;17272:4;17269:1;17262:15;17300:4;17297:1;17290:15;17154:2;;16996:325;;;:::o;17326:135::-;17365:3;-1:-1:-1;;17386:17:1;;17383:2;;;17406:18;;:::i;:::-;-1:-1:-1;17453:1:1;17442:13;;17373:88::o;17466:127::-;17527:10;17522:3;17518:20;17515:1;17508:31;17558:4;17555:1;17548:15;17582:4;17579:1;17572:15;17598:131;-1:-1:-1;;;;;17673:31:1;;17663:42;;17653:2;;17719:1;17716;17709:12

Swarm Source

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