ETH Price: $3,386.21 (-0.26%)
Gas: 3 Gwei

Token

neuralNetX (neuralNetX)
 

Overview

Max Total Supply

1,000,000,000,000,000 neuralNetX

Holders

52

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
21,702,060,255,079.170309572 neuralNetX

Value
$0.00
0x70fb00c547abda3918e30714b210ba16d323b4f3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
neuralNetX

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-20
*/

// https://www.neuralnetx.net?etherscan
// https://twitter.com/NeuralNet0x
// https://t.me/NeuralNetX
// https://www.reddit.com/r/NeuralNetX/
// https://medium.com/@NeuralNetX
// https://github.com/neuralnet0x

// NeuralNetX offers an exciting opportunity for investors to capture the technological transformation of the future. 
// While this innovative platform creates a unique intersection between artificial intelligence and multichain technology, it stands out with its products and various ecosystem components.

// SPDX-License-Identifier: MIT


pragma solidity ^0.8.9;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @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 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);
}

/*
 * @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;
    }
}

/**
 * @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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of 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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 value {ERC20} uses, unless this function is
     * 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 9;
    }

    /**
     * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

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

        return true;
    }

    /**
     * @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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @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;
        _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;
        }
        _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 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 {}
}

/**
 * @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() {
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) internal {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract neuralNetX is ERC20, Ownable, Pausable {

    // CONFIG START
    
    uint256 private initialSupply;
   
    uint256 private denominator = 100;

    uint256 private swapThreshold = 0.0000005 ether; // The contract will only swap to ETH, once the fee tokens reach the specified threshold
    
    uint256 private devTaxBuy;
    uint256 private marketingTaxBuy;
    uint256 private liquidityTaxBuy;
    uint256 private charityTaxBuy;
    
    uint256 private devTaxSell;
    uint256 private marketingTaxSell;
    uint256 private liquidityTaxSell;
    uint256 private charityTaxSell;
    
    address private devTaxWallet;
    address private marketingTaxWallet;
    address private liquidityTaxWallet;
    address private charityTaxWallet;
    
    // CONFIG END
    
    mapping (address => bool) private blacklist;
    mapping (address => bool) private excludeList;
    
    mapping (string => uint256) private buyTaxes;
    mapping (string => uint256) private sellTaxes;
    mapping (string => address) private taxWallets;
    
    bool public taxStatus = true;
    
    IUniswapV2Router02 private uniswapV2Router02;
    IUniswapV2Factory private uniswapV2Factory;
    IUniswapV2Pair private uniswapV2Pair;
    
    constructor() ERC20("neuralNetX", "neuralNetX") payable
    {
        uint256 initialSupply = 1000000000000000 * (10**9);
        address owner = 0x9Ae6853880CCc15bfe8EBFfC515ade6beB6957B4; // owner wallet
        address uniswapV2Router02Address = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Uniswap
        // address uniswapV2Router02Address = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PancakeSwap
        // address uniswapV2Router02Address = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; // QuickSwap

        _setOwner(owner);
        uniswapV2Router02 = IUniswapV2Router02(uniswapV2Router02Address);
        uniswapV2Factory = IUniswapV2Factory(uniswapV2Router02.factory());
        uniswapV2Pair = IUniswapV2Pair(uniswapV2Factory.createPair(address(this), uniswapV2Router02.WETH()));
        taxWallets["liquidity"] = owner;

        setBuyTax(1, 1, 1, 1);
        setSellTax(1, 1, 1, 1);
        setTaxWallets(owner, owner, owner);
        exclude(msg.sender);
        exclude(address(this));
        payable(owner).transfer(msg.value);
        _mint(msg.sender, initialSupply);
    }
    
    uint256 private marketingTokens;
    uint256 private devTokens;
    uint256 private liquidityTokens;
    uint256 private charityTokens;
    
    /**
     * @dev Calculates the tax, transfer it to the contract. If the user is selling, and the swap threshold is met, it executes the tax.
     */
    function handleTax(address from, address to, uint256 amount) private returns (uint256) {
        address[] memory sellPath = new address[](2);
        sellPath[0] = address(this);
        sellPath[1] = uniswapV2Router02.WETH();
        
        if(!isExcluded(from) && !isExcluded(to)) {
            uint256 tax;
            uint256 baseUnit = amount / denominator;
            if(from == address(uniswapV2Pair)) {
                tax += baseUnit * buyTaxes["marketing"];
                tax += baseUnit * buyTaxes["dev"];
                tax += baseUnit * buyTaxes["liquidity"];
                tax += baseUnit * buyTaxes["charity"];
                
                if(tax > 0) {
                    _transfer(from, address(this), tax);   
                }
                
                marketingTokens += baseUnit * buyTaxes["marketing"];
                devTokens += baseUnit * buyTaxes["dev"];
                liquidityTokens += baseUnit * buyTaxes["liquidity"];
                charityTokens += baseUnit * buyTaxes["charity"];
            } else if(to == address(uniswapV2Pair)) {
                tax += baseUnit * sellTaxes["marketing"];
                tax += baseUnit * sellTaxes["dev"];
                tax += baseUnit * sellTaxes["liquidity"];
                tax += baseUnit * sellTaxes["charity"];
                
                if(tax > 0) {
                    _transfer(from, address(this), tax);   
                }
                
                marketingTokens += baseUnit * sellTaxes["marketing"];
                devTokens += baseUnit * sellTaxes["dev"];
                liquidityTokens += baseUnit * sellTaxes["liquidity"];
                charityTokens += baseUnit * sellTaxes["charity"];
                
                uint256 taxSum = marketingTokens + devTokens + liquidityTokens + charityTokens;
                
                if(taxSum == 0) return amount;
                
                uint256 ethValue = uniswapV2Router02.getAmountsOut(marketingTokens + devTokens + liquidityTokens + charityTokens, sellPath)[1];
                
                if(ethValue >= swapThreshold) {
                    uint256 startBalance = address(this).balance;

                    uint256 toSell = marketingTokens + devTokens + liquidityTokens / 2 + charityTokens;
                    
                    _approve(address(this), address(uniswapV2Router02), toSell);
            
                    uniswapV2Router02.swapExactTokensForETH(
                        toSell,
                        0,
                        sellPath,
                        address(this),
                        block.timestamp
                    );
                    
                    uint256 ethGained = address(this).balance - startBalance;
                    
                    uint256 liquidityToken = liquidityTokens / 2;
                    uint256 liquidityETH = (ethGained * ((liquidityTokens / 2 * 10**9) / taxSum)) / 10**9;
                    
                    uint256 marketingETH = (ethGained * ((marketingTokens * 10**9) / taxSum)) / 10**9;
                    uint256 devETH = (ethGained * ((devTokens * 10**9) / taxSum)) / 10**9;
                    uint256 charityETH = (ethGained * ((charityTokens * 10**9) / taxSum)) / 10**9;
                    
                    _approve(address(this), address(uniswapV2Router02), liquidityToken);
                    
                    (uint amountToken, uint amountETH, uint liquidity) = uniswapV2Router02.addLiquidityETH{value: liquidityETH}(
                        address(this),
                        liquidityToken,
                        0,
                        0,
                        taxWallets["liquidity"],
                        block.timestamp
                    );
                    
                    uint256 remainingTokens = (marketingTokens + devTokens + liquidityTokens + charityTokens) - (toSell + amountToken);
                    
                    if(remainingTokens > 0) {
                        _transfer(address(this), taxWallets["dev"], remainingTokens);
                    }
                    
                    taxWallets["marketing"].call{value: marketingETH}("");
                    taxWallets["dev"].call{value: devETH}("");
                    taxWallets["charity"].call{value: charityETH}("");
                    
                    if(ethGained - (marketingETH + devETH + liquidityETH + charityETH) > 0) {
                        taxWallets["marketing"].call{value: ethGained - (marketingETH + devETH + liquidityETH + charityETH)}("");
                    }
                    
                    marketingTokens = 0;
                    devTokens = 0;
                    liquidityTokens = 0;
                    charityTokens = 0;
                }
                
            }
            
            amount -= tax;
        }
        
        return amount;
    }
    
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override virtual {
        require(!paused(), "CoinToken: token transfer while paused");
        require(!isBlacklisted(msg.sender), "CoinToken: sender blacklisted");
        require(!isBlacklisted(recipient), "CoinToken: recipient blacklisted");
        require(!isBlacklisted(tx.origin), "CoinToken: sender blacklisted");
        
        if(taxStatus) {
            amount = handleTax(sender, recipient, amount);   
        }
        
        super._transfer(sender, recipient, amount);
    }
    
    /**
     * @dev Triggers the tax handling functionality
     */
    function triggerTax() public onlyOwner {
        handleTax(address(0), address(uniswapV2Pair), 0);
    }
    
    /**
     * @dev Pauses transfers on the token.
     */
    function pause() public onlyOwner {
        require(!paused(), "CoinToken: Contract is already paused");
        _pause();
    }

    /**
     * @dev Unpauses transfers on the token.
     */
    function unpause() public onlyOwner {
        require(paused(), "CoinToken: Contract is not paused");
        _unpause();
    }
    
    /**
     * @dev Burns tokens from caller address.
     */
    function burn(uint256 amount) public onlyOwner {
        _burn(msg.sender, amount);
    }
    
    /**
     * @dev Blacklists the specified account (Disables transfers to and from the account).
     */
    function enableBlacklist(address account) public onlyOwner {
        require(!blacklist[account], "CoinToken: Account is already blacklisted");
        blacklist[account] = true;
    }
    
    /**
     * @dev Remove the specified account from the blacklist.
     */
    function disableBlacklist(address account) public onlyOwner {
        require(blacklist[account], "CoinToken: Account is not blacklisted");
        blacklist[account] = false;
    }
    
    /**
     * @dev Excludes the specified account from tax.
     */
    function exclude(address account) public onlyOwner {
        require(!isExcluded(account), "CoinToken: Account is already excluded");
        excludeList[account] = true;
    }
    
    /**
     * @dev Re-enables tax on the specified account.
     */
    function removeExclude(address account) public onlyOwner {
        require(isExcluded(account), "CoinToken: Account is not excluded");
        excludeList[account] = false;
    }
    
    /**
     * @dev Sets tax for buys.
     */
    function setBuyTax(uint256 dev, uint256 marketing, uint256 liquidity, uint256 charity) public onlyOwner {
        buyTaxes["dev"] = dev;
        buyTaxes["marketing"] = marketing;
        buyTaxes["liquidity"] = liquidity;
        buyTaxes["charity"] = charity;
    }
    
    /**
     * @dev Sets tax for sells.
     */
    function setSellTax(uint256 dev, uint256 marketing, uint256 liquidity, uint256 charity) public onlyOwner {

        sellTaxes["dev"] = dev;
        sellTaxes["marketing"] = marketing;
        sellTaxes["liquidity"] = liquidity;
        sellTaxes["charity"] = charity;
    }
    
    /**
     * @dev Sets wallets for taxes.
     */
    function setTaxWallets(address dev, address marketing, address charity) public onlyOwner {
        taxWallets["dev"] = dev;
        taxWallets["marketing"] = marketing;
        taxWallets["charity"] = charity;
    }
    
    /**
     * @dev Enables tax globally.
     */
    function enableTax() public onlyOwner {
        require(!taxStatus, "CoinToken: Tax is already enabled");
        taxStatus = true;
    }
    
    /**
     * @dev Disables tax globally.
     */
    function disableTax() public onlyOwner {
        require(taxStatus, "CoinToken: Tax is already disabled");
        taxStatus = false;
    }
    
    /**
     * @dev Returns true if the account is blacklisted, and false otherwise.
     */
    function isBlacklisted(address account) public view returns (bool) {
        return blacklist[account];
    }
    
    /**
     * @dev Returns true if the account is excluded, and false otherwise.
     */
    function isExcluded(address account) public view returns (bool) {
        return excludeList[account];
    }
    
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"disableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeExclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dev","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"charity","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dev","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"charity","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"charity","type":"address"}],"name":"setTaxWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"triggerTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

