ETH Price: $3,667.49 (-5.55%)

Token

ERC-20: CurateAI (CAI)
 

Overview

Max Total Supply

1,000,000,000,000,000,000,000,000 CAI

Holders

59

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
2,240,719,747,765,664,738,120 CAI

Value
$0.00
0xa720d005c0d8b675ee817e32e1c9004bbf49f9b2
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CurateAI

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-19
*/

// SPDX-License-Identifier: MIT

/*
http://curateai.xyz/
https://t.me/CurateAI
*/

pragma solidity ^0.8.20;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_
    ) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

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

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

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

        return c;
    }

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

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;

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

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

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

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

    function waiveOwnership() 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;
    }
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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

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

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

    uint256 private constant TOTAL_SUPPLY = 1_000_000 * (10**18); // Assuming 18 is the decimal
    uint256 private constant MAX_TRANSACTION_PERCENT = 200; // 2%
    uint256 private constant MAX_WALLET_PERCENT = 200; // 2%
    uint256 private constant SWAP_TOKENS_AT_AMOUNT_PERCENT = 50;
    uint256 private constant MAX_SWAPABLE_TOKENS_PERCENT = 100;
    uint256 private constant BUY_FEES = 1_000;
    uint256 private constant SELL_FEES = 2_000;

    // External addresses - should be passed in constructor if possible
    address private constant DEVELOPMENT_WALLET =
        0x437015AC55AA37ff0b7001b4885Cf9dEDC6f6B1b;
    address private constant TREASURY_WALLET =
        0xc5c41c0446E463402A101CFd71178e1f28AcF54b;
    address private constant MARKETING_WALLET =
        0x083AA8cEBA302066e4Ba4ab9fAB4aB66AbDc7010;

    uint256 private constant TREASURY_RATIO = 400; // 40.0%
    uint256 private constant MARKETING_RATIO = 400; // 40.0%

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    bool private swapping;

    address private developmentWallet;
    address private marketingWallet;
    address private treasuryWallet;
    uint256 public maxTransaction;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

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

    mapping(address => uint256) private _holderLastTransferBlock;
    bool public transDelayActived = true;
    uint256 public launchBlockNo;

    uint256 public buyFees;
    uint256 public sellFees;
    uint256 private _maxSwapableTokens;

    uint256 public _preventSwapBefore = 10;
    uint256 public _removeLimitsAt = 30;
    uint256 public _totalBuys = 0;

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

    constructor() ERC20("CurateAI", "CAI", 18) {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = TOTAL_SUPPLY;

        maxTransaction = (totalSupply * MAX_TRANSACTION_PERCENT) / 10_000;
        maxWallet = (totalSupply * MAX_WALLET_PERCENT) / 10_000;
        swapTokensAtAmount =
            (totalSupply * SWAP_TOKENS_AT_AMOUNT_PERCENT) /
            10_000;
        _maxSwapableTokens =
            (totalSupply * MAX_SWAPABLE_TOKENS_PERCENT) /
            10_000;

        buyFees = BUY_FEES;
        sellFees = SELL_FEES;

        developmentWallet = DEVELOPMENT_WALLET;
        treasuryWallet = MARKETING_WALLET;
        marketingWallet = MARKETING_WALLET;

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

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

        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function launch() external onlyOwner {
        require(!tradingActive, "Token launched");
        tradingActive = true;
        launchBlockNo = block.number;
        swapEnabled = true;
    }

    function removeLimits() internal returns (bool) {
        limitsInEffect = false;
        buyFees = 1_000;
        sellFees = 2_000;
        return true;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transDelayActived = false;
        return true;
    }

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

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

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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function updateTreasuryWallet(address newWallet)
        external
        onlyOwner
    {
        emit TreasuryWalletUpdated(newWallet, treasuryWallet);
        treasuryWallet = newWallet;
    }

    function updateMarketingWallet(address newWallet) external onlyOwner {
        emit MarketingWalletUpdated(newWallet, marketingWallet);
        marketingWallet = newWallet;
    }

    function updateDevelopmentWallet(address newWallet) external onlyOwner {
        emit DevelopmentWalletUpdated(newWallet, developmentWallet);
        developmentWallet = newWallet;
    }

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

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

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

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

                if (transDelayActived) {
                    if (
                        to != owner() &&
                        to != address(uniswapV2Router) &&
                        to != address(uniswapV2Pair)
                    ) {
                        require(
                            _holderLastTransferBlock[tx.origin] < block.number,
                            "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                        );
                        _holderLastTransferBlock[tx.origin] = block.number;
                    }
                }

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

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] &&
            _totalBuys > _preventSwapBefore
        ) {
            swapping = true;
            swapBack(min(contractTokenBalance, _maxSwapableTokens));
            swapping = false;
        }

        bool takeFee = !swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;

        if (takeFee) {
            // SELL
            if (automatedMarketMakerPairs[to] && sellFees > 0) {
                fees = amount.mul(sellFees).div(10_000);
            }
            // BUY
            else if (automatedMarketMakerPairs[from] && buyFees > 0) {
                fees = amount.mul(buyFees).div(10_000);
                _totalBuys++;
            }

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

            amount -= fees;
        }

        super._transfer(from, to, amount);

        if (_totalBuys >= _removeLimitsAt && limitsInEffect) {
            removeLimits();
        }
    }

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

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack(uint256 amount) private {
        bool success;

        if (amount == 0) {
            return;
        }

        uint256 amountToSwapForETH = amount;
        swapTokensForEth(amountToSwapForETH);
        uint256 ethBalance = address(this).balance;
        // Calculate allocations
        uint256 treasuryAmount = (ethBalance * TREASURY_RATIO) / 1000;
        uint256 marketingAmount = (ethBalance * MARKETING_RATIO) / 1000;
        uint256 developmentAmount = ethBalance - treasuryAmount - marketingAmount;

        (success, ) = address(treasuryWallet).call{value: treasuryAmount}("");
        (success, ) = address(marketingWallet).call{value: marketingAmount}("");
        (success, ) = address(developmentWallet).call{value: developmentAmount}(
            ""
        );
    }

    function changeSwapTokensAtAmount(uint256 newValue)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newValue >= (totalSupply() * 1) / 100_000,
            "Swap amount < 0.001% total supply."
        );
        require(
            newValue <= (totalSupply() * 100) / 10_000,
            "Swap amount > 1% total supply."
        );
        swapTokensAtAmount = newValue;
        return true;
    }

    function changeMaxTransaction(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 10) / 10_000),
            "maxTransaction < 0.1%"
        );
        maxTransaction = newValue * (10**decimals());
    }

    function changeMaxWallet(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 50) / 10_000),
            "maxWallet < 0.5%"
        );
        maxWallet = newValue * (10**decimals());
    }

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

    function updateBuyFee(uint256 _newFee) external onlyOwner {
        require(buyFees <= 1_000);
        buyFees = _newFee;
    }

    function updateSellFee(uint256 _newFee) external onlyOwner {
        require(sellFees <= 1_000);
        sellFees = _newFee;
    }

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

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

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

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

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"DevelopmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedmaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preventSwapBefore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_removeLimitsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalBuys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"changeMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"changeMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"changeSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlockNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transDelayActived","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnable","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"waiveOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055600e805462ffffff191660019081179091556010805460ff19169091179055600a601555601e6016555f60175534801562000063575f80fd5b5060405180604001604052806008815260200167437572617465414960c01b8152506040518060400160405280600381526020016243414960e81b81525060128260039081620000b491906200074d565b506004620000c383826200074d565b506005805460ff191660ff92909216919091179055505f9050620000e43390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506007546001600160a01b0316620001528160016200044a565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200019b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c1919062000819565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200020d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000233919062000819565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200027e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002a4919062000819565b6001600160a01b031660a0819052620002bf9060016200044a565b60a051620002cf906001620004c8565b69d3c21bcecceda1000000612710620002ea60c8836200085c565b620002f691906200087c565b600b556127106200030960c8836200085c565b6200031591906200087c565b600d55612710620003286032836200085c565b6200033491906200087c565b600c55612710620003476064836200085c565b6200035391906200087c565b6014556103e86012556107d0601355600880546001600160a01b031990811673437015ac55aa37ff0b7001b4885cf9dedc6f6b1b17909155600a8054821673083aa8ceba302066e4ba4ab9fab4ab66abdc701090811790915560098054909216179055620003da620003d260055461010090046001600160a01b031690565b60016200051b565b620003e73060016200051b565b620003f661dead60016200051b565b6200041a6200041260055461010090046001600160a01b031690565b60016200044a565b620004273060016200044a565b6200043661dead60016200044a565b620004423382620005c9565b5050620008b2565b6005546001600160a01b036101009091041633146200049e5760405162461bcd60e51b815260206004820181905260248201525f805160206200302f83398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152601960205260409020805460ff1916911515919091179055565b6001600160a01b0382165f818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b036101009091041633146200056b5760405162461bcd60e51b815260206004820181905260248201525f805160206200302f833981519152604482015260640162000495565b6001600160a01b0382165f81815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000495565b8060025f8282546200063491906200089c565b90915550506001600160a01b0382165f9081526020819052604081208054839290620006629084906200089c565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620006d957607f821691505b602082108103620006f857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620006ab57805f5260205f20601f840160051c81016020851015620007255750805b601f840160051c820191505b8181101562000746575f815560010162000731565b5050505050565b81516001600160401b03811115620007695762000769620006b0565b62000781816200077a8454620006c4565b84620006fe565b602080601f831160018114620007b7575f84156200079f5750858301515b5f19600386901b1c1916600185901b17855562000811565b5f85815260208120601f198616915b82811015620007e757888601518255948401946001909101908401620007c6565b50858210156200080557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156200082a575f80fd5b81516001600160a01b038116811462000841575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141762000876576200087662000848565b92915050565b5f826200089757634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111562000876576200087662000848565b60805160a051612731620008fe5f395f818161045201528181610efb01526116f501525f818161034c015281816116b7015281816120cb0152818161218201526121be01526127315ff3fe608060405260043610610283575f3560e01c8063914eb66a11610155578063cd73ab02116100be578063e4748b9e11610078578063e4748b9e146107e2578063e884f260146107f7578063f023f5731461080b578063f2fde38b1461082a578063f887ea4014610849578063f8b45b0514610868575f80fd5b8063cd73ab021461070e578063d14df2391461072d578063dd62ed3e14610746578063e0f3ccf51461078a578063e1bc33941461079f578063e2f45605146107cd575f80fd5b8063aacebbe31161010f578063aacebbe31461065a578063b62496f514610679578063bbc0c742146106a7578063c0246668146106c5578063c3f70b52146106e4578063c81d9246146106f9575f80fd5b8063914eb66a146105b6578063924de9b7146105ca57806395d89b41146105e95780639a7a23d6146105fd578063a457c2d71461061c578063a9059cbb1461063b575f80fd5b8063467abe0a116101f75780636ddd1713116101b15780636ddd1713146104ee57806370a082311461050d57806373a94292146105415780637571336a14610556578063809d458d146105755780638da5cb5b14610594575f80fd5b8063467abe0a1461042257806349bd5a5e146104415780634a62bb65146104745780634fbee1931461048d57806363ee4d1c146104c457806368018226146104d9575f80fd5b80631694505e116102485780631694505e1461033b57806318160ddd146103865780631d933a4a146103a457806323b872dd146103c3578063313ce567146103e25780633950935114610403575f80fd5b806301339c211461028e57806306fdde03146102a4578063095ea7b3146102ce57806309d6bf0a146102fd5780630b006d601461031c575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102a261087d565b005b3480156102af575f80fd5b506102b8610916565b6040516102c59190612261565b60405180910390f35b3480156102d9575f80fd5b506102ed6102e83660046122c4565b6109a6565b60405190151581526020016102c5565b348015610308575f80fd5b506102ed6103173660046122ee565b6109bc565b348015610327575f80fd5b506102a26103363660046122ee565b610ae8565b348015610346575f80fd5b5061036e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102c5565b348015610391575f80fd5b506002545b6040519081526020016102c5565b3480156103af575f80fd5b506102a26103be3660046122ee565b610b9c565b3480156103ce575f80fd5b506102ed6103dd366004612305565b610be1565b3480156103ed575f80fd5b5060055460405160ff90911681526020016102c5565b34801561040e575f80fd5b506102ed61041d3660046122c4565b610c89565b34801561042d575f80fd5b506102a261043c3660046122ee565b610cc4565b34801561044c575f80fd5b5061036e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047f575f80fd5b50600e546102ed9060ff1681565b348015610498575f80fd5b506102ed6104a7366004612343565b6001600160a01b03165f9081526018602052604090205460ff1690565b3480156104cf575f80fd5b5061039660115481565b3480156104e4575f80fd5b5061039660165481565b3480156104f9575f80fd5b50600e546102ed9062010000900460ff1681565b348015610518575f80fd5b50610396610527366004612343565b6001600160a01b03165f9081526020819052604090205490565b34801561054c575f80fd5b5061039660175481565b348015610561575f80fd5b506102a261057036600461236d565b610d09565b348015610580575f80fd5b506102a261058f366004612343565b610d63565b34801561059f575f80fd5b5060055461010090046001600160a01b031661036e565b3480156105c1575f80fd5b506102a2610def565b3480156105d5575f80fd5b506102a26105e43660046123a0565b610e6e565b3480156105f4575f80fd5b506102b8610eba565b348015610608575f80fd5b506102a261061736600461236d565b610ec9565b348015610627575f80fd5b506102ed6106363660046122c4565b610fae565b348015610646575f80fd5b506102ed6106553660046122c4565b611046565b348015610665575f80fd5b506102a2610674366004612343565b611052565b348015610684575f80fd5b506102ed610693366004612343565b601a6020525f908152604090205460ff1681565b3480156106b2575f80fd5b50600e546102ed90610100900460ff1681565b3480156106d0575f80fd5b506102a26106df36600461236d565b6110de565b3480156106ef575f80fd5b50610396600b5481565b348015610704575f80fd5b5061039660155481565b348015610719575f80fd5b506102a26107283660046122ee565b61116c565b348015610738575f80fd5b506010546102ed9060ff1681565b348015610751575f80fd5b506103966107603660046123b9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610795575f80fd5b5061039660135481565b3480156107aa575f80fd5b506102ed6107b9366004612343565b60196020525f908152604090205460ff1681565b3480156107d8575f80fd5b50610396600c5481565b3480156107ed575f80fd5b5061039660125481565b348015610802575f80fd5b506102ed611225565b348015610816575f80fd5b506102a2610825366004612343565b611267565b348015610835575f80fd5b506102a2610844366004612343565b6112f3565b348015610854575f80fd5b5060075461036e906001600160a01b031681565b348015610873575f80fd5b50610396600d5481565b6005546001600160a01b036101009091041633146108b65760405162461bcd60e51b81526004016108ad906123f0565b60405180910390fd5b600e54610100900460ff16156108ff5760405162461bcd60e51b815260206004820152600e60248201526d151bdad95b881b185d5b98da195960921b60448201526064016108ad565b600e80544360115562ffff00191662010100179055565b60606003805461092590612425565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612425565b801561099c5780601f106109735761010080835404028352916020019161099c565b820191905f5260205f20905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b5f6109b23384846113ee565b5060015b92915050565b6005545f906001600160a01b036101009091041633146109ee5760405162461bcd60e51b81526004016108ad906123f0565b620186a06109fb60025490565b610a06906001612471565b610a109190612488565b821015610a6a5760405162461bcd60e51b815260206004820152602260248201527f5377617020616d6f756e74203c20302e3030312520746f74616c20737570706c6044820152613c9760f11b60648201526084016108ad565b612710610a7660025490565b610a81906064612471565b610a8b9190612488565b821115610ada5760405162461bcd60e51b815260206004820152601e60248201527f5377617020616d6f756e74203e20312520746f74616c20737570706c792e000060448201526064016108ad565b50600c81905560015b919050565b6005546001600160a01b03610100909104163314610b185760405162461bcd60e51b81526004016108ad906123f0565b612710610b2460025490565b610b2f906032612471565b610b399190612488565b811015610b7b5760405162461bcd60e51b815260206004820152601060248201526f6d617857616c6c6574203c20302e352560801b60448201526064016108ad565b60055460ff16610b8c90600a612587565b610b969082612471565b600d5550565b6005546001600160a01b03610100909104163314610bcc5760405162461bcd60e51b81526004016108ad906123f0565b6103e86013541115610bdc575f80fd5b601355565b5f610bed848484611511565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610c715760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108ad565b610c7e85338584036113ee565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916109b2918590610cbf908690612595565b6113ee565b6005546001600160a01b03610100909104163314610cf45760405162461bcd60e51b81526004016108ad906123f0565b6103e86012541115610d04575f80fd5b601255565b6005546001600160a01b03610100909104163314610d395760405162461bcd60e51b81526004016108ad906123f0565b6001600160a01b03919091165f908152601960205260409020805460ff1916911515919091179055565b6005546001600160a01b03610100909104163314610d935760405162461bcd60e51b81526004016108ad906123f0565b600a546040516001600160a01b03918216918316907fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314610e1f5760405162461bcd60e51b81526004016108ad906123f0565b6005546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314610e9e5760405162461bcd60e51b81526004016108ad906123f0565b600e8054911515620100000262ff000019909216919091179055565b60606004805461092590612425565b6005546001600160a01b03610100909104163314610ef95760405162461bcd60e51b81526004016108ad906123f0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603610fa05760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016108ad565b610faa8282611c95565b5050565b335f9081526001602090815260408083206001600160a01b03861684529091528120548281101561102f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ad565b61103c33858584036113ee565b5060019392505050565b5f6109b2338484611511565b6005546001600160a01b036101009091041633146110825760405162461bcd60e51b81526004016108ad906123f0565b6009546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc67905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0361010090910416331461110e5760405162461bcd60e51b81526004016108ad906123f0565b6001600160a01b0382165f81815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0361010090910416331461119c5760405162461bcd60e51b81526004016108ad906123f0565b6127106111a860025490565b6111b390600a612471565b6111bd9190612488565b8110156112045760405162461bcd60e51b81526020600482015260156024820152746d61785472616e73616374696f6e203c20302e312560581b60448201526064016108ad565b60055460ff1661121590600a612587565b61121f9082612471565b600b5550565b6005545f906001600160a01b036101009091041633146112575760405162461bcd60e51b81526004016108ad906123f0565b506010805460ff19169055600190565b6005546001600160a01b036101009091041633146112975760405162461bcd60e51b81526004016108ad906123f0565b6008546040516001600160a01b03918216918316907f94cc1498503be9a145caf3e96f856665f29cf9b26c7179a93fbe1c1e5f56a0fd905f90a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146113235760405162461bcd60e51b81526004016108ad906123f0565b6001600160a01b0381166113885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ad565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0383166114505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ad565b6001600160a01b0382166114b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ad565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166115375760405162461bcd60e51b81526004016108ad906125a8565b6001600160a01b03821661155d5760405162461bcd60e51b81526004016108ad906125ed565b805f036115745761156f83835f611ce8565b505050565b600e5460ff1615611a29576005546001600160a01b0384811661010090920416148015906115b557506005546001600160a01b038381166101009092041614155b80156115c957506001600160a01b03821615155b80156115e057506001600160a01b03821661dead14155b80156115f65750600754600160a01b900460ff16155b15611a2957600e54610100900460ff1661168c576001600160a01b0383165f9081526018602052604090205460ff168061164757506001600160a01b0382165f9081526018602052604090205460ff165b61168c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016108ad565b60105460ff16156117d6576005546001600160a01b0383811661010090920416148015906116ec57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561172a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156117d657325f908152600f602052604090205443116117c45760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a4016108ad565b325f908152600f602052604090204390555b6001600160a01b0383165f908152601a602052604090205460ff16801561181557506001600160a01b0382165f9081526019602052604090205460ff16155b156118f257600b548111156118845760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b60648201526084016108ad565b600d546001600160a01b0383165f908152602081905260409020546118a99083612595565b11156118ed5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108ad565b611a29565b6001600160a01b0382165f908152601a602052604090205460ff16801561193157506001600160a01b0383165f9081526019602052604090205460ff16155b156119a157600b548111156118ed5760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b60648201526084016108ad565b6001600160a01b0382165f9081526019602052604090205460ff16611a2957600d546001600160a01b0383165f908152602081905260409020546119e59083612595565b1115611a295760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108ad565b305f90815260208190526040902054600c5481108015908190611a545750600e5462010000900460ff165b8015611a6a5750600754600160a01b900460ff16155b8015611a8e57506001600160a01b0385165f908152601a602052604090205460ff16155b8015611ab257506001600160a01b0385165f9081526018602052604090205460ff16155b8015611ad657506001600160a01b0384165f9081526018602052604090205460ff16155b8015611ae55750601554601754115b15611b22576007805460ff60a01b1916600160a01b179055601454611b1490611b0f908490611e3b565b611e52565b6007805460ff60a01b191690555b6007546001600160a01b0386165f9081526018602052604090205460ff600160a01b909204821615911680611b6e57506001600160a01b0385165f9081526018602052604090205460ff165b15611b7657505f5b5f8115611c4f576001600160a01b0386165f908152601a602052604090205460ff168015611ba557505f601354115b15611bd257611bcb612710611bc560135488611fb790919063ffffffff16565b90612035565b9050611c31565b6001600160a01b0387165f908152601a602052604090205460ff168015611bfa57505f601254115b15611c3157611c1a612710611bc560125488611fb790919063ffffffff16565b601780549192505f611c2b83612630565b91905055505b8015611c4257611c42873083611ce8565b611c4c8186612648565b94505b611c5a878787611ce8565b60165460175410158015611c705750600e5460ff165b15611c8c57600e805460ff191690556103e86012556107d06013555b50505050505050565b6001600160a01b0382165f818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611d0e5760405162461bcd60e51b81526004016108ad906125a8565b6001600160a01b038216611d345760405162461bcd60e51b81526004016108ad906125ed565b6001600160a01b0383165f9081526020819052604090205481811015611dab5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ad565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611de1908490612595565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e2d91815260200190565b60405180910390a350505050565b5f818311611e495782611e4b565b815b9392505050565b5f815f03611e5e575050565b81611e6881612076565b475f6103e8611e7961019084612471565b611e839190612488565b90505f6103e8611e9561019085612471565b611e9f9190612488565b90505f81611ead8486612648565b611eb79190612648565b600a546040519192506001600160a01b03169084905f81818185875af1925050503d805f8114611f02576040519150601f19603f3d011682016040523d82523d5f602084013e611f07565b606091505b50506009546040519197506001600160a01b03169083905f81818185875af1925050503d805f8114611f54576040519150601f19603f3d011682016040523d82523d5f602084013e611f59565b606091505b50506008546040519197506001600160a01b03169082905f81818185875af1925050503d805f8114611fa6576040519150601f19603f3d011682016040523d82523d5f602084013e611fab565b606091505b50505050505050505050565b5f825f03611fc657505f6109b6565b5f611fd18385612471565b905082611fde8583612488565b14611e4b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108ad565b5f611e4b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061222c565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106120a9576120a961265b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612125573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612149919061266f565b8160018151811061215c5761215c61265b565b60200260200101906001600160a01b031690816001600160a01b0316815250506121a7307f0000000000000000000000000000000000000000000000000000000000000000846113ee565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906121fb9085905f9086903090429060040161268a565b5f604051808303815f87803b158015612212575f80fd5b505af1158015612224573d5f803e3d5ffd5b505050505050565b5f818361224c5760405162461bcd60e51b81526004016108ad9190612261565b505f6122588486612488565b95945050505050565b5f602080835283518060208501525f5b8181101561228d57858101830151858201604001528201612271565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146122c1575f80fd5b50565b5f80604083850312156122d5575f80fd5b82356122e0816122ad565b946020939093013593505050565b5f602082840312156122fe575f80fd5b5035919050565b5f805f60608486031215612317575f80fd5b8335612322816122ad565b92506020840135612332816122ad565b929592945050506040919091013590565b5f60208284031215612353575f80fd5b8135611e4b816122ad565b80358015158114610ae3575f80fd5b5f806040838503121561237e575f80fd5b8235612389816122ad565b91506123976020840161235e565b90509250929050565b5f602082840312156123b0575f80fd5b611e4b8261235e565b5f80604083850312156123ca575f80fd5b82356123d5816122ad565b915060208301356123e5816122ad565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061243957607f821691505b60208210810361245757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109b6576109b661245d565b5f826124a257634e487b7160e01b5f52601260045260245ffd5b500490565b600181815b808511156124e157815f19048211156124c7576124c761245d565b808516156124d457918102915b93841c93908002906124ac565b509250929050565b5f826124f7575060016109b6565b8161250357505f6109b6565b816001811461251957600281146125235761253f565b60019150506109b6565b60ff8411156125345761253461245d565b50506001821b6109b6565b5060208310610133831016604e8410600b8410161715612562575081810a6109b6565b61256c83836124a7565b805f190482111561257f5761257f61245d565b029392505050565b5f611e4b60ff8416836124e9565b808201808211156109b6576109b661245d565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b5f600182016126415761264161245d565b5060010190565b818103818111156109b6576109b661245d565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561267f575f80fd5b8151611e4b816122ad565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156126da5784516001600160a01b0316835293830193918301916001016126b5565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220cfb599e379ffd89fb9ac450836bf0f04c211046674e515559762e1cfbef6f28c64736f6c634300081600334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x608060405260043610610283575f3560e01c8063914eb66a11610155578063cd73ab02116100be578063e4748b9e11610078578063e4748b9e146107e2578063e884f260146107f7578063f023f5731461080b578063f2fde38b1461082a578063f887ea4014610849578063f8b45b0514610868575f80fd5b8063cd73ab021461070e578063d14df2391461072d578063dd62ed3e14610746578063e0f3ccf51461078a578063e1bc33941461079f578063e2f45605146107cd575f80fd5b8063aacebbe31161010f578063aacebbe31461065a578063b62496f514610679578063bbc0c742146106a7578063c0246668146106c5578063c3f70b52146106e4578063c81d9246146106f9575f80fd5b8063914eb66a146105b6578063924de9b7146105ca57806395d89b41146105e95780639a7a23d6146105fd578063a457c2d71461061c578063a9059cbb1461063b575f80fd5b8063467abe0a116101f75780636ddd1713116101b15780636ddd1713146104ee57806370a082311461050d57806373a94292146105415780637571336a14610556578063809d458d146105755780638da5cb5b14610594575f80fd5b8063467abe0a1461042257806349bd5a5e146104415780634a62bb65146104745780634fbee1931461048d57806363ee4d1c146104c457806368018226146104d9575f80fd5b80631694505e116102485780631694505e1461033b57806318160ddd146103865780631d933a4a146103a457806323b872dd146103c3578063313ce567146103e25780633950935114610403575f80fd5b806301339c211461028e57806306fdde03146102a4578063095ea7b3146102ce57806309d6bf0a146102fd5780630b006d601461031c575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102a261087d565b005b3480156102af575f80fd5b506102b8610916565b6040516102c59190612261565b60405180910390f35b3480156102d9575f80fd5b506102ed6102e83660046122c4565b6109a6565b60405190151581526020016102c5565b348015610308575f80fd5b506102ed6103173660046122ee565b6109bc565b348015610327575f80fd5b506102a26103363660046122ee565b610ae8565b348015610346575f80fd5b5061036e7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102c5565b348015610391575f80fd5b506002545b6040519081526020016102c5565b3480156103af575f80fd5b506102a26103be3660046122ee565b610b9c565b3480156103ce575f80fd5b506102ed6103dd366004612305565b610be1565b3480156103ed575f80fd5b5060055460405160ff90911681526020016102c5565b34801561040e575f80fd5b506102ed61041d3660046122c4565b610c89565b34801561042d575f80fd5b506102a261043c3660046122ee565b610cc4565b34801561044c575f80fd5b5061036e7f000000000000000000000000a1a2f6190b81de18b7de175124bbf087a1ed2ee381565b34801561047f575f80fd5b50600e546102ed9060ff1681565b348015610498575f80fd5b506102ed6104a7366004612343565b6001600160a01b03165f9081526018602052604090205460ff1690565b3480156104cf575f80fd5b5061039660115481565b3480156104e4575f80fd5b5061039660165481565b3480156104f9575f80fd5b50600e546102ed9062010000900460ff1681565b348015610518575f80fd5b50610396610527366004612343565b6001600160a01b03165f9081526020819052604090205490565b34801561054c575f80fd5b5061039660175481565b348015610561575f80fd5b506102a261057036600461236d565b610d09565b348015610580575f80fd5b506102a261058f366004612343565b610d63565b34801561059f575f80fd5b5060055461010090046001600160a01b031661036e565b3480156105c1575f80fd5b506102a2610def565b3480156105d5575f80fd5b506102a26105e43660046123a0565b610e6e565b3480156105f4575f80fd5b506102b8610eba565b348015610608575f80fd5b506102a261061736600461236d565b610ec9565b348015610627575f80fd5b506102ed6106363660046122c4565b610fae565b348015610646575f80fd5b506102ed6106553660046122c4565b611046565b348015610665575f80fd5b506102a2610674366004612343565b611052565b348015610684575f80fd5b506102ed610693366004612343565b601a6020525f908152604090205460ff1681565b3480156106b2575f80fd5b50600e546102ed90610100900460ff1681565b3480156106d0575f80fd5b506102a26106df36600461236d565b6110de565b3480156106ef575f80fd5b50610396600b5481565b348015610704575f80fd5b5061039660155481565b348015610719575f80fd5b506102a26107283660046122ee565b61116c565b348015610738575f80fd5b506010546102ed9060ff1681565b348015610751575f80fd5b506103966107603660046123b9565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610795575f80fd5b5061039660135481565b3480156107aa575f80fd5b506102ed6107b9366004612343565b60196020525f908152604090205460ff1681565b3480156107d8575f80fd5b50610396600c5481565b3480156107ed575f80fd5b5061039660125481565b348015610802575f80fd5b506102ed611225565b348015610816575f80fd5b506102a2610825366004612343565b611267565b348015610835575f80fd5b506102a2610844366004612343565b6112f3565b348015610854575f80fd5b5060075461036e906001600160a01b031681565b348015610873575f80fd5b50610396600d5481565b6005546001600160a01b036101009091041633146108b65760405162461bcd60e51b81526004016108ad906123f0565b60405180910390fd5b600e54610100900460ff16156108ff5760405162461bcd60e51b815260206004820152600e60248201526d151bdad95b881b185d5b98da195960921b60448201526064016108ad565b600e80544360115562ffff00191662010100179055565b60606003805461092590612425565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612425565b801561099c5780601f106109735761010080835404028352916020019161099c565b820191905f5260205f20905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b5f6109b23384846113ee565b5060015b92915050565b6005545f906001600160a01b036101009091041633146109ee5760405162461bcd60e51b81526004016108ad906123f0565b620186a06109fb60025490565b610a06906001612471565b610a109190612488565b821015610a6a5760405162461bcd60e51b815260206004820152602260248201527f5377617020616d6f756e74203c20302e3030312520746f74616c20737570706c6044820152613c9760f11b60648201526084016108ad565b612710610a7660025490565b610a81906064612471565b610a8b9190612488565b821115610ada5760405162461bcd60e51b815260206004820152601e60248201527f5377617020616d6f756e74203e20312520746f74616c20737570706c792e000060448201526064016108ad565b50600c81905560015b919050565b6005546001600160a01b03610100909104163314610b185760405162461bcd60e51b81526004016108ad906123f0565b612710610b2460025490565b610b2f906032612471565b610b399190612488565b811015610b7b5760405162461bcd60e51b815260206004820152601060248201526f6d617857616c6c6574203c20302e352560801b60448201526064016108ad565b60055460ff16610b8c90600a612587565b610b969082612471565b600d5550565b6005546001600160a01b03610100909104163314610bcc5760405162461bcd60e51b81526004016108ad906123f0565b6103e86013541115610bdc575f80fd5b601355565b5f610bed848484611511565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610c715760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108ad565b610c7e85338584036113ee565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916109b2918590610cbf908690612595565b6113ee565b6005546001600160a01b03610100909104163314610cf45760405162461bcd60e51b81526004016108ad906123f0565b6103e86012541115610d04575f80fd5b601255565b6005546001600160a01b03610100909104163314610d395760405162461bcd60e51b81526004016108ad906123f0565b6001600160a01b03919091165f908152601960205260409020805460ff1916911515919091179055565b6005546001600160a01b03610100909104163314610d935760405162461bcd60e51b81526004016108ad906123f0565b600a546040516001600160a01b03918216918316907fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314610e1f5760405162461bcd60e51b81526004016108ad906123f0565b6005546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314610e9e5760405162461bcd60e51b81526004016108ad906123f0565b600e8054911515620100000262ff000019909216919091179055565b60606004805461092590612425565b6005546001600160a01b03610100909104163314610ef95760405162461bcd60e51b81526004016108ad906123f0565b7f000000000000000000000000a1a2f6190b81de18b7de175124bbf087a1ed2ee36001600160a01b0316826001600160a01b031603610fa05760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016108ad565b610faa8282611c95565b5050565b335f9081526001602090815260408083206001600160a01b03861684529091528120548281101561102f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ad565b61103c33858584036113ee565b5060019392505050565b5f6109b2338484611511565b6005546001600160a01b036101009091041633146110825760405162461bcd60e51b81526004016108ad906123f0565b6009546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc67905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0361010090910416331461110e5760405162461bcd60e51b81526004016108ad906123f0565b6001600160a01b0382165f81815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0361010090910416331461119c5760405162461bcd60e51b81526004016108ad906123f0565b6127106111a860025490565b6111b390600a612471565b6111bd9190612488565b8110156112045760405162461bcd60e51b81526020600482015260156024820152746d61785472616e73616374696f6e203c20302e312560581b60448201526064016108ad565b60055460ff1661121590600a612587565b61121f9082612471565b600b5550565b6005545f906001600160a01b036101009091041633146112575760405162461bcd60e51b81526004016108ad906123f0565b506010805460ff19169055600190565b6005546001600160a01b036101009091041633146112975760405162461bcd60e51b81526004016108ad906123f0565b6008546040516001600160a01b03918216918316907f94cc1498503be9a145caf3e96f856665f29cf9b26c7179a93fbe1c1e5f56a0fd905f90a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146113235760405162461bcd60e51b81526004016108ad906123f0565b6001600160a01b0381166113885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ad565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0383166114505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ad565b6001600160a01b0382166114b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ad565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166115375760405162461bcd60e51b81526004016108ad906125a8565b6001600160a01b03821661155d5760405162461bcd60e51b81526004016108ad906125ed565b805f036115745761156f83835f611ce8565b505050565b600e5460ff1615611a29576005546001600160a01b0384811661010090920416148015906115b557506005546001600160a01b038381166101009092041614155b80156115c957506001600160a01b03821615155b80156115e057506001600160a01b03821661dead14155b80156115f65750600754600160a01b900460ff16155b15611a2957600e54610100900460ff1661168c576001600160a01b0383165f9081526018602052604090205460ff168061164757506001600160a01b0382165f9081526018602052604090205460ff165b61168c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016108ad565b60105460ff16156117d6576005546001600160a01b0383811661010090920416148015906116ec57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b801561172a57507f000000000000000000000000a1a2f6190b81de18b7de175124bbf087a1ed2ee36001600160a01b0316826001600160a01b031614155b156117d657325f908152600f602052604090205443116117c45760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a4016108ad565b325f908152600f602052604090204390555b6001600160a01b0383165f908152601a602052604090205460ff16801561181557506001600160a01b0382165f9081526019602052604090205460ff16155b156118f257600b548111156118845760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b60648201526084016108ad565b600d546001600160a01b0383165f908152602081905260409020546118a99083612595565b11156118ed5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108ad565b611a29565b6001600160a01b0382165f908152601a602052604090205460ff16801561193157506001600160a01b0383165f9081526019602052604090205460ff16155b156119a157600b548111156118ed5760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b60648201526084016108ad565b6001600160a01b0382165f9081526019602052604090205460ff16611a2957600d546001600160a01b0383165f908152602081905260409020546119e59083612595565b1115611a295760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016108ad565b305f90815260208190526040902054600c5481108015908190611a545750600e5462010000900460ff165b8015611a6a5750600754600160a01b900460ff16155b8015611a8e57506001600160a01b0385165f908152601a602052604090205460ff16155b8015611ab257506001600160a01b0385165f9081526018602052604090205460ff16155b8015611ad657506001600160a01b0384165f9081526018602052604090205460ff16155b8015611ae55750601554601754115b15611b22576007805460ff60a01b1916600160a01b179055601454611b1490611b0f908490611e3b565b611e52565b6007805460ff60a01b191690555b6007546001600160a01b0386165f9081526018602052604090205460ff600160a01b909204821615911680611b6e57506001600160a01b0385165f9081526018602052604090205460ff165b15611b7657505f5b5f8115611c4f576001600160a01b0386165f908152601a602052604090205460ff168015611ba557505f601354115b15611bd257611bcb612710611bc560135488611fb790919063ffffffff16565b90612035565b9050611c31565b6001600160a01b0387165f908152601a602052604090205460ff168015611bfa57505f601254115b15611c3157611c1a612710611bc560125488611fb790919063ffffffff16565b601780549192505f611c2b83612630565b91905055505b8015611c4257611c42873083611ce8565b611c4c8186612648565b94505b611c5a878787611ce8565b60165460175410158015611c705750600e5460ff165b15611c8c57600e805460ff191690556103e86012556107d06013555b50505050505050565b6001600160a01b0382165f818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611d0e5760405162461bcd60e51b81526004016108ad906125a8565b6001600160a01b038216611d345760405162461bcd60e51b81526004016108ad906125ed565b6001600160a01b0383165f9081526020819052604090205481811015611dab5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ad565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611de1908490612595565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e2d91815260200190565b60405180910390a350505050565b5f818311611e495782611e4b565b815b9392505050565b5f815f03611e5e575050565b81611e6881612076565b475f6103e8611e7961019084612471565b611e839190612488565b90505f6103e8611e9561019085612471565b611e9f9190612488565b90505f81611ead8486612648565b611eb79190612648565b600a546040519192506001600160a01b03169084905f81818185875af1925050503d805f8114611f02576040519150601f19603f3d011682016040523d82523d5f602084013e611f07565b606091505b50506009546040519197506001600160a01b03169083905f81818185875af1925050503d805f8114611f54576040519150601f19603f3d011682016040523d82523d5f602084013e611f59565b606091505b50506008546040519197506001600160a01b03169082905f81818185875af1925050503d805f8114611fa6576040519150601f19603f3d011682016040523d82523d5f602084013e611fab565b606091505b50505050505050505050565b5f825f03611fc657505f6109b6565b5f611fd18385612471565b905082611fde8583612488565b14611e4b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108ad565b5f611e4b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061222c565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106120a9576120a961265b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612125573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612149919061266f565b8160018151811061215c5761215c61265b565b60200260200101906001600160a01b031690816001600160a01b0316815250506121a7307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846113ee565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906121fb9085905f9086903090429060040161268a565b5f604051808303815f87803b158015612212575f80fd5b505af1158015612224573d5f803e3d5ffd5b505050505050565b5f818361224c5760405162461bcd60e51b81526004016108ad9190612261565b505f6122588486612488565b95945050505050565b5f602080835283518060208501525f5b8181101561228d57858101830151858201604001528201612271565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146122c1575f80fd5b50565b5f80604083850312156122d5575f80fd5b82356122e0816122ad565b946020939093013593505050565b5f602082840312156122fe575f80fd5b5035919050565b5f805f60608486031215612317575f80fd5b8335612322816122ad565b92506020840135612332816122ad565b929592945050506040919091013590565b5f60208284031215612353575f80fd5b8135611e4b816122ad565b80358015158114610ae3575f80fd5b5f806040838503121561237e575f80fd5b8235612389816122ad565b91506123976020840161235e565b90509250929050565b5f602082840312156123b0575f80fd5b611e4b8261235e565b5f80604083850312156123ca575f80fd5b82356123d5816122ad565b915060208301356123e5816122ad565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061243957607f821691505b60208210810361245757634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109b6576109b661245d565b5f826124a257634e487b7160e01b5f52601260045260245ffd5b500490565b600181815b808511156124e157815f19048211156124c7576124c761245d565b808516156124d457918102915b93841c93908002906124ac565b509250929050565b5f826124f7575060016109b6565b8161250357505f6109b6565b816001811461251957600281146125235761253f565b60019150506109b6565b60ff8411156125345761253461245d565b50506001821b6109b6565b5060208310610133831016604e8410600b8410161715612562575081810a6109b6565b61256c83836124a7565b805f190482111561257f5761257f61245d565b029392505050565b5f611e4b60ff8416836124e9565b808201808211156109b6576109b661245d565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b5f600182016126415761264161245d565b5060010190565b818103818111156109b6576109b661245d565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561267f575f80fd5b8151611e4b816122ad565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156126da5784516001600160a01b0316835293830193918301916001016126b5565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220cfb599e379ffd89fb9ac450836bf0f04c211046674e515559762e1cfbef6f28c64736f6c63430008160033

