ETH Price: $2,733.70 (+12.85%)
 

Overview

Max Total Supply

100,000,000 MBET

Holders

810 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 MBET

Value
$0.00
0x15c4317a59f71fd3a67908b90f8ed43175c613c2
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:
MetaBET

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-14
*/

pragma solidity ^0.8.11;
//SPDX-License-Identifier: none

interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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 {}
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

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

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

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

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

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

abstract contract 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() {
        _setOwner(_msgSender());
    }

    /**
     * @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) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1));

    int256 c = a * b;
    require((b == 0) || (c / b == a));
    return c;
  }

  function div(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && (b > 0));

    return a / b;
  }

  function sub(int256 a, int256 b) internal pure returns (int256) {
    require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));

    return a - b;
  }

  function add(int256 a, int256 b) internal pure returns (int256) {
    int256 c = a + b;
    require((b >= 0 && c >= a) || (b < 0 && c < a));
    return c;
  }

  function toUint256Safe(int256 a) internal pure returns (uint256) {
    require(a >= 0);
    return uint256(a);
  }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

library SafeMath {

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

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

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

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

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

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

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

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

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

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

contract MetaBET is Context, ERC20, Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using Address for address;

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

	bool private trading;
    bool private starting;
    bool public swapping;

    address private marketingWallet;
    address private liquidityWallet;

    uint256 public swapTokensAtAmount;

    uint256 private _buyMarketingFee;
    uint256 private _buyLiquidityFee;

    uint256 private _sellMarketingFee;
    uint256 private _sellLiquidityFee;

    uint256 private elonRent;

    uint256 public _maxWallet;
    uint256 public _maxBuy;
    uint256 public _maxSell;
    uint256 private _previousMaxWallet;
    uint256 private _previousMaxSell;
    uint256 private _previousMaxBuy;

    uint256 public totalBuyFees;
    uint256 public totalSellFees;

	uint256 public contractTokenBalanceAmount;

    uint256 private constant DefaultTime = 28 weeks;

    mapping (address => bool) private _isExcludedFromFees;

    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) public _isBlacklisted;
    mapping (address => bool) public _isElon;
    mapping (address => bool) public _isExcludedFromContractBuyingLimit;

    modifier onlyNonContract {
        if (_isExcludedFromContractBuyingLimit[msg.sender]) {
            _;
        } else {
            require(!address(msg.sender).isContract(), 'Contract not allowed to call');
            _;
        }
    }

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event isElon(address indexed account, bool isExcluded);
    event blacklist(address indexed account, bool isBlacklisted);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event tradingUpdated(bool _enabled);
    event burningUpdated(bool _enabled);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event ProductiongWalletUpdated(address indexed newProductionWallet, address indexed oldProductionWallet);
    event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet);
    event DevelopmentWalletUpdated(address indexed newDevelopmentWallet, address indexed oldDevelopmentWallet);
    event CharityWalletUpdated(address indexed newCharityWallet, address indexed oldCharityWallet);
    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

    constructor() ERC20 ("MetaBET", "MBET") {

        _buyMarketingFee = 10;
        _buyLiquidityFee = 10;

        _sellMarketingFee = 10;
        _sellLiquidityFee = 10;

        elonRent = 99;

		contractTokenBalanceAmount = 250000 * 10**18;

        swapTokensAtAmount = 250000 * (10**18);
        _maxWallet = 2000000 * (10**18);
        _maxBuy = 2000000 * (10**18);
        _maxSell = 2000000 * (10**18);

        totalBuyFees = _buyMarketingFee.add(_buyLiquidityFee);
        totalSellFees = _sellMarketingFee.add(_sellLiquidityFee);

    	liquidityWallet = address(0x89E52510223254CF97F10Bf9E96027C1dfE4b898);

        marketingWallet = address(0x80635174a264070dF517017Af2a4A7bD5ED5Ee96);

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x03f7724180AA6b939894B5Ca4314783B0b36b329);
        //0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D Ethereum Mainnet
    	//0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3 Testnet
    	//0x10ED43C718714eb63d5aA57B78B54704E256024E BSC Mainnet
    	//0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D Ropsten
    	//0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F BakerySwap
        //0x03f7724180AA6b939894B5Ca4314783B0b36b329 ShibaSwap
        //0x4B0d61C160572CAcC0A20D2dbeF6E0138bf58681 ShibaSwap Ropsten
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from paying fees
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);

        _isExcludedFromContractBuyingLimit[address(this)] = true;
        _isExcludedFromContractBuyingLimit[0x03f7724180AA6b939894B5Ca4314783B0b36b329] = true;
        _isExcludedFromContractBuyingLimit[address(uniswapV2Pair)] = true;
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(address(0x89E52510223254CF97F10Bf9E96027C1dfE4b898), 100000000 * (10**18));
    }

    receive() external payable {

  	}

	function updateSwapAmount(uint256 amount) public onlyOwner {
	    swapTokensAtAmount = amount * (10**18);
	}
    
    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "MetaBET: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "MetaBET: Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function updateIsElon(address account, bool elon) public onlyOwner {
        require(_isElon[account] != elon, "MetaBET: Account is already the value of 'elon'");
        _isElon[account] = elon;

        emit isElon(account, elon);
    }
    
    function addToBlacklist(address account, bool blacklisted) public onlyOwner {
        require(_isBlacklisted[account] != blacklisted, "MetaBET: Account is already the value of 'blacklisted'");
        _isBlacklisted[account] = blacklisted;

        emit blacklist(account, blacklisted);
    }

    function enableContractAddressTrading(address account, bool enabled) external onlyOwner {
        require(account.isContract(), 'Only contract address is allowed!');
        _isExcludedFromContractBuyingLimit[account] = enabled;
    }

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

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "MetaBET: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    address private _liquidityTokenAddress;
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
        _liquidityUnlockTime=block.timestamp+DefaultTime;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
     uint256 private _liquidityUnlockTime;

    //Sets Liquidity Release to 20% at a time and prolongs liquidity Lock for a Week after Release.
    //Should be called once start was successful.
    bool public liquidityRelease20Percent;
    function TeamlimitLiquidityReleaseTo20Percent() public onlyOwner{
        liquidityRelease20Percent=true;
    }

    function TeamUnlockLiquidityInSeconds(uint256 secondsUntilUnlock) public onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() public onlyOwner {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");

        IERC20 liquidityToken = IERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease20Percent)
        {
            _liquidityUnlockTime=block.timestamp+DefaultTime;
            //regular liquidity release, only releases 20% at a time and locks liquidity for another week
            amount=amount*2/10;
            liquidityToken.transfer(liquidityWallet, amount);
        }
        else
        {
            //Liquidity release if something goes wrong at start
            //liquidityRelease20Percent should be called once everything is clear
            liquidityToken.transfer(liquidityWallet, amount);
        }
    }

    function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner {
        require(newLiquidityWallet != liquidityWallet, "MetaBET: The liquidity wallet is already this address");
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }

    function updateMarketingWallet(address newMarketingWallet) public onlyOwner {
        require(newMarketingWallet != marketingWallet, "MetaBET: The marketing wallet is already this address");
        excludeFromFees(newMarketingWallet, true);
        emit MarketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

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

    function isElonAddress(address account) public view returns(bool) {
        return _isElon[account];
    }

    function isContractAddressTradeable(address account) public view returns(bool) {
        return _isExcludedFromContractBuyingLimit[account];
    }
    
    function isBlacklisted(address account) public view returns (bool) {
        return _isBlacklisted[account];
    }
	
	function tradingEnabled(bool _enabled) public onlyOwner {
        trading = _enabled;
        
        emit tradingUpdated(_enabled);
    }

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

        if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && to != uniswapV2Pair && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) 
        {
            require(trading == true);
            require(amount <= _maxBuy, "Transfer amount exceeds the maxTxAmount.");
            uint256 contractBalanceRecepient = balanceOf(to);
            require(contractBalanceRecepient + amount <= _maxWallet, "Exceeds maximum wallet token amount.");
        }
            
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if(!swapping && automatedMarketMakerPairs[to] && from != address(uniswapV2Router) && from != owner() && to != owner() && !_isExcludedFromFees[to] && !_isExcludedFromFees[from])
        {
            require(trading == true);

            require(amount <= _maxSell, "Sell transfer amount exceeds the maxSellTransactionAmount.");
        }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
		
		if(canSwap && !swapping && !automatedMarketMakerPairs[from] && from != liquidityWallet && to != liquidityWallet && from != marketingWallet && to != marketingWallet && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) {
		    
		    contractTokenBalance = contractTokenBalanceAmount;
		    uint256 swapTokens;
			uint256 swapAmount = totalSellFees;
			uint256 liquidityAmount = contractTokenBalance.mul(_sellLiquidityFee).div(swapAmount);
			uint256 half = liquidityAmount.div(2);
			uint256 otherHalf = liquidityAmount.sub(half);
            
            swapping = true;
            
            if (_sellMarketingFee > 0) {
            swapTokens = contractTokenBalance.sub(half);
            swapTokensForEth(swapTokens);
            uint256 marketingAmount = address(this).balance.mul(_sellMarketingFee).div(swapAmount);
            payable(marketingWallet).transfer(marketingAmount);
            }

			if (_sellLiquidityFee > 0) {
			    
		    uint256 newBalance = address(this).balance.mul(_sellLiquidityFee).div(swapAmount);
			
            // add liquidity to uniswap
             addLiquidity(half, newBalance);

             emit SwapAndLiquify(otherHalf, newBalance, half);
            }
			
            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
            super._transfer(from, to, amount);
        }

        else if(!automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
        takeFee = false;
        super._transfer(from, to, amount);
        }

        if(takeFee) {
                uint256 BuyFees = amount.mul(totalBuyFees).div(100);
                uint256 SellFees = amount.mul(totalSellFees).div(100);
                uint256 ElonRent = amount.mul(elonRent).div(100);

            if(_isElon[to] && automatedMarketMakerPairs[from]) {
                amount = amount.sub(ElonRent);
                super._transfer(from, address(this), ElonRent);
                super._transfer(from, to, amount);
            }

            // if sell
            else if(automatedMarketMakerPairs[to] && totalSellFees > 0) {
                amount = amount.sub(SellFees);
                super._transfer(from, address(this), SellFees);
                super._transfer(from, to, amount);
            }

            // if buy or wallet to wallet transfer
            else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) {
                amount = amount.sub(BuyFees);
                super._transfer(from, address(this), BuyFees);
                super._transfer(from, to, amount);
                
                if(starting && !_isElon[to] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                _isElon[to] = true;
                }
                }
        }
    }

    function swapTokensForEth(uint256 tokenAmount) private {

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

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {

        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function addLP() external onlyOwner() {
        updateBuyFees(0,0);
        updateSellFees(0,0);

		trading = false;

        updateMaxWallet(100000000);
        updateMaxBuySell((100000000), (100000000));
    }
    
	function letsGoLive() external onlyOwner() {
        updateBuyFees(10,10);
        updateSellFees(10,10);

        updateMaxWallet(2000000);
        updateMaxBuySell(2000000, 2000000);

		trading = true;
        starting = false;
    }

    function letsGetStarted() external onlyOwner() {
        updateBuyFees(50,49);
        updateSellFees(10,10);

        updateMaxWallet(2000000);
        updateMaxBuySell(2000000, 2000000);

		trading = true;
        starting = true;
    }

    function updateBuyFees(uint8 newBuyMarketingFee, uint8 newBuyLiquidityFee) public onlyOwner {
        _buyMarketingFee = newBuyMarketingFee;
        _buyLiquidityFee = newBuyLiquidityFee;
        
        totalFees();
    }

    function updateSellFees(uint8 newSellMarketingFee, uint8 newSellLiquidityFee) public onlyOwner {
        _sellMarketingFee = newSellMarketingFee;
        _sellLiquidityFee = newSellLiquidityFee;
        
        totalFees();
    }

    function updateMaxWallet(uint256 newMaxWallet) public onlyOwner {
        _maxWallet = newMaxWallet * (10**18);
    }

    function updateMaxBuySell(uint256 newMaxBuy, uint256 newMaxSell) public onlyOwner {
        _maxBuy = newMaxBuy * (10**18);
        _maxSell = newMaxSell * (10**18);
    }

    function totalFees() private {
        totalBuyFees = _buyMarketingFee.add(_buyLiquidityFee);
        totalSellFees = _sellMarketingFee.add(_sellLiquidityFee);
    }

    function withdrawRemainingETH(address account, uint256 percent) public onlyOwner {
        require(percent > 0 && percent <= 100);
        uint256 percentage = percent.div(100);
        uint256 balance = address(this).balance.mul(percentage);
        super._transfer(address(this), account, balance);
    }

    function withdrawRemainingToken(address account) public onlyOwner {
        uint256 balance = balanceOf(address(this));
        super._transfer(address(this), account, balance);
    }

    function withdrawRemainingERC20Token(address token, address account) public onlyOwner {
        ERC20 Token = ERC20(token);
        uint256 balance = Token.balanceOf(address(this));
        Token.transfer(account, balance);
    }

    function burnTokenManual(uint256 amount) public onlyOwner {
        require(amount <= balanceOf(address(this)), "Amount cannot exceed tokens in contract");
        super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, amount);
    }

	function transferToWallet(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newCharityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldCharityWallet","type":"address"}],"name":"CharityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newDevelopmentWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldDevelopmentWallet","type":"address"}],"name":"DevelopmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newProductionWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldProductionWallet","type":"address"}],"name":"ProductiongWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"burningUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"isElon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"tradingUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamUnlockLiquidityInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamlimitLiquidityReleaseTo20Percent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isElon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromContractBuyingLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTokenManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractTokenBalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableContractAddressTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isContractAddressTradeable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isElonAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"letsGetStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"letsGoLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityRelease20Percent","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"tradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBuyMarketingFee","type":"uint8"},{"internalType":"uint8","name":"newBuyLiquidityFee","type":"uint8"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"elon","type":"bool"}],"name":"updateIsElon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"},{"internalType":"uint256","name":"newMaxSell","type":"uint256"}],"name":"updateMaxBuySell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newSellMarketingFee","type":"uint8"},{"internalType":"uint8","name":"newSellLiquidityFee","type":"uint8"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"withdrawRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b50604080518082018252600781526613595d1850915560ca1b6020808301918252835180850190945260048452631350915560e21b9084015281519192916200005d91600391620007ba565b50805162000073906004906020840190620007ba565b505050620000906200008a620003ca60201b60201c565b620003ce565b600a808055600b819055600c819055600d8190556063600e556934f086f3b33b6840000060178190556009556a01a784379d99db42000000600f8190556010819055601155620000ed908062000420602090811b62001ee617901c565b60158190555062000111600d54600c546200042060201b62001ee61790919060201c565b601655600880546001600160a01b03199081167389e52510223254cf97f10bf9e96027c1dfe4b89817909155600780549091167380635174a264070df517017af2a4a7bd5ed5ee961790556040805163c45a015560e01b815290517303f7724180aa6b939894b5ca4314783b0b36b32991600091839163c45a01559160048083019260209291908290030181865afa158015620001b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d8919062000860565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000226573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024c919062000860565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200029a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c0919062000860565b600680546001600160a01b0319166001600160a01b038581169190911790915581166080529050620002f48160016200048e565b6008546200030d906001600160a01b0316600162000583565b60075462000326906001600160a01b0316600162000583565b6200033330600162000583565b306000908152601c60205260408082208054600160ff1991821681179092557f4f82643f96c336191917fdc6a27e021540844043642d0f2c7d81373485c7fe3180548216831790556080516001600160a01b031684529190922080549091169091179055620003c27389e52510223254cf97f10bf9e96027c1dfe4b8986a52b7d2dcc80cd2e4000000620006d5565b5050620008ef565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806200042f83856200088b565b905083811015620004875760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03821660009081526019602052604090205460ff16151581151514156200052f5760405162461bcd60e51b815260206004820152604160248201527f4d6574614245543a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a4016200047e565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620005df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200047e565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415620006765760405162461bcd60e51b815260206004820152603360248201527f4d6574614245543a204163636f756e7420697320616c7265616479207468652060448201527f76616c7565206f6620276578636c75646564270000000000000000000000000060648201526084016200047e565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200072d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200047e565b80600260008282546200074191906200088b565b90915550506001600160a01b03821660009081526020819052604081208054839290620007709084906200088b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620007c890620008b2565b90600052602060002090601f016020900481019282620007ec576000855562000837565b82601f106200080757805160ff191683800117855562000837565b8280016001018555821562000837579182015b82811115620008375782518255916020019190600101906200081a565b506200084592915062000849565b5090565b5b808211156200084557600081556001016200084a565b6000602082840312156200087357600080fd5b81516001600160a01b03811681146200048757600080fd5b60008219821115620008ad57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620008c757607f821691505b60208210811415620008e957634e487b7160e01b600052602260045260246000fd5b50919050565b6080516135356200091960003960008181610661015281816114ed015261217f01526135356000f3fe6080604052600436106103905760003560e01c80637bbf8df9116101dc578063be874c9211610102578063e2f45605116100a0578063f2fde38b1161006f578063f2fde38b14610ad6578063f5a0805214610af6578063f77dbdc614610b16578063fe575a8714610b4657600080fd5b8063e2f4560514610a60578063e37ba8f914610a76578063eab8072314610a96578063f298f42c14610ab657600080fd5b8063c3a3c032116100dc578063c3a3c032146109da578063d0a39814146109ef578063d63607d814610a05578063dd62ed3e14610a1a57600080fd5b8063be874c921461097a578063c02466681461099a578063c23be47f146109ba57600080fd5b8063a9059cbb1161017a578063b1ff3b5c11610149578063b1ff3b5c14610909578063b62496f51461091f578063b9e937001461094f578063bc37e1a31461096557600080fd5b8063a9059cbb14610893578063a9dec436146108b3578063aacebbe3146108c9578063ab3b5545146108e957600080fd5b80638da5cb5b116101b65780638da5cb5b1461082057806395d89b411461083e5780639a7a23d614610853578063a457c2d71461087357600080fd5b80637bbf8df9146107ca57806382247ec0146107ea5780638ab792e31461080057600080fd5b80632c889d18116102c157806349bdf8731161025f57806365b8dbc01161022e57806365b8dbc01461072f57806370a082311461074f578063715018a6146107855780637235f2931461079a57600080fd5b806349bdf873146106835780634cdaf0ae1461069d5780634fbee193146106bd5780636067e190146106f657600080fd5b8063395093511161029b57806339509351146105e15780633c7a309b146106015780634939f0331461061657806349bd5a5e1461064f57600080fd5b80632c889d18146105855780632de3f956146105a5578063313ce567146105c557600080fd5b806319fb3e7a1161032e57806323b872dd1161030857806323b872dd14610510578063270924c714610530578063296d3de0146105455780632b75e9dd1461056557600080fd5b806319fb3e7a146104a05780631c499ab0146104c05780631cdd3be3146104e057600080fd5b8063095ea7b31161036a578063095ea7b3146104025780631694505e146104325780631732cded1461046a57806318160ddd1461048b57600080fd5b8063021954661461039c57806306fdde03146103b35780630773d31d146103de57600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610b7f565b005b3480156103bf57600080fd5b506103c8610bf9565b6040516103d5919061306f565b60405180910390f35b3480156103ea57600080fd5b506103f460115481565b6040519081526020016103d5565b34801561040e57600080fd5b5061042261041d3660046130d9565b610c8b565b60405190151581526020016103d5565b34801561043e57600080fd5b50600654610452906001600160a01b031681565b6040516001600160a01b0390911681526020016103d5565b34801561047657600080fd5b5060065461042290600160b01b900460ff1681565b34801561049757600080fd5b506002546103f4565b3480156104ac57600080fd5b506103b16104bb366004613105565b610ca2565b3480156104cc57600080fd5b506103b16104db36600461313e565b610db7565b3480156104ec57600080fd5b506104226104fb366004613157565b601a6020526000908152604090205460ff1681565b34801561051c57600080fd5b5061042261052b366004613174565b610df9565b34801561053c57600080fd5b506103b1610ea3565b34801561055157600080fd5b506103b16105603660046131b5565b610f12565b34801561057157600080fd5b506103b16105803660046131ed565b610f6a565b34801561059157600080fd5b506103b16105a036600461313e565b610fad565b3480156105b157600080fd5b506103b16105c036600461322e565b610fec565b3480156105d157600080fd5b50604051601281526020016103d5565b3480156105ed57600080fd5b506104226105fc3660046130d9565b61106e565b34801561060d57600080fd5b506103b16110aa565b34801561062257600080fd5b50610422610631366004613157565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561065b57600080fd5b506104527f000000000000000000000000000000000000000000000000000000000000000081565b34801561068f57600080fd5b50601f546104229060ff1681565b3480156106a957600080fd5b506103b16106b8366004613157565b611278565b3480156106c957600080fd5b506104226106d8366004613157565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561070257600080fd5b50610422610711366004613157565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561073b57600080fd5b506103b161074a366004613157565b6112d1565b34801561075b57600080fd5b506103f461076a366004613157565b6001600160a01b031660009081526020819052604090205490565b34801561079157600080fd5b506103b16113cb565b3480156107a657600080fd5b506104226107b5366004613157565b601b6020526000908152604090205460ff1681565b3480156107d657600080fd5b506103b16107e53660046130d9565b611401565b3480156107f657600080fd5b506103f4600f5481565b34801561080c57600080fd5b506103b161081b3660046131ed565b611473565b34801561082c57600080fd5b506005546001600160a01b0316610452565b34801561084a57600080fd5b506103c86114b2565b34801561085f57600080fd5b506103b161086e36600461324b565b6114c1565b34801561087f57600080fd5b5061042261088e3660046130d9565b6115b4565b34801561089f57600080fd5b506104226108ae3660046130d9565b61164d565b3480156108bf57600080fd5b506103f460105481565b3480156108d557600080fd5b506103b16108e4366004613157565b61165a565b3480156108f557600080fd5b506103b161090436600461313e565b611768565b34801561091557600080fd5b506103f460175481565b34801561092b57600080fd5b5061042261093a366004613157565b60196020526000908152604090205460ff1681565b34801561095b57600080fd5b506103f460155481565b34801561097157600080fd5b506103b16117aa565b34801561098657600080fd5b506103b161099536600461313e565b611812565b3480156109a657600080fd5b506103b16109b536600461324b565b6118b8565b3480156109c657600080fd5b506103b16109d5366004613157565b6119cd565b3480156109e657600080fd5b506103f4611a13565b3480156109fb57600080fd5b506103f460165481565b348015610a1157600080fd5b506103b1611a38565b348015610a2657600080fd5b506103f4610a35366004613105565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a6c57600080fd5b506103f460095481565b348015610a8257600080fd5b506103b1610a91366004613157565b611a71565b348015610aa257600080fd5b506103b1610ab136600461324b565b611b7f565b348015610ac257600080fd5b506103b1610ad136600461324b565b611c88565b348015610ae257600080fd5b506103b1610af1366004613157565b611d98565b348015610b0257600080fd5b506103b1610b1136600461324b565b611e30565b348015610b2257600080fd5b50610422610b31366004613157565b601c6020526000908152604090205460ff1681565b348015610b5257600080fd5b50610422610b61366004613157565b6001600160a01b03166000908152601a602052604090205460ff1690565b6005546001600160a01b03163314610bb25760405162461bcd60e51b8152600401610ba990613279565b60405180910390fd5b610bbe60326031611473565b610bc9600a80610f6a565b610bd5621e8480610db7565b610be2621e848080610f12565b6006805461ffff60a01b191661010160a01b179055565b606060038054610c08906132ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c34906132ae565b8015610c815780601f10610c5657610100808354040283529160200191610c81565b820191906000526020600020905b815481529060010190602001808311610c6457829003601f168201915b5050505050905090565b6000610c98338484611f4c565b5060015b92915050565b6005546001600160a01b03163314610ccc5760405162461bcd60e51b8152600401610ba990613279565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3991906132e9565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db09190613302565b5050505050565b6005546001600160a01b03163314610de15760405162461bcd60e51b8152600401610ba990613279565b610df381670de0b6b3a7640000613335565b600f5550565b6000610e06848484612070565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e8b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ba9565b610e988533858403611f4c565b506001949350505050565b6005546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610ba990613279565b610ed8600a80611473565b610ee3600a80610f6a565b610eef621e8480610db7565b610efc621e848080610f12565b6006805461ffff60a01b1916600160a01b179055565b6005546001600160a01b03163314610f3c5760405162461bcd60e51b8152600401610ba990613279565b610f4e82670de0b6b3a7640000613335565b601055610f6381670de0b6b3a7640000613335565b6011555050565b6005546001600160a01b03163314610f945760405162461bcd60e51b8152600401610ba990613279565b60ff808316600c558116600d55610fa9612a6b565b5050565b6005546001600160a01b03163314610fd75760405162461bcd60e51b8152600401610ba990613279565b610fe9610fe44283613354565b612a91565b50565b6005546001600160a01b031633146110165760405162461bcd60e51b8152600401610ba990613279565b60068054821515600160a01b0260ff60a01b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb29061106390831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c989185906110a5908690613354565b611f4c565b6005546001600160a01b031633146110d45760405162461bcd60e51b8152600401610ba990613279565b601e544210156111195760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610ba9565b601d546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a91906132e9565b601f5490915060ff161561123f576111a6630102660042613354565b601e55600a6111b6826002613335565b6111c0919061336c565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af1158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a9190613302565b505050565b60085460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016111f7565b6005546001600160a01b031633146112a25760405162461bcd60e51b8152600401610ba990613279565b601d80546001600160a01b0319166001600160a01b0383161790556112cb630102660042613354565b601e5550565b6005546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610ba990613279565b6006546001600160a01b038281169116141561136e5760405162461bcd60e51b815260206004820152602c60248201527f4d6574614245543a2054686520726f7574657220616c7265616479206861732060448201526b74686174206164647265737360a01b6064820152608401610ba9565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113f55760405162461bcd60e51b8152600401610ba990613279565b6113ff6000612aa4565b565b6005546001600160a01b0316331461142b5760405162461bcd60e51b8152600401610ba990613279565b60008111801561143c575060648111155b61144557600080fd5b6000611452826064612af6565b905060006114604783612b51565b905061146d308583612bd0565b50505050565b6005546001600160a01b0316331461149d5760405162461bcd60e51b8152600401610ba990613279565b60ff808316600a558116600b55610fa9612a6b565b606060048054610c08906132ae565b6005546001600160a01b031633146114eb5760405162461bcd60e51b8152600401610ba990613279565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156115aa5760405162461bcd60e51b815260206004820152604e60248201527f4d6574614245543a205468652050616e63616b6553776170207061697220636160448201527f6e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d6160648201526d726b65744d616b6572506169727360901b608482015260a401610ba9565b610fa98282612d24565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116365760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ba9565b6116433385858403611f4c565b5060019392505050565b6000610c98338484612070565b6005546001600160a01b031633146116845760405162461bcd60e51b8152600401610ba990613279565b6007546001600160a01b03828116911614156117005760405162461bcd60e51b815260206004820152603560248201527f4d6574614245543a20546865206d61726b6574696e672077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b6064820152608401610ba9565b61170b8160016118b8565b6007546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146117925760405162461bcd60e51b8152600401610ba990613279565b6117a481670de0b6b3a7640000613335565b60095550565b6005546001600160a01b031633146117d45760405162461bcd60e51b8152600401610ba990613279565b6117df600080611473565b6117ea600080610f6a565b6006805460ff60a01b191690556118046305f5e100610db7565b6113ff6305f5e10080610f12565b6005546001600160a01b0316331461183c5760405162461bcd60e51b8152600401610ba990613279565b306000908152602081905260409020548111156118ab5760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f742065786365656420746f6b656e7320696e20636044820152661bdb9d1c9858dd60ca1b6064820152608401610ba9565b610fe93061dead83612bd0565b6005546001600160a01b031633146118e25760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b03821660009081526018602052604090205460ff161515811515141561196d5760405162461bcd60e51b815260206004820152603360248201527f4d6574614245543a204163636f756e7420697320616c7265616479207468652060448201527276616c7565206f6620276578636c756465642760681b6064820152608401610ba9565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b031633146119f75760405162461bcd60e51b8152600401610ba990613279565b3060008181526020819052604090205490610fa9908383612bd0565b6000601e54421015611a325742601e54611a2d919061338e565b905090565b50600090565b6005546001600160a01b03163314611a625760405162461bcd60e51b8152600401610ba990613279565b601f805460ff19166001179055565b6005546001600160a01b03163314611a9b5760405162461bcd60e51b8152600401610ba990613279565b6008546001600160a01b0382811691161415611b175760405162461bcd60e51b815260206004820152603560248201527f4d6574614245543a20546865206c69717569646974792077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b6064820152608401610ba9565b611b228160016118b8565b6008546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611ba95760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b0382166000908152601b602052604090205460ff1615158115151415611c305760405162461bcd60e51b815260206004820152602f60248201527f4d6574614245543a204163636f756e7420697320616c7265616479207468652060448201526e76616c7565206f662027656c6f6e2760881b6064820152608401610ba9565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f061c5e8a60e1b2a590ab9407616506b02d4efc8b078988e5dcfd6182e042e3a891016119c1565b6005546001600160a01b03163314611cb25760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b0382166000908152601a602052604090205460ff1615158115151415611d405760405162461bcd60e51b815260206004820152603660248201527f4d6574614245543a204163636f756e7420697320616c7265616479207468652060448201527576616c7565206f662027626c61636b6c69737465642760501b6064820152608401610ba9565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c91016119c1565b6005546001600160a01b03163314611dc25760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b038116611e275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba9565b610fe981612aa4565b6005546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b0382163b611ebb5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920636f6e7472616374206164647265737320697320616c6c6f7765646044820152602160f81b6064820152608401610ba9565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b600080611ef38385613354565b905083811015611f455760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ba9565b9392505050565b6001600160a01b038316611fae5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba9565b6001600160a01b03821661200f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b336000908152601c602052604090205460ff16156129f6576001600160a01b0383166120ae5760405162461bcd60e51b8152600401610ba9906133a5565b6001600160a01b0382166120d45760405162461bcd60e51b8152600401610ba9906133ea565b6001600160a01b0382166000908152601a602052604090205460ff1615801561211657506001600160a01b0383166000908152601a602052604090205460ff16155b61211f57600080fd5b6005546001600160a01b0384811691161480159061214b57506005546001600160a01b03838116911614155b801561215f57506001600160a01b03821615155b801561217657506001600160a01b03821661dead14155b80156121b457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156121d957506001600160a01b03821660009081526018602052604090205460ff16155b80156121fe57506001600160a01b03831660009081526018602052604090205460ff16155b1561230357600654600160a01b900460ff16151560011461221e57600080fd5b6010548111156122815760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610ba9565b6001600160a01b038216600090815260208190526040902054600f546122a78383613354565b11156123015760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610ba9565b505b806123145761123a83836000612bd0565b600654600160b01b900460ff1615801561234657506001600160a01b03821660009081526019602052604090205460ff165b801561236057506006546001600160a01b03848116911614155b801561237a57506005546001600160a01b03848116911614155b801561239457506005546001600160a01b03838116911614155b80156123b957506001600160a01b03821660009081526018602052604090205460ff16155b80156123de57506001600160a01b03831660009081526018602052604090205460ff16155b1561247657600654600160a01b900460ff1615156001146123fe57600080fd5b6011548111156124765760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610ba9565b30600090815260208190526040902054600954811080159081906124a45750600654600160b01b900460ff16155b80156124c957506001600160a01b03851660009081526019602052604090205460ff16155b80156124e357506008546001600160a01b03868116911614155b80156124fd57506008546001600160a01b03858116911614155b801561251757506007546001600160a01b03868116911614155b801561253157506007546001600160a01b03858116911614155b801561255657506001600160a01b03841660009081526018602052604090205460ff16155b801561257b57506001600160a01b03851660009081526018602052604090205460ff16155b156126dc576017549150600080601654905060006125ae826125a8600d5488612b5190919063ffffffff16565b90612af6565b905060006125bd826002612af6565b905060006125cb8383612e17565b6006805460ff60b01b1916600160b01b179055600c5490915015612657576125f38783612e17565b94506125fe85612e73565b6000612619856125a8600c5447612b5190919063ffffffff16565b6007546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612654573d6000803e3d6000fd5b50505b600d54156126c957600061267a856125a8600d5447612b5190919063ffffffff16565b90506126868382612fc5565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b50506006805460ff60b01b191690555050505b6006546001600160a01b03861660009081526018602052604090205460ff600160b01b90920482161591168061272a57506001600160a01b03851660009081526018602052604090205460ff165b156127425750600061273d868686612bd0565b6127e1565b6001600160a01b03861660009081526019602052604090205460ff1615801561278457506001600160a01b03851660009081526019602052604090205460ff16155b80156127a957506001600160a01b03861660009081526018602052604090205460ff16155b80156127ce57506001600160a01b03851660009081526018602052604090205460ff16155b156127e1575060006127e1868686612bd0565b80156129ee57600061280360646125a860155488612b5190919063ffffffff16565b9050600061282160646125a860165489612b5190919063ffffffff16565b9050600061283f60646125a8600e548a612b5190919063ffffffff16565b6001600160a01b0389166000908152601b602052604090205490915060ff16801561288257506001600160a01b03891660009081526019602052604090205460ff165b156128ae576128918782612e17565b965061289e893083612bd0565b6128a9898989612bd0565b6129ea565b6001600160a01b03881660009081526019602052604090205460ff1680156128d857506000601654115b156128f4576128e78783612e17565b965061289e893084612bd0565b6001600160a01b03891660009081526019602052604090205460ff16801561291e57506000601554115b156129ea5761292d8784612e17565b965061293a893085612bd0565b612945898989612bd0565b600654600160a81b900460ff16801561297757506001600160a01b0388166000908152601b602052604090205460ff16155b801561299c57506001600160a01b03891660009081526018602052604090205460ff16155b80156129c157506001600160a01b03881660009081526018602052604090205460ff16155b156129ea576001600160a01b0388166000908152601b60205260409020805460ff191660011790555b5050505b505050505050565b333b15612a455760405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206e6f7420616c6c6f77656420746f2063616c6c000000006044820152606401610ba9565b6001600160a01b0383166120ae5760405162461bcd60e51b8152600401610ba9906133a5565b600b54600a54612a7a91611ee6565b601555600d54600c54612a8c91611ee6565b601655565b601e548111612a9f57600080fd5b601e55565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000808211612b475760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610ba9565b611f45828461336c565b600082612b6057506000610c9c565b6000612b6c8385613335565b905082612b79858361336c565b14611f455760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ba9565b6001600160a01b038316612bf65760405162461bcd60e51b8152600401610ba9906133a5565b6001600160a01b038216612c1c5760405162461bcd60e51b8152600401610ba9906133ea565b6001600160a01b03831660009081526020819052604090205481811015612c945760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba9565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612ccb908490613354565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d1791815260200190565b60405180910390a361146d565b6001600160a01b03821660009081526019602052604090205460ff1615158115151415612dc35760405162461bcd60e51b815260206004820152604160248201527f4d6574614245543a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a401610ba9565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b600082821115612e695760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610ba9565b611f45828461338e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ea857612ea861342d565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f259190613443565b81600181518110612f3857612f3861342d565b6001600160a01b039283166020918202929092010152600654612f5e9130911684611f4c565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612f97908590600090869030904290600401613460565b600060405180830381600087803b158015612fb157600080fd5b505af11580156129ee573d6000803e3d6000fd5b600654612fdd9030906001600160a01b031684611f4c565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561304a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610db091906134d1565b600060208083528351808285015260005b8181101561309c57858101830151858201604001528201613080565b818111156130ae576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610fe957600080fd5b600080604083850312156130ec57600080fd5b82356130f7816130c4565b946020939093013593505050565b6000806040838503121561311857600080fd5b8235613123816130c4565b91506020830135613133816130c4565b809150509250929050565b60006020828403121561315057600080fd5b5035919050565b60006020828403121561316957600080fd5b8135611f45816130c4565b60008060006060848603121561318957600080fd5b8335613194816130c4565b925060208401356131a4816130c4565b929592945050506040919091013590565b600080604083850312156131c857600080fd5b50508035926020909101359150565b803560ff811681146131e857600080fd5b919050565b6000806040838503121561320057600080fd5b613209836131d7565b9150613217602084016131d7565b90509250929050565b8015158114610fe957600080fd5b60006020828403121561324057600080fd5b8135611f4581613220565b6000806040838503121561325e57600080fd5b8235613269816130c4565b9150602083013561313381613220565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806132c257607f821691505b602082108114156132e357634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156132fb57600080fd5b5051919050565b60006020828403121561331457600080fd5b8151611f4581613220565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561334f5761334f61331f565b500290565b600082198211156133675761336761331f565b500190565b60008261338957634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156133a0576133a061331f565b500390565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561345557600080fd5b8151611f45816130c4565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156134b05784516001600160a01b03168352938301939183019160010161348b565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156134e657600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a20d80d0ddd6a4553e95bc23fdef3660b7d74a4c45133d0b9f1beaf7f980236e64736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106103905760003560e01c80637bbf8df9116101dc578063be874c9211610102578063e2f45605116100a0578063f2fde38b1161006f578063f2fde38b14610ad6578063f5a0805214610af6578063f77dbdc614610b16578063fe575a8714610b4657600080fd5b8063e2f4560514610a60578063e37ba8f914610a76578063eab8072314610a96578063f298f42c14610ab657600080fd5b8063c3a3c032116100dc578063c3a3c032146109da578063d0a39814146109ef578063d63607d814610a05578063dd62ed3e14610a1a57600080fd5b8063be874c921461097a578063c02466681461099a578063c23be47f146109ba57600080fd5b8063a9059cbb1161017a578063b1ff3b5c11610149578063b1ff3b5c14610909578063b62496f51461091f578063b9e937001461094f578063bc37e1a31461096557600080fd5b8063a9059cbb14610893578063a9dec436146108b3578063aacebbe3146108c9578063ab3b5545146108e957600080fd5b80638da5cb5b116101b65780638da5cb5b1461082057806395d89b411461083e5780639a7a23d614610853578063a457c2d71461087357600080fd5b80637bbf8df9146107ca57806382247ec0146107ea5780638ab792e31461080057600080fd5b80632c889d18116102c157806349bdf8731161025f57806365b8dbc01161022e57806365b8dbc01461072f57806370a082311461074f578063715018a6146107855780637235f2931461079a57600080fd5b806349bdf873146106835780634cdaf0ae1461069d5780634fbee193146106bd5780636067e190146106f657600080fd5b8063395093511161029b57806339509351146105e15780633c7a309b146106015780634939f0331461061657806349bd5a5e1461064f57600080fd5b80632c889d18146105855780632de3f956146105a5578063313ce567146105c557600080fd5b806319fb3e7a1161032e57806323b872dd1161030857806323b872dd14610510578063270924c714610530578063296d3de0146105455780632b75e9dd1461056557600080fd5b806319fb3e7a146104a05780631c499ab0146104c05780631cdd3be3146104e057600080fd5b8063095ea7b31161036a578063095ea7b3146104025780631694505e146104325780631732cded1461046a57806318160ddd1461048b57600080fd5b8063021954661461039c57806306fdde03146103b35780630773d31d146103de57600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610b7f565b005b3480156103bf57600080fd5b506103c8610bf9565b6040516103d5919061306f565b60405180910390f35b3480156103ea57600080fd5b506103f460115481565b6040519081526020016103d5565b34801561040e57600080fd5b5061042261041d3660046130d9565b610c8b565b60405190151581526020016103d5565b34801561043e57600080fd5b50600654610452906001600160a01b031681565b6040516001600160a01b0390911681526020016103d5565b34801561047657600080fd5b5060065461042290600160b01b900460ff1681565b34801561049757600080fd5b506002546103f4565b3480156104ac57600080fd5b506103b16104bb366004613105565b610ca2565b3480156104cc57600080fd5b506103b16104db36600461313e565b610db7565b3480156104ec57600080fd5b506104226104fb366004613157565b601a6020526000908152604090205460ff1681565b34801561051c57600080fd5b5061042261052b366004613174565b610df9565b34801561053c57600080fd5b506103b1610ea3565b34801561055157600080fd5b506103b16105603660046131b5565b610f12565b34801561057157600080fd5b506103b16105803660046131ed565b610f6a565b34801561059157600080fd5b506103b16105a036600461313e565b610fad565b3480156105b157600080fd5b506103b16105c036600461322e565b610fec565b3480156105d157600080fd5b50604051601281526020016103d5565b3480156105ed57600080fd5b506104226105fc3660046130d9565b61106e565b34801561060d57600080fd5b506103b16110aa565b34801561062257600080fd5b50610422610631366004613157565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561065b57600080fd5b506104527f000000000000000000000000745dc578c96c70578c9f7c9d3ba77e286dfbcdd981565b34801561068f57600080fd5b50601f546104229060ff1681565b3480156106a957600080fd5b506103b16106b8366004613157565b611278565b3480156106c957600080fd5b506104226106d8366004613157565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561070257600080fd5b50610422610711366004613157565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561073b57600080fd5b506103b161074a366004613157565b6112d1565b34801561075b57600080fd5b506103f461076a366004613157565b6001600160a01b031660009081526020819052604090205490565b34801561079157600080fd5b506103b16113cb565b3480156107a657600080fd5b506104226107b5366004613157565b601b6020526000908152604090205460ff1681565b3480156107d657600080fd5b506103b16107e53660046130d9565b611401565b3480156107f657600080fd5b506103f4600f5481565b34801561080c57600080fd5b506103b161081b3660046131ed565b611473565b34801561082c57600080fd5b506005546001600160a01b0316610452565b34801561084a57600080fd5b506103c86114b2565b34801561085f57600080fd5b506103b161086e36600461324b565b6114c1565b34801561087f57600080fd5b5061042261088e3660046130d9565b6115b4565b34801561089f57600080fd5b506104226108ae3660046130d9565b61164d565b3480156108bf57600080fd5b506103f460105481565b3480156108d557600080fd5b506103b16108e4366004613157565b61165a565b3480156108f557600080fd5b506103b161090436600461313e565b611768565b34801561091557600080fd5b506103f460175481565b34801561092b57600080fd5b5061042261093a366004613157565b60196020526000908152604090205460ff1681565b34801561095b57600080fd5b506103f460155481565b34801561097157600080fd5b506103b16117aa565b34801561098657600080fd5b506103b161099536600461313e565b611812565b3480156109a657600080fd5b506103b16109b536600461324b565b6118b8565b3480156109c657600080fd5b506103b16109d5366004613157565b6119cd565b3480156109e657600080fd5b506103f4611a13565b3480156109fb57600080fd5b506103f460165481565b348015610a1157600080fd5b506103b1611a38565b348015610a2657600080fd5b506103f4610a35366004613105565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a6c57600080fd5b506103f460095481565b348015610a8257600080fd5b506103b1610a91366004613157565b611a71565b348015610aa257600080fd5b506103b1610ab136600461324b565b611b7f565b348015610ac257600080fd5b506103b1610ad136600461324b565b611c88565b348015610ae257600080fd5b506103b1610af1366004613157565b611d98565b348015610b0257600080fd5b506103b1610b1136600461324b565b611e30565b348015610b2257600080fd5b50610422610b31366004613157565b601c6020526000908152604090205460ff1681565b348015610b5257600080fd5b50610422610b61366004613157565b6001600160a01b03166000908152601a602052604090205460ff1690565b6005546001600160a01b03163314610bb25760405162461bcd60e51b8152600401610ba990613279565b60405180910390fd5b610bbe60326031611473565b610bc9600a80610f6a565b610bd5621e8480610db7565b610be2621e848080610f12565b6006805461ffff60a01b191661010160a01b179055565b606060038054610c08906132ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c34906132ae565b8015610c815780601f10610c5657610100808354040283529160200191610c81565b820191906000526020600020905b815481529060010190602001808311610c6457829003601f168201915b5050505050905090565b6000610c98338484611f4c565b5060015b92915050565b6005546001600160a01b03163314610ccc5760405162461bcd60e51b8152600401610ba990613279565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3991906132e9565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db09190613302565b5050505050565b6005546001600160a01b03163314610de15760405162461bcd60e51b8152600401610ba990613279565b610df381670de0b6b3a7640000613335565b600f5550565b6000610e06848484612070565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e8b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ba9565b610e988533858403611f4c565b506001949350505050565b6005546001600160a01b03163314610ecd5760405162461bcd60e51b8152600401610ba990613279565b610ed8600a80611473565b610ee3600a80610f6a565b610eef621e8480610db7565b610efc621e848080610f12565b6006805461ffff60a01b1916600160a01b179055565b6005546001600160a01b03163314610f3c5760405162461bcd60e51b8152600401610ba990613279565b610f4e82670de0b6b3a7640000613335565b601055610f6381670de0b6b3a7640000613335565b6011555050565b6005546001600160a01b03163314610f945760405162461bcd60e51b8152600401610ba990613279565b60ff808316600c558116600d55610fa9612a6b565b5050565b6005546001600160a01b03163314610fd75760405162461bcd60e51b8152600401610ba990613279565b610fe9610fe44283613354565b612a91565b50565b6005546001600160a01b031633146110165760405162461bcd60e51b8152600401610ba990613279565b60068054821515600160a01b0260ff60a01b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb29061106390831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c989185906110a5908690613354565b611f4c565b6005546001600160a01b031633146110d45760405162461bcd60e51b8152600401610ba990613279565b601e544210156111195760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610ba9565b601d546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a91906132e9565b601f5490915060ff161561123f576111a6630102660042613354565b601e55600a6111b6826002613335565b6111c0919061336c565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af1158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a9190613302565b505050565b60085460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016111f7565b6005546001600160a01b031633146112a25760405162461bcd60e51b8152600401610ba990613279565b601d80546001600160a01b0319166001600160a01b0383161790556112cb630102660042613354565b601e5550565b6005546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610ba990613279565b6006546001600160a01b038281169116141561136e5760405162461bcd60e51b815260206004820152602c60248201527f4d6574614245543a2054686520726f7574657220616c7265616479206861732060448201526b74686174206164647265737360a01b6064820152608401610ba9565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113f55760405162461bcd60e51b8152600401610ba990613279565b6113ff6000612aa4565b565b6005546001600160a01b0316331461142b5760405162461bcd60e51b8152600401610ba990613279565b60008111801561143c575060648111155b61144557600080fd5b6000611452826064612af6565b905060006114604783612b51565b905061146d308583612bd0565b50505050565b6005546001600160a01b0316331461149d5760405162461bcd60e51b8152600401610ba990613279565b60ff808316600a558116600b55610fa9612a6b565b606060048054610c08906132ae565b6005546001600160a01b031633146114eb5760405162461bcd60e51b8152600401610ba990613279565b7f000000000000000000000000745dc578c96c70578c9f7c9d3ba77e286dfbcdd96001600160a01b0316826001600160a01b031614156115aa5760405162461bcd60e51b815260206004820152604e60248201527f4d6574614245543a205468652050616e63616b6553776170207061697220636160448201527f6e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d6160648201526d726b65744d616b6572506169727360901b608482015260a401610ba9565b610fa98282612d24565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116365760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ba9565b6116433385858403611f4c565b5060019392505050565b6000610c98338484612070565b6005546001600160a01b031633146116845760405162461bcd60e51b8152600401610ba990613279565b6007546001600160a01b03828116911614156117005760405162461bcd60e51b815260206004820152603560248201527f4d6574614245543a20546865206d61726b6574696e672077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b6064820152608401610ba9565b61170b8160016118b8565b6007546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146117925760405162461bcd60e51b8152600401610ba990613279565b6117a481670de0b6b3a7640000613335565b60095550565b6005546001600160a01b031633146117d45760405162461bcd60e51b8152600401610ba990613279565b6117df600080611473565b6117ea600080610f6a565b6006805460ff60a01b191690556118046305f5e100610db7565b6113ff6305f5e10080610f12565b6005546001600160a01b0316331461183c5760405162461bcd60e51b8152600401610ba990613279565b306000908152602081905260409020548111156118ab5760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f742065786365656420746f6b656e7320696e20636044820152661bdb9d1c9858dd60ca1b6064820152608401610ba9565b610fe93061dead83612bd0565b6005546001600160a01b031633146118e25760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b03821660009081526018602052604090205460ff161515811515141561196d5760405162461bcd60e51b815260206004820152603360248201527f4d6574614245543a204163636f756e7420697320616c7265616479207468652060448201527276616c7565206f6620276578636c756465642760681b6064820152608401610ba9565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b031633146119f75760405162461bcd60e51b8152600401610ba990613279565b3060008181526020819052604090205490610fa9908383612bd0565b6000601e54421015611a325742601e54611a2d919061338e565b905090565b50600090565b6005546001600160a01b03163314611a625760405162461bcd60e51b8152600401610ba990613279565b601f805460ff19166001179055565b6005546001600160a01b03163314611a9b5760405162461bcd60e51b8152600401610ba990613279565b6008546001600160a01b0382811691161415611b175760405162461bcd60e51b815260206004820152603560248201527f4d6574614245543a20546865206c69717569646974792077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b6064820152608401610ba9565b611b228160016118b8565b6008546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611ba95760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b0382166000908152601b602052604090205460ff1615158115151415611c305760405162461bcd60e51b815260206004820152602f60248201527f4d6574614245543a204163636f756e7420697320616c7265616479207468652060448201526e76616c7565206f662027656c6f6e2760881b6064820152608401610ba9565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f061c5e8a60e1b2a590ab9407616506b02d4efc8b078988e5dcfd6182e042e3a891016119c1565b6005546001600160a01b03163314611cb25760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b0382166000908152601a602052604090205460ff1615158115151415611d405760405162461bcd60e51b815260206004820152603660248201527f4d6574614245543a204163636f756e7420697320616c7265616479207468652060448201527576616c7565206f662027626c61636b6c69737465642760501b6064820152608401610ba9565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c91016119c1565b6005546001600160a01b03163314611dc25760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b038116611e275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba9565b610fe981612aa4565b6005546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401610ba990613279565b6001600160a01b0382163b611ebb5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920636f6e7472616374206164647265737320697320616c6c6f7765646044820152602160f81b6064820152608401610ba9565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b600080611ef38385613354565b905083811015611f455760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ba9565b9392505050565b6001600160a01b038316611fae5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba9565b6001600160a01b03821661200f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b336000908152601c602052604090205460ff16156129f6576001600160a01b0383166120ae5760405162461bcd60e51b8152600401610ba9906133a5565b6001600160a01b0382166120d45760405162461bcd60e51b8152600401610ba9906133ea565b6001600160a01b0382166000908152601a602052604090205460ff1615801561211657506001600160a01b0383166000908152601a602052604090205460ff16155b61211f57600080fd5b6005546001600160a01b0384811691161480159061214b57506005546001600160a01b03838116911614155b801561215f57506001600160a01b03821615155b801561217657506001600160a01b03821661dead14155b80156121b457507f000000000000000000000000745dc578c96c70578c9f7c9d3ba77e286dfbcdd96001600160a01b0316826001600160a01b031614155b80156121d957506001600160a01b03821660009081526018602052604090205460ff16155b80156121fe57506001600160a01b03831660009081526018602052604090205460ff16155b1561230357600654600160a01b900460ff16151560011461221e57600080fd5b6010548111156122815760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610ba9565b6001600160a01b038216600090815260208190526040902054600f546122a78383613354565b11156123015760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610ba9565b505b806123145761123a83836000612bd0565b600654600160b01b900460ff1615801561234657506001600160a01b03821660009081526019602052604090205460ff165b801561236057506006546001600160a01b03848116911614155b801561237a57506005546001600160a01b03848116911614155b801561239457506005546001600160a01b03838116911614155b80156123b957506001600160a01b03821660009081526018602052604090205460ff16155b80156123de57506001600160a01b03831660009081526018602052604090205460ff16155b1561247657600654600160a01b900460ff1615156001146123fe57600080fd5b6011548111156124765760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610ba9565b30600090815260208190526040902054600954811080159081906124a45750600654600160b01b900460ff16155b80156124c957506001600160a01b03851660009081526019602052604090205460ff16155b80156124e357506008546001600160a01b03868116911614155b80156124fd57506008546001600160a01b03858116911614155b801561251757506007546001600160a01b03868116911614155b801561253157506007546001600160a01b03858116911614155b801561255657506001600160a01b03841660009081526018602052604090205460ff16155b801561257b57506001600160a01b03851660009081526018602052604090205460ff16155b156126dc576017549150600080601654905060006125ae826125a8600d5488612b5190919063ffffffff16565b90612af6565b905060006125bd826002612af6565b905060006125cb8383612e17565b6006805460ff60b01b1916600160b01b179055600c5490915015612657576125f38783612e17565b94506125fe85612e73565b6000612619856125a8600c5447612b5190919063ffffffff16565b6007546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612654573d6000803e3d6000fd5b50505b600d54156126c957600061267a856125a8600d5447612b5190919063ffffffff16565b90506126868382612fc5565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b50506006805460ff60b01b191690555050505b6006546001600160a01b03861660009081526018602052604090205460ff600160b01b90920482161591168061272a57506001600160a01b03851660009081526018602052604090205460ff165b156127425750600061273d868686612bd0565b6127e1565b6001600160a01b03861660009081526019602052604090205460ff1615801561278457506001600160a01b03851660009081526019602052604090205460ff16155b80156127a957506001600160a01b03861660009081526018602052604090205460ff16155b80156127ce57506001600160a01b03851660009081526018602052604090205460ff16155b156127e1575060006127e1868686612bd0565b80156129ee57600061280360646125a860155488612b5190919063ffffffff16565b9050600061282160646125a860165489612b5190919063ffffffff16565b9050600061283f60646125a8600e548a612b5190919063ffffffff16565b6001600160a01b0389166000908152601b602052604090205490915060ff16801561288257506001600160a01b03891660009081526019602052604090205460ff165b156128ae576128918782612e17565b965061289e893083612bd0565b6128a9898989612bd0565b6129ea565b6001600160a01b03881660009081526019602052604090205460ff1680156128d857506000601654115b156128f4576128e78783612e17565b965061289e893084612bd0565b6001600160a01b03891660009081526019602052604090205460ff16801561291e57506000601554115b156129ea5761292d8784612e17565b965061293a893085612bd0565b612945898989612bd0565b600654600160a81b900460ff16801561297757506001600160a01b0388166000908152601b602052604090205460ff16155b801561299c57506001600160a01b03891660009081526018602052604090205460ff16155b80156129c157506001600160a01b03881660009081526018602052604090205460ff16155b156129ea576001600160a01b0388166000908152601b60205260409020805460ff191660011790555b5050505b505050505050565b333b15612a455760405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206e6f7420616c6c6f77656420746f2063616c6c000000006044820152606401610ba9565b6001600160a01b0383166120ae5760405162461bcd60e51b8152600401610ba9906133a5565b600b54600a54612a7a91611ee6565b601555600d54600c54612a8c91611ee6565b601655565b601e548111612a9f57600080fd5b601e55565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000808211612b475760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610ba9565b611f45828461336c565b600082612b6057506000610c9c565b6000612b6c8385613335565b905082612b79858361336c565b14611f455760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ba9565b6001600160a01b038316612bf65760405162461bcd60e51b8152600401610ba9906133a5565b6001600160a01b038216612c1c5760405162461bcd60e51b8152600401610ba9906133ea565b6001600160a01b03831660009081526020819052604090205481811015612c945760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba9565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612ccb908490613354565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d1791815260200190565b60405180910390a361146d565b6001600160a01b03821660009081526019602052604090205460ff1615158115151415612dc35760405162461bcd60e51b815260206004820152604160248201527f4d6574614245543a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a401610ba9565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b600082821115612e695760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610ba9565b611f45828461338e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ea857612ea861342d565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f259190613443565b81600181518110612f3857612f3861342d565b6001600160a01b039283166020918202929092010152600654612f5e9130911684611f4c565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612f97908590600090869030904290600401613460565b600060405180830381600087803b158015612fb157600080fd5b505af11580156129ee573d6000803e3d6000fd5b600654612fdd9030906001600160a01b031684611f4c565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561304a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610db091906134d1565b600060208083528351808285015260005b8181101561309c57858101830151858201604001528201613080565b818111156130ae576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610fe957600080fd5b600080604083850312156130ec57600080fd5b82356130f7816130c4565b946020939093013593505050565b6000806040838503121561311857600080fd5b8235613123816130c4565b91506020830135613133816130c4565b809150509250929050565b60006020828403121561315057600080fd5b5035919050565b60006020828403121561316957600080fd5b8135611f45816130c4565b60008060006060848603121561318957600080fd5b8335613194816130c4565b925060208401356131a4816130c4565b929592945050506040919091013590565b600080604083850312156131c857600080fd5b50508035926020909101359150565b803560ff811681146131e857600080fd5b919050565b6000806040838503121561320057600080fd5b613209836131d7565b9150613217602084016131d7565b90509250929050565b8015158114610fe957600080fd5b60006020828403121561324057600080fd5b8135611f4581613220565b6000806040838503121561325e57600080fd5b8235613269816130c4565b9150602083013561313381613220565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806132c257607f821691505b602082108114156132e357634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156132fb57600080fd5b5051919050565b60006020828403121561331457600080fd5b8151611f4581613220565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561334f5761334f61331f565b500290565b600082198211156133675761336761331f565b500190565b60008261338957634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156133a0576133a061331f565b500390565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561345557600080fd5b8151611f45816130c4565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156134b05784516001600160a01b03168352938301939183019160010161348b565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156134e657600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a20d80d0ddd6a4553e95bc23fdef3660b7d74a4c45133d0b9f1beaf7f980236e64736f6c634300080b0033

Deployed Bytecode Sourcemap

36635:19980:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54256:247;;;;;;;;;;;;;:::i;:::-;;2354:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37338:23;;;;;;;;;;;;;;;;;;;762:25:1;;;750:2;735:18;37338:23:0;616:177:1;4521:169:0;;;;;;;;;;-1:-1:-1;4521:169:0;;;;;:::i;:::-;;:::i;:::-;;;1419:14:1;;1412:22;1394:41;;1382:2;1367:18;4521:169:0;1254:187:1;36786:41:0;;;;;;;;;;-1:-1:-1;36786:41:0;;;;-1:-1:-1;;;;;36786:41:0;;;;;;-1:-1:-1;;;;;1637:32:1;;;1619:51;;1607:2;1592:18;36786:41:0;1446:230:1;36933:20:0;;;;;;;;;;-1:-1:-1;36933:20:0;;;;-1:-1:-1;;;36933:20:0;;;;;;3474:108;;;;;;;;;;-1:-1:-1;3562:12:0;;3474:108;;55988:233;;;;;;;;;;-1:-1:-1;55988:233:0;;;;;:::i;:::-;;:::i;54990:119::-;;;;;;;;;;-1:-1:-1;54990:119:0;;;;;:::i;:::-;;:::i;37789:47::-;;;;;;;;;;-1:-1:-1;37789:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5172:492;;;;;;;;;;-1:-1:-1;5172:492:0;;;;;:::i;:::-;;:::i;54004:244::-;;;;;;;;;;;;;:::i;55117:174::-;;;;;;;;;;-1:-1:-1;55117:174:0;;;;;:::i;:::-;;:::i;54747:235::-;;;;;;;;;;-1:-1:-1;54747:235:0;;;;;:::i;:::-;;:::i;45086:158::-;;;;;;;;;;-1:-1:-1;45086:158:0;;;;;:::i;:::-;;:::i;47975:143::-;;;;;;;;;;-1:-1:-1;47975:143:0;;;;;:::i;:::-;;:::i;3316:93::-;;;;;;;;;;-1:-1:-1;3316:93:0;;3399:2;4154:36:1;;4142:2;4127:18;3316:93:0;4012:184:1;6073:215:0;;;;;;;;;;-1:-1:-1;6073:215:0;;;;;:::i;:::-;;:::i;45545:903::-;;;;;;;;;;;;;:::i;47693:148::-;;;;;;;;;;-1:-1:-1;47693:148:0;;;;;:::i;:::-;-1:-1:-1;;;;;47790:43:0;47766:4;47790:43;;;:34;:43;;;;;;;;;47693:148;36834:38;;;;;;;;;;;;;;;44921:37;;;;;;;;;;-1:-1:-1;44921:37:0;;;;;;;;44136:205;;;;;;;;;;-1:-1:-1;44136:205:0;;;;;:::i;:::-;;:::i;47444:125::-;;;;;;;;;;-1:-1:-1;47444:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;47533:28:0;47509:4;47533:28;;;:19;:28;;;;;;;;;47444:125;47577:108;;;;;;;;;;-1:-1:-1;47577:108:0;;;;;:::i;:::-;-1:-1:-1;;;;;47661:16:0;47637:4;47661:16;;;:7;:16;;;;;;;;;47577:108;41999:316;;;;;;;;;;-1:-1:-1;41999:316:0;;;;;:::i;:::-;;:::i;3645:127::-;;;;;;;;;;-1:-1:-1;3645:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;3746:18:0;3719:7;3746:18;;;;;;;;;;;;3645:127;24665:94;;;;;;;;;;;;;:::i;37843:40::-;;;;;;;;;;-1:-1:-1;37843:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55475:311;;;;;;;;;;-1:-1:-1;55475:311:0;;;;;:::i;:::-;;:::i;37277:25::-;;;;;;;;;;;;;;;;54511:228;;;;;;;;;;-1:-1:-1;54511:228:0;;;;;:::i;:::-;;:::i;24014:87::-;;;;;;;;;;-1:-1:-1;24087:6:0;;-1:-1:-1;;;;;24087:6:0;24014:87;;2573:104;;;;;;;;;;;;;:::i;43435:265::-;;;;;;;;;;-1:-1:-1;43435:265:0;;;;;:::i;:::-;;:::i;6791:413::-;;;;;;;;;;-1:-1:-1;6791:413:0;;;;;:::i;:::-;;:::i;3985:175::-;;;;;;;;;;-1:-1:-1;3985:175:0;;;;;:::i;:::-;;:::i;37309:22::-;;;;;;;;;;;;;;;;46836:372;;;;;;;;;;-1:-1:-1;46836:372:0;;;;;:::i;:::-;;:::i;41877:110::-;;;;;;;;;;-1:-1:-1;41877:110:0;;;;;:::i;:::-;;:::i;37556:41::-;;;;;;;;;;;;;;;;37724:58;;;;;;;;;;-1:-1:-1;37724:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37488:27;;;;;;;;;;;;;;;;53776:219;;;;;;;;;;;;;:::i;56229:256::-;;;;;;;;;;-1:-1:-1;56229:256:0;;;;;:::i;:::-;;:::i;42323:299::-;;;;;;;;;;-1:-1:-1;42323:299:0;;;;;:::i;:::-;;:::i;55794:186::-;;;;;;;;;;-1:-1:-1;55794:186:0;;;;;:::i;:::-;;:::i;47216:220::-;;;;;;;;;;;;;:::i;37522:28::-;;;;;;;;;;;;;;;;44965:113;;;;;;;;;;;;;:::i;4223:151::-;;;;;;;;;;-1:-1:-1;4223:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;4339:18:0;;;4312:7;4339:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4223:151;37040:33;;;;;;;;;;;;;;;;46456:372;;;;;;;;;;-1:-1:-1;46456:372:0;;;;;:::i;:::-;;:::i;42630:243::-;;;;;;;;;;-1:-1:-1;42630:243:0;;;;;:::i;:::-;;:::i;42885:297::-;;;;;;;;;;-1:-1:-1;42885:297:0;;;;;:::i;:::-;;:::i;24914:192::-;;;;;;;;;;-1:-1:-1;24914:192:0;;;;;:::i;:::-;;:::i;43190:237::-;;;;;;;;;;-1:-1:-1;43190:237:0;;;;;:::i;:::-;;:::i;37890:67::-;;;;;;;;;;-1:-1:-1;37890:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47853:116;;;;;;;;;;-1:-1:-1;47853:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;47938:23:0;47914:4;47938:23;;;:14;:23;;;;;;;;;47853:116;54256:247;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;;;;;;;;;54314:20:::1;54328:2;54331;54314:13;:20::i;:::-;54345:21;54360:2;54363::::0;54345:14:::1;:21::i;:::-;54379:24;54395:7;54379:15;:24::i;:::-;54414:34;54431:7;54440::::0;54414:16:::1;:34::i;:::-;54455:7;:14:::0;;-1:-1:-1;;;;54480:15:0;-1:-1:-1;;;54480:15:0;;;54256:247::o;2354:100::-;2408:13;2441:5;2434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2354:100;:::o;4521:169::-;4604:4;4621:39;1307:10;4644:7;4653:6;4621:8;:39::i;:::-;-1:-1:-1;4678:4:0;4521:169;;;;;:::o;55988:233::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;56140:30:::1;::::0;-1:-1:-1;;;56140:30:0;;56164:4:::1;56140:30;::::0;::::1;1619:51:1::0;56105:5:0;;56085:11:::1;::::0;-1:-1:-1;;;;;56140:15:0;::::1;::::0;::::1;::::0;1592:18:1;;56140:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56181:32;::::0;-1:-1:-1;;;56181:32:0;;-1:-1:-1;;;;;5923:32:1;;;56181::0::1;::::0;::::1;5905:51:1::0;5972:18;;;5965:34;;;56122:48:0;;-1:-1:-1;56181:14:0;;::::1;::::0;::::1;::::0;5878:18:1;;56181:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56074:147;;55988:233:::0;;:::o;54990:119::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;55078:23:::1;:12:::0;55094:6:::1;55078:23;:::i;:::-;55065:10;:36:::0;-1:-1:-1;54990:119:0:o;5172:492::-;5312:4;5329:36;5339:6;5347:9;5358:6;5329:9;:36::i;:::-;-1:-1:-1;;;;;5405:19:0;;5378:24;5405:19;;;:11;:19;;;;;;;;1307:10;5405:33;;;;;;;;5457:26;;;;5449:79;;;;-1:-1:-1;;;5449:79:0;;6767:2:1;5449:79:0;;;6749:21:1;6806:2;6786:18;;;6779:30;6845:34;6825:18;;;6818:62;-1:-1:-1;;;6896:18:1;;;6889:38;6944:19;;5449:79:0;6565:404:1;5449:79:0;5564:57;5573:6;1307:10;5614:6;5595:16;:25;5564:8;:57::i;:::-;-1:-1:-1;5652:4:0;;5172:492;-1:-1:-1;;;;5172:492:0:o;54004:244::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;54058:20:::1;54072:2;54075::::0;54058:13:::1;:20::i;:::-;54089:21;54104:2;54107::::0;54089:14:::1;:21::i;:::-;54123:24;54139:7;54123:15;:24::i;:::-;54158:34;54175:7;54184::::0;54158:16:::1;:34::i;:::-;54199:7;:14:::0;;-1:-1:-1;;;;54224:16:0;-1:-1:-1;;;54224:16:0;;;54004:244::o;55117:174::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;55220:20:::1;:9:::0;55233:6:::1;55220:20;:::i;:::-;55210:7;:30:::0;55262:21:::1;:10:::0;55276:6:::1;55262:21;:::i;:::-;55251:8;:32:::0;-1:-1:-1;;55117:174:0:o;54747:235::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;54853:39:::1;::::0;;::::1;:17;:39:::0;54903;::::1;:17;:39:::0;54963:11:::1;:9;:11::i;:::-;54747:235:::0;;:::o;45086:158::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;45179:57:::1;45201:34;45220:15;45201:18:::0;:34:::1;:::i;:::-;45179:21;:57::i;:::-;45086:158:::0;:::o;47975:143::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;48042:7:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;48042:18:0::1;-1:-1:-1::0;;;;48042:18:0;;::::1;;::::0;;48086:24:::1;::::0;::::1;::::0;::::1;::::0;48052:8;1419:14:1;1412:22;1394:41;;1382:2;1367:18;;1254:187;48086:24:0::1;;;;;;;;47975:143:::0;:::o;6073:215::-;1307:10;6161:4;6210:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6210:34:0;;;;;;;;;;6161:4;;6178:80;;6201:7;;6210:47;;6247:10;;6210:47;:::i;:::-;6178:8;:80::i;45545:903::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;45690:20:::1;;45671:15;:39;;45663:68;;;::::0;-1:-1:-1;;;45663:68:0;;7309:2:1;45663:68:0::1;::::0;::::1;7291:21:1::0;7348:2;7328:18;;;7321:30;-1:-1:-1;;;7367:18:1;;;7360:46;7423:18;;45663:68:0::1;7107:340:1::0;45663:68:0::1;45775:22;::::0;45826:39:::1;::::0;-1:-1:-1;;;45826:39:0;;45859:4:::1;45826:39;::::0;::::1;1619:51:1::0;-1:-1:-1;;;;;45775:22:0;;::::1;::::0;45744:21:::1;::::0;45775:22;;45826:24:::1;::::0;1592:18:1;;45826:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45879:25;::::0;45809:56;;-1:-1:-1;45879:25:0::1;;45876:565;;;45951:27;37645:8;45951:15;:27;:::i;:::-;45930:20;:48:::0;46116:2:::1;46107:8;:6:::0;46114:1:::1;46107:8;:::i;:::-;:11;;;;:::i;:::-;46157:15;::::0;46133:48:::1;::::0;-1:-1:-1;;;46133:48:0;;-1:-1:-1;;;;;46157:15:0;;::::1;46133:48;::::0;::::1;5905:51:1::0;5972:18;;;5965:34;;;46100:18:0;;-1:-1:-1;46133:23:0;::::1;::::0;::::1;::::0;5878:18:1;;46133:48:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54747:235:::0;;:::o;45876:565::-:1;46405:15;::::0;46381:48:::1;::::0;-1:-1:-1;;;46381:48:0;;-1:-1:-1;;;;;46405:15:0;;::::1;46381:48;::::0;::::1;5905:51:1::0;5972:18;;;5965:34;;;46381:23:0;;::::1;::::0;::::1;::::0;5878:18:1;;46381:48:0::1;5731:274:1::0;44136:205:0;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;44230:22:::1;:44:::0;;-1:-1:-1;;;;;;44230:44:0::1;-1:-1:-1::0;;;;;44230:44:0;::::1;;::::0;;44306:27:::1;37645:8;44306:15;:27;:::i;:::-;44285:20;:48:::0;-1:-1:-1;44136:205:0:o;41999:316::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;42108:15:::1;::::0;-1:-1:-1;;;;;42086:38:0;;::::1;42108:15:::0;::::1;42086:38;;42078:95;;;::::0;-1:-1:-1;;;42078:95:0;;7876:2:1;42078:95:0::1;::::0;::::1;7858:21:1::0;7915:2;7895:18;;;7888:30;7954:34;7934:18;;;7927:62;-1:-1:-1;;;8005:18:1;;;7998:42;8057:19;;42078:95:0::1;7674:408:1::0;42078:95:0::1;42231:15;::::0;42189:59:::1;::::0;-1:-1:-1;;;;;42231:15:0;;::::1;::::0;42189:59;::::1;::::0;::::1;::::0;42231:15:::1;::::0;42189:59:::1;42259:15;:48:::0;;-1:-1:-1;;;;;;42259:48:0::1;-1:-1:-1::0;;;;;42259:48:0;;;::::1;::::0;;;::::1;::::0;;41999:316::o;24665:94::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;24730:21:::1;24748:1;24730:9;:21::i;:::-;24665:94::o:0;55475:311::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;55585:1:::1;55575:7;:11;:29;;;;;55601:3;55590:7;:14;;55575:29;55567:38;;;::::0;::::1;;55616:18;55637:16;:7:::0;55649:3:::1;55637:11;:16::i;:::-;55616:37:::0;-1:-1:-1;55664:15:0::1;55682:37;:21;55616:37:::0;55682:25:::1;:37::i;:::-;55664:55;;55730:48;55754:4;55761:7;55770;55730:15;:48::i;:::-;55556:230;;55475:311:::0;;:::o;54511:228::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;54614:37:::1;::::0;;::::1;:16;:37:::0;54662;::::1;:16;:37:::0;54720:11:::1;:9;:11::i;2573:104::-:0;2629:13;2662:7;2655:14;;;;;:::i;43435:265::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;43542:13:::1;-1:-1:-1::0;;;;;43534:21:0::1;:4;-1:-1:-1::0;;;;;43534:21:0::1;;;43526:112;;;::::0;-1:-1:-1;;;43526:112:0;;8289:2:1;43526:112:0::1;::::0;::::1;8271:21:1::0;8328:2;8308:18;;;8301:30;8367:34;8347:18;;;8340:62;8438:34;8418:18;;;8411:62;-1:-1:-1;;;8489:19:1;;;8482:45;8544:19;;43526:112:0::1;8087:482:1::0;43526:112:0::1;43651:41;43680:4;43686:5;43651:28;:41::i;6791:413::-:0;1307:10;6884:4;6928:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6928:34:0;;;;;;;;;;6981:35;;;;6973:85;;;;-1:-1:-1;;;6973:85:0;;8776:2:1;6973:85:0;;;8758:21:1;8815:2;8795:18;;;8788:30;8854:34;8834:18;;;8827:62;-1:-1:-1;;;8905:18:1;;;8898:35;8950:19;;6973:85:0;8574:401:1;6973:85:0;7094:67;1307:10;7117:7;7145:15;7126:16;:34;7094:8;:67::i;:::-;-1:-1:-1;7192:4:0;;6791:413;-1:-1:-1;;;6791:413:0:o;3985:175::-;4071:4;4088:42;1307:10;4112:9;4123:6;4088:9;:42::i;46836:372::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;46953:15:::1;::::0;-1:-1:-1;;;;;46931:37:0;;::::1;46953:15:::0;::::1;46931:37;;46923:103;;;::::0;-1:-1:-1;;;46923:103:0;;9182:2:1;46923:103:0::1;::::0;::::1;9164:21:1::0;9221:2;9201:18;;;9194:30;9260:34;9240:18;;;9233:62;-1:-1:-1;;;9311:18:1;;;9304:51;9372:19;;46923:103:0::1;8980:417:1::0;46923:103:0::1;47037:41;47053:18;47073:4;47037:15;:41::i;:::-;47137:15;::::0;47094:59:::1;::::0;-1:-1:-1;;;;;47137:15:0;;::::1;::::0;47094:59;::::1;::::0;::::1;::::0;47137:15:::1;::::0;47094:59:::1;47164:15;:36:::0;;-1:-1:-1;;;;;;47164:36:0::1;-1:-1:-1::0;;;;;47164:36:0;;;::::1;::::0;;;::::1;::::0;;46836:372::o;41877:110::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;41965:17:::1;:6:::0;41975::::1;41965:17;:::i;:::-;41944:18;:38:::0;-1:-1:-1;41877:110:0:o;53776:219::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;53825:18:::1;53839:1;53841::::0;53825:13:::1;:18::i;:::-;53854:19;53869:1;53871::::0;53854:14:::1;:19::i;:::-;53880:7;:15:::0;;-1:-1:-1;;;;53880:15:0::1;::::0;;53908:26:::1;53924:9;53908:15;:26::i;:::-;53945:42;53963:9;53976::::0;53945:16:::1;:42::i;56229:256::-:0;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;56334:4:::1;3719:7:::0;3746:18;;;;;;;;;;;56306:6:::1;:34;;56298:86;;;::::0;-1:-1:-1;;;56298:86:0;;9604:2:1;56298:86:0::1;::::0;::::1;9586:21:1::0;9643:2;9623:18;;;9616:30;9682:34;9662:18;;;9655:62;-1:-1:-1;;;9733:18:1;;;9726:37;9780:19;;56298:86:0::1;9402:403:1::0;56298:86:0::1;56395:82;56419:4;56426:42;56470:6;56395:15;:82::i;42323:299::-:0;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42416:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;42408:104;;;::::0;-1:-1:-1;;;42408:104:0;;10012:2:1;42408:104:0::1;::::0;::::1;9994:21:1::0;10051:2;10031:18;;;10024:30;10090:34;10070:18;;;10063:62;-1:-1:-1;;;10141:18:1;;;10134:49;10200:19;;42408:104:0::1;9810:415:1::0;42408:104:0::1;-1:-1:-1::0;;;;;42523:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;42523:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;42580:34;;1394:41:1;;;42580:34:0::1;::::0;1367:18:1;42580:34:0::1;;;;;;;;42323:299:::0;;:::o;55794:186::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;55907:4:::1;55871:15;3746:18:::0;;;;;;;;;;;;55924:48:::1;::::0;55955:7;3746:18;55924:15:::1;:48::i;47216:220::-:0;47281:7;47319:20;;47303:15;:36;47300:110;;;47383:15;47362:20;;:36;;;;:::i;:::-;47355:43;;47216:220;:::o;47300:110::-;-1:-1:-1;47427:1:0;;47216:220::o;44965:113::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;45040:25:::1;:30:::0;;-1:-1:-1;;45040:30:0::1;45066:4;45040:30;::::0;;44965:113::o;46456:372::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;46573:15:::1;::::0;-1:-1:-1;;;;;46551:37:0;;::::1;46573:15:::0;::::1;46551:37;;46543:103;;;::::0;-1:-1:-1;;;46543:103:0;;10562:2:1;46543:103:0::1;::::0;::::1;10544:21:1::0;10601:2;10581:18;;;10574:30;10640:34;10620:18;;;10613:62;-1:-1:-1;;;10691:18:1;;;10684:51;10752:19;;46543:103:0::1;10360:417:1::0;46543:103:0::1;46657:41;46673:18;46693:4;46657:15;:41::i;:::-;46757:15;::::0;46714:59:::1;::::0;-1:-1:-1;;;;;46757:15:0;;::::1;::::0;46714:59;::::1;::::0;::::1;::::0;46757:15:::1;::::0;46714:59:::1;46784:15;:36:::0;;-1:-1:-1;;;;;;46784:36:0::1;-1:-1:-1::0;;;;;46784:36:0;;;::::1;::::0;;;::::1;::::0;;46456:372::o;42630:243::-;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42716:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;::::1;;:24;;::::0;::::1;;;;42708:84;;;::::0;-1:-1:-1;;;42708:84:0;;10984:2:1;42708:84:0::1;::::0;::::1;10966:21:1::0;11023:2;11003:18;;;10996:30;11062:34;11042:18;;;11035:62;-1:-1:-1;;;11113:18:1;;;11106:45;11168:19;;42708:84:0::1;10782:411:1::0;42708:84:0::1;-1:-1:-1::0;;;;;42803:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;;:23;;-1:-1:-1;;42803:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;42844:21;;1394:41:1;;;42844:21:0::1;::::0;1367:18:1;42844:21:0::1;1254:187:1::0;42885:297:0;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42980:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;:38;;::::0;::::1;;;;42972:105;;;::::0;-1:-1:-1;;;42972:105:0;;11400:2:1;42972:105:0::1;::::0;::::1;11382:21:1::0;11439:2;11419:18;;;11412:30;11478:34;11458:18;;;11451:62;-1:-1:-1;;;11529:18:1;;;11522:52;11591:19;;42972:105:0::1;11198:418:1::0;42972:105:0::1;-1:-1:-1::0;;;;;43088:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;:37;;-1:-1:-1;;43088:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43143:31;;1394:41:1;;;43143:31:0::1;::::0;1367:18:1;43143:31:0::1;1254:187:1::0;24914:192:0;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25003:22:0;::::1;24995:73;;;::::0;-1:-1:-1;;;24995:73:0;;11823:2:1;24995:73:0::1;::::0;::::1;11805:21:1::0;11862:2;11842:18;;;11835:30;11901:34;11881:18;;;11874:62;-1:-1:-1;;;11952:18:1;;;11945:36;11998:19;;24995:73:0::1;11621:402:1::0;24995:73:0::1;25079:19;25089:8;25079:9;:19::i;43190:237::-:0;24087:6;;-1:-1:-1;;;;;24087:6:0;1307:10;24234:23;24226:68;;;;-1:-1:-1;;;24226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43297:18:0;::::1;13248:20:::0;43289:66:::1;;;::::0;-1:-1:-1;;;43289:66:0;;12230:2:1;43289:66:0::1;::::0;::::1;12212:21:1::0;12269:2;12249:18;;;12242:30;12308:34;12288:18;;;12281:62;-1:-1:-1;;;12359:18:1;;;12352:31;12400:19;;43289:66:0::1;12028:397:1::0;43289:66:0::1;-1:-1:-1::0;;;;;43366:43:0;;;::::1;;::::0;;;:34:::1;:43;::::0;;;;:53;;-1:-1:-1;;43366:53:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43190:237::o;35215:179::-;35273:7;;35305:5;35309:1;35305;:5;:::i;:::-;35293:17;;35334:1;35329;:6;;35321:46;;;;-1:-1:-1;;;35321:46:0;;12632:2:1;35321:46:0;;;12614:21:1;12671:2;12651:18;;;12644:30;12710:29;12690:18;;;12683:57;12757:18;;35321:46:0;12430:351:1;35321:46:0;35385:1;35215:179;-1:-1:-1;;;35215:179:0:o;10475:380::-;-1:-1:-1;;;;;10611:19:0;;10603:68;;;;-1:-1:-1;;;10603:68:0;;12988:2:1;10603:68:0;;;12970:21:1;13027:2;13007:18;;;13000:30;13066:34;13046:18;;;13039:62;-1:-1:-1;;;13117:18:1;;;13110:34;13161:19;;10603:68:0;12786:400:1;10603:68:0;-1:-1:-1;;;;;10690:21:0;;10682:68;;;;-1:-1:-1;;;10682:68:0;;13393:2:1;10682:68:0;;;13375:21:1;13432:2;13412:18;;;13405:30;13471:34;13451:18;;;13444:62;-1:-1:-1;;;13522:18:1;;;13515:32;13564:19;;10682:68:0;13191:398:1;10682:68:0;-1:-1:-1;;;;;10763:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10815:32;;762:25:1;;;10815:32:0;;735:18:1;10815:32:0;;;;;;;10475:380;;;:::o;48126:4515::-;38041:10;38006:46;;;;:34;:46;;;;;;;;38002:203;;;-1:-1:-1;;;;;48274:18:0;::::1;48266:68;;;;-1:-1:-1::0;;;48266:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48353:16:0;::::1;48345:64;;;;-1:-1:-1::0;;;48345:64:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48429:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;;::::1;;48428:19;:44:::0;::::1;;;-1:-1:-1::0;;;;;;48452:20:0;::::1;;::::0;;;:14:::1;:20;::::0;;;;;::::1;;48451:21;48428:44;48420:53;;;::::0;::::1;;24087:6:::0;;-1:-1:-1;;;;;48490:15:0;;::::1;24087:6:::0;;48490:15:::1;::::0;::::1;::::0;:32:::1;;-1:-1:-1::0;24087:6:0;;-1:-1:-1;;;;;48509:13:0;;::::1;24087:6:::0;;48509:13:::1;;48490:32;:52;;;;-1:-1:-1::0;;;;;;48526:16:0;::::1;::::0;::::1;48490:52;:77;;;;-1:-1:-1::0;;;;;;48546:21:0;::::1;48560:6;48546:21;;48490:77;:100;;;;;48577:13;-1:-1:-1::0;;;;;48571:19:0::1;:2;-1:-1:-1::0;;;;;48571:19:0::1;;;48490:100;:128;;;;-1:-1:-1::0;;;;;;48595:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;48594:24;48490:128;:158;;;;-1:-1:-1::0;;;;;;48623:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;48622:26;48490:158;48486:484;;;48683:7;::::0;-1:-1:-1;;;48683:7:0;::::1;;;:15;;48694:4;48683:15;48675:24;;;::::0;::::1;;48732:7;;48722:6;:17;;48714:70;;;::::0;-1:-1:-1;;;48714:70:0;;14606:2:1;48714:70:0::1;::::0;::::1;14588:21:1::0;14645:2;14625:18;;;14618:30;14684:34;14664:18;;;14657:62;-1:-1:-1;;;14735:18:1;;;14728:38;14783:19;;48714:70:0::1;14404:404:1::0;48714:70:0::1;-1:-1:-1::0;;;;;3746:18:0;;48799:32:::1;3746:18:::0;;;;;;;;;;;48907:10:::1;::::0;48870:33:::1;48897:6:::0;3746:18;48870:33:::1;:::i;:::-;:47;;48862:96;;;::::0;-1:-1:-1;;;48862:96:0;;15015:2:1;48862:96:0::1;::::0;::::1;14997:21:1::0;15054:2;15034:18;;;15027:30;15093:34;15073:18;;;15066:62;-1:-1:-1;;;15144:18:1;;;15137:34;15188:19;;48862:96:0::1;14813:400:1::0;48862:96:0::1;48660:310;48486:484;48997:11:::0;48994:92:::1;;49025:28;49041:4;49047:2;49051:1;49025:15;:28::i;48994:92::-;49102:8;::::0;-1:-1:-1;;;49102:8:0;::::1;;;49101:9;:42:::0;::::1;;;-1:-1:-1::0;;;;;;49114:29:0;::::1;;::::0;;;:25:::1;:29;::::0;;;;;::::1;;49101:42;:78;;;;-1:-1:-1::0;49163:15:0::1;::::0;-1:-1:-1;;;;;49147:32:0;;::::1;49163:15:::0;::::1;49147:32;;49101:78;:97;;;;-1:-1:-1::0;24087:6:0;;-1:-1:-1;;;;;49183:15:0;;::::1;24087:6:::0;;49183:15:::1;;49101:97;:114;;;;-1:-1:-1::0;24087:6:0;;-1:-1:-1;;;;;49202:13:0;;::::1;24087:6:::0;;49202:13:::1;;49101:114;:142;;;;-1:-1:-1::0;;;;;;49220:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;49219:24;49101:142;:172;;;;-1:-1:-1::0;;;;;;49248:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;49247:26;49101:172;49098:343;;;49307:7;::::0;-1:-1:-1;;;49307:7:0;::::1;;;:15;;49318:4;49307:15;49299:24;;;::::0;::::1;;49358:8;;49348:6;:18;;49340:89;;;::::0;-1:-1:-1;;;49340:89:0;;15420:2:1;49340:89:0::1;::::0;::::1;15402:21:1::0;15459:2;15439:18;;;15432:30;15498:34;15478:18;;;15471:62;15569:28;15549:18;;;15542:56;15615:19;;49340:89:0::1;15218:422:1::0;49340:89:0::1;49496:4;49447:28;3746:18:::0;;;;;;;;;;;49554::::1;::::0;49530:42;::::1;::::0;::::1;::::0;;;49584:20:::1;;-1:-1:-1::0;49596:8:0::1;::::0;-1:-1:-1;;;49596:8:0;::::1;;;49595:9;49584:20;:56;;;;-1:-1:-1::0;;;;;;49609:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;::::1;;49608:32;49584:56;:83;;;;-1:-1:-1::0;49652:15:0::1;::::0;-1:-1:-1;;;;;49644:23:0;;::::1;49652:15:::0;::::1;49644:23;;49584:83;:108;;;;-1:-1:-1::0;49677:15:0::1;::::0;-1:-1:-1;;;;;49671:21:0;;::::1;49677:15:::0;::::1;49671:21;;49584:108;:135;;;;-1:-1:-1::0;49704:15:0::1;::::0;-1:-1:-1;;;;;49696:23:0;;::::1;49704:15:::0;::::1;49696:23;;49584:135;:160;;;;-1:-1:-1::0;49729:15:0::1;::::0;-1:-1:-1;;;;;49723:21:0;;::::1;49729:15:::0;::::1;49723:21;;49584:160;:188;;;;-1:-1:-1::0;;;;;;49749:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;49748:24;49584:188;:218;;;;-1:-1:-1::0;;;;;;49777:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;49776:26;49584:218;49581:1278;;;49844:26;;49821:49;;49879:18;49903::::0;49924:13:::1;;49903:34;;49943:23;49969:59;50017:10;49969:43;49994:17;;49969:20;:24;;:43;;;;:::i;:::-;:47:::0;::::1;:59::i;:::-;49943:85:::0;-1:-1:-1;50034:12:0::1;50049:22;49943:85:::0;50069:1:::1;50049:19;:22::i;:::-;50034:37:::0;-1:-1:-1;50077:17:0::1;50097:25;:15:::0;50034:37;50097:19:::1;:25::i;:::-;50151:8;:15:::0;;-1:-1:-1;;;;50151:15:0::1;-1:-1:-1::0;;;50151:15:0::1;::::0;;50199:17:::1;::::0;50077:45;;-1:-1:-1;50199:21:0;50195:310:::1;;50250:30;:20:::0;50275:4;50250:24:::1;:30::i;:::-;50237:43;;50295:28;50312:10;50295:16;:28::i;:::-;50338:23;50364:60;50413:10;50364:44;50390:17;;50364:21;:25;;:44;;;;:::i;:60::-;50447:15;::::0;50439:50:::1;::::0;50338:86;;-1:-1:-1;;;;;;50447:15:0::1;::::0;50439:50;::::1;;;::::0;50338:86;;50447:15:::1;50439:50:::0;50447:15;50439:50;50338:86;50447:15;50439:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50222:283;50195:310;50516:17;::::0;:21;50512:300:::1;;50557:18;50578:60;50627:10;50578:44;50604:17;;50578:21;:25;;:44;;;;:::i;:60::-;50557:81;;50700:30;50713:4;50719:10;50700:12;:30::i;:::-;50753:43;::::0;;15847:25:1;;;15903:2;15888:18;;15881:34;;;15931:18;;;15924:34;;;50753:43:0::1;::::0;15835:2:1;15820:18;50753:43:0::1;;;;;;;50539:273;50512:300;-1:-1:-1::0;;50831:8:0::1;:16:::0;;-1:-1:-1;;;;50831:16:0::1;::::0;;-1:-1:-1;;;49581:1278:0::1;50887:8;::::0;-1:-1:-1;;;;;50996:25:0;::::1;50871:12;50996:25:::0;;;:19:::1;:25;::::0;;;;;50887:8:::1;-1:-1:-1::0;;;50887:8:0;;::::1;::::0;::::1;50886:9;::::0;50996:25:::1;::::0;:52:::1;;-1:-1:-1::0;;;;;;51025:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;50996:52;50993:375;;;-1:-1:-1::0;51075:5:0::1;51095:33;51111:4:::0;51117:2;51121:6;51095:15:::1;:33::i;:::-;50993:375;;;-1:-1:-1::0;;;;;51161:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;::::1;;51160:32;:66:::0;::::1;;;-1:-1:-1::0;;;;;;51197:29:0;::::1;;::::0;;;:25:::1;:29;::::0;;;;;::::1;;51196:30;51160:66;:96;;;;-1:-1:-1::0;;;;;;51231:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;51230:26;51160:96;:124;;;;-1:-1:-1::0;;;;;;51261:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;51260:24;51160:124;51157:211;;;-1:-1:-1::0;51307:5:0::1;51323:33;51339:4:::0;51345:2;51349:6;51323:15:::1;:33::i;:::-;51383:7;51380:1254;;;51411:15;51429:33;51458:3;51429:24;51440:12;;51429:6;:10;;:24;;;;:::i;:33::-;51411:51;;51481:16;51500:34;51530:3;51500:25;51511:13;;51500:6;:10;;:25;;;;:::i;:34::-;51481:53;;51553:16;51572:29;51597:3;51572:20;51583:8;;51572:6;:10;;:20;;;;:::i;:29::-;-1:-1:-1::0;;;;;51621:11:0;::::1;;::::0;;;:7:::1;:11;::::0;;;;;51553:48;;-1:-1:-1;51621:11:0::1;;:46:::0;::::1;;;-1:-1:-1::0;;;;;;51636:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;::::1;;51621:46;51618:1005;;;51697:20;:6:::0;51708:8;51697:10:::1;:20::i;:::-;51688:29;;51736:46;51752:4;51766;51773:8;51736:15;:46::i;:::-;51801:33;51817:4;51823:2;51827:6;51801:15;:33::i;:::-;51618:1005;;;-1:-1:-1::0;;;;;51898:29:0;::::1;;::::0;;;:25:::1;:29;::::0;;;;;::::1;;:50:::0;::::1;;;;51947:1;51931:13;;:17;51898:50;51895:728;;;51978:20;:6:::0;51989:8;51978:10:::1;:20::i;:::-;51969:29;;52017:46;52033:4;52047;52054:8;52017:15;:46::i;51895:728::-;-1:-1:-1::0;;;;;52207:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;::::1;;:51:::0;::::1;;;;52257:1;52242:12;;:16;52207:51;52204:419;;;52288:19;:6:::0;52299:7;52288:10:::1;:19::i;:::-;52279:28;;52326:45;52342:4;52356;52363:7;52326:15;:45::i;:::-;52390:33;52406:4;52412:2;52416:6;52390:15;:33::i;:::-;52463:8;::::0;-1:-1:-1;;;52463:8:0;::::1;;;:24:::0;::::1;;;-1:-1:-1::0;;;;;;52476:11:0;::::1;;::::0;;;:7:::1;:11;::::0;;;;;::::1;;52475:12;52463:24;:54;;;;-1:-1:-1::0;;;;;;52492:25:0;::::1;;::::0;;;:19:::1;:25;::::0;;;;;::::1;;52491:26;52463:54;:82;;;;-1:-1:-1::0;;;;;;52522:23:0;::::1;;::::0;;;:19:::1;:23;::::0;;;;;::::1;;52521:24;52463:82;52460:144;;;-1:-1:-1::0;;;;;52566:11:0;::::1;;::::0;;;:7:::1;:11;::::0;;;;:18;;-1:-1:-1;;52566:18:0::1;52580:4;52566:18;::::0;;52460:144:::1;51392:1242;;;51380:1254;48255:4386;;;46133:48;54747:235:::0;;:::o;38002:203::-;38120:10;13248:20;13296:8;38103:74;;;;-1:-1:-1;;;38103:74:0;;16171:2:1;38103:74:0;;;16153:21:1;16210:2;16190:18;;;16183:30;16249;16229:18;;;16222:58;16297:18;;38103:74:0;15969:352:1;38103:74:0;-1:-1:-1;;;;;48274:18:0;::::1;48266:68;;;;-1:-1:-1::0;;;48266:68:0::1;;;;;;;:::i;55299:168::-:0;55375:16;;55354;;:38;;:20;:38::i;:::-;55339:12;:53;55441:17;;55419;;:40;;:21;:40::i;:::-;55403:13;:56;55299:168::o;45250:230::-;45406:20;;45392:13;:34;45384:43;;;;;;45438:20;:34;45250:230::o;25114:173::-;25189:6;;;-1:-1:-1;;;;;25206:17:0;;;-1:-1:-1;;;;;;25206:17:0;;;;;;;25239:40;;25189:6;;;25206:17;25189:6;;25239:40;;25170:16;;25239:40;25159:128;25114:173;:::o;35796:153::-;35854:7;35886:1;35882;:5;35874:44;;;;-1:-1:-1;;;35874:44:0;;16528:2:1;35874:44:0;;;16510:21:1;16567:2;16547:18;;;16540:30;16606:28;16586:18;;;16579:56;16652:18;;35874:44:0;16326:350:1;35874:44:0;35936:5;35940:1;35936;:5;:::i;35568:220::-;35626:7;35650:6;35646:20;;-1:-1:-1;35665:1:0;35658:8;;35646:20;35677:9;35689:5;35693:1;35689;:5;:::i;:::-;35677:17;-1:-1:-1;35722:1:0;35713:5;35717:1;35677:17;35713:5;:::i;:::-;:10;35705:56;;;;-1:-1:-1;;;35705:56:0;;16883:2:1;35705:56:0;;;16865:21:1;16922:2;16902:18;;;16895:30;16961:34;16941:18;;;16934:62;-1:-1:-1;;;17012:18:1;;;17005:31;17053:19;;35705:56:0;16681:397:1;7694:733:0;-1:-1:-1;;;;;7834:20:0;;7826:70;;;;-1:-1:-1;;;7826:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7915:23:0;;7907:71;;;;-1:-1:-1;;;7907:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8075:17:0;;8051:21;8075:17;;;;;;;;;;;8111:23;;;;8103:74;;;;-1:-1:-1;;;8103:74:0;;17285:2:1;8103:74:0;;;17267:21:1;17324:2;17304:18;;;17297:30;17363:34;17343:18;;;17336:62;-1:-1:-1;;;17414:18:1;;;17407:36;17460:19;;8103:74:0;17083:402:1;8103:74:0;-1:-1:-1;;;;;8213:17:0;;;:9;:17;;;;;;;;;;;8233:22;;;8213:42;;8277:20;;;;;;;;:30;;8249:6;;8213:9;8277:30;;8249:6;;8277:30;:::i;:::-;;;;;;;;8342:9;-1:-1:-1;;;;;8325:35:0;8334:6;-1:-1:-1;;;;;8325:35:0;;8353:6;8325:35;;;;762:25:1;;750:2;735:18;;616:177;8325:35:0;;;;;;;;8373:46;54747:235;43708:317;-1:-1:-1;;;;;43799:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;43791:118;;;;-1:-1:-1;;;43791:118:0;;17692:2:1;43791:118:0;;;17674:21:1;17731:2;17711:18;;;17704:30;17770:34;17750:18;;;17743:62;17841:34;17821:18;;;17814:62;-1:-1:-1;;;17892:19:1;;;17885:32;17934:19;;43791:118:0;17490:469:1;43791:118:0;-1:-1:-1;;;;;43920:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;43920:39:0;;;;;;;;;;43977:40;;43920:39;;:31;43977:40;;;43708:317;;:::o;35402:158::-;35460:7;35493:1;35488;:6;;35480:49;;;;-1:-1:-1;;;35480:49:0;;18166:2:1;35480:49:0;;;18148:21:1;18205:2;18185:18;;;18178:30;18244:32;18224:18;;;18217:60;18294:18;;35480:49:0;17964:354:1;35480:49:0;35547:5;35551:1;35547;:5;:::i;52649:591::-;52801:16;;;52815:1;52801:16;;;;;;;;52777:21;;52801:16;;;;;;;;;;-1:-1:-1;52801:16:0;52777:40;;52846:4;52828;52833:1;52828:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52828:23:0;;;:7;;;;;;;;;;:23;;;;52872:15;;:22;;;-1:-1:-1;;;52872:22:0;;;;:15;;;;;:20;;:22;;;;;52828:7;;52872:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52862:4;52867:1;52862:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52862:32:0;;;:7;;;;;;;;;:32;52939:15;;52907:62;;52924:4;;52939:15;52957:11;52907:8;:62::i;:::-;53008:15;;:224;;-1:-1:-1;;;53008:224:0;;-1:-1:-1;;;;;53008:15:0;;;;:66;;:224;;53089:11;;53008:15;;53159:4;;53186;;53206:15;;53008:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53248:520;53430:15;;53398:62;;53415:4;;-1:-1:-1;;;;;53430:15:0;53448:11;53398:8;:62::i;:::-;53502:15;;:258;;-1:-1:-1;;;53502:258:0;;53574:4;53502:258;;;20169:34:1;;;20219:18;;;20212:34;;;53502:15:0;20262:18:1;;;20255:34;;;20305:18;;;20298:34;20348:19;;;20341:44;53734:15:0;20401:19:1;;;20394:35;-1:-1:-1;;;;;53502:15:0;;;;:31;;53541:9;;20103:19:1;;53502:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:597: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;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;934:315;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;1239:2;1224:18;;;;1211:32;;-1:-1:-1;;;934:315:1:o;1681:388::-;1749:6;1757;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;1865:9;1852:23;1884:31;1909:5;1884:31;:::i;:::-;1934:5;-1:-1:-1;1991:2:1;1976:18;;1963:32;2004:33;1963:32;2004:33;:::i;:::-;2056:7;2046:17;;;1681:388;;;;;:::o;2074:180::-;2133:6;2186:2;2174:9;2165:7;2161:23;2157:32;2154:52;;;2202:1;2199;2192:12;2154:52;-1:-1:-1;2225:23:1;;2074:180;-1:-1:-1;2074:180:1:o;2259:247::-;2318:6;2371:2;2359:9;2350:7;2346:23;2342:32;2339:52;;;2387:1;2384;2377:12;2339:52;2426:9;2413:23;2445:31;2470:5;2445:31;:::i;2511:456::-;2588:6;2596;2604;2657:2;2645:9;2636:7;2632:23;2628:32;2625:52;;;2673:1;2670;2663:12;2625:52;2712:9;2699:23;2731:31;2756:5;2731:31;:::i;:::-;2781:5;-1:-1:-1;2838:2:1;2823:18;;2810:32;2851:33;2810:32;2851:33;:::i;:::-;2511:456;;2903:7;;-1:-1:-1;;;2957:2:1;2942:18;;;;2929:32;;2511:456::o;2972:248::-;3040:6;3048;3101:2;3089:9;3080:7;3076:23;3072:32;3069:52;;;3117:1;3114;3107:12;3069:52;-1:-1:-1;;3140:23:1;;;3210:2;3195:18;;;3182:32;;-1:-1:-1;2972:248:1:o;3225:156::-;3291:20;;3351:4;3340:16;;3330:27;;3320:55;;3371:1;3368;3361:12;3320:55;3225:156;;;:::o;3386:252::-;3450:6;3458;3511:2;3499:9;3490:7;3486:23;3482:32;3479:52;;;3527:1;3524;3517:12;3479:52;3550:27;3567:9;3550:27;:::i;:::-;3540:37;;3596:36;3628:2;3617:9;3613:18;3596:36;:::i;:::-;3586:46;;3386:252;;;;;:::o;3643:118::-;3729:5;3722:13;3715:21;3708:5;3705:32;3695:60;;3751:1;3748;3741:12;3766:241;3822:6;3875:2;3863:9;3854:7;3850:23;3846:32;3843:52;;;3891:1;3888;3881:12;3843:52;3930:9;3917:23;3949:28;3971:5;3949:28;:::i;4409:382::-;4474:6;4482;4535:2;4523:9;4514:7;4510:23;4506:32;4503:52;;;4551:1;4548;4541:12;4503:52;4590:9;4577:23;4609:31;4634:5;4609:31;:::i;:::-;4659:5;-1:-1:-1;4716:2:1;4701:18;;4688:32;4729:30;4688:32;4729:30;:::i;4796:356::-;4998:2;4980:21;;;5017:18;;;5010:30;5076:34;5071:2;5056:18;;5049:62;5143:2;5128:18;;4796:356::o;5157:380::-;5236:1;5232:12;;;;5279;;;5300:61;;5354:4;5346:6;5342:17;5332:27;;5300:61;5407:2;5399:6;5396:14;5376:18;5373:38;5370:161;;;5453:10;5448:3;5444:20;5441:1;5434:31;5488:4;5485:1;5478:15;5516:4;5513:1;5506:15;5370:161;;5157:380;;;:::o;5542:184::-;5612:6;5665:2;5653:9;5644:7;5640:23;5636:32;5633:52;;;5681:1;5678;5671:12;5633:52;-1:-1:-1;5704:16:1;;5542:184;-1:-1:-1;5542:184:1:o;6010:245::-;6077:6;6130:2;6118:9;6109:7;6105:23;6101:32;6098:52;;;6146:1;6143;6136:12;6098:52;6178:9;6172:16;6197:28;6219:5;6197:28;:::i;6260:127::-;6321:10;6316:3;6312:20;6309:1;6302:31;6352:4;6349:1;6342:15;6376:4;6373:1;6366:15;6392:168;6432:7;6498:1;6494;6490:6;6486:14;6483:1;6480:21;6475:1;6468:9;6461:17;6457:45;6454:71;;;6505:18;;:::i;:::-;-1:-1:-1;6545:9:1;;6392:168::o;6974:128::-;7014:3;7045:1;7041:6;7038:1;7035:13;7032:39;;;7051:18;;:::i;:::-;-1:-1:-1;7087:9:1;;6974:128::o;7452:217::-;7492:1;7518;7508:132;;7562:10;7557:3;7553:20;7550:1;7543:31;7597:4;7594:1;7587:15;7625:4;7622:1;7615:15;7508:132;-1:-1:-1;7654:9:1;;7452:217::o;10230:125::-;10270:4;10298:1;10295;10292:8;10289:34;;;10303:18;;:::i;:::-;-1:-1:-1;10340:9:1;;10230:125::o;13594:401::-;13796:2;13778:21;;;13835:2;13815:18;;;13808:30;13874:34;13869:2;13854:18;;13847:62;-1:-1:-1;;;13940:2:1;13925:18;;13918:35;13985:3;13970:19;;13594:401::o;14000:399::-;14202:2;14184:21;;;14241:2;14221:18;;;14214:30;14280:34;14275:2;14260:18;;14253:62;-1:-1:-1;;;14346:2:1;14331:18;;14324:33;14389:3;14374:19;;14000:399::o;18455:127::-;18516:10;18511:3;18507:20;18504:1;18497:31;18547:4;18544:1;18537:15;18571:4;18568:1;18561:15;18587:251;18657:6;18710:2;18698:9;18689:7;18685:23;18681:32;18678:52;;;18726:1;18723;18716:12;18678:52;18758:9;18752:16;18777:31;18802:5;18777:31;:::i;18843:980::-;19105:4;19153:3;19142:9;19138:19;19184:6;19173:9;19166:25;19210:2;19248:6;19243:2;19232:9;19228:18;19221:34;19291:3;19286:2;19275:9;19271:18;19264:31;19315:6;19350;19344:13;19381:6;19373;19366:22;19419:3;19408:9;19404:19;19397:26;;19458:2;19450:6;19446:15;19432:29;;19479:1;19489:195;19503:6;19500:1;19497:13;19489:195;;;19568:13;;-1:-1:-1;;;;;19564:39:1;19552:52;;19659:15;;;;19624:12;;;;19600:1;19518:9;19489:195;;;-1:-1:-1;;;;;;;19740:32:1;;;;19735:2;19720:18;;19713:60;-1:-1:-1;;;19804:3:1;19789:19;19782:35;19701:3;18843:980;-1:-1:-1;;;18843:980:1:o;20440:306::-;20528:6;20536;20544;20597:2;20585:9;20576:7;20572:23;20568:32;20565:52;;;20613:1;20610;20603:12;20565:52;20642:9;20636:16;20626:26;;20692:2;20681:9;20677:18;20671:25;20661:35;;20736:2;20725:9;20721:18;20715:25;20705:35;;20440:306;;;;;:::o

Swarm Source

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