ETH Price: $3,092.83 (+1.05%)
Gas: 3 Gwei

Token

PEPURAI (PEPURAI)
 

Overview

Max Total Supply

420,690,000,000,000 PEPURAI

Holders

393 ( 0.509%)

Market

Price

$0.00 @ 0.000000 ETH (+2.35%)

Onchain Market Cap

$87,169.49

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V2: PEPURAI
Balance
89,113,115,077,509.132369335828740413 PEPURAI

Value
$18,464.77 ( ~5.9702 Eth) [21.1826%]
0xd46da99978cb71600aaf3d7dcfbf83b4ab8f8c3c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Pepurai Token is an ERC-20 token on the Ethereum network.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PEPURAI

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-31
*/

/**
Website: https://www.pepurai.com/
**/

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
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;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}


// File contracts/PEPURAI.sol


/**
Website: https://www.pepurai.com/
**/

pragma solidity 0.8.17;


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

interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

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

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

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

contract PEPURAI is ERC20, Ownable {
    address public devWallet;
    address public marketingWallet;

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;
    IUniswapV2Router public uniswapV2Router;

    address public lpPair;

    bool public hasLimits = true;
    bool private swapping;
    uint256 public swapTokensAtAmount;

    uint256 public constant FEE_DECIMALS = 10000;
    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyDevFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellmarketingFee;
    uint256 public sellDevFee;
    uint256 public sellLiquidityFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForDev;
    uint256 public tokensForLiquidity;

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

    //events
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event MaxTransactionExclusion(address _address, bool excluded);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event OwnerForcedSwapBack(uint256 timestamp);
    event UpdatedMaxBuyAmount(uint256 newAmount);
    event UpdatedMaxSellAmount(uint256 newAmount);
    event UpdatedMaxWalletAmount(uint256 newAmount);
    event RemovedLimits();
    event BuyBackTriggered(uint256 amount);

    constructor() ERC20("PEPURAI", "PEPURAI") {

        address newOwner = msg.sender; // can leave alone if owner is deployer.

        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;

        //create pair
        lpPair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _excludeFromMaxTransaction(address(lpPair), true);
        _setAutomatedMarketMakerPair(address(lpPair), true);

        uint256 totalSupply = 420690000000000 * 1e18;

        maxBuyAmount = totalSupply * 1 / 100;
        maxSellAmount = totalSupply * 1 / 100;
        maxWalletAmount = totalSupply * 1 / 100;
        swapTokensAtAmount = totalSupply * 1 / 1000;

        buyDevFee = 0;
        buyMarketingFee = 600;
        buyLiquidityFee = 600;
        buyTotalFees = buyMarketingFee + buyDevFee + buyLiquidityFee;

        sellDevFee = 0;
        sellmarketingFee = 600;
        sellLiquidityFee = 600;
        sellTotalFees = sellmarketingFee + sellDevFee + sellLiquidityFee;

        devWallet = newOwner;
        marketingWallet = newOwner;

        _excludeFromMaxTransaction(devWallet, true);
        _excludeFromMaxTransaction(marketingWallet, true);
        _excludeFromMaxTransaction(address(this), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(devWallet, true);
        excludeFromFees(marketingWallet, true);

        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        _mint(newOwner, totalSupply);

        transferOwnership(newOwner);
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "cannot transfer from the zero address");
        require(to != address(0), "cannot transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");

        if(hasLimits){
            if(from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]){
                //buy action
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
                //sell action
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                }
                //other transfers
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max amount");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;

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

        uint256 fees = 0;

        if(takeFee){
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees / FEE_DECIMALS;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellmarketingFee / sellTotalFees;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
            }
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount * buyTotalFees / FEE_DECIMALS;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
                tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
            }

            if(fees > 0){

                super._transfer(from, address(this), fees);
            }

            amount -= fees;

        }

        super._transfer(from, to, amount);

    }

    function swapBack() private {

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForDev + tokensForMarketing + tokensForLiquidity;

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

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

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForDev = ethBalance * tokensForDev / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 ethForMarketing = ethBalance * tokensForMarketing / (totalTokensToSwap - (tokensForLiquidity/2));

        ethForLiquidity -= ethForDev + ethForMarketing;

        tokensForLiquidity = 0;
        tokensForDev = 0;
        tokensForMarketing = 0;

        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

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

    }

    receive() external payable {}

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            address(0xdead),
            block.timestamp
        );
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != lpPair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function _excludeFromMaxTransaction(address adrs, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[adrs] = isExcluded;
        emit MaxTransactionExclusion(adrs, isExcluded);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

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

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

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

    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(balanceOf(address(this)) >= swapTokensAtAmount, "Contract should have a token amount that is higher than restriction");
        swapping = true;
        swapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }

    // withdraw ETH from contract address
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

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

    function setWalletsAddresses(address _development, address _marketingAddress) external onlyOwner {
        require(_development != address(0),"address cannot be zero address");
        require(_marketingAddress != address(0),"address cannot be zero address");

        devWallet = payable(_development);
        marketingWallet = payable(_marketingAddress);

    }

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

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 2 / 1000)/1e18, "Cannot set max buy amount lower than 0.2%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 2 / 1000)/1e18, "Cannot set max sell amount lower than 0.2%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

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

    function updateSellFees(uint256 _devFee, uint256 _marketingFee, uint256 _liquidityFee) external onlyOwner {
        sellDevFee = _devFee;
        sellmarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellTotalFees = sellDevFee + sellmarketingFee + sellLiquidityFee;
        require(sellTotalFees <= 8000, "Must keep fees at 80% or less");
    }

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

        _setAutomatedMarketMakerPair(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

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

        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    //remove limits after token is stable
    function removeLimits() external onlyOwner {
        hasLimits = false;
        emit RemovedLimits();
    }

    // useful for buybacks or to reclaim any ETH on the contract in a way that helps holders.
    function buyBackTokens(uint256 amountInWei) payable external onlyOwner {
        require(amountInWei <= 10 ether, "May not buy more than 10 ETH in a single buy to reduce sandwich attacks");

        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );

        emit BuyBackTriggered(amountInWei);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBackTriggered","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":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","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":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"inputs":[],"name":"FEE_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"uint256","name":"amountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellmarketingFee","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":[{"internalType":"address","name":"_development","type":"address"},{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setWalletsAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600c805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040805180820182526007808252665045505552414960c81b6020808401829052845180860190955291845290830152906003620000648382620007fd565b506004620000738282620007fd565b505050620000906200008a6200042260201b60201c565b62000426565b600b80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051339291829163c45a0155916004808201926020929091908290030181865afa158015620000fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001209190620008c9565b6001600160a01b031663c9c6539630600b60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000183573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a99190620008c9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620001f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021d9190620008c9565b600c80546001600160a01b0319166001600160a01b039290921691821790556200024990600162000478565b600c5462000262906001600160a01b03166001620004db565b6d14bddab3e51a57cff87a5000000060646200028082600162000911565b6200028c919062000931565b60085560646200029e82600162000911565b620002aa919062000931565b6009556064620002bc82600162000911565b620002c8919062000931565b600a556103e8620002db82600162000911565b620002e7919062000931565b600d5560006010819055610258600f8190556011819055906200030b908262000954565b62000317919062000954565b600e556000601481905561025860138190556015819055906200033b908262000954565b62000347919062000954565b601255600680546001600160a01b0385166001600160a01b0319918216811790925560078054909116821790556200038190600162000478565b6007546200039a906001600160a01b0316600162000478565b620003a730600162000478565b620003b483600162000547565b600654620003cd906001600160a01b0316600162000547565b600754620003e6906001600160a01b0316600162000547565b620003f330600162000547565b6200040261dead600162000547565b6200040e8382620005b0565b620004198362000677565b5050506200096a565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000818152601a6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152601b60205260409020805460ff19168215151790556200050b828262000478565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b62000551620006f6565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200060c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b806002600082825462000620919062000954565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b62000681620006f6565b6001600160a01b038116620006e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000603565b620006f38162000426565b50565b6005546001600160a01b03163314620007525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000603565b565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200078457607f821691505b602082108103620007a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200075457600081815260208120601f850160051c81016020861015620007d45750805b601f850160051c820191505b81811015620007f557828155600101620007e0565b505050505050565b81516001600160401b0381111562000819576200081962000759565b62000831816200082a84546200076f565b84620007ab565b602080601f831160018114620008695760008415620008505750858301515b600019600386901b1c1916600185901b178555620007f5565b600085815260208120601f198616915b828110156200089a5788860151825594840194600190910190840162000879565b5085821015620008b95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620008dc57600080fd5b81516001600160a01b0381168114620008f457600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200092b576200092b620008fb565b92915050565b6000826200094f57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200092b576200092b620008fb565b6129e0806200097a6000396000f3fe6080604052600436106102e85760003560e01c80638ea5220f11610190578063c18bc195116100dc578063e2f4560511610095578063f48c36f41161006f578063f48c36f414610876578063f5648a4f14610897578063f6374342146108ac578063fc155d1d146108c257600080fd5b8063e2f456051461082a578063f11a24d314610840578063f2fde38b1461085657600080fd5b8063c18bc1951461077e578063ccf288c61461079e578063d257b34f146107b4578063d85ba063146107d4578063dc3f0d0f146107ea578063dd62ed3e1461080a57600080fd5b8063a184e6dc11610149578063aa4bde2811610123578063aa4bde28146106f8578063b62496f51461070e578063c02466681461073e578063c17b5b8c1461075e57600080fd5b8063a184e6dc146106a2578063a457c2d7146106b8578063a9059cbb146106d857600080fd5b80638ea5220f1461060b57806395d89b411461062b5780639a7a23d6146106405780639c3b4fdc146106605780639fccce3214610676578063a0d82dc51461068c57600080fd5b80634a863f411161024f578063751039fc116102085780637bce5a04116101e25780637bce5a04146105a15780638095d564146105b757806388e765ff146105d75780638da5cb5b146105ed57600080fd5b8063751039fc1461054c5780637571336a1461056157806375f0a8741461058157600080fd5b80634a863f41146104a057806351f205e4146104c057806366d602ae146104d55780636a486a8e146104eb57806370a0823114610501578063715018a61461053757600080fd5b80631f3fed8f116102a15780631f3fed8f146103ec57806323b872dd146104025780632be32b6114610422578063313ce567146104445780633950935114610460578063452ed4f11461048057600080fd5b806306fdde03146102f4578063095ea7b31461031f57806310d5de531461034f5780631694505e1461037f57806318160ddd146103b75780631a8145bb146103d657600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b506103096108d5565b6040516103169190612640565b60405180910390f35b34801561032b57600080fd5b5061033f61033a3660046126a3565b610967565b6040519015158152602001610316565b34801561035b57600080fd5b5061033f61036a3660046126cf565b601a6020526000908152604090205460ff1681565b34801561038b57600080fd5b50600b5461039f906001600160a01b031681565b6040516001600160a01b039091168152602001610316565b3480156103c357600080fd5b506002545b604051908152602001610316565b3480156103e257600080fd5b506103c860185481565b3480156103f857600080fd5b506103c860165481565b34801561040e57600080fd5b5061033f61041d3660046126f3565b610981565b34801561042e57600080fd5b5061044261043d366004612734565b6109a5565b005b34801561045057600080fd5b5060405160128152602001610316565b34801561046c57600080fd5b5061033f61047b3660046126a3565b610a95565b34801561048c57600080fd5b50600c5461039f906001600160a01b031681565b3480156104ac57600080fd5b506104426104bb36600461274d565b610ab7565b3480156104cc57600080fd5b50610442610b99565b3480156104e157600080fd5b506103c860095481565b3480156104f757600080fd5b506103c860125481565b34801561050d57600080fd5b506103c861051c3660046126cf565b6001600160a01b031660009081526020819052604090205490565b34801561054357600080fd5b50610442610c91565b34801561055857600080fd5b50610442610ca5565b34801561056d57600080fd5b5061044261057c366004612786565b610ce5565b34801561058d57600080fd5b5060075461039f906001600160a01b031681565b3480156105ad57600080fd5b506103c8600f5481565b3480156105c357600080fd5b506104426105d23660046127b9565b610d8b565b3480156105e357600080fd5b506103c860085481565b3480156105f957600080fd5b506005546001600160a01b031661039f565b34801561061757600080fd5b5060065461039f906001600160a01b031681565b34801561063757600080fd5b50610309610e12565b34801561064c57600080fd5b5061044261065b366004612786565b610e21565b34801561066c57600080fd5b506103c860105481565b34801561068257600080fd5b506103c860175481565b34801561069857600080fd5b506103c860145481565b3480156106ae57600080fd5b506103c860135481565b3480156106c457600080fd5b5061033f6106d33660046126a3565b610ef3565b3480156106e457600080fd5b5061033f6106f33660046126a3565b610f6e565b34801561070457600080fd5b506103c8600a5481565b34801561071a57600080fd5b5061033f6107293660046126cf565b601b6020526000908152604090205460ff1681565b34801561074a57600080fd5b50610442610759366004612786565b610f7c565b34801561076a57600080fd5b506104426107793660046127b9565b610fe3565b34801561078a57600080fd5b50610442610799366004612734565b611065565b3480156107aa57600080fd5b506103c861271081565b3480156107c057600080fd5b506104426107cf366004612734565b61114c565b3480156107e057600080fd5b506103c8600e5481565b3480156107f657600080fd5b50610442610805366004612734565b611275565b34801561081657600080fd5b506103c861082536600461274d565b61135a565b34801561083657600080fd5b506103c8600d5481565b34801561084c57600080fd5b506103c860115481565b34801561086257600080fd5b506104426108713660046126cf565b611385565b34801561088257600080fd5b50600c5461033f90600160a01b900460ff1681565b3480156108a357600080fd5b506104426113fe565b3480156108b857600080fd5b506103c860155481565b6104426108d0366004612734565b611453565b6060600380546108e4906127e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610910906127e5565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b600033610975818585611675565b60019150505b92915050565b60003361098f858285611799565b61099a85858561180d565b506001949350505050565b6109ad611f4d565b670de0b6b3a76400006103e86109c260025490565b6109cd906002612835565b6109d7919061284c565b6109e1919061284c565b811015610a475760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b60648201526084015b60405180910390fd5b610a5981670de0b6b3a7640000612835565b60088190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b600033610975818585610aa8838361135a565b610ab2919061286e565b611675565b610abf611f4d565b6001600160a01b038216610b155760405162461bcd60e51b815260206004820152601e60248201527f616464726573732063616e6e6f74206265207a65726f206164647265737300006044820152606401610a3e565b6001600160a01b038116610b6b5760405162461bcd60e51b815260206004820152601e60248201527f616464726573732063616e6e6f74206265207a65726f206164647265737300006044820152606401610a3e565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b610ba1611f4d565b600d54306000908152602081905260409020541015610c345760405162461bcd60e51b815260206004820152604360248201527f436f6e74726163742073686f756c642068617665206120746f6b656e20616d6f60448201527f756e74207468617420697320686967686572207468616e20726573747269637460648201526234b7b760e91b608482015260a401610a3e565b600c805460ff60a81b1916600160a81b179055610c4f611fa7565b600c805460ff60a81b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b610c99611f4d565b610ca360006121b4565b565b610cad611f4d565b600c805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b610ced611f4d565b80610d6057600c546001600160a01b0390811690831603610d605760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610a3e565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b610d93611f4d565b6010839055600f829055601181905580610dad838561286e565b610db7919061286e565b600e81905561157c1015610e0d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420353525206f72206c6573730000006044820152606401610a3e565b505050565b6060600480546108e4906127e5565b610e29611f4d565b600c546001600160a01b0390811690831603610ead5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a3e565b610eb78282612206565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60003381610f01828661135a565b905083811015610f615760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a3e565b61099a8286868403611675565b60003361097581858561180d565b610f84611f4d565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610feb611f4d565b60148390556013829055601581905580611005838561286e565b61100f919061286e565b6012819055611f401015610e0d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420383025206f72206c6573730000006044820152606401610a3e565b61106d611f4d565b670de0b6b3a76400006103e861108260025490565b61108d906003612835565b611097919061284c565b6110a1919061284c565b8110156111055760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610a3e565b61111781670de0b6b3a7640000612835565b600a8190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610a8a565b611154611f4d565b620186a061116160025490565b61116c906001612835565b611176919061284c565b8110156111e35760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a3e565b6103e86111ef60025490565b6111fa906001612835565b611204919061284c565b8111156112705760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610a3e565b600d55565b61127d611f4d565b670de0b6b3a76400006103e861129260025490565b61129d906002612835565b6112a7919061284c565b6112b1919061284c565b8110156113135760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610a3e565b61132581670de0b6b3a7640000612835565b60098190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610a8a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61138d611f4d565b6001600160a01b0381166113f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3e565b6113fb816121b4565b50565b611406611f4d565b604051600090339047908381818185875af1925050503d8060008114611448576040519150601f19603f3d011682016040523d82523d6000602084013e61144d565b606091505b50505050565b61145b611f4d565b678ac7230489e800008111156114e95760405162461bcd60e51b815260206004820152604760248201527f4d6179206e6f7420627579206d6f7265207468616e2031302045544820696e2060448201527f612073696e676c652062757920746f207265647563652073616e64776963682060648201526661747461636b7360c81b608482015260a401610a3e565b6040805160028082526060820183526000926020830190803683375050600b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190612881565b8160008151811061158a5761158a61289e565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106115be576115be61289e565b6001600160a01b039283166020918202929092010152600b5460405163b6f9de9560e01b815291169063b6f9de9590849061160690600090869061dead9042906004016128f8565b6000604051808303818588803b15801561161f57600080fd5b505af1158015611633573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d6848205688260405161166991815260200190565b60405180910390a15050565b6001600160a01b0383166116d75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a3e565b6001600160a01b0382166117385760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a3e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006117a5848461135a565b9050600019811461144d57818110156118005760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a3e565b61144d8484848403611675565b6001600160a01b0383166118715760405162461bcd60e51b815260206004820152602560248201527f63616e6e6f74207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a3e565b6001600160a01b0382166118d35760405162461bcd60e51b815260206004820152602360248201527f63616e6e6f74207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a3e565b600081116119235760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a3e565b600c54600160a01b900460ff1615611c3c576005546001600160a01b0384811691161480159061196157506005546001600160a01b03838116911614155b801561197557506001600160a01b03821615155b801561198c57506001600160a01b03821661dead14155b80156119b157506001600160a01b03831660009081526019602052604090205460ff16155b80156119d657506001600160a01b03821660009081526019602052604090205460ff16155b15611c3c576001600160a01b0383166000908152601b602052604090205460ff168015611a1c57506001600160a01b0382166000908152601a602052604090205460ff16155b15611afd57600854811115611a845760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610a3e565b600a546001600160a01b038316600090815260208190526040902054611aaa908361286e565b1115611af85760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420457863656564206d61782077616c6c657400000000000000006044820152606401610a3e565b611c3c565b6001600160a01b0382166000908152601b602052604090205460ff168015611b3e57506001600160a01b0383166000908152601a602052604090205460ff16155b15611ba857600954811115611af85760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610a3e565b6001600160a01b0382166000908152601a602052604090205460ff16611c3c57600a546001600160a01b038316600090815260208190526040902054611bee908361286e565b1115611c3c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420457863656564206d617820616d6f756e7400000000000000006044820152606401610a3e565b30600090815260208190526040902054600d5481108015908190611c6a5750600c54600160a81b900460ff16155b8015611c8f57506001600160a01b0385166000908152601b602052604090205460ff16155b8015611cb457506001600160a01b03851660009081526019602052604090205460ff16155b8015611cd957506001600160a01b03841660009081526019602052604090205460ff16155b15611d0757600c805460ff60a81b1916600160a81b179055611cf9611fa7565b600c805460ff60a81b191690555b6001600160a01b03851660009081526019602052604090205460019060ff1680611d4957506001600160a01b03851660009081526019602052604090205460ff165b15611d52575060005b60008115611f39576001600160a01b0386166000908152601b602052604090205460ff168015611d8457506000601254115b15611e3d5761271060125486611d9a9190612835565b611da4919061284c565b905060125460145482611db79190612835565b611dc1919061284c565b60176000828254611dd2919061286e565b9091555050601254601354611de79083612835565b611df1919061284c565b60166000828254611e02919061286e565b9091555050601254601554611e179083612835565b611e21919061284c565b60186000828254611e32919061286e565b90915550611f1b9050565b6001600160a01b0387166000908152601b602052604090205460ff168015611e6757506000600e54115b15611f1b57612710600e5486611e7d9190612835565b611e87919061284c565b9050600e5460105482611e9a9190612835565b611ea4919061284c565b60176000828254611eb5919061286e565b9091555050600e54600f54611eca9083612835565b611ed4919061284c565b60166000828254611ee5919061286e565b9091555050600e54601154611efa9083612835565b611f04919061284c565b60186000828254611f15919061286e565b90915550505b8015611f2c57611f2c873083612234565b611f36818661292d565b94505b611f44878787612234565b50505050505050565b6005546001600160a01b03163314610ca35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3e565b3060009081526020819052604081205490506000601854601654601754611fce919061286e565b611fd8919061286e565b9050811580611fe5575080155b15611fee575050565b600d54611ffc906014612835565b82111561201457600d54612011906014612835565b91505b600080600283601854866120289190612835565b612032919061284c565b61203c919061284c565b905061205061204b828661292d565b6123d8565b601854479081906000906120669060029061284c565b612070908761292d565b60175461207d9085612835565b612087919061284c565b90506000600260185461209a919061284c565b6120a4908861292d565b6016546120b19086612835565b6120bb919061284c565b90506120c7818361286e565b6120d1908461292d565b600060188190556017819055601655925084158015906120f15750600083115b15612100576121008584612532565b6006546040516001600160a01b03909116908390600081818185875af1925050503d806000811461214d576040519150601f19603f3d011682016040523d82523d6000602084013e612152565b606091505b50506007546040519197506001600160a01b0316904790600081818185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b5050505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601b60205260409020805460ff1916821515179055610eb782826125e4565b6001600160a01b0383166122985760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a3e565b6001600160a01b0382166122fa5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a3e565b6001600160a01b038316600090815260208190526040902054818110156123725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a3e565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361144d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061240d5761240d61289e565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248a9190612881565b8160018151811061249d5761249d61289e565b6001600160a01b039283166020918202929092010152600b546124c39130911684611675565b600b5460405163791ac94760e01b81526001600160a01b039091169063791ac947906124fc908590600090869030904290600401612940565b600060405180830381600087803b15801561251657600080fd5b505af115801561252a573d6000803e3d6000fd5b505050505050565b600b5461254a9030906001600160a01b031684611675565b600b5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156125b8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125dd919061297c565b5050505050565b6001600160a01b0382166000818152601a6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101611669565b600060208083528351808285015260005b8181101561266d57858101830151858201604001528201612651565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146113fb57600080fd5b600080604083850312156126b657600080fd5b82356126c18161268e565b946020939093013593505050565b6000602082840312156126e157600080fd5b81356126ec8161268e565b9392505050565b60008060006060848603121561270857600080fd5b83356127138161268e565b925060208401356127238161268e565b929592945050506040919091013590565b60006020828403121561274657600080fd5b5035919050565b6000806040838503121561276057600080fd5b823561276b8161268e565b9150602083013561277b8161268e565b809150509250929050565b6000806040838503121561279957600080fd5b82356127a48161268e565b91506020830135801515811461277b57600080fd5b6000806000606084860312156127ce57600080fd5b505081359360208301359350604090920135919050565b600181811c908216806127f957607f821691505b60208210810361281957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761097b5761097b61281f565b60008261286957634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561097b5761097b61281f565b60006020828403121561289357600080fd5b81516126ec8161268e565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156128ed5781516001600160a01b0316875295820195908201906001016128c8565b509495945050505050565b84815260806020820152600061291160808301866128b4565b6001600160a01b03949094166040830152506060015292915050565b8181038181111561097b5761097b61281f565b85815284602082015260a06040820152600061295f60a08301866128b4565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561299157600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207c923f66ffe7d37a36be81806a21ef20d56569f19bcf34b017024bc79c94fb3d64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102e85760003560e01c80638ea5220f11610190578063c18bc195116100dc578063e2f4560511610095578063f48c36f41161006f578063f48c36f414610876578063f5648a4f14610897578063f6374342146108ac578063fc155d1d146108c257600080fd5b8063e2f456051461082a578063f11a24d314610840578063f2fde38b1461085657600080fd5b8063c18bc1951461077e578063ccf288c61461079e578063d257b34f146107b4578063d85ba063146107d4578063dc3f0d0f146107ea578063dd62ed3e1461080a57600080fd5b8063a184e6dc11610149578063aa4bde2811610123578063aa4bde28146106f8578063b62496f51461070e578063c02466681461073e578063c17b5b8c1461075e57600080fd5b8063a184e6dc146106a2578063a457c2d7146106b8578063a9059cbb146106d857600080fd5b80638ea5220f1461060b57806395d89b411461062b5780639a7a23d6146106405780639c3b4fdc146106605780639fccce3214610676578063a0d82dc51461068c57600080fd5b80634a863f411161024f578063751039fc116102085780637bce5a04116101e25780637bce5a04146105a15780638095d564146105b757806388e765ff146105d75780638da5cb5b146105ed57600080fd5b8063751039fc1461054c5780637571336a1461056157806375f0a8741461058157600080fd5b80634a863f41146104a057806351f205e4146104c057806366d602ae146104d55780636a486a8e146104eb57806370a0823114610501578063715018a61461053757600080fd5b80631f3fed8f116102a15780631f3fed8f146103ec57806323b872dd146104025780632be32b6114610422578063313ce567146104445780633950935114610460578063452ed4f11461048057600080fd5b806306fdde03146102f4578063095ea7b31461031f57806310d5de531461034f5780631694505e1461037f57806318160ddd146103b75780631a8145bb146103d657600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b506103096108d5565b6040516103169190612640565b60405180910390f35b34801561032b57600080fd5b5061033f61033a3660046126a3565b610967565b6040519015158152602001610316565b34801561035b57600080fd5b5061033f61036a3660046126cf565b601a6020526000908152604090205460ff1681565b34801561038b57600080fd5b50600b5461039f906001600160a01b031681565b6040516001600160a01b039091168152602001610316565b3480156103c357600080fd5b506002545b604051908152602001610316565b3480156103e257600080fd5b506103c860185481565b3480156103f857600080fd5b506103c860165481565b34801561040e57600080fd5b5061033f61041d3660046126f3565b610981565b34801561042e57600080fd5b5061044261043d366004612734565b6109a5565b005b34801561045057600080fd5b5060405160128152602001610316565b34801561046c57600080fd5b5061033f61047b3660046126a3565b610a95565b34801561048c57600080fd5b50600c5461039f906001600160a01b031681565b3480156104ac57600080fd5b506104426104bb36600461274d565b610ab7565b3480156104cc57600080fd5b50610442610b99565b3480156104e157600080fd5b506103c860095481565b3480156104f757600080fd5b506103c860125481565b34801561050d57600080fd5b506103c861051c3660046126cf565b6001600160a01b031660009081526020819052604090205490565b34801561054357600080fd5b50610442610c91565b34801561055857600080fd5b50610442610ca5565b34801561056d57600080fd5b5061044261057c366004612786565b610ce5565b34801561058d57600080fd5b5060075461039f906001600160a01b031681565b3480156105ad57600080fd5b506103c8600f5481565b3480156105c357600080fd5b506104426105d23660046127b9565b610d8b565b3480156105e357600080fd5b506103c860085481565b3480156105f957600080fd5b506005546001600160a01b031661039f565b34801561061757600080fd5b5060065461039f906001600160a01b031681565b34801561063757600080fd5b50610309610e12565b34801561064c57600080fd5b5061044261065b366004612786565b610e21565b34801561066c57600080fd5b506103c860105481565b34801561068257600080fd5b506103c860175481565b34801561069857600080fd5b506103c860145481565b3480156106ae57600080fd5b506103c860135481565b3480156106c457600080fd5b5061033f6106d33660046126a3565b610ef3565b3480156106e457600080fd5b5061033f6106f33660046126a3565b610f6e565b34801561070457600080fd5b506103c8600a5481565b34801561071a57600080fd5b5061033f6107293660046126cf565b601b6020526000908152604090205460ff1681565b34801561074a57600080fd5b50610442610759366004612786565b610f7c565b34801561076a57600080fd5b506104426107793660046127b9565b610fe3565b34801561078a57600080fd5b50610442610799366004612734565b611065565b3480156107aa57600080fd5b506103c861271081565b3480156107c057600080fd5b506104426107cf366004612734565b61114c565b3480156107e057600080fd5b506103c8600e5481565b3480156107f657600080fd5b50610442610805366004612734565b611275565b34801561081657600080fd5b506103c861082536600461274d565b61135a565b34801561083657600080fd5b506103c8600d5481565b34801561084c57600080fd5b506103c860115481565b34801561086257600080fd5b506104426108713660046126cf565b611385565b34801561088257600080fd5b50600c5461033f90600160a01b900460ff1681565b3480156108a357600080fd5b506104426113fe565b3480156108b857600080fd5b506103c860155481565b6104426108d0366004612734565b611453565b6060600380546108e4906127e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610910906127e5565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b600033610975818585611675565b60019150505b92915050565b60003361098f858285611799565b61099a85858561180d565b506001949350505050565b6109ad611f4d565b670de0b6b3a76400006103e86109c260025490565b6109cd906002612835565b6109d7919061284c565b6109e1919061284c565b811015610a475760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b60648201526084015b60405180910390fd5b610a5981670de0b6b3a7640000612835565b60088190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b600033610975818585610aa8838361135a565b610ab2919061286e565b611675565b610abf611f4d565b6001600160a01b038216610b155760405162461bcd60e51b815260206004820152601e60248201527f616464726573732063616e6e6f74206265207a65726f206164647265737300006044820152606401610a3e565b6001600160a01b038116610b6b5760405162461bcd60e51b815260206004820152601e60248201527f616464726573732063616e6e6f74206265207a65726f206164647265737300006044820152606401610a3e565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b610ba1611f4d565b600d54306000908152602081905260409020541015610c345760405162461bcd60e51b815260206004820152604360248201527f436f6e74726163742073686f756c642068617665206120746f6b656e20616d6f60448201527f756e74207468617420697320686967686572207468616e20726573747269637460648201526234b7b760e91b608482015260a401610a3e565b600c805460ff60a81b1916600160a81b179055610c4f611fa7565b600c805460ff60a81b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b610c99611f4d565b610ca360006121b4565b565b610cad611f4d565b600c805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b610ced611f4d565b80610d6057600c546001600160a01b0390811690831603610d605760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610a3e565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b610d93611f4d565b6010839055600f829055601181905580610dad838561286e565b610db7919061286e565b600e81905561157c1015610e0d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420353525206f72206c6573730000006044820152606401610a3e565b505050565b6060600480546108e4906127e5565b610e29611f4d565b600c546001600160a01b0390811690831603610ead5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a3e565b610eb78282612206565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60003381610f01828661135a565b905083811015610f615760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a3e565b61099a8286868403611675565b60003361097581858561180d565b610f84611f4d565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610feb611f4d565b60148390556013829055601581905580611005838561286e565b61100f919061286e565b6012819055611f401015610e0d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420383025206f72206c6573730000006044820152606401610a3e565b61106d611f4d565b670de0b6b3a76400006103e861108260025490565b61108d906003612835565b611097919061284c565b6110a1919061284c565b8110156111055760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610a3e565b61111781670de0b6b3a7640000612835565b600a8190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610a8a565b611154611f4d565b620186a061116160025490565b61116c906001612835565b611176919061284c565b8110156111e35760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a3e565b6103e86111ef60025490565b6111fa906001612835565b611204919061284c565b8111156112705760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610a3e565b600d55565b61127d611f4d565b670de0b6b3a76400006103e861129260025490565b61129d906002612835565b6112a7919061284c565b6112b1919061284c565b8110156113135760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610a3e565b61132581670de0b6b3a7640000612835565b60098190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610a8a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61138d611f4d565b6001600160a01b0381166113f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3e565b6113fb816121b4565b50565b611406611f4d565b604051600090339047908381818185875af1925050503d8060008114611448576040519150601f19603f3d011682016040523d82523d6000602084013e61144d565b606091505b50505050565b61145b611f4d565b678ac7230489e800008111156114e95760405162461bcd60e51b815260206004820152604760248201527f4d6179206e6f7420627579206d6f7265207468616e2031302045544820696e2060448201527f612073696e676c652062757920746f207265647563652073616e64776963682060648201526661747461636b7360c81b608482015260a401610a3e565b6040805160028082526060820183526000926020830190803683375050600b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115779190612881565b8160008151811061158a5761158a61289e565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106115be576115be61289e565b6001600160a01b039283166020918202929092010152600b5460405163b6f9de9560e01b815291169063b6f9de9590849061160690600090869061dead9042906004016128f8565b6000604051808303818588803b15801561161f57600080fd5b505af1158015611633573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d6848205688260405161166991815260200190565b60405180910390a15050565b6001600160a01b0383166116d75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a3e565b6001600160a01b0382166117385760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a3e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006117a5848461135a565b9050600019811461144d57818110156118005760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a3e565b61144d8484848403611675565b6001600160a01b0383166118715760405162461bcd60e51b815260206004820152602560248201527f63616e6e6f74207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a3e565b6001600160a01b0382166118d35760405162461bcd60e51b815260206004820152602360248201527f63616e6e6f74207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a3e565b600081116119235760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610a3e565b600c54600160a01b900460ff1615611c3c576005546001600160a01b0384811691161480159061196157506005546001600160a01b03838116911614155b801561197557506001600160a01b03821615155b801561198c57506001600160a01b03821661dead14155b80156119b157506001600160a01b03831660009081526019602052604090205460ff16155b80156119d657506001600160a01b03821660009081526019602052604090205460ff16155b15611c3c576001600160a01b0383166000908152601b602052604090205460ff168015611a1c57506001600160a01b0382166000908152601a602052604090205460ff16155b15611afd57600854811115611a845760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610a3e565b600a546001600160a01b038316600090815260208190526040902054611aaa908361286e565b1115611af85760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420457863656564206d61782077616c6c657400000000000000006044820152606401610a3e565b611c3c565b6001600160a01b0382166000908152601b602052604090205460ff168015611b3e57506001600160a01b0383166000908152601a602052604090205460ff16155b15611ba857600954811115611af85760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610a3e565b6001600160a01b0382166000908152601a602052604090205460ff16611c3c57600a546001600160a01b038316600090815260208190526040902054611bee908361286e565b1115611c3c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420457863656564206d617820616d6f756e7400000000000000006044820152606401610a3e565b30600090815260208190526040902054600d5481108015908190611c6a5750600c54600160a81b900460ff16155b8015611c8f57506001600160a01b0385166000908152601b602052604090205460ff16155b8015611cb457506001600160a01b03851660009081526019602052604090205460ff16155b8015611cd957506001600160a01b03841660009081526019602052604090205460ff16155b15611d0757600c805460ff60a81b1916600160a81b179055611cf9611fa7565b600c805460ff60a81b191690555b6001600160a01b03851660009081526019602052604090205460019060ff1680611d4957506001600160a01b03851660009081526019602052604090205460ff165b15611d52575060005b60008115611f39576001600160a01b0386166000908152601b602052604090205460ff168015611d8457506000601254115b15611e3d5761271060125486611d9a9190612835565b611da4919061284c565b905060125460145482611db79190612835565b611dc1919061284c565b60176000828254611dd2919061286e565b9091555050601254601354611de79083612835565b611df1919061284c565b60166000828254611e02919061286e565b9091555050601254601554611e179083612835565b611e21919061284c565b60186000828254611e32919061286e565b90915550611f1b9050565b6001600160a01b0387166000908152601b602052604090205460ff168015611e6757506000600e54115b15611f1b57612710600e5486611e7d9190612835565b611e87919061284c565b9050600e5460105482611e9a9190612835565b611ea4919061284c565b60176000828254611eb5919061286e565b9091555050600e54600f54611eca9083612835565b611ed4919061284c565b60166000828254611ee5919061286e565b9091555050600e54601154611efa9083612835565b611f04919061284c565b60186000828254611f15919061286e565b90915550505b8015611f2c57611f2c873083612234565b611f36818661292d565b94505b611f44878787612234565b50505050505050565b6005546001600160a01b03163314610ca35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3e565b3060009081526020819052604081205490506000601854601654601754611fce919061286e565b611fd8919061286e565b9050811580611fe5575080155b15611fee575050565b600d54611ffc906014612835565b82111561201457600d54612011906014612835565b91505b600080600283601854866120289190612835565b612032919061284c565b61203c919061284c565b905061205061204b828661292d565b6123d8565b601854479081906000906120669060029061284c565b612070908761292d565b60175461207d9085612835565b612087919061284c565b90506000600260185461209a919061284c565b6120a4908861292d565b6016546120b19086612835565b6120bb919061284c565b90506120c7818361286e565b6120d1908461292d565b600060188190556017819055601655925084158015906120f15750600083115b15612100576121008584612532565b6006546040516001600160a01b03909116908390600081818185875af1925050503d806000811461214d576040519150601f19603f3d011682016040523d82523d6000602084013e612152565b606091505b50506007546040519197506001600160a01b0316904790600081818185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b5050505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601b60205260409020805460ff1916821515179055610eb782826125e4565b6001600160a01b0383166122985760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a3e565b6001600160a01b0382166122fa5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a3e565b6001600160a01b038316600090815260208190526040902054818110156123725760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a3e565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361144d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061240d5761240d61289e565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248a9190612881565b8160018151811061249d5761249d61289e565b6001600160a01b039283166020918202929092010152600b546124c39130911684611675565b600b5460405163791ac94760e01b81526001600160a01b039091169063791ac947906124fc908590600090869030904290600401612940565b600060405180830381600087803b15801561251657600080fd5b505af115801561252a573d6000803e3d6000fd5b505050505050565b600b5461254a9030906001600160a01b031684611675565b600b5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156125b8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125dd919061297c565b5050505050565b6001600160a01b0382166000818152601a6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101611669565b600060208083528351808285015260005b8181101561266d57858101830151858201604001528201612651565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146113fb57600080fd5b600080604083850312156126b657600080fd5b82356126c18161268e565b946020939093013593505050565b6000602082840312156126e157600080fd5b81356126ec8161268e565b9392505050565b60008060006060848603121561270857600080fd5b83356127138161268e565b925060208401356127238161268e565b929592945050506040919091013590565b60006020828403121561274657600080fd5b5035919050565b6000806040838503121561276057600080fd5b823561276b8161268e565b9150602083013561277b8161268e565b809150509250929050565b6000806040838503121561279957600080fd5b82356127a48161268e565b91506020830135801515811461277b57600080fd5b6000806000606084860312156127ce57600080fd5b505081359360208301359350604090920135919050565b600181811c908216806127f957607f821691505b60208210810361281957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761097b5761097b61281f565b60008261286957634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561097b5761097b61281f565b60006020828403121561289357600080fd5b81516126ec8161268e565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156128ed5781516001600160a01b0316875295820195908201906001016128c8565b509495945050505050565b84815260806020820152600061291160808301866128b4565b6001600160a01b03949094166040830152506060015292915050565b8181038181111561097b5761097b61281f565b85815284602082015260a06040820152600061295f60a08301866128b4565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561299157600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207c923f66ffe7d37a36be81806a21ef20d56569f19bcf34b017024bc79c94fb3d64736f6c63430008110033

Deployed Bytecode Sourcemap

21416:13714:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9267:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11627:201;;;;;;;;;;-1:-1:-1;11627:201:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;11627:201:0;1023:187:1;22330:64:0;;;;;;;;;;-1:-1:-1;22330:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;21634:39;;;;;;;;;;-1:-1:-1;21634:39:0;;;;-1:-1:-1;;;;;21634:39:0;;;;;;-1:-1:-1;;;;;1655:32:1;;;1637:51;;1625:2;1610:18;21634:39:0;1467:227:1;10396:108:0;;;;;;;;;;-1:-1:-1;10484:12:0;;10396:108;;;1845:25:1;;;1833:2;1818:18;10396:108:0;1699:177:1;22228:33:0;;;;;;;;;;;;;;;;22154;;;;;;;;;;;;;;;;12408:261;;;;;;;;;;-1:-1:-1;12408:261:0;;;;;:::i;:::-;;:::i;32382:269::-;;;;;;;;;;-1:-1:-1;32382:269:0;;;;;:::i;:::-;;:::i;:::-;;10238:93;;;;;;;;;;-1:-1:-1;10238:93:0;;10321:2;2669:36:1;;2657:2;2642:18;10238:93:0;2527:184:1;13078:238:0;;;;;;;;;;-1:-1:-1;13078:238:0;;;;;:::i;:::-;;:::i;21682:21::-;;;;;;;;;;-1:-1:-1;21682:21:0;;;;-1:-1:-1;;;;;21682:21:0;;;31291:371;;;;;;;;;;-1:-1:-1;31291:371:0;;;;;:::i;:::-;;:::i;30567:315::-;;;;;;;;;;;;;:::i;21562:28::-;;;;;;;;;;;;;;;;22009;;;;;;;;;;;;;;;;10567:127;;;;;;;;;;-1:-1:-1;10567:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10668:18:0;10641:7;10668:18;;;;;;;;;;;;10567:127;2708:103;;;;;;;;;;;;;:::i;34300:110::-;;;;;;;;;;;;;:::i;29445:260::-;;;;;;;;;;-1:-1:-1;29445:260:0;;;;;:::i;:::-;;:::i;21489:30::-;;;;;;;;;;-1:-1:-1;21489:30:0;;;;-1:-1:-1;;;;;21489:30:0;;;21902;;;;;;;;;;;;;;;;32941:371;;;;;;;;;;-1:-1:-1;32941:371:0;;;;;:::i;:::-;;:::i;21528:27::-;;;;;;;;;;;;;;;;2067:87;;;;;;;;;;-1:-1:-1;2140:6:0;;-1:-1:-1;;;;;2140:6:0;2067:87;;21458:24;;;;;;;;;;-1:-1:-1;21458:24:0;;;;-1:-1:-1;;;;;21458:24:0;;;9486:104;;;;;;;;;;;;;:::i;33708:295::-;;;;;;;;;;-1:-1:-1;33708:295:0;;;;;:::i;:::-;;:::i;21939:24::-;;;;;;;;;;;;;;;;22194:27;;;;;;;;;;;;;;;;22082:25;;;;;;;;;;;;;;;;22044:31;;;;;;;;;;;;;;;;13819:436;;;;;;;;;;-1:-1:-1;13819:436:0;;;;;:::i;:::-;;:::i;10900:193::-;;;;;;;;;;-1:-1:-1;10900:193:0;;;;;:::i;:::-;;:::i;21597:30::-;;;;;;;;;;;;;;;;22401:58;;;;;;;;;;-1:-1:-1;22401:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31101:182;;;;;;;;;;-1:-1:-1;31101:182:0;;;;;:::i;:::-;;:::i;33320:380::-;;;;;;;;;;-1:-1:-1;33320:380:0;;;;;:::i;:::-;;:::i;32090:284::-;;;;;;;;;;-1:-1:-1;32090:284:0;;;;;:::i;:::-;;:::i;21817:44::-;;;;;;;;;;;;21856:5;21817:44;;31732:350;;;;;;;;;;-1:-1:-1;31732:350:0;;;;;:::i;:::-;;:::i;21868:27::-;;;;;;;;;;;;;;;;32659:274;;;;;;;;;;-1:-1:-1;32659:274:0;;;;;:::i;:::-;;:::i;11156:151::-;;;;;;;;;;-1:-1:-1;11156:151:0;;;;;:::i;:::-;;:::i;21775:33::-;;;;;;;;;;;;;;;;21970:30;;;;;;;;;;;;;;;;2966:201;;;;;;;;;;-1:-1:-1;2966:201:0;;;;;:::i;:::-;;:::i;21712:28::-;;;;;;;;;;-1:-1:-1;21712:28:0;;;;-1:-1:-1;;;21712:28:0;;;;;;30933:160;;;;;;;;;;;;;:::i;22114:31::-;;;;;;;;;;;;;;;;34513:612;;;;;;:::i;:::-;;:::i;9267:100::-;9321:13;9354:5;9347:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9267:100;:::o;11627:201::-;11710:4;694:10;11766:32;694:10;11782:7;11791:6;11766:8;:32::i;:::-;11816:4;11809:11;;;11627:201;;;;;:::o;12408:261::-;12505:4;694:10;12563:38;12579:4;694:10;12594:6;12563:15;:38::i;:::-;12612:27;12622:4;12628:2;12632:6;12612:9;:27::i;:::-;-1:-1:-1;12657:4:0;;12408:261;-1:-1:-1;;;;12408:261:0:o;32382:269::-;1953:13;:11;:13::i;:::-;32501:4:::1;32495;32475:13;10484:12:::0;;;10396:108;32475:13:::1;:17;::::0;32491:1:::1;32475:17;:::i;:::-;:24;;;;:::i;:::-;32474:31;;;;:::i;:::-;32464:6;:41;;32456:95;;;::::0;-1:-1:-1;;;32456:95:0;;5173:2:1;32456:95:0::1;::::0;::::1;5155:21:1::0;5212:2;5192:18;;;5185:30;5251:34;5231:18;;;5224:62;-1:-1:-1;;;5302:18:1;;;5295:39;5351:19;;32456:95:0::1;;;;;;;;;32577:17;:6:::0;32587::::1;32577:17;:::i;:::-;32562:12;:32:::0;;;32610:33:::1;::::0;1845:25:1;;;32610:33:0::1;::::0;1833:2:1;1818:18;32610:33:0::1;;;;;;;;32382:269:::0;:::o;13078:238::-;13166:4;694:10;13222:64;694:10;13238:7;13275:10;13247:25;694:10;13238:7;13247:9;:25::i;:::-;:38;;;;:::i;:::-;13222:8;:64::i;31291:371::-;1953:13;:11;:13::i;:::-;-1:-1:-1;;;;;31407:26:0;::::1;31399:68;;;::::0;-1:-1:-1;;;31399:68:0;;5713:2:1;31399:68:0::1;::::0;::::1;5695:21:1::0;5752:2;5732:18;;;5725:30;5791:32;5771:18;;;5764:60;5841:18;;31399:68:0::1;5511:354:1::0;31399:68:0::1;-1:-1:-1::0;;;;;31486:31:0;::::1;31478:73;;;::::0;-1:-1:-1;;;31478:73:0;;5713:2:1;31478:73:0::1;::::0;::::1;5695:21:1::0;5752:2;5732:18;;;5725:30;5791:32;5771:18;;;5764:60;5841:18;;31478:73:0::1;5511:354:1::0;31478:73:0::1;31564:9;:33:::0;;-1:-1:-1;;;;;31564:33:0;;::::1;-1:-1:-1::0;;;;;;31564:33:0;;::::1;;::::0;;;31608:15:::1;:44:::0;;;;;::::1;::::0;::::1;;::::0;;31291:371::o;30567:315::-;1953:13;:11;:13::i;:::-;30658:18:::1;::::0;30648:4:::1;10641:7:::0;10668:18;;;;;;;;;;;30630:46:::1;;30622:126;;;::::0;-1:-1:-1;;;30622:126:0;;6072:2:1;30622:126:0::1;::::0;::::1;6054:21:1::0;6111:2;6091:18;;;6084:30;6150:34;6130:18;;;6123:62;6221:34;6201:18;;;6194:62;-1:-1:-1;;;6272:19:1;;;6265:34;6316:19;;30622:126:0::1;5870:471:1::0;30622:126:0::1;30759:8;:15:::0;;-1:-1:-1;;;;30759:15:0::1;-1:-1:-1::0;;;30759:15:0::1;::::0;;30785:10:::1;:8;:10::i;:::-;30806:8;:16:::0;;-1:-1:-1;;;;30806:16:0::1;::::0;;30838:36:::1;::::0;30858:15:::1;1845:25:1::0;;30838:36:0::1;::::0;1833:2:1;1818:18;30838:36:0::1;;;;;;;30567:315::o:0;2708:103::-;1953:13;:11;:13::i;:::-;2773:30:::1;2800:1;2773:18;:30::i;:::-;2708:103::o:0;34300:110::-;1953:13;:11;:13::i;:::-;34354:9:::1;:17:::0;;-1:-1:-1;;;;34354:17:0::1;::::0;;34387:15:::1;::::0;::::1;::::0;34366:5:::1;::::0;34387:15:::1;34300:110::o:0;29445:260::-;1953:13;:11;:13::i;:::-;29541:4:::1;29537:104;;29579:6;::::0;-1:-1:-1;;;;;29579:6:0;;::::1;29569:16:::0;;::::1;::::0;29561:68:::1;;;::::0;-1:-1:-1;;;29561:68:0;;6548:2:1;29561:68:0::1;::::0;::::1;6530:21:1::0;6587:2;6567:18;;;6560:30;6626:34;6606:18;;;6599:62;-1:-1:-1;;;6677:18:1;;;6670:37;6724:19;;29561:68:0::1;6346:403:1::0;29561:68:0::1;-1:-1:-1::0;;;;;29651:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;29651:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29445:260::o;32941:371::-;1953:13;:11;:13::i;:::-;33057:9:::1;:19:::0;;;33087:15:::1;:31:::0;;;33129:15:::1;:31:::0;;;33147:13;33186:27:::1;33105:13:::0;33069:7;33186:27:::1;:::i;:::-;:45;;;;:::i;:::-;33171:12;:60:::0;;;33266:4:::1;-1:-1:-1::0;33250:20:0::1;33242:62;;;::::0;-1:-1:-1;;;33242:62:0;;6956:2:1;33242:62:0::1;::::0;::::1;6938:21:1::0;6995:2;6975:18;;;6968:30;7034:31;7014:18;;;7007:59;7083:18;;33242:62:0::1;6754:353:1::0;33242:62:0::1;32941:371:::0;;;:::o;9486:104::-;9542:13;9575:7;9568:14;;;;;:::i;33708:295::-;1953:13;:11;:13::i;:::-;33817:6:::1;::::0;-1:-1:-1;;;;;33817:6:0;;::::1;33809:14:::0;;::::1;::::0;33801:84:::1;;;::::0;-1:-1:-1;;;33801:84:0;;7314:2:1;33801:84:0::1;::::0;::::1;7296:21:1::0;7353:2;7333:18;;;7326:30;7392:34;7372:18;;;7365:62;7463:27;7443:18;;;7436:55;7508:19;;33801:84:0::1;7112:421:1::0;33801:84:0::1;33898:41;33927:4;33933:5;33898:28;:41::i;:::-;33955:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;33955:40:0;::::1;::::0;::::1;::::0;;;::::1;33708:295:::0;;:::o;13819:436::-;13912:4;694:10;13912:4;13995:25;694:10;14012:7;13995:9;:25::i;:::-;13968:52;;14059:15;14039:16;:35;;14031:85;;;;-1:-1:-1;;;14031:85:0;;7740:2:1;14031:85:0;;;7722:21:1;7779:2;7759:18;;;7752:30;7818:34;7798:18;;;7791:62;-1:-1:-1;;;7869:18:1;;;7862:35;7914:19;;14031:85:0;7538:401:1;14031:85:0;14152:60;14161:5;14168:7;14196:15;14177:16;:34;14152:8;:60::i;10900:193::-;10979:4;694:10;11035:28;694:10;11052:2;11056:6;11035:9;:28::i;31101:182::-;1953:13;:11;:13::i;:::-;-1:-1:-1;;;;;31186:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;31186:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31241:34;;1163:41:1;;;31241:34:0::1;::::0;1136:18:1;31241:34:0::1;;;;;;;31101:182:::0;;:::o;33320:380::-;1953:13;:11;:13::i;:::-;33437:10:::1;:20:::0;;;33468:16:::1;:32:::0;;;33511:16:::1;:32:::0;;;33530:13;33570:29:::1;33487:13:::0;33450:7;33570:29:::1;:::i;:::-;:48;;;;:::i;:::-;33554:13;:64:::0;;;33654:4:::1;-1:-1:-1::0;33637:21:0::1;33629:63;;;::::0;-1:-1:-1;;;33629:63:0;;8146:2:1;33629:63:0::1;::::0;::::1;8128:21:1::0;8185:2;8165:18;;;8158:30;8224:31;8204:18;;;8197:59;8273:18;;33629:63:0::1;7944:353:1::0;32090:284:0;1953:13;:11;:13::i;:::-;32212:4:::1;32206;32186:13;10484:12:::0;;;10396:108;32186:13:::1;:17;::::0;32202:1:::1;32186:17;:::i;:::-;:24;;;;:::i;:::-;32185:31;;;;:::i;:::-;32175:6;:41;;32167:98;;;::::0;-1:-1:-1;;;32167:98:0;;8504:2:1;32167:98:0::1;::::0;::::1;8486:21:1::0;8543:2;8523:18;;;8516:30;8582:34;8562:18;;;8555:62;-1:-1:-1;;;8633:18:1;;;8626:42;8685:19;;32167:98:0::1;8302:408:1::0;32167:98:0::1;32294:17;:6:::0;32304::::1;32294:17;:::i;:::-;32276:15;:35:::0;;;32327:39:::1;::::0;1845:25:1;;;32327:39:0::1;::::0;1833:2:1;1818:18;32327:39:0::1;1699:177:1::0;31732:350:0;1953:13;:11;:13::i;:::-;31856:6:::1;31836:13;10484:12:::0;;;10396:108;31836:13:::1;:17;::::0;31852:1:::1;31836:17;:::i;:::-;:26;;;;:::i;:::-;31823:9;:39;;31815:105;;;::::0;-1:-1:-1;;;31815:105:0;;8917:2:1;31815:105:0::1;::::0;::::1;8899:21:1::0;8956:2;8936:18;;;8929:30;8995:34;8975:18;;;8968:62;-1:-1:-1;;;9046:18:1;;;9039:51;9107:19;;31815:105:0::1;8715:417:1::0;31815:105:0::1;31972:4;31952:13;10484:12:::0;;;10396:108;31952:13:::1;:17;::::0;31968:1:::1;31952:17;:::i;:::-;:24;;;;:::i;:::-;31939:9;:37;;31931:102;;;::::0;-1:-1:-1;;;31931:102:0;;9339:2:1;31931:102:0::1;::::0;::::1;9321:21:1::0;9378:2;9358:18;;;9351:30;9417:34;9397:18;;;9390:62;-1:-1:-1;;;9468:18:1;;;9461:50;9528:19;;31931:102:0::1;9137:416:1::0;31931:102:0::1;32044:18;:30:::0;31732:350::o;32659:274::-;1953:13;:11;:13::i;:::-;32779:4:::1;32773;32753:13;10484:12:::0;;;10396:108;32753:13:::1;:17;::::0;32769:1:::1;32753:17;:::i;:::-;:24;;;;:::i;:::-;32752:31;;;;:::i;:::-;32742:6;:41;;32734:96;;;::::0;-1:-1:-1;;;32734:96:0;;9760:2:1;32734:96:0::1;::::0;::::1;9742:21:1::0;9799:2;9779:18;;;9772:30;9838:34;9818:18;;;9811:62;-1:-1:-1;;;9889:18:1;;;9882:40;9939:19;;32734:96:0::1;9558:406:1::0;32734:96:0::1;32857:17;:6:::0;32867::::1;32857:17;:::i;:::-;32841:13;:33:::0;;;32890:35:::1;::::0;1845:25:1;;;32890:35:0::1;::::0;1833:2:1;1818:18;32890:35:0::1;1699:177:1::0;11156:151:0;-1:-1:-1;;;;;11272:18:0;;;11245:7;11272:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11156:151::o;2966:201::-;1953:13;:11;:13::i;:::-;-1:-1:-1;;;;;3055:22:0;::::1;3047:73;;;::::0;-1:-1:-1;;;3047:73:0;;10171:2:1;3047:73:0::1;::::0;::::1;10153:21:1::0;10210:2;10190:18;;;10183:30;10249:34;10229:18;;;10222:62;-1:-1:-1;;;10300:18:1;;;10293:36;10346:19;;3047:73:0::1;9969:402:1::0;3047:73:0::1;3131:28;3150:8;3131:18;:28::i;:::-;2966:201:::0;:::o;30933:160::-;1953:13;:11;:13::i;:::-;31027:58:::1;::::0;30991:12:::1;::::0;31035:10:::1;::::0;31059:21:::1;::::0;30991:12;31027:58;30991:12;31027:58;31059:21;31035:10;31027:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;30933:160:0:o;34513:612::-;1953:13;:11;:13::i;:::-;34618:8:::1;34603:11;:23;;34595:107;;;::::0;-1:-1:-1;;;34595:107:0;;10788:2:1;34595:107:0::1;::::0;::::1;10770:21:1::0;10827:2;10807:18;;;10800:30;10866:34;10846:18;;;10839:62;10937:34;10917:18;;;10910:62;-1:-1:-1;;;10988:19:1;;;10981:38;11036:19;;34595:107:0::1;10586:475:1::0;34595:107:0::1;34739:16;::::0;;34753:1:::1;34739:16:::0;;;;;::::1;::::0;;34715:21:::1;::::0;34739:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;34776:15:0::1;::::0;:22:::1;::::0;;-1:-1:-1;;;34776:22:0;;;;34715:40;;-1:-1:-1;;;;;;34776:15:0;;::::1;::::0;:20:::1;::::0;-1:-1:-1;34776:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34766:4;34771:1;34766:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;34766:32:0::1;;;-1:-1:-1::0;;;;;34766:32:0::1;;;::::0;::::1;34827:4;34809;34814:1;34809:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34809:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;34845:15:::1;::::0;:225:::1;::::0;-1:-1:-1;;;34845:225:0;;:15;::::1;::::0;:66:::1;::::0;34919:11;;34845:225:::1;::::0;:15:::1;::::0;34995:4;;35022:6:::1;::::0;35044:15:::1;::::0;34845:225:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;35088:29;35105:11;35088:29;;;;1845:25:1::0;;1833:2;1818:18;;1699:177;35088:29:0::1;;;;;;;;34584:541;34513:612:::0;:::o;17812:346::-;-1:-1:-1;;;;;17914:19:0;;17906:68;;;;-1:-1:-1;;;17906:68:0;;12769:2:1;17906:68:0;;;12751:21:1;12808:2;12788:18;;;12781:30;12847:34;12827:18;;;12820:62;-1:-1:-1;;;12898:18:1;;;12891:34;12942:19;;17906:68:0;12567:400:1;17906:68:0;-1:-1:-1;;;;;17993:21:0;;17985:68;;;;-1:-1:-1;;;17985:68:0;;13174:2:1;17985:68:0;;;13156:21:1;13213:2;13193:18;;;13186:30;13252:34;13232:18;;;13225:62;-1:-1:-1;;;13303:18:1;;;13296:32;13345:19;;17985:68:0;12972:398:1;17985:68:0;-1:-1:-1;;;;;18066:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18118:32;;1845:25:1;;;18118:32:0;;1818:18:1;18118:32:0;;;;;;;17812:346;;;:::o;18449:419::-;18550:24;18577:25;18587:5;18594:7;18577:9;:25::i;:::-;18550:52;;-1:-1:-1;;18617:16:0;:37;18613:248;;18699:6;18679:16;:26;;18671:68;;;;-1:-1:-1;;;18671:68:0;;13577:2:1;18671:68:0;;;13559:21:1;13616:2;13596:18;;;13589:30;13655:31;13635:18;;;13628:59;13704:18;;18671:68:0;13375:353:1;18671:68:0;18783:51;18792:5;18799:7;18827:6;18808:16;:25;18783:8;:51::i;24688:2837::-;-1:-1:-1;;;;;24786:18:0;;24778:68;;;;-1:-1:-1;;;24778:68:0;;13935:2:1;24778:68:0;;;13917:21:1;13974:2;13954:18;;;13947:30;14013:34;13993:18;;;13986:62;-1:-1:-1;;;14064:18:1;;;14057:35;14109:19;;24778:68:0;13733:401:1;24778:68:0;-1:-1:-1;;;;;24865:16:0;;24857:64;;;;-1:-1:-1;;;24857:64:0;;14341:2:1;24857:64:0;;;14323:21:1;14380:2;14360:18;;;14353:30;14419:34;14399:18;;;14392:62;-1:-1:-1;;;14470:18:1;;;14463:33;14513:19;;24857:64:0;14139:399:1;24857:64:0;24949:1;24940:6;:10;24932:52;;;;-1:-1:-1;;;24932:52:0;;14745:2:1;24932:52:0;;;14727:21:1;14784:2;14764:18;;;14757:30;14823:31;14803:18;;;14796:59;14872:18;;24932:52:0;14543:353:1;24932:52:0;25000:9;;-1:-1:-1;;;25000:9:0;;;;24997:1009;;;2140:6;;-1:-1:-1;;;;;25028:15:0;;;2140:6;;25028:15;;;;:32;;-1:-1:-1;2140:6:0;;-1:-1:-1;;;;;25047:13:0;;;2140:6;;25047:13;;25028:32;:52;;;;-1:-1:-1;;;;;;25064:16:0;;;;25028:52;:77;;;;-1:-1:-1;;;;;;25084:21:0;;25098:6;25084:21;;25028:77;:107;;;;-1:-1:-1;;;;;;25110:25:0;;;;;;:19;:25;;;;;;;;25109:26;25028:107;:135;;;;-1:-1:-1;;;;;;25140:23:0;;;;;;:19;:23;;;;;;;;25139:24;25028:135;25025:970;;;-1:-1:-1;;;;;25217:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;25253:35:0;;;;;;:31;:35;;;;;;;;25252:36;25217:71;25213:767;;;25331:12;;25321:6;:22;;25313:75;;;;-1:-1:-1;;;25313:75:0;;15103:2:1;25313:75:0;;;15085:21:1;15142:2;15122:18;;;15115:30;15181:34;15161:18;;;15154:62;-1:-1:-1;;;15232:18:1;;;15225:38;15280:19;;25313:75:0;14901:404:1;25313:75:0;25445:15;;-1:-1:-1;;;;;10668:18:0;;10641:7;10668:18;;;;;;;;;;;25419:22;;:6;:22;:::i;:::-;:41;;25411:78;;;;-1:-1:-1;;;25411:78:0;;15512:2:1;25411:78:0;;;15494:21:1;15551:2;15531:18;;;15524:30;15590:26;15570:18;;;15563:54;15634:18;;25411:78:0;15310:348:1;25411:78:0;25213:767;;;-1:-1:-1;;;;;25567:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;25601:37:0;;;;;;:31;:37;;;;;;;;25600:38;25567:71;25563:417;;;25681:13;;25671:6;:23;;25663:78;;;;-1:-1:-1;;;25663:78:0;;15865:2:1;25663:78:0;;;15847:21:1;15904:2;15884:18;;;15877:30;15943:34;15923:18;;;15916:62;-1:-1:-1;;;15994:18:1;;;15987:40;16044:19;;25663:78:0;15663:406:1;25563:417:0;-1:-1:-1;;;;;25823:35:0;;;;;;:31;:35;;;;;;;;25819:161;;25916:15;;-1:-1:-1;;;;;10668:18:0;;10641:7;10668:18;;;;;;;;;;;25890:22;;:6;:22;:::i;:::-;:41;;25882:78;;;;-1:-1:-1;;;25882:78:0;;16276:2:1;25882:78:0;;;16258:21:1;16315:2;16295:18;;;16288:30;16354:26;16334:18;;;16327:54;16398:18;;25882:78:0;16074:348:1;25882:78:0;26067:4;26018:28;10668:18;;;;;;;;;;;26125;;26101:42;;;;;;;26159:20;;-1:-1:-1;26171:8:0;;-1:-1:-1;;;26171:8:0;;;;26170:9;26159:20;:56;;;;-1:-1:-1;;;;;;26184:31:0;;;;;;:25;:31;;;;;;;;26183:32;26159:56;:86;;;;-1:-1:-1;;;;;;26220:25:0;;;;;;:19;:25;;;;;;;;26219:26;26159:86;:114;;;;-1:-1:-1;;;;;;26250:23:0;;;;;;:19;:23;;;;;;;;26249:24;26159:114;26156:217;;;26290:8;:15;;-1:-1:-1;;;;26290:15:0;-1:-1:-1;;;26290:15:0;;;26320:10;:8;:10::i;:::-;26345:8;:16;;-1:-1:-1;;;;26345:16:0;;;26156:217;-1:-1:-1;;;;;26420:25:0;;26385:12;26420:25;;;:19;:25;;;;;;26400:4;;26420:25;;;:52;;-1:-1:-1;;;;;;26449:23:0;;;;;;:19;:23;;;;;;;;26420:52;26417:98;;;-1:-1:-1;26498:5:0;26417:98;26527:12;26559:7;26556:914;;;-1:-1:-1;;;;;26586:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;26635:1;26619:13;;:17;26586:50;26582:737;;;21856:5;26672:13;;26663:6;:22;;;;:::i;:::-;:37;;;;:::i;:::-;26656:44;;26755:13;;26742:10;;26735:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;26719:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;26835:13:0;;26816:16;;26809:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;26787:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;26915:13:0;;26896:16;;26889:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;26867:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;26582:737:0;;-1:-1:-1;26582:737:0;;-1:-1:-1;;;;;26966:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;27016:1;27001:12;;:16;26966:51;26963:356;;;21856:5;27054:12;;27045:6;:21;;;;:::i;:::-;:36;;;;:::i;:::-;27038:43;;27135:12;;27123:9;;27116:4;:16;;;;:::i;:::-;:31;;;;:::i;:::-;27100:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;27213:12:0;;27195:15;;27188:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;27166:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;27291:12:0;;27273:15;;27266:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;27244:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;26963:356:0;27338:8;;27335:91;;27368:42;27384:4;27398;27405;27368:15;:42::i;:::-;27442:14;27452:4;27442:14;;:::i;:::-;;;26556:914;27482:33;27498:4;27504:2;27508:6;27482:15;:33::i;:::-;24767:2758;;;;24688:2837;;;:::o;2232:132::-;2140:6;;-1:-1:-1;;;;;2140:6:0;694:10;2296:23;2288:68;;;;-1:-1:-1;;;2288:68:0;;16762:2:1;2288:68:0;;;16744:21:1;;;16781:18;;;16774:30;16840:34;16820:18;;;16813:62;16892:18;;2288:68:0;16560:356:1;27533:1392:0;27618:4;27574:23;10668:18;;;;;;;;;;;27574:50;;27635:25;27699:18;;27678;;27663:12;;:33;;;;:::i;:::-;:54;;;;:::i;:::-;27635:82;-1:-1:-1;27733:20:0;;;:46;;-1:-1:-1;27757:22:0;;27733:46;27730:59;;;27781:7;;27533:1392::o;27730:59::-;27822:18;;:23;;27843:2;27822:23;:::i;:::-;27804:15;:41;27801:113;;;27879:18;;:23;;27900:2;27879:23;:::i;:::-;27861:41;;27801:113;27926:12;28000:23;28085:1;28065:17;28044:18;;28026:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;28000:86;-1:-1:-1;28099:51:0;28116:33;28000:86;28116:15;:33;:::i;:::-;28099:16;:51::i;:::-;28335:18;;28184:21;;;;28163:18;;28335:20;;28354:1;;28335:20;:::i;:::-;28314:42;;:17;:42;:::i;:::-;28298:12;;28285:25;;:10;:25;:::i;:::-;:72;;;;:::i;:::-;28265:92;;28368:23;28469:1;28450:18;;:20;;;;:::i;:::-;28429:42;;:17;:42;:::i;:::-;28407:18;;28394:31;;:10;:31;:::i;:::-;:78;;;;:::i;:::-;28368:104;-1:-1:-1;28504:27:0;28368:104;28504:9;:27;:::i;:::-;28485:46;;;;:::i;:::-;28565:1;28544:18;:22;;;28577:12;:16;;;28604:18;:22;28485:46;-1:-1:-1;28642:19:0;;;;;:42;;;28683:1;28665:15;:19;28642:42;28639:119;;;28700:46;28713:15;28730;28700:12;:46::i;:::-;28791:9;;28783:45;;-1:-1:-1;;;;;28791:9:0;;;;28814;;28783:45;;;;28814:9;28791;28783:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28860:15:0;;28852:63;;28770:58;;-1:-1:-1;;;;;;28860:15:0;;28889:21;;28852:63;;;;28889:21;28860:15;28852:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27533:1392:0:o;3327:191::-;3420:6;;;-1:-1:-1;;;;;3437:17:0;;;-1:-1:-1;;;;;;3437:17:0;;;;;;;3470:40;;3420:6;;;3437:17;3420:6;;3470:40;;3401:16;;3470:40;3390:128;3327:191;:::o;34011:240::-;-1:-1:-1;;;;;34094:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;34094:39:0;;;;;;;34146;34094:31;:39;34146:26;:39::i;14725:806::-;-1:-1:-1;;;;;14822:18:0;;14814:68;;;;-1:-1:-1;;;14814:68:0;;17123:2:1;14814:68:0;;;17105:21:1;17162:2;17142:18;;;17135:30;17201:34;17181:18;;;17174:62;-1:-1:-1;;;17252:18:1;;;17245:35;17297:19;;14814:68:0;16921:401:1;14814:68:0;-1:-1:-1;;;;;14901:16:0;;14893:64;;;;-1:-1:-1;;;14893:64:0;;17529:2:1;14893:64:0;;;17511:21:1;17568:2;17548:18;;;17541:30;17607:34;17587:18;;;17580:62;-1:-1:-1;;;17658:18:1;;;17651:33;17701:19;;14893:64:0;17327:399:1;14893:64:0;-1:-1:-1;;;;;15043:15:0;;15021:19;15043:15;;;;;;;;;;;15077:21;;;;15069:72;;;;-1:-1:-1;;;15069:72:0;;17933:2:1;15069:72:0;;;17915:21:1;17972:2;17952:18;;;17945:30;18011:34;17991:18;;;17984:62;-1:-1:-1;;;18062:18:1;;;18055:36;18108:19;;15069:72:0;17731:402:1;15069:72:0;-1:-1:-1;;;;;15177:15:0;;;:9;:15;;;;;;;;;;;15195:20;;;15177:38;;15395:13;;;;;;;;;;:23;;;;;;15447:26;;1845:25:1;;;15395:13:0;;15447:26;;1818:18:1;15447:26:0;;;;;;;15486:37;32941:371;29922:593;30074:16;;;30088:1;30074:16;;;;;;;;30050:21;;30074:16;;;;;;;;;;-1:-1:-1;30074:16:0;30050:40;;30119:4;30101;30106:1;30101:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30101:23:0;;;:7;;;;;;;;;;:23;;;;30145:15;;:22;;;-1:-1:-1;;;30145:22:0;;;;:15;;;;;:20;;:22;;;;;30101:7;;30145:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30135:4;30140:1;30135:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30135:32:0;;;:7;;;;;;;;;:32;30212:15;;30180:62;;30197:4;;30212:15;30230:11;30180:8;:62::i;:::-;30281:15;;:224;;-1:-1:-1;;;30281:224:0;;-1:-1:-1;;;;;30281:15:0;;;;:66;;:224;;30362:11;;30281:15;;30432:4;;30459;;30479:15;;30281:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29977:538;29922:593;:::o;28970:467::-;29150:15;;29118:62;;29135:4;;-1:-1:-1;;;;;29150:15:0;29168:11;29118:8;:62::i;:::-;29223:15;;:206;;-1:-1:-1;;;29223:206:0;;29295:4;29223:206;;;19066:34:1;19116:18;;;19109:34;;;29223:15:0;19159:18:1;;;19152:34;;;19202:18;;;19195:34;29381:6:0;19245:19:1;;;19238:44;29403:15:0;19298:19:1;;;19291:35;-1:-1:-1;;;;;29223:15:0;;;;:31;;29262:9;;19000:19:1;;29223:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28970:467;;:::o;29713:201::-;-1:-1:-1;;;;;29799:37:0;;;;;;:31;:37;;;;;;;;;:50;;-1:-1:-1;;29799:50:0;;;;;;;;;;29865:41;;19816:51:1;;;19883:18;;;19876:50;29865:41:0;;19789:18:1;29865:41:0;19648:284:1;14:548;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;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:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;:::-;1451:5;1215:247;-1:-1:-1;;;1215:247:1:o;1881:456::-;1958:6;1966;1974;2027:2;2015:9;2006:7;2002:23;1998:32;1995:52;;;2043:1;2040;2033:12;1995:52;2082:9;2069:23;2101:31;2126:5;2101:31;:::i;:::-;2151:5;-1:-1:-1;2208:2:1;2193:18;;2180:32;2221:33;2180:32;2221:33;:::i;:::-;1881:456;;2273:7;;-1:-1:-1;;;2327:2:1;2312:18;;;;2299:32;;1881:456::o;2342:180::-;2401:6;2454:2;2442:9;2433:7;2429:23;2425:32;2422:52;;;2470:1;2467;2460:12;2422:52;-1:-1:-1;2493:23:1;;2342:180;-1:-1:-1;2342:180:1:o;2924:388::-;2992:6;3000;3053:2;3041:9;3032:7;3028:23;3024:32;3021:52;;;3069:1;3066;3059:12;3021:52;3108:9;3095:23;3127:31;3152:5;3127:31;:::i;:::-;3177:5;-1:-1:-1;3234:2:1;3219:18;;3206:32;3247:33;3206:32;3247:33;:::i;:::-;3299:7;3289:17;;;2924:388;;;;;:::o;3317:416::-;3382:6;3390;3443:2;3431:9;3422:7;3418:23;3414:32;3411:52;;;3459:1;3456;3449:12;3411:52;3498:9;3485:23;3517:31;3542:5;3517:31;:::i;:::-;3567:5;-1:-1:-1;3624:2:1;3609:18;;3596:32;3666:15;;3659:23;3647:36;;3637:64;;3697:1;3694;3687:12;3738:316;3815:6;3823;3831;3884:2;3872:9;3863:7;3859:23;3855:32;3852:52;;;3900:1;3897;3890:12;3852:52;-1:-1:-1;;3923:23:1;;;3993:2;3978:18;;3965:32;;-1:-1:-1;4044:2:1;4029:18;;;4016:32;;3738:316;-1:-1:-1;3738:316:1:o;4059:380::-;4138:1;4134:12;;;;4181;;;4202:61;;4256:4;4248:6;4244:17;4234:27;;4202:61;4309:2;4301:6;4298:14;4278:18;4275:38;4272:161;;4355:10;4350:3;4346:20;4343:1;4336:31;4390:4;4387:1;4380:15;4418:4;4415:1;4408:15;4272:161;;4059:380;;;:::o;4444:127::-;4505:10;4500:3;4496:20;4493:1;4486:31;4536:4;4533:1;4526:15;4560:4;4557:1;4550:15;4576:168;4649:9;;;4680;;4697:15;;;4691:22;;4677:37;4667:71;;4718:18;;:::i;4749:217::-;4789:1;4815;4805:132;;4859:10;4854:3;4850:20;4847:1;4840:31;4894:4;4891:1;4884:15;4922:4;4919:1;4912:15;4805:132;-1:-1:-1;4951:9:1;;4749:217::o;5381:125::-;5446:9;;;5467:10;;;5464:36;;;5480:18;;:::i;11198:251::-;11268:6;11321:2;11309:9;11300:7;11296:23;11292:32;11289:52;;;11337:1;11334;11327:12;11289:52;11369:9;11363:16;11388:31;11413:5;11388:31;:::i;11454:127::-;11515:10;11510:3;11506:20;11503:1;11496:31;11546:4;11543:1;11536:15;11570:4;11567:1;11560:15;11586:461;11639:3;11677:5;11671:12;11704:6;11699:3;11692:19;11730:4;11759:2;11754:3;11750:12;11743:19;;11796:2;11789:5;11785:14;11817:1;11827:195;11841:6;11838:1;11835:13;11827:195;;;11906:13;;-1:-1:-1;;;;;11902:39:1;11890:52;;11962:12;;;;11997:15;;;;11938:1;11856:9;11827:195;;;-1:-1:-1;12038:3:1;;11586:461;-1:-1:-1;;;;;11586:461:1:o;12052:510::-;12323:6;12312:9;12305:25;12366:3;12361:2;12350:9;12346:18;12339:31;12286:4;12387:57;12439:3;12428:9;12424:19;12416:6;12387:57;:::i;:::-;-1:-1:-1;;;;;12480:32:1;;;;12475:2;12460:18;;12453:60;-1:-1:-1;12544:2:1;12529:18;12522:34;12379:65;12052:510;-1:-1:-1;;12052:510:1:o;16427:128::-;16494:9;;;16515:11;;;16512:37;;;16529:18;;:::i;18138:582::-;18437:6;18426:9;18419:25;18480:6;18475:2;18464:9;18460:18;18453:34;18523:3;18518:2;18507:9;18503:18;18496:31;18400:4;18544:57;18596:3;18585:9;18581:19;18573:6;18544:57;:::i;:::-;-1:-1:-1;;;;;18637:32:1;;;;18632:2;18617:18;;18610:60;-1:-1:-1;18701:3:1;18686:19;18679:35;18536:65;18138:582;-1:-1:-1;;;18138:582:1:o;19337:306::-;19425:6;19433;19441;19494:2;19482:9;19473:7;19469:23;19465:32;19462:52;;;19510:1;19507;19500:12;19462:52;19539:9;19533:16;19523:26;;19589:2;19578:9;19574:18;19568:25;19558:35;;19633:2;19622:9;19618:18;19612:25;19602:35;;19337:306;;;;;:::o

Swarm Source

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