606460075564746a528800600855601a805460ff19166001179055600a6080818152690dccaeae4c2d89ccae8b60b31b60a081905261010060405260c092835260e052906003620000518382620008c8565b506004620000608282620008c8565b50506005805460ff60a01b191690555069d3c21bcecceda1000000739ae6853880ccc15bfe8ebffc515ade6beb6957b4737a250d5630b4cf539739df2c5dacb4c659f2488d620000b0826200033b565b80601a60016101000a8154816001600160a01b0302191690836001600160a01b03160217905550601a60019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200012b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000151919062000994565b601b80546001600160a01b0319166001600160a01b03928316908117909155601a54604080516315ab88c960e31b81529051929363c9c6539693309361010090049091169163ad5c46489160048083019260209291908290030181865afa158015620001c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e7919062000994565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025b919062000994565b601c80546001600160a01b03199081166001600160a01b039384161790915560408051686c697175696469747960b81b8152601960098201529051908190036029019020805492851692909116919091179055620002bd60018080806200038d565b620002cc600180808062000480565b620002d98280806200055e565b620002e43362000651565b620002ef3062000651565b6040516001600160a01b038316903480156108fc02916000818181858888f1935050505015801562000325573d6000803e3d6000fd5b506200033233846200073a565b505050620009ee565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620003dc5760405162461bcd60e51b815260206004820181905260248201526000805160206200337d83398151915260448201526064015b60405180910390fd5b836017604051620003f690623232bb60e91b815260030190565b9081526040805191829003602001822092909255686d61726b6574696e6760b81b81526017600980830182905283519283900360299081018420889055686c697175696469747960b81b84529083018290529251918290039092018120849055666368617269747960c81b81528291906007015b9081526040519081900360200190205550505050565b6005546001600160a01b03163314620004cb5760405162461bcd60e51b815260206004820181905260248201526000805160206200337d8339815191526044820152606401620003d3565b836018604051620004e590623232bb60e91b815260030190565b9081526040805191829003602001822092909255686d61726b6574696e6760b81b81526018600980830182905283519283900360299081018420889055686c697175696469747960b81b84529083018290529251918290039092018120849055666368617269747960c81b81528291906007016200046a565b6005546001600160a01b03163314620005a95760405162461bcd60e51b815260206004820181905260248201526000805160206200337d8339815191526044820152606401620003d3565b826019604051620005c390623232bb60e91b815260030190565b9081526040805191829003602001822080546001600160a01b039485166001600160a01b031991821617909155686d61726b6574696e6760b81b83526019600984018190528251938490036029018420805497861697831697909717909655666368617269747960c81b83526007830195909552519081900360270190208054929091169190921617905550565b6005546001600160a01b031633146200069c5760405162461bcd60e51b815260206004820181905260248201526000805160206200337d8339815191526044820152606401620003d3565b6001600160a01b03811660009081526016602052604090205460ff1615620007165760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b6064820152608401620003d3565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6001600160a01b038216620007925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620003d3565b8060026000828254620007a69190620009c6565b90915550506001600160a01b03821660009081526020819052604081208054839290620007d5908490620009c6565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200084f57607f821691505b6020821081036200087057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200081f57600081815260208120601f850160051c810160208610156200089f5750805b601f850160051c820191505b81811015620008c057828155600101620008ab565b505050505050565b81516001600160401b03811115620008e457620008e462000824565b620008fc81620008f584546200083a565b8462000876565b602080601f8311600181146200093457600084156200091b5750858301515b600019600386901b1c1916600185901b178555620008c0565b600085815260208120601f198616915b82811015620009655788860151825594840194600190910190840162000944565b5085821015620009845787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009a757600080fd5b81516001600160a01b0381168114620009bf57600080fd5b9392505050565b80820180821115620009e857634e487b7160e01b600052601160045260246000fd5b92915050565b61297f80620009fe6000396000f3fe6080604052600436106101dc5760003560e01c8063717a865111610102578063a9059cbb11610095578063cfefd79e11610064578063cfefd79e1461052a578063dd62ed3e1461054a578063f2fde38b14610590578063fe575a87146105b057600080fd5b8063a9059cbb146104b5578063abe4f11d146104d5578063cba0e996146104f5578063ced695a41461051557600080fd5b806395d89b41116100d157806395d89b41146104405780639fda058114610455578063a457c2d714610475578063a82cfe8b1461049557600080fd5b8063717a8651146103c35780638456cb59146103e357806384666b08146103f85780638da5cb5b1461041857600080fd5b8063395093511161017a57806353eb3bcf1161014957806353eb3bcf146103445780635c975abb1461035957806370a0823114610378578063715018a6146103ae57600080fd5b806339509351146102cf5780633f4ba83a146102ef57806342966c68146103045780634febf53d1461032457600080fd5b806323a38a38116101b657806323a38a381461026257806323b872dd1461027c5780632c32abc21461029c578063313ce567146102b357600080fd5b806306fdde03146101e8578063095ea7b31461021357806318160ddd1461024357600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506101fd6105e9565b60405161020a9190612487565b60405180910390f35b34801561021f57600080fd5b5061023361022e3660046124ea565b61067b565b604051901515815260200161020a565b34801561024f57600080fd5b506002545b60405190815260200161020a565b34801561026e57600080fd5b50601a546102339060ff1681565b34801561028857600080fd5b50610233610297366004612516565b610692565b3480156102a857600080fd5b506102b1610743565b005b3480156102bf57600080fd5b506040516009815260200161020a565b3480156102db57600080fd5b506102336102ea3660046124ea565b610789565b3480156102fb57600080fd5b506102b16107c5565b34801561031057600080fd5b506102b161031f366004612557565b61085c565b34801561033057600080fd5b506102b161033f366004612570565b610890565b34801561035057600080fd5b506102b1610943565b34801561036557600080fd5b50600554600160a01b900460ff16610233565b34801561038457600080fd5b50610254610393366004612570565b6001600160a01b031660009081526020819052604090205490565b3480156103ba57600080fd5b506102b16109d9565b3480156103cf57600080fd5b506102b16103de366004612570565b610a0d565b3480156103ef57600080fd5b506102b1610ad6565b34801561040457600080fd5b506102b161041336600461258d565b610b70565b34801561042457600080fd5b506005546040516001600160a01b03909116815260200161020a565b34801561044c57600080fd5b506101fd610c22565b34801561046157600080fd5b506102b16104703660046125bf565b610c31565b34801561048157600080fd5b506102336104903660046124ea565b610d20565b3480156104a157600080fd5b506102b16104b036600461258d565b610db9565b3480156104c157600080fd5b506102336104d03660046124ea565b610e55565b3480156104e157600080fd5b506102b16104f0366004612570565b610e62565b34801561050157600080fd5b50610233610510366004612570565b610f0d565b34801561052157600080fd5b506102b1610f2b565b34801561053657600080fd5b506102b1610545366004612570565b610fbe565b34801561055657600080fd5b5061025461056536600461260a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561059c57600080fd5b506102b16105ab366004612570565b61107f565b3480156105bc57600080fd5b506102336105cb366004612570565b6001600160a01b031660009081526015602052604090205460ff1690565b6060600380546105f890612643565b80601f016020809104026020016040519081016040528092919081815260200182805461062490612643565b80156106715780601f1061064657610100808354040283529160200191610671565b820191906000526020600020905b81548152906001019060200180831161065457829003601f168201915b5050505050905090565b6000610688338484611117565b5060015b92915050565b600061069f84848461123b565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107295760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107368533858403611117565b60019150505b9392505050565b6005546001600160a01b0316331461076d5760405162461bcd60e51b81526004016107209061267d565b601c54610786906000906001600160a01b0316816113f6565b50565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106889185906107c09086906126c8565b611117565b6005546001600160a01b031633146107ef5760405162461bcd60e51b81526004016107209061267d565b600554600160a01b900460ff166108525760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a20436f6e7472616374206973206e6f742070617573656044820152601960fa1b6064820152608401610720565b61085a611ff3565b565b6005546001600160a01b031633146108865760405162461bcd60e51b81526004016107209061267d565b6107863382612090565b6005546001600160a01b031633146108ba5760405162461bcd60e51b81526004016107209061267d565b6108c381610f0d565b1561091f5760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b6064820152608401610720565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6005546001600160a01b0316331461096d5760405162461bcd60e51b81526004016107209061267d565b601a5460ff16156109ca5760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a2054617820697320616c726561647920656e61626c656044820152601960fa1b6064820152608401610720565b601a805460ff19166001179055565b6005546001600160a01b03163314610a035760405162461bcd60e51b81526004016107209061267d565b61085a60006121de565b6005546001600160a01b03163314610a375760405162461bcd60e51b81526004016107209061267d565b6001600160a01b03811660009081526015602052604090205460ff1615610ab25760405162461bcd60e51b815260206004820152602960248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920626c6044820152681858dadb1a5cdd195960ba1b6064820152608401610720565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b6005546001600160a01b03163314610b005760405162461bcd60e51b81526004016107209061267d565b600554600160a01b900460ff1615610b685760405162461bcd60e51b815260206004820152602560248201527f436f696e546f6b656e3a20436f6e747261637420697320616c72656164792070604482015264185d5cd95960da1b6064820152608401610720565b61085a612230565b6005546001600160a01b03163314610b9a5760405162461bcd60e51b81526004016107209061267d565b836018604051610ba9906126db565b908152602001604051809103902081905550826018604051610bca906126ea565b908152602001604051809103902081905550816018604051610beb906126ff565b908152602001604051809103902081905550806018604051610c0c90612714565b9081526040519081900360200190205550505050565b6060600480546105f890612643565b6005546001600160a01b03163314610c5b5760405162461bcd60e51b81526004016107209061267d565b826019604051610c6a906126db565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816019604051610cab906126ea565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806019604051610cec90612714565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610da25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610720565b610daf3385858403611117565b5060019392505050565b6005546001600160a01b03163314610de35760405162461bcd60e51b81526004016107209061267d565b836017604051610df2906126db565b908152602001604051809103902081905550826017604051610e13906126ea565b908152602001604051809103902081905550816017604051610e34906126ff565b908152602001604051809103902081905550806017604051610c0c90612714565b600061068833848461123b565b6005546001600160a01b03163314610e8c5760405162461bcd60e51b81526004016107209061267d565b610e9581610f0d565b610eec5760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a204163636f756e74206973206e6f74206578636c7564604482015261195960f21b6064820152608401610720565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6001600160a01b031660009081526016602052604090205460ff1690565b6005546001600160a01b03163314610f555760405162461bcd60e51b81526004016107209061267d565b601a5460ff16610fb25760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a2054617820697320616c72656164792064697361626c604482015261195960f21b6064820152608401610720565b601a805460ff19169055565b6005546001600160a01b03163314610fe85760405162461bcd60e51b81526004016107209061267d565b6001600160a01b03811660009081526015602052604090205460ff1661105e5760405162461bcd60e51b815260206004820152602560248201527f436f696e546f6b656e3a204163636f756e74206973206e6f7420626c61636b6c6044820152641a5cdd195960da1b6064820152608401610720565b6001600160a01b03166000908152601560205260409020805460ff19169055565b6005546001600160a01b031633146110a95760405162461bcd60e51b81526004016107209061267d565b6001600160a01b03811661110e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610720565b610786816121de565b6001600160a01b0383166111795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610720565b6001600160a01b0382166111da5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610720565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600554600160a01b900460ff16156112a45760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a20746f6b656e207472616e73666572207768696c65206044820152651c185d5cd95960d21b6064820152608401610720565b3360009081526015602052604090205460ff16156113045760405162461bcd60e51b815260206004820152601d60248201527f436f696e546f6b656e3a2073656e64657220626c61636b6c69737465640000006044820152606401610720565b6001600160a01b03821660009081526015602052604090205460ff161561136d5760405162461bcd60e51b815260206004820181905260248201527f436f696e546f6b656e3a20726563697069656e7420626c61636b6c69737465646044820152606401610720565b3260009081526015602052604090205460ff16156113cd5760405162461bcd60e51b815260206004820152601d60248201527f436f696e546f6b656e3a2073656e64657220626c61636b6c69737465640000006044820152606401610720565b601a5460ff16156113e6576113e38383836113f6565b90505b6113f18383836122b8565b505050565b60408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061142f5761142f61273d565b60200260200101906001600160a01b031690816001600160a01b031681525050601a60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c69190612753565b816001815181106114d9576114d961273d565b60200260200101906001600160a01b031690816001600160a01b03168152505061150285610f0d565b158015611515575061151384610f0d565b155b15611fea576000806007548561152b9190612770565b601c549091506001600160a01b0390811690881603611726576017604051611552906126ea565b9081526020016040518091039020548161156c9190612792565b61157690836126c8565b91506017604051611586906126db565b908152602001604051809103902054816115a09190612792565b6115aa90836126c8565b915060176040516115ba906126ff565b908152602001604051809103902054816115d49190612792565b6115de90836126c8565b915060176040516115ee90612714565b908152602001604051809103902054816116089190612792565b61161290836126c8565b915081156116255761162587308461123b565b6017604051611633906126ea565b9081526020016040518091039020548161164d9190612792565b601d600082825461165e91906126c8565b9091555050604051601790611672906126db565b9081526020016040518091039020548161168c9190612792565b601e600082825461169d91906126c8565b90915550506040516017906116b1906126ff565b908152602001604051809103902054816116cb9190612792565b601f60008282546116dc91906126c8565b90915550506040516017906116f090612714565b9081526020016040518091039020548161170a9190612792565b6020600082825461171b91906126c8565b90915550611fdb9050565b601c546001600160a01b0390811690871603611fdb57601860405161174a906126ea565b908152602001604051809103902054816117649190612792565b61176e90836126c8565b9150601860405161177e906126db565b908152602001604051809103902054816117989190612792565b6117a290836126c8565b915060186040516117b2906126ff565b908152602001604051809103902054816117cc9190612792565b6117d690836126c8565b915060186040516117e690612714565b908152602001604051809103902054816118009190612792565b61180a90836126c8565b9150811561181d5761181d87308461123b565b601860405161182b906126ea565b908152602001604051809103902054816118459190612792565b601d600082825461185691906126c8565b909155505060405160189061186a906126db565b908152602001604051809103902054816118849190612792565b601e600082825461189591906126c8565b90915550506040516018906118a9906126ff565b908152602001604051809103902054816118c39190612792565b601f60008282546118d491906126c8565b90915550506040516018906118e890612714565b908152602001604051809103902054816119029190612792565b6020600082825461191391906126c8565b925050819055506000602054601f54601e54601d5461193291906126c8565b61193c91906126c8565b61194691906126c8565b90508060000361195c578594505050505061073c565b6000601a60019054906101000a90046001600160a01b03166001600160a01b031663d06ca61f602054601f54601e54601d5461199891906126c8565b6119a291906126c8565b6119ac91906126c8565b876040518363ffffffff1660e01b81526004016119ca9291906127ed565b600060405180830381865afa1580156119e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a0f919081019061280e565b600181518110611a2157611a2161273d565b602002602001015190506008548110611fd857602054601f544791600091611a4b90600290612770565b601e54601d54611a5b91906126c8565b611a6591906126c8565b611a6f91906126c8565b9050611a9130601a60019054906101000a90046001600160a01b031683611117565b601a546040516318cbafe560e01b81526101009091046001600160a01b0316906318cbafe590611ace9084906000908c90309042906004016128cc565b6000604051808303816000875af1158015611aed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b15919081019061280e565b506000611b228347612908565b905060006002601f54611b359190612770565b90506000633b9aca00876002601f54611b4e9190612770565b611b5c90633b9aca00612792565b611b669190612770565b611b709085612792565b611b7a9190612770565b90506000633b9aca0088601d54633b9aca00611b969190612792565b611ba09190612770565b611baa9086612792565b611bb49190612770565b90506000633b9aca0089601e54633b9aca00611bd09190612792565b611bda9190612770565b611be49087612792565b611bee9190612770565b90506000633b9aca008a602054633b9aca00611c0a9190612792565b611c149190612770565b611c1e9088612792565b611c289190612770565b9050611c4a30601a60019054906101000a90046001600160a01b031687611117565b6000806000601a60019054906101000a90046001600160a01b03166001600160a01b031663f305d71988308b6000806019604051611c87906126ff565b908152604051908190036020018120546001600160e01b031960e089901b1682526001600160a01b039586166004830152602482019490945260448101929092526064820152911660848201524260a482015260c40160606040518083038185885af1158015611cfb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d20919061291b565b919450925090506000611d33848c6126c8565b602054601f54601e54601d54611d4991906126c8565b611d5391906126c8565b611d5d91906126c8565b611d679190612908565b90508015611da057611da0306019604051611d81906126db565b908152604051908190036020019020546001600160a01b03168361123b565b6019604051611dae906126ea565b908152604051908190036020018120546001600160a01b031690889060006040518083038185875af1925050503d8060008114611e07576040519150601f19603f3d011682016040523d82523d6000602084013e611e0c565b606091505b5050506019604051611e1d906126db565b908152604051908190036020018120546001600160a01b031690879060006040518083038185875af1925050503d8060008114611e76576040519150601f19603f3d011682016040523d82523d6000602084013e611e7b565b606091505b5050506019604051611e8c90612714565b908152604051908190036020018120546001600160a01b031690869060006040518083038185875af1925050503d8060008114611ee5576040519150601f19603f3d011682016040523d82523d6000602084013e611eea565b606091505b50505060008589888a611efd91906126c8565b611f0791906126c8565b611f1191906126c8565b611f1b908c612908565b1115611fb7576019604051611f2f906126ea565b908152604051908190036020019020546001600160a01b03168589611f54898b6126c8565b611f5e91906126c8565b611f6891906126c8565b611f72908c612908565b604051600081818185875af1925050503d8060008114611fae576040519150601f19603f3d011682016040523d82523d6000602084013e611fb3565b606091505b5050505b50506000601d819055601e819055601f819055602055505050505050505050505b50505b611fe58286612908565b945050505b50909392505050565b600554600160a01b900460ff166120435760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610720565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166120f05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610720565b6001600160a01b038216600090815260208190526040902054818110156121645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610720565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612193908490612908565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff161561227d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610720565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120733390565b6001600160a01b03831661231c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610720565b6001600160a01b03821661237e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610720565b6001600160a01b038316600090815260208190526040902054818110156123f65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610720565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061242d9084906126c8565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161247991815260200190565b60405180910390a350505050565b600060208083528351808285015260005b818110156124b457858101830151858201604001528201612498565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461078657600080fd5b600080604083850312156124fd57600080fd5b8235612508816124d5565b946020939093013593505050565b60008060006060848603121561252b57600080fd5b8335612536816124d5565b92506020840135612546816124d5565b929592945050506040919091013590565b60006020828403121561256957600080fd5b5035919050565b60006020828403121561258257600080fd5b813561073c816124d5565b600080600080608085870312156125a357600080fd5b5050823594602084013594506040840135936060013592509050565b6000806000606084860312156125d457600080fd5b83356125df816124d5565b925060208401356125ef816124d5565b915060408401356125ff816124d5565b809150509250925092565b6000806040838503121561261d57600080fd5b8235612628816124d5565b91506020830135612638816124d5565b809150509250929050565b600181811c9082168061265757607f821691505b60208210810361267757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561068c5761068c6126b2565b623232bb60e91b815260030190565b686d61726b6574696e6760b81b815260090190565b686c697175696469747960b81b815260090190565b666368617269747960c81b815260070190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561276557600080fd5b815161073c816124d5565b60008261278d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761068c5761068c6126b2565b600081518084526020808501945080840160005b838110156127e25781516001600160a01b0316875295820195908201906001016127bd565b509495945050505050565b82815260406020820152600061280660408301846127a9565b949350505050565b6000602080838503121561282157600080fd5b825167ffffffffffffffff8082111561283957600080fd5b818501915085601f83011261284d57600080fd5b81518181111561285f5761285f612727565b8060051b604051601f19603f8301168101818110858211171561288457612884612727565b6040529182528482019250838101850191888311156128a257600080fd5b938501935b828510156128c0578451845293850193928501926128a7565b98975050505050505050565b85815284602082015260a0604082015260006128eb60a08301866127a9565b6001600160a01b0394909416606083015250608001529392505050565b8181038181111561068c5761068c6126b2565b60008060006060848603121561293057600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220df522746ea40adb223dbcdf8bed2187e48b94d62058cef523e3d151742b04d7764736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c8063717a865111610102578063a9059cbb11610095578063cfefd79e11610064578063cfefd79e1461052a578063dd62ed3e1461054a578063f2fde38b14610590578063fe575a87146105b057600080fd5b8063a9059cbb146104b5578063abe4f11d146104d5578063cba0e996146104f5578063ced695a41461051557600080fd5b806395d89b41116100d157806395d89b41146104405780639fda058114610455578063a457c2d714610475578063a82cfe8b1461049557600080fd5b8063717a8651146103c35780638456cb59146103e357806384666b08146103f85780638da5cb5b1461041857600080fd5b8063395093511161017a57806353eb3bcf1161014957806353eb3bcf146103445780635c975abb1461035957806370a0823114610378578063715018a6146103ae57600080fd5b806339509351146102cf5780633f4ba83a146102ef57806342966c68146103045780634febf53d1461032457600080fd5b806323a38a38116101b657806323a38a381461026257806323b872dd1461027c5780632c32abc21461029c578063313ce567146102b357600080fd5b806306fdde03146101e8578063095ea7b31461021357806318160ddd1461024357600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506101fd6105e9565b60405161020a9190612487565b60405180910390f35b34801561021f57600080fd5b5061023361022e3660046124ea565b61067b565b604051901515815260200161020a565b34801561024f57600080fd5b506002545b60405190815260200161020a565b34801561026e57600080fd5b50601a546102339060ff1681565b34801561028857600080fd5b50610233610297366004612516565b610692565b3480156102a857600080fd5b506102b1610743565b005b3480156102bf57600080fd5b506040516009815260200161020a565b3480156102db57600080fd5b506102336102ea3660046124ea565b610789565b3480156102fb57600080fd5b506102b16107c5565b34801561031057600080fd5b506102b161031f366004612557565b61085c565b34801561033057600080fd5b506102b161033f366004612570565b610890565b34801561035057600080fd5b506102b1610943565b34801561036557600080fd5b50600554600160a01b900460ff16610233565b34801561038457600080fd5b50610254610393366004612570565b6001600160a01b031660009081526020819052604090205490565b3480156103ba57600080fd5b506102b16109d9565b3480156103cf57600080fd5b506102b16103de366004612570565b610a0d565b3480156103ef57600080fd5b506102b1610ad6565b34801561040457600080fd5b506102b161041336600461258d565b610b70565b34801561042457600080fd5b506005546040516001600160a01b03909116815260200161020a565b34801561044c57600080fd5b506101fd610c22565b34801561046157600080fd5b506102b16104703660046125bf565b610c31565b34801561048157600080fd5b506102336104903660046124ea565b610d20565b3480156104a157600080fd5b506102b16104b036600461258d565b610db9565b3480156104c157600080fd5b506102336104d03660046124ea565b610e55565b3480156104e157600080fd5b506102b16104f0366004612570565b610e62565b34801561050157600080fd5b50610233610510366004612570565b610f0d565b34801561052157600080fd5b506102b1610f2b565b34801561053657600080fd5b506102b1610545366004612570565b610fbe565b34801561055657600080fd5b5061025461056536600461260a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561059c57600080fd5b506102b16105ab366004612570565b61107f565b3480156105bc57600080fd5b506102336105cb366004612570565b6001600160a01b031660009081526015602052604090205460ff1690565b6060600380546105f890612643565b80601f016020809104026020016040519081016040528092919081815260200182805461062490612643565b80156106715780601f1061064657610100808354040283529160200191610671565b820191906000526020600020905b81548152906001019060200180831161065457829003601f168201915b5050505050905090565b6000610688338484611117565b5060015b92915050565b600061069f84848461123b565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107295760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107368533858403611117565b60019150505b9392505050565b6005546001600160a01b0316331461076d5760405162461bcd60e51b81526004016107209061267d565b601c54610786906000906001600160a01b0316816113f6565b50565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106889185906107c09086906126c8565b611117565b6005546001600160a01b031633146107ef5760405162461bcd60e51b81526004016107209061267d565b600554600160a01b900460ff166108525760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a20436f6e7472616374206973206e6f742070617573656044820152601960fa1b6064820152608401610720565b61085a611ff3565b565b6005546001600160a01b031633146108865760405162461bcd60e51b81526004016107209061267d565b6107863382612090565b6005546001600160a01b031633146108ba5760405162461bcd60e51b81526004016107209061267d565b6108c381610f0d565b1561091f5760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b6064820152608401610720565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6005546001600160a01b0316331461096d5760405162461bcd60e51b81526004016107209061267d565b601a5460ff16156109ca5760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a2054617820697320616c726561647920656e61626c656044820152601960fa1b6064820152608401610720565b601a805460ff19166001179055565b6005546001600160a01b03163314610a035760405162461bcd60e51b81526004016107209061267d565b61085a60006121de565b6005546001600160a01b03163314610a375760405162461bcd60e51b81526004016107209061267d565b6001600160a01b03811660009081526015602052604090205460ff1615610ab25760405162461bcd60e51b815260206004820152602960248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920626c6044820152681858dadb1a5cdd195960ba1b6064820152608401610720565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b6005546001600160a01b03163314610b005760405162461bcd60e51b81526004016107209061267d565b600554600160a01b900460ff1615610b685760405162461bcd60e51b815260206004820152602560248201527f436f696e546f6b656e3a20436f6e747261637420697320616c72656164792070604482015264185d5cd95960da1b6064820152608401610720565b61085a612230565b6005546001600160a01b03163314610b9a5760405162461bcd60e51b81526004016107209061267d565b836018604051610ba9906126db565b908152602001604051809103902081905550826018604051610bca906126ea565b908152602001604051809103902081905550816018604051610beb906126ff565b908152602001604051809103902081905550806018604051610c0c90612714565b9081526040519081900360200190205550505050565b6060600480546105f890612643565b6005546001600160a01b03163314610c5b5760405162461bcd60e51b81526004016107209061267d565b826019604051610c6a906126db565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550816019604051610cab906126ea565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806019604051610cec90612714565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610da25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610720565b610daf3385858403611117565b5060019392505050565b6005546001600160a01b03163314610de35760405162461bcd60e51b81526004016107209061267d565b836017604051610df2906126db565b908152602001604051809103902081905550826017604051610e13906126ea565b908152602001604051809103902081905550816017604051610e34906126ff565b908152602001604051809103902081905550806017604051610c0c90612714565b600061068833848461123b565b6005546001600160a01b03163314610e8c5760405162461bcd60e51b81526004016107209061267d565b610e9581610f0d565b610eec5760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a204163636f756e74206973206e6f74206578636c7564604482015261195960f21b6064820152608401610720565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6001600160a01b031660009081526016602052604090205460ff1690565b6005546001600160a01b03163314610f555760405162461bcd60e51b81526004016107209061267d565b601a5460ff16610fb25760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a2054617820697320616c72656164792064697361626c604482015261195960f21b6064820152608401610720565b601a805460ff19169055565b6005546001600160a01b03163314610fe85760405162461bcd60e51b81526004016107209061267d565b6001600160a01b03811660009081526015602052604090205460ff1661105e5760405162461bcd60e51b815260206004820152602560248201527f436f696e546f6b656e3a204163636f756e74206973206e6f7420626c61636b6c6044820152641a5cdd195960da1b6064820152608401610720565b6001600160a01b03166000908152601560205260409020805460ff19169055565b6005546001600160a01b031633146110a95760405162461bcd60e51b81526004016107209061267d565b6001600160a01b03811661110e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610720565b610786816121de565b6001600160a01b0383166111795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610720565b6001600160a01b0382166111da5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610720565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600554600160a01b900460ff16156112a45760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a20746f6b656e207472616e73666572207768696c65206044820152651c185d5cd95960d21b6064820152608401610720565b3360009081526015602052604090205460ff16156113045760405162461bcd60e51b815260206004820152601d60248201527f436f696e546f6b656e3a2073656e64657220626c61636b6c69737465640000006044820152606401610720565b6001600160a01b03821660009081526015602052604090205460ff161561136d5760405162461bcd60e51b815260206004820181905260248201527f436f696e546f6b656e3a20726563697069656e7420626c61636b6c69737465646044820152606401610720565b3260009081526015602052604090205460ff16156113cd5760405162461bcd60e51b815260206004820152601d60248201527f436f696e546f6b656e3a2073656e64657220626c61636b6c69737465640000006044820152606401610720565b601a5460ff16156113e6576113e38383836113f6565b90505b6113f18383836122b8565b505050565b60408051600280825260608201835260009283929190602083019080368337019050509050308160008151811061142f5761142f61273d565b60200260200101906001600160a01b031690816001600160a01b031681525050601a60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c69190612753565b816001815181106114d9576114d961273d565b60200260200101906001600160a01b031690816001600160a01b03168152505061150285610f0d565b158015611515575061151384610f0d565b155b15611fea576000806007548561152b9190612770565b601c549091506001600160a01b0390811690881603611726576017604051611552906126ea565b9081526020016040518091039020548161156c9190612792565b61157690836126c8565b91506017604051611586906126db565b908152602001604051809103902054816115a09190612792565b6115aa90836126c8565b915060176040516115ba906126ff565b908152602001604051809103902054816115d49190612792565b6115de90836126c8565b915060176040516115ee90612714565b908152602001604051809103902054816116089190612792565b61161290836126c8565b915081156116255761162587308461123b565b6017604051611633906126ea565b9081526020016040518091039020548161164d9190612792565b601d600082825461165e91906126c8565b9091555050604051601790611672906126db565b9081526020016040518091039020548161168c9190612792565b601e600082825461169d91906126c8565b90915550506040516017906116b1906126ff565b908152602001604051809103902054816116cb9190612792565b601f60008282546116dc91906126c8565b90915550506040516017906116f090612714565b9081526020016040518091039020548161170a9190612792565b6020600082825461171b91906126c8565b90915550611fdb9050565b601c546001600160a01b0390811690871603611fdb57601860405161174a906126ea565b908152602001604051809103902054816117649190612792565b61176e90836126c8565b9150601860405161177e906126db565b908152602001604051809103902054816117989190612792565b6117a290836126c8565b915060186040516117b2906126ff565b908152602001604051809103902054816117cc9190612792565b6117d690836126c8565b915060186040516117e690612714565b908152602001604051809103902054816118009190612792565b61180a90836126c8565b9150811561181d5761181d87308461123b565b601860405161182b906126ea565b908152602001604051809103902054816118459190612792565b601d600082825461185691906126c8565b909155505060405160189061186a906126db565b908152602001604051809103902054816118849190612792565b601e600082825461189591906126c8565b90915550506040516018906118a9906126ff565b908152602001604051809103902054816118c39190612792565b601f60008282546118d491906126c8565b90915550506040516018906118e890612714565b908152602001604051809103902054816119029190612792565b6020600082825461191391906126c8565b925050819055506000602054601f54601e54601d5461193291906126c8565b61193c91906126c8565b61194691906126c8565b90508060000361195c578594505050505061073c565b6000601a60019054906101000a90046001600160a01b03166001600160a01b031663d06ca61f602054601f54601e54601d5461199891906126c8565b6119a291906126c8565b6119ac91906126c8565b876040518363ffffffff1660e01b81526004016119ca9291906127ed565b600060405180830381865afa1580156119e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a0f919081019061280e565b600181518110611a2157611a2161273d565b602002602001015190506008548110611fd857602054601f544791600091611a4b90600290612770565b601e54601d54611a5b91906126c8565b611a6591906126c8565b611a6f91906126c8565b9050611a9130601a60019054906101000a90046001600160a01b031683611117565b601a546040516318cbafe560e01b81526101009091046001600160a01b0316906318cbafe590611ace9084906000908c90309042906004016128cc565b6000604051808303816000875af1158015611aed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b15919081019061280e565b506000611b228347612908565b905060006002601f54611b359190612770565b90506000633b9aca00876002601f54611b4e9190612770565b611b5c90633b9aca00612792565b611b669190612770565b611b709085612792565b611b7a9190612770565b90506000633b9aca0088601d54633b9aca00611b969190612792565b611ba09190612770565b611baa9086612792565b611bb49190612770565b90506000633b9aca0089601e54633b9aca00611bd09190612792565b611bda9190612770565b611be49087612792565b611bee9190612770565b90506000633b9aca008a602054633b9aca00611c0a9190612792565b611c149190612770565b611c1e9088612792565b611c289190612770565b9050611c4a30601a60019054906101000a90046001600160a01b031687611117565b6000806000601a60019054906101000a90046001600160a01b03166001600160a01b031663f305d71988308b6000806019604051611c87906126ff565b908152604051908190036020018120546001600160e01b031960e089901b1682526001600160a01b039586166004830152602482019490945260448101929092526064820152911660848201524260a482015260c40160606040518083038185885af1158015611cfb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d20919061291b565b919450925090506000611d33848c6126c8565b602054601f54601e54601d54611d4991906126c8565b611d5391906126c8565b611d5d91906126c8565b611d679190612908565b90508015611da057611da0306019604051611d81906126db565b908152604051908190036020019020546001600160a01b03168361123b565b6019604051611dae906126ea565b908152604051908190036020018120546001600160a01b031690889060006040518083038185875af1925050503d8060008114611e07576040519150601f19603f3d011682016040523d82523d6000602084013e611e0c565b606091505b5050506019604051611e1d906126db565b908152604051908190036020018120546001600160a01b031690879060006040518083038185875af1925050503d8060008114611e76576040519150601f19603f3d011682016040523d82523d6000602084013e611e7b565b606091505b5050506019604051611e8c90612714565b908152604051908190036020018120546001600160a01b031690869060006040518083038185875af1925050503d8060008114611ee5576040519150601f19603f3d011682016040523d82523d6000602084013e611eea565b606091505b50505060008589888a611efd91906126c8565b611f0791906126c8565b611f1191906126c8565b611f1b908c612908565b1115611fb7576019604051611f2f906126ea565b908152604051908190036020019020546001600160a01b03168589611f54898b6126c8565b611f5e91906126c8565b611f6891906126c8565b611f72908c612908565b604051600081818185875af1925050503d8060008114611fae576040519150601f19603f3d011682016040523d82523d6000602084013e611fb3565b606091505b5050505b50506000601d819055601e819055601f819055602055505050505050505050505b50505b611fe58286612908565b945050505b50909392505050565b600554600160a01b900460ff166120435760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610720565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166120f05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610720565b6001600160a01b038216600090815260208190526040902054818110156121645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610720565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612193908490612908565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff161561227d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610720565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120733390565b6001600160a01b03831661231c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610720565b6001600160a01b03821661237e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610720565b6001600160a01b038316600090815260208190526040902054818110156123f65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610720565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061242d9084906126c8565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161247991815260200190565b60405180910390a350505050565b600060208083528351808285015260005b818110156124b457858101830151858201604001528201612498565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461078657600080fd5b600080604083850312156124fd57600080fd5b8235612508816124d5565b946020939093013593505050565b60008060006060848603121561252b57600080fd5b8335612536816124d5565b92506020840135612546816124d5565b929592945050506040919091013590565b60006020828403121561256957600080fd5b5035919050565b60006020828403121561258257600080fd5b813561073c816124d5565b600080600080608085870312156125a357600080fd5b5050823594602084013594506040840135936060013592509050565b6000806000606084860312156125d457600080fd5b83356125df816124d5565b925060208401356125ef816124d5565b915060408401356125ff816124d5565b809150509250925092565b6000806040838503121561261d57600080fd5b8235612628816124d5565b91506020830135612638816124d5565b809150509250929050565b600181811c9082168061265757607f821691505b60208210810361267757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561068c5761068c6126b2565b623232bb60e91b815260030190565b686d61726b6574696e6760b81b815260090190565b686c697175696469747960b81b815260090190565b666368617269747960c81b815260070190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561276557600080fd5b815161073c816124d5565b60008261278d57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761068c5761068c6126b2565b600081518084526020808501945080840160005b838110156127e25781516001600160a01b0316875295820195908201906001016127bd565b509495945050505050565b82815260406020820152600061280660408301846127a9565b949350505050565b6000602080838503121561282157600080fd5b825167ffffffffffffffff8082111561283957600080fd5b818501915085601f83011261284d57600080fd5b81518181111561285f5761285f612727565b8060051b604051601f19603f8301168101818110858211171561288457612884612727565b6040529182528482019250838101850191888311156128a257600080fd5b938501935b828510156128c0578451845293850193928501926128a7565b98975050505050505050565b85815284602082015260a0604082015260006128eb60a08301866127a9565b6001600160a01b0394909416606083015250608001529392505050565b8181038181111561068c5761068c6126b2565b60008060006060848603121561293057600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220df522746ea40adb223dbcdf8bed2187e48b94d62058cef523e3d151742b04d7764736f6c63430008130033