Deployed Bytecode Sourcemap

22319:13636:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26072:196;;;;;;;;;;;;;:::i;:::-;;2259:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3321:210;;;;;;;;;;-1:-1:-1;3321:210:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;3321:210:0;1023:187:1;33747:457:0;;;;;;;;;;-1:-1:-1;33747:457:0;;;;;:::i;:::-;;:::i;34475:240::-;;;;;;;;;;-1:-1:-1;34475:240:0;;;;;:::i;:::-;;:::i;23360:51::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1591:32:1;;;1573:51;;1561:2;1546:18;23360:51:0;1400:230:1;2587:108:0;;;;;;;;;;-1:-1:-1;2675:12:0;;2587:108;;;1781:25:1;;;1769:2;1754:18;2587:108:0;1635:177:1;35061:133:0;;;;;;;;;;-1:-1:-1;35061:133:0;;;;;:::i;:::-;;:::i;3539:529::-;;;;;;;;;;-1:-1:-1;3539:529:0;;;;;:::i;:::-;;:::i;2479:100::-;;;;;;;;;;-1:-1:-1;2562:9:0;;2479:100;;2562:9;;;;2420:36:1;;2408:2;2393:18;2479:100:0;2278:184:1;4076:297:0;;;;;;;;;;-1:-1:-1;4076:297:0;;;;;:::i;:::-;;:::i;34923:130::-;;;;;;;;;;-1:-1:-1;34923:130:0;;;;;:::i;:::-;;:::i;23418:38::-;;;;;;;;;;;;;;;23792:33;;;;;;;;;;-1:-1:-1;23792:33:0;;;;;;;;28100:126;;;;;;;;;;-1:-1:-1;28100:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;28190:28:0;28166:4;28190:28;;;:19;:28;;;;;;;;;28100:126;24022:28;;;;;;;;;;;;;;;;24206:35;;;;;;;;;;;;;;;;23872:31;;;;;;;;;;-1:-1:-1;23872:31:0;;;;;;;;;;;2703:177;;;;;;;;;;-1:-1:-1;2703:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;2854:18:0;2822:7;2854:18;;;;;;;;;;;;2703:177;24248:29;;;;;;;;;;;;;;;;26641:161;;;;;;;;;;-1:-1:-1;26641:161:0;;;;;:::i;:::-;;:::i;27506:200::-;;;;;;;;;;-1:-1:-1;27506:200:0;;;;;:::i;:::-;;:::i;12467:79::-;;;;;;;;;;-1:-1:-1;12532:6:0;;;;;-1:-1:-1;;;;;12532:6:0;12467:79;;12681:145;;;;;;;;;;;;;:::i;34811:104::-;;;;;;;;;;-1:-1:-1;34811:104:0;;;;;:::i;:::-;;:::i;2367:::-;;;;;;;;;;;;;:::i;27000:304::-;;;;;;;;;;-1:-1:-1;27000:304:0;;;;;:::i;:::-;;:::i;4381:482::-;;;;;;;;;;-1:-1:-1;4381:482:0;;;;;:::i;:::-;;:::i;2888:216::-;;;;;;;;;;-1:-1:-1;2888:216:0;;;;;:::i;:::-;;:::i;27714:181::-;;;;;;;;;;-1:-1:-1;27714:181:0;;;;;:::i;:::-;;:::i;24409:57::-;;;;;;;;;;-1:-1:-1;24409:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23832:33;;;;;;;;;;-1:-1:-1;23832:33:0;;;;;;;;;;;26810:182;;;;;;;;;;-1:-1:-1;26810:182:0;;;;;:::i;:::-;;:::i;23683:29::-;;;;;;;;;;;;;;;;24161:38;;;;;;;;;;;;;;;;34212:255;;;;;;;;;;-1:-1:-1;34212:255:0;;;;;:::i;:::-;;:::i;23979:36::-;;;;;;;;;;-1:-1:-1;23979:36:0;;;;;;;;3112:201;;;;;;;;;;-1:-1:-1;3112:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;3278:18:0;;;3246:7;3278:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3112:201;24088:23;;;;;;;;;;;;;;;;24345:57;;;;;;;;;;-1:-1:-1;24345:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23719:33;;;;;;;;;;;;;;;;24059:22;;;;;;;;;;;;;;;;26501:132;;;;;;;;;;;;;:::i;27903:189::-;;;;;;;;;;-1:-1:-1;27903:189:0;;;;;:::i;:::-;;:::i;12834:281::-;;;;;;;;;;-1:-1:-1;12834:281:0;;;;;:::i;:::-;;:::i;23463:66::-;;;;;;;;;;-1:-1:-1;23463:66:0;;;;-1:-1:-1;;;;;23463:66:0;;;23759:24;;;;;;;;;;;;;;;;26072:196;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;;;;;;;;;26129:13:::1;::::0;::::1;::::0;::::1;;;26128:14;26120:41;;;::::0;-1:-1:-1;;;26120:41:0;;4553:2:1;26120:41:0::1;::::0;::::1;4535:21:1::0;4592:2;4572:18;;;4565:30;-1:-1:-1;;;4611:18:1;;;4604:44;4665:18;;26120:41:0::1;4351:338:1::0;26120:41:0::1;26172:13;:20:::0;;26219:12:::1;26203:13;:28:::0;-1:-1:-1;;26242:18:0;;;;;26072:196::o;2259:100::-;2313:13;2346:5;2339:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2259:100;:::o;3321:210::-;3440:4;3462:39;247:10;3485:7;3494:6;3462:8;:39::i;:::-;-1:-1:-1;3519:4:0;3321:210;;;;;:::o;33747:457::-;12594:6;;33854:4;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;33932:7:::1;33911:13;2675:12:::0;;;2587:108;33911:13:::1;:17;::::0;33927:1:::1;33911:17;:::i;:::-;33910:29;;;;:::i;:::-;33898:8;:41;;33876:125;;;::::0;-1:-1:-1;;;33876:125:0;;5808:2:1;33876:125:0::1;::::0;::::1;5790:21:1::0;5847:2;5827:18;;;5820:30;5886:34;5866:18;;;5859:62;-1:-1:-1;;;5937:18:1;;;5930:32;5979:19;;33876:125:0::1;5606:398:1::0;33876:125:0::1;34070:6;34047:13;2675:12:::0;;;2587:108;34047:13:::1;:19;::::0;34063:3:::1;34047:19;:::i;:::-;34046:30;;;;:::i;:::-;34034:8;:42;;34012:122;;;::::0;-1:-1:-1;;;34012:122:0;;6211:2:1;34012:122:0::1;::::0;::::1;6193:21:1::0;6250:2;6230:18;;;6223:30;6289:32;6269:18;;;6262:60;6339:18;;34012:122:0::1;6009:354:1::0;34012:122:0::1;-1:-1:-1::0;34145:18:0::1;:29:::0;;;34192:4:::1;12664:1;33747:457:::0;;;:::o;34475:240::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;34606:6:::1;34584:13;2675:12:::0;;;2587:108;34584:13:::1;:18;::::0;34600:2:::1;34584:18;:::i;:::-;34583:29;;;;:::i;:::-;34570:8;:43;;34548:109;;;::::0;-1:-1:-1;;;34548:109:0;;6570:2:1;34548:109:0::1;::::0;::::1;6552:21:1::0;6609:2;6589:18;;;6582:30;-1:-1:-1;;;6628:18:1;;;6621:46;6684:18;;34548:109:0::1;6368:340:1::0;34548:109:0::1;2562:9:::0;;;;34692:14:::1;::::0;:2:::1;:14;:::i;:::-;34680:27;::::0;:8;:27:::1;:::i;:::-;34668:9;:39:::0;-1:-1:-1;34475:240:0:o;35061:133::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;35151:5:::1;35139:8;;:17;;35131:26;;;::::0;::::1;;35168:8;:18:::0;35061:133::o;3539:529::-;3679:4;3696:36;3706:6;3714:9;3725:6;3696:9;:36::i;:::-;-1:-1:-1;;;;;3772:19:0;;3745:24;3772:19;;;:11;:19;;;;;;;;247:10;3772:33;;;;;;;;3838:26;;;;3816:116;;;;-1:-1:-1;;;3816:116:0;;8292:2:1;3816:116:0;;;8274:21:1;8331:2;8311:18;;;8304:30;8370:34;8350:18;;;8343:62;-1:-1:-1;;;8421:18:1;;;8414:38;8469:19;;3816:116:0;8090:404:1;3816:116:0;3968:57;3977:6;247:10;4018:6;3999:16;:25;3968:8;:57::i;:::-;-1:-1:-1;4056:4:0;;3539:529;-1:-1:-1;;;;3539:529:0:o;4076:297::-;247:10;4191:4;4285:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4285:34:0;;;;;;;;;;4191:4;;4213:130;;4263:7;;4285:47;;4322:10;;4285:47;:::i;:::-;4213:8;:130::i;34923:::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;35011:5:::1;35000:7;;:16;;34992:25;;;::::0;::::1;;35028:7;:17:::0;34923:130::o;26641:161::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26754:33:0;;;::::1;;::::0;;;:25:::1;:33;::::0;;;;:40;;-1:-1:-1;;26754:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26641:161::o;27506:200::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;27646:14:::1;::::0;27613:48:::1;::::0;-1:-1:-1;;;;;27646:14:0;;::::1;::::0;27613:48;::::1;::::0;::::1;::::0;27646:14:::1;::::0;27613:48:::1;27672:14;:26:::0;;-1:-1:-1;;;;;;27672:26:0::1;-1:-1:-1::0;;;;;27672:26:0;;;::::1;::::0;;;::::1;::::0;;27506:200::o;12681:145::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;12769:6:::1;::::0;12748:40:::1;::::0;12785:1:::1;::::0;12769:6:::1;::::0;::::1;-1:-1:-1::0;;;;;12769:6:0::1;::::0;12748:40:::1;::::0;12785:1;;12748:40:::1;12799:6;:19:::0;;-1:-1:-1;;;;;;12799:19:0::1;::::0;;12681:145::o;34811:104::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;34884:11:::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;34884:23:0;;::::1;::::0;;;::::1;::::0;;34811:104::o;2367:::-;2423:13;2456:7;2449:14;;;;;:::i;27000:304::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;27144:13:::1;-1:-1:-1::0;;;;;27136:21:0::1;:4;-1:-1:-1::0;;;;;27136:21:0::1;::::0;27114:128:::1;;;::::0;-1:-1:-1;;;27114:128:0;;8831:2:1;27114:128:0::1;::::0;::::1;8813:21:1::0;8870:2;8850:18;;;8843:30;8909:34;8889:18;;;8882:62;8980:27;8960:18;;;8953:55;9025:19;;27114:128:0::1;8629:421:1::0;27114:128:0::1;27255:41;27284:4;27290:5;27255:28;:41::i;:::-;27000:304:::0;;:::o;4381:482::-;247:10;4501:4;4550:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4550:34:0;;;;;;;;;;4617:35;;;;4595:122;;;;-1:-1:-1;;;4595:122:0;;9257:2:1;4595:122:0;;;9239:21:1;9296:2;9276:18;;;9269:30;9335:34;9315:18;;;9308:62;-1:-1:-1;;;9386:18:1;;;9379:35;9431:19;;4595:122:0;9055:401:1;4595:122:0;4753:67;247:10;4776:7;4804:15;4785:16;:34;4753:8;:67::i;:::-;-1:-1:-1;4851:4:0;;4381:482;-1:-1:-1;;;4381:482:0:o;2888:216::-;3010:4;3032:42;247:10;3056:9;3067:6;3032:9;:42::i;27714:181::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;27833:15:::1;::::0;27799:50:::1;::::0;-1:-1:-1;;;;;27833:15:0;;::::1;::::0;27799:50;::::1;::::0;::::1;::::0;27833:15:::1;::::0;27799:50:::1;27860:15;:27:::0;;-1:-1:-1;;;;;;27860:27:0::1;-1:-1:-1::0;;;;;27860:27:0;;;::::1;::::0;;;::::1;::::0;;27714:181::o;26810:182::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26895:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;26895:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26950:34;;1163:41:1;;;26950:34:0::1;::::0;1136:18:1;26950:34:0::1;;;;;;;26810:182:::0;;:::o;34212:255::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;34348:6:::1;34326:13;2675:12:::0;;;2587:108;34326:13:::1;:18;::::0;34342:2:::1;34326:18;:::i;:::-;34325:29;;;;:::i;:::-;34312:8;:43;;34290:114;;;::::0;-1:-1:-1;;;34290:114:0;;9663:2:1;34290:114:0::1;::::0;::::1;9645:21:1::0;9702:2;9682:18;;;9675:30;-1:-1:-1;;;9721:18:1;;;9714:51;9782:18;;34290:114:0::1;9461:345:1::0;34290:114:0::1;2562:9:::0;;;;34444:14:::1;::::0;:2:::1;:14;:::i;:::-;34432:27;::::0;:8;:27:::1;:::i;:::-;34415:14;:44:::0;-1:-1:-1;34212:255:0:o;26501:132::-;12594:6;;26561:4;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;-1:-1:-1;26578:17:0::1;:25:::0;;-1:-1:-1;;26578:25:0::1;::::0;;;26501:132;:::o;27903:189::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;28026:17:::1;::::0;27990:54:::1;::::0;-1:-1:-1;;;;;28026:17:0;;::::1;::::0;27990:54;::::1;::::0;::::1;::::0;28026:17:::1;::::0;27990:54:::1;28055:17;:29:::0;;-1:-1:-1;;;;;;28055:29:0::1;-1:-1:-1::0;;;;;28055:29:0;;;::::1;::::0;;;::::1;::::0;;27903:189::o;12834:281::-;12594:6;;-1:-1:-1;;;;;12594:6:0;;;;;247:10;12594:22;12586:67;;;;-1:-1:-1;;;12586:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12937:22:0;::::1;12915:110;;;::::0;-1:-1:-1;;;12915:110:0;;10013:2:1;12915:110:0::1;::::0;::::1;9995:21:1::0;10052:2;10032:18;;;10025:30;10091:34;10071:18;;;10064:62;-1:-1:-1;;;10142:18:1;;;10135:36;10188:19;;12915:110:0::1;9811:402:1::0;12915:110:0::1;13062:6;::::0;13041:38:::1;::::0;-1:-1:-1;;;;;13041:38:0;;::::1;::::0;13062:6:::1;::::0;::::1;;::::0;13041:38:::1;::::0;;;::::1;13090:6;:17:::0;;-1:-1:-1;;;;;13090:17:0;;::::1;;;-1:-1:-1::0;;;;;;13090:17:0;;::::1;::::0;;;::::1;::::0;;12834:281::o;6655:380::-;-1:-1:-1;;;;;6791:19:0;;6783:68;;;;-1:-1:-1;;;6783:68:0;;10420:2:1;6783:68:0;;;10402:21:1;10459:2;10439:18;;;10432:30;10498:34;10478:18;;;10471:62;-1:-1:-1;;;10549:18:1;;;10542:34;10593:19;;6783:68:0;10218:400:1;6783:68:0;-1:-1:-1;;;;;6870:21:0;;6862:68;;;;-1:-1:-1;;;6862:68:0;;10825:2:1;6862:68:0;;;10807:21:1;10864:2;10844:18;;;10837:30;10903:34;10883:18;;;10876:62;-1:-1:-1;;;10954:18:1;;;10947:32;10996:19;;6862:68:0;10623:398:1;6862:68:0;-1:-1:-1;;;;;6943:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6995:32;;1781:25:1;;;6995:32:0;;1754:18:1;6995:32:0;;;;;;;6655:380;;;:::o;28234:4078::-;-1:-1:-1;;;;;28366:18:0;;28358:68;;;;-1:-1:-1;;;28358:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28445:16:0;;28437:64;;;;-1:-1:-1;;;28437:64:0;;;;;;;:::i;:::-;28518:6;28528:1;28518:11;28514:93;;28546:28;28562:4;28568:2;28572:1;28546:15;:28::i;:::-;28234:4078;;;:::o;28514:93::-;28623:14;;;;28619:2261;;;12532:6;;-1:-1:-1;;;;;28676:15:0;;;12532:6;;;;;28676:15;;;;:49;;-1:-1:-1;12532:6:0;;-1:-1:-1;;;;;28712:13:0;;;12532:6;;;;;28712:13;;28676:49;:86;;;;-1:-1:-1;;;;;;28746:16:0;;;;28676:86;:128;;;;-1:-1:-1;;;;;;28783:21:0;;28797:6;28783:21;;28676:128;:158;;;;-1:-1:-1;28826:8:0;;-1:-1:-1;;;28826:8:0;;;;28825:9;28676:158;28654:2215;;;28874:13;;;;;;;28869:223;;-1:-1:-1;;;;;28946:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;28975:23:0;;;;;;:19;:23;;;;;;;;28946:52;28912:160;;;;-1:-1:-1;;;28912:160:0;;12038:2:1;28912:160:0;;;12020:21:1;12077:2;12057:18;;;12050:30;-1:-1:-1;;;12096:18:1;;;12089:52;12158:18;;28912:160:0;11836:346:1;28912:160:0;29116:17;;;;29112:597;;;12532:6;;-1:-1:-1;;;;;29188:13:0;;;12532:6;;;;;29188:13;;;;:72;;;29244:15;-1:-1:-1;;;;;29230:30:0;:2;-1:-1:-1;;;;;29230:30:0;;;29188:72;:129;;;;;29303:13;-1:-1:-1;;;;;29289:28:0;:2;-1:-1:-1;;;;;29289:28:0;;;29188:129;29158:532;;;29431:9;29406:35;;;;:24;:35;;;;;;29444:12;-1:-1:-1;29368:221:0;;;;-1:-1:-1;;;29368:221:0;;12389:2:1;29368:221:0;;;12371:21:1;12428:2;12408:18;;;12401:30;12467:34;12447:18;;;12440:62;12538:34;12518:18;;;12511:62;-1:-1:-1;;;12589:19:1;;;12582:40;12639:19;;29368:221:0;12187:477:1;29368:221:0;29641:9;29616:35;;;;:24;:35;;;;;29654:12;29616:50;;29158:532;-1:-1:-1;;;;;29779:31:0;;;;;;:25;:31;;;;;;;;:86;;;;-1:-1:-1;;;;;;29836:29:0;;;;;;:25;:29;;;;;;;;29835:30;29779:86;29753:1101;;;29952:14;;29942:6;:24;;29908:157;;;;-1:-1:-1;;;29908:157:0;;12871:2:1;29908:157:0;;;12853:21:1;12910:2;12890:18;;;12883:30;12949:34;12929:18;;;12922:62;-1:-1:-1;;;13000:18:1;;;12993:45;13055:19;;29908:157:0;12669:411:1;29908:157:0;30148:9;;-1:-1:-1;;;;;2854:18:0;;2822:7;2854:18;;;;;;;;;;;30122:22;;:6;:22;:::i;:::-;:35;;30088:140;;;;-1:-1:-1;;;30088:140:0;;13287:2:1;30088:140:0;;;13269:21:1;13326:2;13306:18;;;13299:30;-1:-1:-1;;;13345:18:1;;;13338:49;13404:18;;30088:140:0;13085:343:1;30088:140:0;29753:1101;;;-1:-1:-1;;;;;30322:29:0;;;;;;:25;:29;;;;;;;;:86;;;;-1:-1:-1;;;;;;30377:31:0;;;;;;:25;:31;;;;;;;;30376:32;30322:86;30296:558;;;30495:14;;30485:6;:24;;30451:158;;;;-1:-1:-1;;;30451:158:0;;13635:2:1;30451:158:0;;;13617:21:1;13674:2;13654:18;;;13647:30;13713:34;13693:18;;;13686:62;-1:-1:-1;;;13764:18:1;;;13757:46;13820:19;;30451:158:0;13433:412:1;30296:558:0;-1:-1:-1;;;;;30640:29:0;;;;;;:25;:29;;;;;;;;30635:219;;30754:9;;-1:-1:-1;;;;;2854:18:0;;2822:7;2854:18;;;;;;;;;;;30728:22;;:6;:22;:::i;:::-;:35;;30694:140;;;;-1:-1:-1;;;30694:140:0;;13287:2:1;30694:140:0;;;13269:21:1;13326:2;13306:18;;;13299:30;-1:-1:-1;;;13345:18:1;;;13338:49;13404:18;;30694:140:0;13085:343:1;30694:140:0;30941:4;30892:28;2854:18;;;;;;;;;;;30999;;30975:42;;;;;;;31048:35;;-1:-1:-1;31072:11:0;;;;;;;31048:35;:61;;;;-1:-1:-1;31101:8:0;;-1:-1:-1;;;31101:8:0;;;;31100:9;31048:61;:110;;;;-1:-1:-1;;;;;;31127:31:0;;;;;;:25;:31;;;;;;;;31126:32;31048:110;:153;;;;-1:-1:-1;;;;;;31176:25:0;;;;;;:19;:25;;;;;;;;31175:26;31048:153;:194;;;;-1:-1:-1;;;;;;31219:23:0;;;;;;:19;:23;;;;;;;;31218:24;31048:194;:242;;;;;31272:18;;31259:10;;:31;31048:242;31030:415;;;31317:8;:15;;-1:-1:-1;;;;31317:15:0;-1:-1:-1;;;31317:15:0;;;:8;31382:18;31347:55;;31356:45;;31360:20;;31356:3;:45::i;:::-;31347:8;:55::i;:::-;31417:8;:16;;-1:-1:-1;;;;31417:16:0;;;31030:415;31473:8;;-1:-1:-1;;;;;31498:25:0;;31457:12;31498:25;;;:19;:25;;;;;;31473:8;-1:-1:-1;;;31473:8:0;;;;;31472:9;;31498:25;;:52;;-1:-1:-1;;;;;;31527:23:0;;;;;;:19;:23;;;;;;;;31498:52;31494:100;;;-1:-1:-1;31577:5:0;31494:100;31606:12;31639:7;31635:518;;;-1:-1:-1;;;;;31688:29:0;;;;;;:25;:29;;;;;;;;:45;;;;;31732:1;31721:8;;:12;31688:45;31684:320;;;31761:32;31786:6;31761:20;31772:8;;31761:6;:10;;:20;;;;:::i;:::-;:24;;:32::i;:::-;31754:39;;31684:320;;;-1:-1:-1;;;;;31852:31:0;;;;;;:25;:31;;;;;;;;:46;;;;;31897:1;31887:7;;:11;31852:46;31848:156;;;31926:31;31950:6;31926:19;31937:7;;31926:6;:10;;:19;;;;:::i;:31::-;31976:10;:12;;31919:38;;-1:-1:-1;31976:10:0;:12;;;:::i;:::-;;;;;;31848:156;32024:8;;32020:91;;32053:42;32069:4;32083;32090;32053:15;:42::i;:::-;32127:14;32137:4;32127:14;;:::i;:::-;;;31635:518;32165:33;32181:4;32187:2;32191:6;32165:15;:33::i;:::-;32229:15;;32215:10;;:29;;:47;;;;-1:-1:-1;32248:14:0;;;;32215:47;32211:94;;;26335:14;:22;;-1:-1:-1;;26335:22:0;;;26378:5;26368:7;:15;26405:5;26394:8;:16;32211:94;28347:3965;;;;28234:4078;;;:::o;27312:186::-;-1:-1:-1;;;;;27395:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;27395:39:0;;;;;;;;;;27450:40;;27395:39;;:31;27450:40;;;27312:186;;:::o;4871:770::-;-1:-1:-1;;;;;5011:20:0;;5003:70;;;;-1:-1:-1;;;5003:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5092:23:0;;5084:71;;;;-1:-1:-1;;;5084:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5252:17:0;;5228:21;5252:17;;;;;;;;;;;5302:23;;;;5280:111;;;;-1:-1:-1;;;5280:111:0;;14325:2:1;5280:111:0;;;14307:21:1;14364:2;14344:18;;;14337:30;14403:34;14383:18;;;14376:62;-1:-1:-1;;;14454:18:1;;;14447:36;14500:19;;5280:111:0;14123:402:1;5280:111:0;-1:-1:-1;;;;;5427:17:0;;;:9;:17;;;;;;;;;;;5447:22;;;5427:42;;5491:20;;;;;;;;:30;;5463:6;;5427:9;5491:30;;5463:6;;5491:30;:::i;:::-;;;;;;;;5556:9;-1:-1:-1;;;;;5539:35:0;5548:6;-1:-1:-1;;;;;5539:35:0;;5567:6;5539:35;;;;1781:25:1;;1769:2;1754:18;;1635:177;5539:35:0;;;;;;;;4992:649;4871:770;;;:::o;32320:107::-;32377:7;32409:1;32405;:5;32404:15;;32418:1;32404:15;;;32414:1;32404:15;32397:22;32320:107;-1:-1:-1;;;32320:107:0:o;32918:821::-;32971:12;33000:6;33010:1;33000:11;32996:50;;33028:7;32918:821;:::o;32996:50::-;33087:6;33104:36;33087:6;33104:16;:36::i;:::-;33172:21;33151:18;33295:4;33264:27;23277:3;33172:21;33264:27;:::i;:::-;33263:36;;;;:::i;:::-;33238:61;-1:-1:-1;33310:23:0;33369:4;33337:28;23339:3;33337:10;:28;:::i;:::-;33336:37;;;;:::i;:::-;33310:63;-1:-1:-1;33384:25:0;33310:63;33412:27;33425:14;33412:10;:27;:::i;:::-;:45;;;;:::i;:::-;33492:14;;33484:55;;33384:73;;-1:-1:-1;;;;;;33492:14:0;;33520;;33484:55;;;;33520:14;33492;33484:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33572:15:0;;33564:57;;33470:69;;-1:-1:-1;;;;;;33572:15:0;;33601;;33564:57;;;;33601:15;33572;33564:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33654:17:0;;33646:85;;33550:71;;-1:-1:-1;;;;;;33654:17:0;;33685;;33646:85;;;;33685:17;33654;33646:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;32918:821:0:o;7898:250::-;7956:7;7980:1;7985;7980:6;7976:47;;-1:-1:-1;8010:1:0;8003:8;;7976:47;8035:9;8047:5;8051:1;8047;:5;:::i;:::-;8035:17;-1:-1:-1;8080:1:0;8071:5;8075:1;8035:17;8071:5;:::i;:::-;:10;8063:56;;;;-1:-1:-1;;;8063:56:0;;14942:2:1;8063:56:0;;;14924:21:1;14981:2;14961:18;;;14954:30;15020:34;15000:18;;;14993:62;-1:-1:-1;;;15071:18:1;;;15064:31;15112:19;;8063:56:0;14740:397:1;8156:132:0;8214:7;8241:39;8245:1;8248;8241:39;;;;;;;;;;;;;;;;;:3;:39::i;32435:475::-;32525:16;;;32539:1;32525:16;;;;;;;;32501:21;;32525:16;;;;;;;;;;-1:-1:-1;32525:16:0;32501:40;;32570:4;32552;32557:1;32552:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;32552:23:0;;;-1:-1:-1;;;;;32552:23:0;;;;;32596:15;-1:-1:-1;;;;;32596:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32586:4;32591:1;32586:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;32586:32:0;;;-1:-1:-1;;;;;32586:32:0;;;;;32631:62;32648:4;32663:15;32681:11;32631:8;:62::i;:::-;32706:196;;-1:-1:-1;;;32706:196:0;;-1:-1:-1;;;;;32706:15:0;:66;;;;:196;;32787:11;;32813:1;;32829:4;;32856;;32876:15;;32706:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32490:420;32435:475;:::o;8296:312::-;8416:7;8451:12;8444:5;8436:28;;;;-1:-1:-1;;;8436:28:0;;;;;;;;:::i;:::-;-1:-1:-1;8475:9:0;8487:5;8491:1;8487;:5;:::i;:::-;8475:17;8296:312;-1:-1:-1;;;;;8296:312:0:o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:315::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;1817:456::-;1894:6;1902;1910;1963:2;1951:9;1942:7;1938:23;1934:32;1931:52;;;1979:1;1976;1969:12;1931:52;2018:9;2005:23;2037:31;2062:5;2037:31;:::i;:::-;2087:5;-1:-1:-1;2144:2:1;2129:18;;2116:32;2157:33;2116:32;2157:33;:::i;:::-;1817:456;;2209:7;;-1:-1:-1;;;2263:2:1;2248:18;;;;2235:32;;1817:456::o;2675:247::-;2734:6;2787:2;2775:9;2766:7;2762:23;2758:32;2755:52;;;2803:1;2800;2793:12;2755:52;2842:9;2829:23;2861:31;2886:5;2861:31;:::i;2927:160::-;2992:20;;3048:13;;3041:21;3031:32;;3021:60;;3077:1;3074;3067:12;3092:315;3157:6;3165;3218:2;3206:9;3197:7;3193:23;3189:32;3186:52;;;3234:1;3231;3224:12;3186:52;3273:9;3260:23;3292:31;3317:5;3292:31;:::i;:::-;3342:5;-1:-1:-1;3366:35:1;3397:2;3382:18;;3366:35;:::i;:::-;3356:45;;3092:315;;;;;:::o;3412:180::-;3468:6;3521:2;3509:9;3500:7;3496:23;3492:32;3489:52;;;3537:1;3534;3527:12;3489:52;3560:26;3576:9;3560:26;:::i;3597:388::-;3665:6;3673;3726:2;3714:9;3705:7;3701:23;3697:32;3694:52;;;3742:1;3739;3732:12;3694:52;3781:9;3768:23;3800:31;3825:5;3800:31;:::i;:::-;3850:5;-1:-1:-1;3907:2:1;3892:18;;3879:32;3920:33;3879:32;3920:33;:::i;:::-;3972:7;3962:17;;;3597:388;;;;;:::o;3990:356::-;4192:2;4174:21;;;4211:18;;;4204:30;4270:34;4265:2;4250:18;;4243:62;4337:2;4322:18;;3990:356::o;4694:380::-;4773:1;4769:12;;;;4816;;;4837:61;;4891:4;4883:6;4879:17;4869:27;;4837:61;4944:2;4936:6;4933:14;4913:18;4910:38;4907:161;;4990:10;4985:3;4981:20;4978:1;4971:31;5025:4;5022:1;5015:15;5053:4;5050:1;5043:15;4907:161;;4694:380;;;:::o;5079:127::-;5140:10;5135:3;5131:20;5128:1;5121:31;5171:4;5168:1;5161:15;5195:4;5192:1;5185:15;5211:168;5284:9;;;5315;;5332:15;;;5326:22;;5312:37;5302:71;;5353:18;;:::i;5384:217::-;5424:1;5450;5440:132;;5494:10;5489:3;5485:20;5482:1;5475:31;5529:4;5526:1;5519:15;5557:4;5554:1;5547:15;5440:132;-1:-1:-1;5586:9:1;;5384:217::o;6713:416::-;6802:1;6839:5;6802:1;6853:270;6874:7;6864:8;6861:21;6853:270;;;6933:4;6929:1;6925:6;6921:17;6915:4;6912:27;6909:53;;;6942:18;;:::i;:::-;6992:7;6982:8;6978:22;6975:55;;;7012:16;;;;6975:55;7091:22;;;;7051:15;;;;6853:270;;;6857:3;6713:416;;;;;:::o;7134:806::-;7183:5;7213:8;7203:80;;-1:-1:-1;7254:1:1;7268:5;;7203:80;7302:4;7292:76;;-1:-1:-1;7339:1:1;7353:5;;7292:76;7384:4;7402:1;7397:59;;;;7470:1;7465:130;;;;7377:218;;7397:59;7427:1;7418:10;;7441:5;;;7465:130;7502:3;7492:8;7489:17;7486:43;;;7509:18;;:::i;:::-;-1:-1:-1;;7565:1:1;7551:16;;7580:5;;7377:218;;7679:2;7669:8;7666:16;7660:3;7654:4;7651:13;7647:36;7641:2;7631:8;7628:16;7623:2;7617:4;7614:12;7610:35;7607:77;7604:159;;;-1:-1:-1;7716:19:1;;;7748:5;;7604:159;7795:34;7820:8;7814:4;7795:34;:::i;:::-;7865:6;7861:1;7857:6;7853:19;7844:7;7841:32;7838:58;;;7876:18;;:::i;:::-;7914:20;;7134:806;-1:-1:-1;;;7134:806:1:o;7945:140::-;8003:5;8032:47;8073:4;8063:8;8059:19;8053:4;8032:47;:::i;8499:125::-;8564:9;;;8585:10;;;8582:36;;;8598:18;;:::i;11026:401::-;11228:2;11210:21;;;11267:2;11247:18;;;11240:30;11306:34;11301:2;11286:18;;11279:62;-1:-1:-1;;;11372:2:1;11357:18;;11350:35;11417:3;11402:19;;11026:401::o;11432:399::-;11634:2;11616:21;;;11673:2;11653:18;;;11646:30;11712:34;11707:2;11692:18;;11685:62;-1:-1:-1;;;11778:2:1;11763:18;;11756:33;11821:3;11806:19;;11432:399::o;13850:135::-;13889:3;13910:17;;;13907:43;;13930:18;;:::i;:::-;-1:-1:-1;13977:1:1;13966:13;;13850:135::o;13990:128::-;14057:9;;;14078:11;;;14075:37;;;14092:18;;:::i;15274:127::-;15335:10;15330:3;15326:20;15323:1;15316:31;15366:4;15363:1;15356:15;15390:4;15387:1;15380:15;15406:251;15476:6;15529:2;15517:9;15508:7;15504:23;15500:32;15497:52;;;15545:1;15542;15535:12;15497:52;15577:9;15571:16;15596:31;15621:5;15596:31;:::i;15662:980::-;15924:4;15972:3;15961:9;15957:19;16003:6;15992:9;15985:25;16029:2;16067:6;16062:2;16051:9;16047:18;16040:34;16110:3;16105:2;16094:9;16090:18;16083:31;16134:6;16169;16163:13;16200:6;16192;16185:22;16238:3;16227:9;16223:19;16216:26;;16277:2;16269:6;16265:15;16251:29;;16298:1;16308:195;16322:6;16319:1;16316:13;16308:195;;;16387:13;;-1:-1:-1;;;;;16383:39:1;16371:52;;16478:15;;;;16443:12;;;;16419:1;16337:9;16308:195;;;-1:-1:-1;;;;;;;16559:32:1;;;;16554:2;16539:18;;16532:60;-1:-1:-1;;;16623:3:1;16608:19;16601:35;16520:3;15662:980;-1:-1:-1;;;15662:980:1:o

Swarm Source

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

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