Deployed Bytecode Sourcemap

28856:12090:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6607:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8773:169;;;;;;;;;;-1:-1:-1;8773:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;8773:169:0;1023:187:1;7726:108:0;;;;;;;;;;-1:-1:-1;7814:12:0;;7726:108;;;1361:25:1;;;1349:2;1334:18;7726:108:0;1215:177:1;29933:28:0;;;;;;;;;;-1:-1:-1;29933:28:0;;;;;;;;9424:492;;;;;;;;;;-1:-1:-1;9424:492:0;;;;;:::i;:::-;;:::i;37299:106::-;;;;;;;;;;;;;:::i;:::-;;7569:92;;;;;;;;;;-1:-1:-1;7569:92:0;;7652:1;2000:36:1;;1988:2;1973:18;7569:92:0;1858:184:1;10325:215:0;;;;;;;;;;-1:-1:-1;10325:215:0;;;;;:::i;:::-;;:::i;37682:130::-;;;;;;;;;;;;;:::i;37889:91::-;;;;;;;;;;-1:-1:-1;37889:91:0;;;;;:::i;:::-;;:::i;38649:179::-;;;;;;;;;;-1:-1:-1;38649:179:0;;;;;:::i;:::-;;:::i;40120:140::-;;;;;;;;;;;;;:::i;19707:86::-;;;;;;;;;;-1:-1:-1;19778:7:0;;-1:-1:-1;;;19778:7:0;;;;19707:86;;7897:127;;;;;;;;;;-1:-1:-1;7897:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;7998:18:0;7971:7;7998:18;;;;;;;;;;;;7897:127;18094:94;;;;;;;;;;;;;:::i;38102:187::-;;;;;;;;;;-1:-1:-1;38102:187:0;;;;;:::i;:::-;;:::i;37479:131::-;;;;;;;;;;;;;:::i;39490:279::-;;;;;;;;;;-1:-1:-1;39490:279:0;;;;;:::i;:::-;;:::i;17443:87::-;;;;;;;;;;-1:-1:-1;17516:6:0;;17443:87;;-1:-1:-1;;;;;17516:6:0;;;3020:51:1;;3008:2;2993:18;17443:87:0;2874:203:1;6826:104:0;;;;;;;;;;;;;:::i;39836:219::-;;;;;;;;;;-1:-1:-1;39836:219:0;;;;;:::i;:::-;;:::i;11043:413::-;;;;;;;;;;-1:-1:-1;11043:413:0;;;;;:::i;:::-;;:::i;39155:272::-;;;;;;;;;;-1:-1:-1;39155:272:0;;;;;:::i;:::-;;:::i;8237:175::-;;;;;;;;;;-1:-1:-1;8237:175:0;;;;;:::i;:::-;;:::i;38912:181::-;;;;;;;;;;-1:-1:-1;38912:181:0;;;;;:::i;:::-;;:::i;40792:110::-;;;;;;;;;;-1:-1:-1;40792:110:0;;;;;:::i;:::-;;:::i;40326:142::-;;;;;;;;;;;;;:::i;38381:184::-;;;;;;;;;;-1:-1:-1;38381:184:0;;;;;:::i;:::-;;:::i;8475:151::-;;;;;;;;;;-1:-1:-1;8475:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;8591:18:0;;;8564:7;8591:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8475:151;18343:192;;;;;;;;;;-1:-1:-1;18343:192:0;;;;;:::i;:::-;;:::i;40576:111::-;;;;;;;;;;-1:-1:-1;40576:111:0;;;;;:::i;:::-;-1:-1:-1;;;;;40661:18:0;40637:4;40661:18;;;:9;:18;;;;;;;;;40576:111;6607:100;6661:13;6694:5;6687:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6607:100;:::o;8773:169::-;8856:4;8873:39;4506:10;8896:7;8905:6;8873:8;:39::i;:::-;-1:-1:-1;8930:4:0;8773:169;;;;;:::o;9424:492::-;9564:4;9581:36;9591:6;9599:9;9610:6;9581:9;:36::i;:::-;-1:-1:-1;;;;;9657:19:0;;9630:24;9657:19;;;:11;:19;;;;;;;;4506:10;9657:33;;;;;;;;9709:26;;;;9701:79;;;;-1:-1:-1;;;9701:79:0;;4596:2:1;9701:79:0;;;4578:21:1;4635:2;4615:18;;;4608:30;4674:34;4654:18;;;4647:62;-1:-1:-1;;;4725:18:1;;;4718:38;4773:19;;9701:79:0;;;;;;;;;9816:57;9825:6;4506:10;9866:6;9847:16;:25;9816:8;:57::i;:::-;9904:4;9897:11;;;9424:492;;;;;;:::o;37299:106::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;37379:13:::1;::::0;37349:48:::1;::::0;37367:1:::1;::::0;-1:-1:-1;;;;;37379:13:0::1;37367:1:::0;37349:9:::1;:48::i;:::-;;37299:106::o:0;10325:215::-;4506:10;10413:4;10462:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10462:34:0;;;;;;;;;;10413:4;;10430:80;;10453:7;;10462:47;;10499:10;;10462:47;:::i;:::-;10430:8;:80::i;37682:130::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;19778:7;;-1:-1:-1;;;19778:7:0;;;;37729:54:::1;;;::::0;-1:-1:-1;;;37729:54:0;;5628:2:1;37729:54:0::1;::::0;::::1;5610:21:1::0;5667:2;5647:18;;;5640:30;5706:34;5686:18;;;5679:62;-1:-1:-1;;;5757:18:1;;;5750:31;5798:19;;37729:54:0::1;5426:397:1::0;37729:54:0::1;37794:10;:8;:10::i;:::-;37682:130::o:0;37889:91::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;37947:25:::1;37953:10;37965:6;37947:5;:25::i;38649:179::-:0;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;38720:19:::1;38731:7;38720:10;:19::i;:::-;38719:20;38711:71;;;::::0;-1:-1:-1;;;38711:71:0;;6030:2:1;38711:71:0::1;::::0;::::1;6012:21:1::0;6069:2;6049:18;;;6042:30;6108:34;6088:18;;;6081:62;-1:-1:-1;;;6159:18:1;;;6152:36;6205:19;;38711:71:0::1;5828:402:1::0;38711:71:0::1;-1:-1:-1::0;;;;;38793:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;38793:27:0::1;38816:4;38793:27;::::0;;38649:179::o;40120:140::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;40178:9:::1;::::0;::::1;;40177:10;40169:56;;;::::0;-1:-1:-1;;;40169:56:0;;6437:2:1;40169:56:0::1;::::0;::::1;6419:21:1::0;6476:2;6456:18;;;6449:30;6515:34;6495:18;;;6488:62;-1:-1:-1;;;6566:18:1;;;6559:31;6607:19;;40169:56:0::1;6235:397:1::0;40169:56:0::1;40236:9;:16:::0;;-1:-1:-1;;40236:16:0::1;40248:4;40236:16;::::0;;40120:140::o;18094:94::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;18159:21:::1;18177:1;18159:9;:21::i;38102:187::-:0;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38181:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;38180:19;38172:73;;;::::0;-1:-1:-1;;;38172:73:0;;6839:2:1;38172:73:0::1;::::0;::::1;6821:21:1::0;6878:2;6858:18;;;6851:30;6917:34;6897:18;;;6890:62;-1:-1:-1;;;6968:18:1;;;6961:39;7017:19;;38172:73:0::1;6637:405:1::0;38172:73:0::1;-1:-1:-1::0;;;;;38256:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;:25;;-1:-1:-1;;38256:25:0::1;38277:4;38256:25;::::0;;38102:187::o;37479:131::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;19778:7;;-1:-1:-1;;;19778:7:0;;;;37532:9:::1;37524:59;;;::::0;-1:-1:-1;;;37524:59:0;;7249:2:1;37524:59:0::1;::::0;::::1;7231:21:1::0;7288:2;7268:18;;;7261:30;7327:34;7307:18;;;7300:62;-1:-1:-1;;;7378:18:1;;;7371:35;7423:19;;37524:59:0::1;7047:401:1::0;37524:59:0::1;37594:8;:6;:8::i;39490:279::-:0;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;39627:3:::1;39608:9;:16;;;;;:::i;:::-;;;;;;;;;;;;;:22;;;;39666:9;39641;:22;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;39711:9;39686;:22;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;39754:7;39731:9;:20;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:30;-1:-1:-1;;;;39490:279:0:o;6826:104::-;6882:13;6915:7;6908:14;;;;;:::i;39836:219::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;39956:3:::1;39936:10;:17;;;;;:::i;:::-;;;;;;;;;;;;;;:23;;;;;-1:-1:-1::0;;;;;39936:23:0::1;;;;;-1:-1:-1::0;;;;;39936:23:0::1;;;;;;39996:9;39970:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;;;;-1:-1:-1::0;;;;;39970:35:0::1;;;;;-1:-1:-1::0;;;;;39970:35:0::1;;;;;;40040:7;40016:10;:21;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:31;;-1:-1:-1;;;;;40016:31:0;;;::::1;-1:-1:-1::0;;;;;;40016:31:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;39836:219:0:o;11043:413::-;4506:10;11136:4;11180:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11180:34:0;;;;;;;;;;11233:35;;;;11225:85;;;;-1:-1:-1;;;11225:85:0;;8703:2:1;11225:85:0;;;8685:21:1;8742:2;8722:18;;;8715:30;8781:34;8761:18;;;8754:62;-1:-1:-1;;;8832:18:1;;;8825:35;8877:19;;11225:85:0;8501:401:1;11225:85:0;11346:67;4506:10;11369:7;11397:15;11378:16;:34;11346:8;:67::i;:::-;-1:-1:-1;11444:4:0;;11043:413;-1:-1:-1;;;11043:413:0:o;39155:272::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;39288:3:::1;39270:8;:15;;;;;:::i;:::-;;;;;;;;;;;;;:21;;;;39326:9;39302:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;;39370:9;39346:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;;39412:7;39390:8;:19;;;;;:::i;8237:175::-:0;8323:4;8340:42;4506:10;8364:9;8375:6;8340:9;:42::i;38912:181::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;38988:19:::1;38999:7;38988:10;:19::i;:::-;38980:66;;;::::0;-1:-1:-1;;;38980:66:0;;9109:2:1;38980:66:0::1;::::0;::::1;9091:21:1::0;9148:2;9128:18;;;9121:30;9187:34;9167:18;;;9160:62;-1:-1:-1;;;9238:18:1;;;9231:32;9280:19;;38980:66:0::1;8907:398:1::0;38980:66:0::1;-1:-1:-1::0;;;;;39057:20:0::1;39080:5;39057:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;39057:28:0::1;::::0;;38912:181::o;40792:110::-;-1:-1:-1;;;;;40874:20:0;40850:4;40874:20;;;:11;:20;;;;;;;;;40792:110::o;40326:142::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;40384:9:::1;::::0;::::1;;40376:56;;;::::0;-1:-1:-1;;;40376:56:0;;9512:2:1;40376:56:0::1;::::0;::::1;9494:21:1::0;9551:2;9531:18;;;9524:30;9590:34;9570:18;;;9563:62;-1:-1:-1;;;9641:18:1;;;9634:32;9683:19;;40376:56:0::1;9310:398:1::0;40376:56:0::1;40443:9;:17:::0;;-1:-1:-1;;40443:17:0::1;::::0;;40326:142::o;38381:184::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38460:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;38452:68;;;::::0;-1:-1:-1;;;38452:68:0;;9915:2:1;38452:68:0::1;::::0;::::1;9897:21:1::0;9954:2;9934:18;;;9927:30;9993:34;9973:18;;;9966:62;-1:-1:-1;;;10044:18:1;;;10037:35;10089:19;;38452:68:0::1;9713:401:1::0;38452:68:0::1;-1:-1:-1::0;;;;;38531:18:0::1;38552:5;38531:18:::0;;;:9:::1;:18;::::0;;;;:26;;-1:-1:-1;;38531:26:0::1;::::0;;38381:184::o;18343:192::-;17516:6;;-1:-1:-1;;;;;17516:6:0;4506:10;17663:23;17655:68;;;;-1:-1:-1;;;17655:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18432:22:0;::::1;18424:73;;;::::0;-1:-1:-1;;;18424:73:0;;10321:2:1;18424:73:0::1;::::0;::::1;10303:21:1::0;10360:2;10340:18;;;10333:30;10399:34;10379:18;;;10372:62;-1:-1:-1;;;10450:18:1;;;10443:36;10496:19;;18424:73:0::1;10119:402:1::0;18424:73:0::1;18508:19;18518:8;18508:9;:19::i;14727:380::-:0;-1:-1:-1;;;;;14863:19:0;;14855:68;;;;-1:-1:-1;;;14855:68:0;;10728:2:1;14855:68:0;;;10710:21:1;10767:2;10747:18;;;10740:30;10806:34;10786:18;;;10779:62;-1:-1:-1;;;10857:18:1;;;10850:34;10901:19;;14855:68:0;10526:400:1;14855:68:0;-1:-1:-1;;;;;14942:21:0;;14934:68;;;;-1:-1:-1;;;14934:68:0;;11133:2:1;14934:68:0;;;11115:21:1;11172:2;11152:18;;;11145:30;11211:34;11191:18;;;11184:62;-1:-1:-1;;;11262:18:1;;;11255:32;11304:19;;14934:68:0;10931:398:1;14934:68:0;-1:-1:-1;;;;;15015:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15067:32;;1361:25:1;;;15067:32:0;;1334:18:1;15067:32:0;;;;;;;14727:380;;;:::o;36597:619::-;19778:7;;-1:-1:-1;;;19778:7:0;;;;36746:9;36738:60;;;;-1:-1:-1;;;36738:60:0;;11536:2:1;36738:60:0;;;11518:21:1;11575:2;11555:18;;;11548:30;11614:34;11594:18;;;11587:62;-1:-1:-1;;;11665:18:1;;;11658:36;11711:19;;36738:60:0;11334:402:1;36738:60:0;36832:10;40637:4;40661:18;;;:9;:18;;;;;;;;36817:26;36809:68;;;;-1:-1:-1;;;36809:68:0;;11943:2:1;36809:68:0;;;11925:21:1;11982:2;11962:18;;;11955:30;12021:31;12001:18;;;11994:59;12070:18;;36809:68:0;11741:353:1;36809:68:0;-1:-1:-1;;;;;40661:18:0;;40637:4;40661:18;;;:9;:18;;;;;;;;36896:25;36888:70;;;;-1:-1:-1;;;36888:70:0;;12301:2:1;36888:70:0;;;12283:21:1;;;12320:18;;;12313:30;12379:34;12359:18;;;12352:62;12431:18;;36888:70:0;12099:356:1;36888:70:0;36992:9;40637:4;40661:18;;;:9;:18;;;;;;;;36977:25;36969:67;;;;-1:-1:-1;;;36969:67:0;;11943:2:1;36969:67:0;;;11925:21:1;11982:2;11962:18;;;11955:30;12021:31;12001:18;;;11994:59;12070:18;;36969:67:0;11741:353:1;36969:67:0;37060:9;;;;37057:89;;;37095:36;37105:6;37113:9;37124:6;37095:9;:36::i;:::-;37086:45;;37057:89;37166:42;37182:6;37190:9;37201:6;37166:15;:42::i;:::-;36597:619;;;:::o;31561:5024::-;31687:16;;;31701:1;31687:16;;;;;;;;31639:7;;;;31687:16;31701:1;31687:16;;;;;;;;;;-1:-1:-1;31687:16:0;31659:44;;31736:4;31714:8;31723:1;31714:11;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;31714:27:0;;;-1:-1:-1;;;;;31714:27:0;;;;;31766:17;;;;;;;;;-1:-1:-1;;;;;31766:17:0;-1:-1:-1;;;;;31766:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31752:8;31761:1;31752:11;;;;;;;;:::i;:::-;;;;;;:38;-1:-1:-1;;;;;31752:38:0;;;-1:-1:-1;;;;;31752:38:0;;;;;31815:16;31826:4;31815:10;:16::i;:::-;31814:17;:36;;;;;31836:14;31847:2;31836:10;:14::i;:::-;31835:15;31814:36;31811:4733;;;31867:11;31893:16;31921:11;;31912:6;:20;;;;:::i;:::-;31966:13;;31893:39;;-1:-1:-1;;;;;;31966:13:0;;;31950:30;;;;31947:4544;;32019:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;;32008:8;:32;;;;:::i;:::-;32001:39;;;;:::i;:::-;;;32077:8;:15;;;;;:::i;:::-;;;;;;;;;;;;;;32066:8;:26;;;;:::i;:::-;32059:33;;;;:::i;:::-;;;32129:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;;32118:8;:32;;;;:::i;:::-;32111:39;;;;:::i;:::-;;;32187:8;:19;;;;;:::i;:::-;;;;;;;;;;;;;;32176:8;:30;;;;:::i;:::-;32169:37;;;;:::i;:::-;;-1:-1:-1;32246:7:0;;32243:93;;32278:35;32288:4;32302;32309:3;32278:9;:35::i;:::-;32402:8;:21;;;;;:::i;:::-;;;;;;;;;;;;;;32391:8;:32;;;;:::i;:::-;32372:15;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;32466:15:0;;:8;;:15;;;:::i;:::-;;;;;;;;;;;;;;32455:8;:26;;;;:::i;:::-;32442:9;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;32530:21:0;;:8;;:21;;;:::i;:::-;;;;;;;;;;;;;;32519:8;:32;;;;:::i;:::-;32500:15;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;32598:19:0;;:8;;:19;;;:::i;:::-;;;;;;;;;;;;;;32587:8;:30;;;;:::i;:::-;32570:13;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;31947:4544:0;;-1:-1:-1;31947:4544:0;;32656:13;;-1:-1:-1;;;;;32656:13:0;;;32642:28;;;;32639:3852;;32709:9;:22;;;;;:::i;:::-;;;;;;;;;;;;;;32698:8;:33;;;;:::i;:::-;32691:40;;;;:::i;:::-;;;32768:9;:16;;;;;:::i;:::-;;;;;;;;;;;;;;32757:8;:27;;;;:::i;:::-;32750:34;;;;:::i;:::-;;;32821:9;:22;;;;;:::i;:::-;;;;;;;;;;;;;;32810:8;:33;;;;:::i;:::-;32803:40;;;;:::i;:::-;;;32880:9;:20;;;;;:::i;:::-;;;;;;;;;;;;;;32869:8;:31;;;;:::i;:::-;32862:38;;;;:::i;:::-;;-1:-1:-1;32940:7:0;;32937:93;;32972:35;32982:4;32996;33003:3;32972:9;:35::i;:::-;33096:9;:22;;;;;:::i;:::-;;;;;;;;;;;;;;33085:8;:33;;;;:::i;:::-;33066:15;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;33161:16:0;;:9;;:16;;;:::i;:::-;;;;;;;;;;;;;;33150:8;:27;;;;:::i;:::-;33137:9;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;33226:22:0;;:9;;:22;;;:::i;:::-;;;;;;;;;;;;;;33215:8;:33;;;;:::i;:::-;33196:15;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;33295:20:0;;:9;;:20;;;:::i;:::-;;;;;;;;;;;;;;33284:8;:31;;;;:::i;:::-;33267:13;;:48;;;;;;;:::i;:::-;;;;;;;;33352:14;33417:13;;33399:15;;33387:9;;33369:15;;:27;;;;:::i;:::-;:45;;;;:::i;:::-;:61;;;;:::i;:::-;33352:78;;33470:6;33480:1;33470:11;33467:29;;33490:6;33483:13;;;;;;;;33467:29;33533:16;33552:17;;;;;;;;;-1:-1:-1;;;;;33552:17:0;-1:-1:-1;;;;;33552:31:0;;33632:13;;33614:15;;33602:9;;33584:15;;:27;;;;:::i;:::-;:45;;;;:::i;:::-;:61;;;;:::i;:::-;33647:8;33552:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33552:104:0;;;;;;;;;;;;:::i;:::-;33657:1;33552:107;;;;;;;;:::i;:::-;;;;;;;33533:126;;33711:13;;33699:8;:25;33696:2762;;33887:13;;33865:15;;33772:21;;33749:20;;33865:19;;33883:1;;33865:19;:::i;:::-;33853:9;;33835:15;;:27;;;;:::i;:::-;:49;;;;:::i;:::-;:65;;;;:::i;:::-;33818:82;;33945:59;33962:4;33977:17;;;;;;;;;-1:-1:-1;;;;;33977:17:0;33997:6;33945:8;:59::i;:::-;34041:17;;:240;;-1:-1:-1;;;34041:240:0;;:17;;;;-1:-1:-1;;;;;34041:17:0;;:39;;:240;;34107:6;;34140:1;;34168:8;;34211:4;;34243:15;;34041:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34041:240:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34326:17:0;34346:36;34370:12;34346:21;:36;:::i;:::-;34326:56;;34427:22;34470:1;34452:15;;:19;;;;:::i;:::-;34427:44;;34494:20;34574:5;34563:6;34550:1;34532:15;;:19;;;;:::i;:::-;:27;;34554:5;34532:27;:::i;:::-;34531:38;;;;:::i;:::-;34518:52;;:9;:52;:::i;:::-;34517:62;;;;:::i;:::-;34494:85;;34624:20;34700:5;34689:6;34662:15;;34680:5;34662:23;;;;:::i;:::-;34661:34;;;;:::i;:::-;34648:48;;:9;:48;:::i;:::-;34647:58;;;;:::i;:::-;34624:81;;34728:14;34792:5;34781:6;34760:9;;34772:5;34760:17;;;;:::i;:::-;34759:28;;;;:::i;:::-;34746:42;;:9;:42;:::i;:::-;34745:52;;;;:::i;:::-;34728:69;;34820:18;34892:5;34881:6;34856:13;;34872:5;34856:21;;;;:::i;:::-;34855:32;;;;:::i;:::-;34842:46;;:9;:46;:::i;:::-;34841:56;;;;:::i;:::-;34820:77;;34942:67;34959:4;34974:17;;;;;;;;;-1:-1:-1;;;;;34974:17:0;34994:14;34942:8;:67::i;:::-;35055:16;35073:14;35089;35107:17;;;;;;;;;-1:-1:-1;;;;;35107:17:0;-1:-1:-1;;;;;35107:33:0;;35148:12;35196:4;35228:14;35269:1;35297;35325:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35107:306:0;;;;;;;-1:-1:-1;;;;;16367:15:1;;;35107:306:0;;;16349:34:1;16399:18;;;16392:34;;;;16442:18;;;16435:34;;;;16485:18;;;16478:34;35325:23:0;;16528:19:1;;;16521:44;35375:15:0;16581:19:1;;;16574:35;16283:19;;35107:306:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35054:359;;-1:-1:-1;35054:359:0;-1:-1:-1;35054:359:0;-1:-1:-1;35458:23:0;35551:20;35054:359;35551:6;:20;:::i;:::-;35533:13;;35515:15;;35503:9;;35485:15;;:27;;;;:::i;:::-;:45;;;;:::i;:::-;:61;;;;:::i;:::-;35484:88;;;;:::i;:::-;35458:114;-1:-1:-1;35620:19:0;;35617:135;;35668:60;35686:4;35693:10;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;35693:17:0;35712:15;35668:9;:60::i;:::-;35796:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;35796:23:0;;35832:12;;35796:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35872:10;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;35872:17:0;;35902:6;;35872:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35936:10;:21;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;35936:21:0;;35970:10;;35936:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36099:1;36085:10;36070:12;36061:6;36046:12;:21;;;;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;36033:63;;:9;:63;:::i;:::-;:67;36030:227;;;36129:10;:23;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;36129:23:0;36217:10;36202:12;36178:21;36193:6;36178:12;:21;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;36165:63;;:9;:63;:::i;:::-;36129:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36030:227;-1:-1:-1;;36319:1:0;36301:15;:19;;;36343:9;:13;;;36379:15;:19;;;36421:13;:17;-1:-1:-1;;;;;;;;;;33696:2762:0;32672:3819;;32639:3852;36519:13;36529:3;36519:13;;:::i;:::-;;;31852:4692;;31811:4733;-1:-1:-1;36571:6:0;;31561:5024;-1:-1:-1;;;31561:5024:0:o;20766:120::-;19778:7;;-1:-1:-1;;;19778:7:0;;;;20302:41;;;;-1:-1:-1;;;20302:41:0;;17343:2:1;20302:41:0;;;17325:21:1;17382:2;17362:18;;;17355:30;-1:-1:-1;;;17401:18:1;;;17394:50;17461:18;;20302:41:0;17141:344:1;20302:41:0;20825:7:::1;:15:::0;;-1:-1:-1;;;;20825:15:0::1;::::0;;20856:22:::1;4506:10:::0;20865:12:::1;20856:22;::::0;-1:-1:-1;;;;;3038:32:1;;;3020:51;;3008:2;2993:18;20856:22:0::1;;;;;;;20766:120::o:0;13698:591::-;-1:-1:-1;;;;;13782:21:0;;13774:67;;;;-1:-1:-1;;;13774:67:0;;17692:2:1;13774:67:0;;;17674:21:1;17731:2;17711:18;;;17704:30;17770:34;17750:18;;;17743:62;-1:-1:-1;;;17821:18:1;;;17814:31;17862:19;;13774:67:0;17490:397:1;13774:67:0;-1:-1:-1;;;;;13941:18:0;;13916:22;13941:18;;;;;;;;;;;13978:24;;;;13970:71;;;;-1:-1:-1;;;13970:71:0;;18094:2:1;13970:71:0;;;18076:21:1;18133:2;18113:18;;;18106:30;18172:34;18152:18;;;18145:62;-1:-1:-1;;;18223:18:1;;;18216:32;18265:19;;13970:71:0;17892:398:1;13970:71:0;-1:-1:-1;;;;;14077:18:0;;:9;:18;;;;;;;;;;14098:23;;;14077:44;;14143:12;:22;;14115:6;;14077:9;14143:22;;14115:6;;14143:22;:::i;:::-;;;;-1:-1:-1;;14183:37:0;;1361:25:1;;;14209:1:0;;-1:-1:-1;;;;;14183:37:0;;;;;1349:2:1;1334:18;14183:37:0;;;;;;;36597:619;;;:::o;18543:174::-;18619:6;;;-1:-1:-1;;;;;18636:17:0;;;-1:-1:-1;;;;;;18636:17:0;;;;;;;18669:40;;18619:6;;;18636:17;18619:6;;18669:40;;18600:16;;18669:40;18589:128;18543:174;:::o;20507:118::-;19778:7;;-1:-1:-1;;;19778:7:0;;;;20032:9;20024:38;;;;-1:-1:-1;;;20024:38:0;;18497:2:1;20024:38:0;;;18479:21:1;18536:2;18516:18;;;18509:30;-1:-1:-1;;;18555:18:1;;;18548:46;18611:18;;20024:38:0;18295:340:1;20024:38:0;20567:7:::1;:14:::0;;-1:-1:-1;;;;20567:14:0::1;-1:-1:-1::0;;;20567:14:0::1;::::0;;20597:20:::1;20604:12;4506:10:::0;;4426:98;11946:733;-1:-1:-1;;;;;12086:20:0;;12078:70;;;;-1:-1:-1;;;12078:70:0;;18842:2:1;12078:70:0;;;18824:21:1;18881:2;18861:18;;;18854:30;18920:34;18900:18;;;18893:62;-1:-1:-1;;;18971:18:1;;;18964:35;19016:19;;12078:70:0;18640:401:1;12078:70:0;-1:-1:-1;;;;;12167:23:0;;12159:71;;;;-1:-1:-1;;;12159:71:0;;19248:2:1;12159:71:0;;;19230:21:1;19287:2;19267:18;;;19260:30;19326:34;19306:18;;;19299:62;-1:-1:-1;;;19377:18:1;;;19370:33;19420:19;;12159:71:0;19046:399:1;12159:71:0;-1:-1:-1;;;;;12327:17:0;;12303:21;12327:17;;;;;;;;;;;12363:23;;;;12355:74;;;;-1:-1:-1;;;12355:74:0;;19652:2:1;12355:74:0;;;19634:21:1;19691:2;19671:18;;;19664:30;19730:34;19710:18;;;19703:62;-1:-1:-1;;;19781:18:1;;;19774:36;19827:19;;12355:74:0;19450:402:1;12355:74:0;-1:-1:-1;;;;;12465:17:0;;;:9;:17;;;;;;;;;;;12485:22;;;12465:42;;12529:20;;;;;;;;:30;;12501:6;;12465:9;12529:30;;12501:6;;12529:30;:::i;:::-;;;;;;;;12594:9;-1:-1:-1;;;;;12577:35:0;12586:6;-1:-1:-1;;;;;12577:35:0;;12605:6;12577:35;;;;1361:25:1;;1349:2;1334:18;;1215:177;12577:35:0;;;;;;;;12067:612;11946:733;;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;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;1397:456::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;1598:9;1585:23;1617:31;1642:5;1617:31;:::i;:::-;1667:5;-1:-1:-1;1724:2:1;1709:18;;1696:32;1737:33;1696:32;1737:33;:::i;:::-;1397:456;;1789:7;;-1:-1:-1;;;1843:2:1;1828:18;;;;1815:32;;1397:456::o;2047:180::-;2106:6;2159:2;2147:9;2138:7;2134:23;2130:32;2127:52;;;2175:1;2172;2165:12;2127:52;-1:-1:-1;2198:23:1;;2047:180;-1:-1:-1;2047:180:1:o;2232:247::-;2291:6;2344:2;2332:9;2323:7;2319:23;2315:32;2312:52;;;2360:1;2357;2350:12;2312:52;2399:9;2386:23;2418:31;2443:5;2418:31;:::i;2484:385::-;2570:6;2578;2586;2594;2647:3;2635:9;2626:7;2622:23;2618:33;2615:53;;;2664:1;2661;2654:12;2615:53;-1:-1:-1;;2687:23:1;;;2757:2;2742:18;;2729:32;;-1:-1:-1;2808:2:1;2793:18;;2780:32;;2859:2;2844:18;2831:32;;-1:-1:-1;2484:385:1;-1:-1:-1;2484:385:1:o;3082:529::-;3159:6;3167;3175;3228:2;3216:9;3207:7;3203:23;3199:32;3196:52;;;3244:1;3241;3234:12;3196:52;3283:9;3270:23;3302:31;3327:5;3302:31;:::i;:::-;3352:5;-1:-1:-1;3409:2:1;3394:18;;3381:32;3422:33;3381:32;3422:33;:::i;:::-;3474:7;-1:-1:-1;3533:2:1;3518:18;;3505:32;3546:33;3505:32;3546:33;:::i;:::-;3598:7;3588:17;;;3082:529;;;;;:::o;3616:388::-;3684:6;3692;3745:2;3733:9;3724:7;3720:23;3716:32;3713:52;;;3761:1;3758;3751:12;3713:52;3800:9;3787:23;3819:31;3844:5;3819:31;:::i;:::-;3869:5;-1:-1:-1;3926:2:1;3911:18;;3898:32;3939:33;3898:32;3939:33;:::i;:::-;3991:7;3981:17;;;3616:388;;;;;:::o;4009:380::-;4088:1;4084:12;;;;4131;;;4152:61;;4206:4;4198:6;4194:17;4184:27;;4152:61;4259:2;4251:6;4248:14;4228:18;4225:38;4222:161;;4305:10;4300:3;4296:20;4293:1;4286:31;4340:4;4337:1;4330:15;4368:4;4365:1;4358:15;4222:161;;4009:380;;;:::o;4803:356::-;5005:2;4987:21;;;5024:18;;;5017:30;5083:34;5078:2;5063:18;;5056:62;5150:2;5135:18;;4803:356::o;5164:127::-;5225:10;5220:3;5216:20;5213:1;5206:31;5256:4;5253:1;5246:15;5280:4;5277:1;5270:15;5296:125;5361:9;;;5382:10;;;5379:36;;;5395:18;;:::i;7453:253::-;-1:-1:-1;;;7655:18:1;;7698:1;7689:11;;7453:253::o;7711:259::-;-1:-1:-1;;;7913:24:1;;7962:1;7953:11;;7711:259::o;7975:::-;-1:-1:-1;;;8177:24:1;;8226:1;8217:11;;7975:259::o;8239:257::-;-1:-1:-1;;;8441:22:1;;8488:1;8479:11;;8239:257::o;12460:127::-;12521:10;12516:3;12512:20;12509:1;12502:31;12552:4;12549:1;12542:15;12576:4;12573:1;12566:15;12592:127;12653:10;12648:3;12644:20;12641:1;12634:31;12684:4;12681:1;12674:15;12708:4;12705:1;12698:15;12724:251;12794:6;12847:2;12835:9;12826:7;12822:23;12818:32;12815:52;;;12863:1;12860;12853:12;12815:52;12895:9;12889:16;12914:31;12939:5;12914:31;:::i;12980:217::-;13020:1;13046;13036:132;;13090:10;13085:3;13081:20;13078:1;13071:31;13125:4;13122:1;13115:15;13153:4;13150:1;13143:15;13036:132;-1:-1:-1;13182:9:1;;12980:217::o;13202:168::-;13275:9;;;13306;;13323:15;;;13317:22;;13303:37;13293:71;;13344:18;;:::i;13375:461::-;13428:3;13466:5;13460:12;13493:6;13488:3;13481:19;13519:4;13548:2;13543:3;13539:12;13532:19;;13585:2;13578:5;13574:14;13606:1;13616:195;13630:6;13627:1;13624:13;13616:195;;;13695:13;;-1:-1:-1;;;;;13691:39:1;13679:52;;13751:12;;;;13786:15;;;;13727:1;13645:9;13616:195;;;-1:-1:-1;13827:3:1;;13375:461;-1:-1:-1;;;;;13375:461:1:o;13841:332::-;14048:6;14037:9;14030:25;14091:2;14086;14075:9;14071:18;14064:30;14011:4;14111:56;14163:2;14152:9;14148:18;14140:6;14111:56;:::i;:::-;14103:64;13841:332;-1:-1:-1;;;;13841:332:1:o;14178:1105::-;14273:6;14304:2;14347;14335:9;14326:7;14322:23;14318:32;14315:52;;;14363:1;14360;14353:12;14315:52;14396:9;14390:16;14425:18;14466:2;14458:6;14455:14;14452:34;;;14482:1;14479;14472:12;14452:34;14520:6;14509:9;14505:22;14495:32;;14565:7;14558:4;14554:2;14550:13;14546:27;14536:55;;14587:1;14584;14577:12;14536:55;14616:2;14610:9;14638:2;14634;14631:10;14628:36;;;14644:18;;:::i;:::-;14690:2;14687:1;14683:10;14722:2;14716:9;14785:2;14781:7;14776:2;14772;14768:11;14764:25;14756:6;14752:38;14840:6;14828:10;14825:22;14820:2;14808:10;14805:18;14802:46;14799:72;;;14851:18;;:::i;:::-;14887:2;14880:22;14937:18;;;14971:15;;;;-1:-1:-1;15013:11:1;;;15009:20;;;15041:19;;;15038:39;;;15073:1;15070;15063:12;15038:39;15097:11;;;;15117:135;15133:6;15128:3;15125:15;15117:135;;;15199:10;;15187:23;;15150:12;;;;15230;;;;15117:135;;;15271:6;14178:1105;-1:-1:-1;;;;;;;;14178:1105:1:o;15288:582::-;15587:6;15576:9;15569:25;15630:6;15625:2;15614:9;15610:18;15603:34;15673:3;15668:2;15657:9;15653:18;15646:31;15550:4;15694:57;15746:3;15735:9;15731:19;15723:6;15694:57;:::i;:::-;-1:-1:-1;;;;;15787:32:1;;;;15782:2;15767:18;;15760:60;-1:-1:-1;15851:3:1;15836:19;15829:35;15686:65;15288:582;-1:-1:-1;;;15288:582:1:o;15875:128::-;15942:9;;;15963:11;;;15960:37;;;15977:18;;:::i;16620:306::-;16708:6;16716;16724;16777:2;16765:9;16756:7;16752:23;16748:32;16745:52;;;16793:1;16790;16783:12;16745:52;16822:9;16816:16;16806:26;;16872:2;16861:9;16857:18;16851:25;16841:35;;16916:2;16905:9;16901:18;16895:25;16885:35;;16620:306;;;;;:::o

Swarm Source

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