ETH Price: $2,389.45 (-0.57%)

Token

The Tribe (TRIBE)
 

Overview

Max Total Supply

1,000,000,000 TRIBE

Holders

350 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$55,770.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
The Tribe: TRIBE Token
Balance
4,950,493.259471940920508163 TRIBE

Value
$276.09 ( ~0.115545637752555 Eth) [0.4950%]
0xdeadface8503399df4b083ef42fa8e02fd39dead
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Tribe is a community driven token on the Ethereum Blockchain. We forge a fellowship of fervent souls. Together, we ascend to greater heights. We extend a hand, beckoning you to this extraordinary path. Joining The $TRIBE will gain you massive amounts of knowledge.

Market

Volume (24H):$11.86
Market Capitalization:$0.00
Circulating Supply:0.00 TRIBE
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheTribe

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 20000 runs

Other Settings:
paris EvmVersion, MIT license
File 1 of 8 : TheTribe.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC20UniswapV2InternalSwaps} from "./ERC20UniswapV2InternalSwaps.sol";

contract TheTribe is ERC20, Ownable, ERC20UniswapV2InternalSwaps {
    /** @notice The presale states. */
    enum PresaleState {
        NONE,
        OPEN,
        CLOSED,
        COMPLETED
    }

    /** @notice Percentage of supply allocated for presale participants (60%). */
    uint256 public constant SHARE_PRESALE = 60_00;
    /** @notice Percentage of supply allocated for initial liquidity (28.5%).*/
    uint256 public constant SHARE_LIQUIDITY = 28_50;
    /** @notice Percentage of supply allocated for team, marketing, cex listings, etc. (11.5%). */
    uint256 public constant SHARE_OTHER = 11_50;
    /** @notice Per account limit in ETH for presale (1 ETH). */
    uint256 public constant PRESALE_ACCOUNT_LIMIT = 1 ether;
    /** @notice Minimum threshold in ETH to trigger #_swapTokens. */
    uint256 public constant SWAP_THRESHOLD_ETH_MIN = 0.005 ether;
    /** @notice Maximum threshold in ETH to trigger #_swapTokens. */
    uint256 public constant SWAP_THRESHOLD_ETH_MAX = 50 ether;
    /** @notice Maximum tax (0.25%) */
    uint256 public constant MAX_TAX = 25;

    uint256 private constant _MAX_SUPPLY = 1_000_000_000 ether;
    uint256 private constant _SUPPLY_PRESALE =
        (_MAX_SUPPLY * SHARE_PRESALE) / 100_00;
    uint256 private constant _SUPPLY_LIQUIDITY =
        (_MAX_SUPPLY * SHARE_LIQUIDITY) / 100_00;
    uint256 private constant _SUPPLY_OTHER =
        _MAX_SUPPLY - _SUPPLY_PRESALE - _SUPPLY_LIQUIDITY;
    uint256 private constant _LAUNCH_BUY_TAX = 3_00;
    uint256 private constant _LAUNCH_SELL_TAX = 50_00;
    uint256 private constant _LAUNCH_TAX_WINDOW = 20 minutes;

    /** @notice Tax recipient wallet. */
    address public taxRecipient;
    /** @notice Whether address is extempt from transfer tax. */
    mapping(address => bool) public taxFreeAccount;
    /** @notice Whether address is an exchange pool. */
    mapping(address => bool) public isExchangePool;
    /** @notice Threshold in ETH of tokens to collect before triggering #_swapTokens. */
    uint256 public swapThresholdEth = 0.1 ether;
    /** @notice Tax manager. */
    address public taxManager;
    /** @notice Buy tax in bps (0%). In first 20 minutes after adding liquidity, buy tax will be 3%. */
    uint256 public buyTax = 0;
    /** @notice Sell tax in bps (0.25%). In first 20 minutes after adding liquidity, sell tax will be 50%. */
    uint256 public sellTax = 25;
    /** @notice Presale commitment in ETH per address. */
    mapping(address => uint256) public commitment;
    /** @notice Presale amount of claimed tokens per address. */
    mapping(address => uint256) public claimedTokens;
    /** @notice Presale total commitment in ETH. */
    uint256 public totalCommitments;
    /** @notice Presale total amount of claimed tokens. */
    uint256 public totalClaimed;
    /** @notice Current presale state. */
    PresaleState public presaleState;

    uint256 private _launchTaxEndsAt = type(uint256).max;

    event CommitedToPresale(address indexed account, uint256 amount);
    event PresaleOpened();
    event PresaleClosed(uint256 totalCommitments);
    event PresaleCompleted(uint256 totalCommitments);
    event PresaleClaimed(address indexed account, uint256 amount);
    event TaxRecipientChanged(address indexed taxRecipient);
    event SwapThresholdChanged(uint256 swapThresholdEth);
    event TaxFreeStateChanged(address indexed account, bool indexed taxFree);
    event ExchangePoolStateChanged(
        address indexed account,
        bool indexed isExchangePool
    );
    event TaxManagerChanged(address indexed taxManager);
    event TaxesChanged(uint256 newBuyTax, uint256 newSellTax);
    event TaxesWithdrawn(uint256 amount);

    error MaxAccountLimitExceeded();
    error PresaleIsClosed();
    error PresaleNotCompleted();
    error AlreadyClaimed();
    error NoCommittments();
    error NothingCommitted();
    error Unauthorized();
    error InvalidParameters();
    error InvalidSwapThreshold();
    error InvalidTax();
    error NoContract();
    error InvalidState();

    modifier onlyTaxManager() {
        if (msg.sender != taxManager) {
            revert Unauthorized();
        }
        _;
    }

    constructor(
        address _owner,
        address _taxRecipient,
        address _taxManager
    ) ERC20("The Tribe", "TRIBE") Ownable(_owner) {
        taxManager = _taxManager;
        emit TaxManagerChanged(_taxManager);
        taxRecipient = _taxRecipient;
        emit TaxRecipientChanged(_taxRecipient);

        taxFreeAccount[address(0)] = true;
        emit TaxFreeStateChanged(address(0), true);
        taxFreeAccount[_taxRecipient] = true;
        emit TaxFreeStateChanged(_taxRecipient, true);
        taxFreeAccount[address(this)] = true;
        emit TaxFreeStateChanged(address(this), true);
        isExchangePool[pair] = true;
        emit ExchangePoolStateChanged(pair, true);
        emit TaxesChanged(buyTax, sellTax);

        _mint(address(this), _SUPPLY_PRESALE + _SUPPLY_LIQUIDITY);
        _mint(_taxRecipient, _SUPPLY_OTHER);
    }

    /** @dev Users can send ETH directly to **this** contract to participate */
    receive() external payable {
        commitToPresale();
    }

    // *** User Interface ***

    /**
     * @notice Commit ETH to presale.
     * Presale supply is claimable proportionally for all presale participants.
     * Presale has no hardcap and 1 ETH per wallet limit.
     * Users can also send ETH directly to **this** contract to participate.
     * @dev Callable once presaleOpen.
     */
    function commitToPresale() public payable {
        address account = msg.sender;
        if (_isContract(account)) {
            revert NoContract();
        }
        if (
            presaleState != PresaleState.OPEN
        ) {
            revert PresaleIsClosed();
        }

        commitment[account] += msg.value;
        totalCommitments += msg.value;

        if (commitment[account] > PRESALE_ACCOUNT_LIMIT) {
            revert MaxAccountLimitExceeded();
        }

        emit CommitedToPresale(account, msg.value);
    }

    /**
     * @notice Claim callers presale tokens.
     * @dev Callable once presaleCompleted.
     */
    function claimPresale() external {
        address account = msg.sender;

        if (_isContract(account)) {
            revert NoContract();
        }
        if (presaleState != PresaleState.COMPLETED) {
            revert PresaleNotCompleted();
        }
        if (commitment[account] == 0) {
            revert NothingCommitted();
        }
        if (claimedTokens[account] != 0) {
            revert AlreadyClaimed();
        }

        uint256 amountTokens = (_SUPPLY_PRESALE * commitment[account]) /
            totalCommitments;
        claimedTokens[account] = amountTokens;
        totalClaimed += amountTokens;

        _transferFromContractBalance(account, amountTokens);

        emit PresaleClaimed(account, amountTokens);
    }

    /** @notice Returns amount of tokens to be claimed by presale participants. */
    function unclaimedSupply() external view returns (uint256) {
        return _SUPPLY_PRESALE - totalClaimed;
    }


    // *** Owner Interface ***

    /**
     * @notice Open presale for all users.
     */
    function openPresale() external onlyOwner {
        if (presaleState != PresaleState.NONE) {
            revert InvalidState();
        }
        presaleState = PresaleState.OPEN;
        emit PresaleOpened();
    }

    /**
     * @notice Close the presale.
     * Called after #openPresale.
     */
    function closePresale() external onlyOwner {
        if (presaleState != PresaleState.OPEN) {
            revert InvalidState();
        }
        if (totalCommitments == 0) {
            revert NoCommittments();
        }

        presaleState = PresaleState.CLOSED;

        emit PresaleClosed(totalCommitments);
    }

    /**
     * @notice Complete the presale.
     * @dev Adds 47.5% of collected ETH with 28.5% of totalSupply to Liquidity.
     * Sends the remaining 52.5% of collected ETH to current owner.
     * Renounces ownership.
     * Called after #closePresale.
     */
    function completePresale() external onlyOwner {
        if (presaleState != PresaleState.CLOSED) {
            revert InvalidState();
        }

        uint256 amountEthForLiquidity = (totalCommitments * _SUPPLY_LIQUIDITY) /
            _SUPPLY_PRESALE;
        _addInitialLiquidityEth(
            _SUPPLY_LIQUIDITY,
            amountEthForLiquidity,
            taxRecipient
        );

        _sweepEth(taxRecipient);

        _launchTaxEndsAt = block.timestamp + _LAUNCH_TAX_WINDOW;
        renounceOwnership();

        presaleState = PresaleState.COMPLETED;

        emit PresaleCompleted(totalCommitments);
    }

    // *** Tax Manager Interface ***

    /**
     * @notice Set `taxFree` state of `account`.
     * @param account account
     * @param taxFree true if `account` should be extempt from transfer taxes.
     * @dev Only callable by taxManager.
     */
    function setTaxFreeAccount(
        address account,
        bool taxFree
    ) external onlyTaxManager {
        if (taxFreeAccount[account] == taxFree) {
            revert InvalidParameters();
        }
        taxFreeAccount[account] = taxFree;
        emit TaxFreeStateChanged(account, taxFree);
    }

    /**
     * @notice Set `exchangePool` state of `account`
     * @param account account
     * @param exchangePool whether `account` is an exchangePool
     * @dev ExchangePool state is used to decide if transfer is a swap
     * and should trigger #_swapTokens.
     */
    function setExchangePool(
        address account,
        bool exchangePool
    ) external onlyTaxManager {
        if (isExchangePool[account] == exchangePool) {
            revert InvalidParameters();
        }
        isExchangePool[account] = exchangePool;
        emit ExchangePoolStateChanged(account, exchangePool);
    }

    /**
     * @notice Transfer taxManager role to `newTaxManager`.
     * @param newTaxManager new taxManager
     * @dev Only callable by taxManager.
     */
    function transferTaxManager(address newTaxManager) external onlyTaxManager {
        if (newTaxManager == taxManager) {
            revert InvalidParameters();
        }
        taxManager = newTaxManager;
        emit TaxManagerChanged(newTaxManager);
    }

    /**
     * @notice Set taxRecipient address to `newTaxRecipient`.
     * @param newTaxRecipient new taxRecipient
     * @dev Only callable by taxManager.
     */
    function setTaxRecipient(address newTaxRecipient) external onlyTaxManager {
        if (newTaxRecipient == taxRecipient) {
            revert InvalidParameters();
        }
        taxRecipient = newTaxRecipient;
        emit TaxRecipientChanged(newTaxRecipient);
    }

    /**
     * @notice Withdraw tax collected (which would usually be automatically swapped to weth) to taxRecipient
     * @dev Only callable by taxManager.
     */
    function withdrawTaxes() external onlyTaxManager {
        uint256 balance = balanceOf(address(this));
        if (balance > 0) {
            super._transfer(address(this), taxRecipient, balance);
            emit TaxesWithdrawn(balance);
        }
    }

    /**
     * @notice Change the amount of tokens collected via tax before a swap is triggered.
     * @param newSwapThresholdEth new threshold received in ETH
     * @dev Only callable by taxManager
     */
    function setSwapThresholdEth(
        uint256 newSwapThresholdEth
    ) external onlyTaxManager {
        if (
            newSwapThresholdEth < SWAP_THRESHOLD_ETH_MIN ||
            newSwapThresholdEth > SWAP_THRESHOLD_ETH_MAX ||
            newSwapThresholdEth == swapThresholdEth
        ) {
            revert InvalidSwapThreshold();
        }
        swapThresholdEth = newSwapThresholdEth;
        emit SwapThresholdChanged(newSwapThresholdEth);
    }

    /**
     * @notice Set tax for buying and selling the token
     * @param newBuyTax new buy tax in bps
     * @param newSellTax new sell tax in bps
     * @dev Only callable by taxManager
     */
    function changeTaxes(
        uint256 newBuyTax,
        uint256 newSellTax
    ) external onlyTaxManager {
        if (newBuyTax > MAX_TAX || newSellTax > MAX_TAX) {
            revert InvalidTax();
        }
        buyTax = newBuyTax;
        sellTax = newSellTax;
        emit TaxesChanged(newBuyTax, newSellTax);
    }

    /**
     * @notice Threshold of how many tokens to collect from tax before calling #swapTokens.
     * @dev Depends on swapThresholdEth which can be configured by taxManager.
     * Restricted to 5% of liquidity.
     */
    function swapThresholdToken() public view returns (uint256) {
        (uint reserveToken, uint reserveWeth) = _getReserve();
        uint256 maxSwapEth = (reserveWeth * 5) / 100;
        return
            _getAmountToken(
                swapThresholdEth > maxSwapEth ? maxSwapEth : swapThresholdEth,
                reserveToken,
                reserveWeth
            );
    }

    /** @notice Get current buy tax depending on current timestamp. */
    function currentBuyTax() public view returns (uint256) {
        return _getTax(true);
    }

    /** @notice Get current buy tax depending on current timestamp. */
    function currentSellTax() public view returns (uint256) {
        return _getTax(false);
    }


    // *** Internal Interface ***

    /** @notice IERC20#_transfer */
    function _update(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        if (
            !taxFreeAccount[from] &&
            !taxFreeAccount[to] &&
            !taxFreeAccount[msg.sender]
        ) {
            uint256 fee = amount * _getTax(isExchangePool[from]) / 100_00;
            super._update(from, address(this), fee);
            unchecked {
                amount -= fee;
            }

            if (isExchangePool[to]) /* selling */ {
                _swapTokens(swapThresholdToken());
            }
        }
        super._update(from, to, amount);
    }


    /** @dev Get transfer tax depending on current timestamp and `isBuy`. */
    function _getTax(bool isBuy) private view returns (uint256) {
        return
            isBuy
                ? (
                    block.timestamp < _launchTaxEndsAt
                        ? _LAUNCH_BUY_TAX
                        : buyTax
                )
                : (
                    block.timestamp < _launchTaxEndsAt
                        ? _LAUNCH_SELL_TAX
                        : sellTax
                );
    }

    /** @dev Transfer `amount` tokens from contract balance to `to`. */
    function _transferFromContractBalance(
        address to,
        uint256 amount
    ) internal override {
        super._update(address(this), to, amount);
    }

    /**
     * @notice Swap `amountToken` collected from tax to WETH to add to send to taxRecipient.
     */
    function _swapTokens(uint256 amountToken) internal {
        if (balanceOf(address(this)) + totalClaimed < amountToken + _SUPPLY_PRESALE) {
            return;
        }

        _swapForWETH(amountToken, taxRecipient);
    }
}

File 2 of 8 : ERC20UniswapV2InternalSwaps.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IUniswapV2Pair {
    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1);

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

    function mint(address to) external;
}

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

interface IWETH {
    function deposit() external payable;
}

/**
 * @notice UniswapV2Pair does not allow to receive to token0 or token1.
 * As a workaround, this contract can receive tokens and has max approval
 * for the creator.
 */
contract ERC20HolderWithApproval {
    constructor(address token) {
        IERC20(token).approve(msg.sender, type(uint256).max);
    }
}

/**
 * @notice Gas optimized ERC20 token based on solmate's ERC20 contract.
 * @dev Optimizations assume a UniswapV2 WETH pair as main liquidity.
 */
abstract contract ERC20UniswapV2InternalSwaps {
    address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address private constant FACTORY =
        0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
    address private immutable wethReceiver;
    address public immutable pair;
    bool private immutable tokenIsToken0;

    constructor() {
        tokenIsToken0 = address(this) < WETH;
        pair = IUniswapV2Factory(FACTORY).createPair(address(this), WETH);
        wethReceiver = address(new ERC20HolderWithApproval(WETH));
    }

    /**
     * @dev Swap tokens to WETH directly on pair, to save gas.
     * No check for minimal return, susceptible to price manipulation!
     */
    function _swapForWETH(uint amountToken, address to) internal {
        uint amountWeth = _getAmountWeth(amountToken);
        _transferFromContractBalance(pair, amountToken);
        // Pair prevents receiving tokens to one of the pairs addresses
        IUniswapV2Pair(pair).swap(tokenIsToken0 ? 0 : amountWeth, tokenIsToken0 ? amountWeth : 0, wethReceiver, new bytes(0));
        IERC20(WETH).transferFrom(wethReceiver, to, amountWeth);
    }

    /**
     * @dev Add tokens and WETH to liquidity, directly on pair, to save gas.
     * No check for minimal return, susceptible to price manipulation!
     * Sufficient WETH in contract balancee assumed!
     */
    function _addLiquidity(
        uint amountToken,
        address to
    ) internal returns (uint amountWeth) {
        amountWeth = _quoteToken(amountToken);
        _transferFromContractBalance(pair, amountToken);
        IERC20(WETH).transferFrom(address(this), pair, amountWeth);
        IUniswapV2Pair(pair).mint(to);
    }

    /**
     * @dev Add tokens and WETH as initial liquidity, directly on pair, to save gas.
     * No checks performed. Caller has to make sure to have access to the token before public!
     * Sufficient WETH in contract balancee assumed!
     */
    function _addInitialLiquidity(
        uint amountToken,
        uint amountWeth,
        address to
    ) internal {
        _transferFromContractBalance(pair, amountToken);
        IERC20(WETH).transferFrom(address(this), pair, amountWeth);
        IUniswapV2Pair(pair).mint(to);
    }

    /**
     * @dev Add tokens and ETH as initial liquidity, directly on pair, to save gas.
     * No checks performed. Caller has to make sure to have access to the token before public!
     * Sufficient ETH in contract balancee assumed!
     */
    function _addInitialLiquidityEth(
        uint amountToken,
        uint amountEth,
        address to
    ) internal {
        IWETH(WETH).deposit{value: amountEth}();
        _addInitialLiquidity(amountToken, amountEth, to);
    }

    /** @dev Transfer all WETH from contract balance to `to`. */
    function _sweepWeth(address to) internal returns (uint amountWeth) {
        amountWeth = IERC20(WETH).balanceOf(address(this));
        IERC20(WETH).transferFrom(address(this), to, amountWeth);
    }

    /** @dev Transfer all ETH from contract balance to `to`. */
    function _sweepEth(address to) internal {
        _safeTransferETH(to, address(this).balance);
    }

    /** @dev Quote `amountToken` in ETH, assuming no fees (used for liquidity). */
    function _quoteToken(
        uint amountToken
    ) internal view returns (uint amountEth) {
        (uint reserveToken, uint reserveEth) = _getReserve();
        amountEth = (amountToken * reserveEth) / reserveToken;
    }

    /** @dev Quote `amountToken` in WETH, assuming 0.3% uniswap fees (used for swap). */
    function _getAmountWeth(
        uint amounToken
    ) internal view returns (uint amountWeth) {
        (uint reserveToken, uint reserveWeth) = _getReserve();
        uint amountTokenWithFee = amounToken * 997;
        uint numerator = amountTokenWithFee * reserveWeth;
        uint denominator = (reserveToken * 1000) + amountTokenWithFee;
        amountWeth = numerator / denominator;
    }

    /** @dev Quote `amountWeth` in tokens, assuming 0.3% uniswap fees (used for swap). */
    function _getAmountToken(
        uint amounWeth,
        uint reserveToken,
        uint reserveWeth
    ) internal pure returns (uint amountToken) {
        uint numerator = reserveToken * amounWeth * 1000;
        uint denominator = (reserveWeth - amounWeth) * 997;
        amountToken = (numerator / denominator) + 1;
    }

    /** @dev Get reserves of pair. */
    function _getReserve()
        internal
        view
        returns (uint reserveToken, uint reserveWeth)
    {
        (uint112 reserveToken0, uint112 reserveToken1) = IUniswapV2Pair(pair).getReserves();
        (reserveToken, reserveWeth) = tokenIsToken0 ? (reserveToken0, reserveToken1) : (reserveToken1, reserveToken0);
    }

    /** @dev Transfer `amount` ETH to `to` gas efficiently. */
    function _safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly { // solhint-disable-line no-inline-assembly
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /** @dev Returns true if `_address` is a contract. */
    function _isContract(address _address) internal view returns (bool) {
        uint32 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(_address)
        }
        return (size > 0);
    }

    /** @dev Transfeer `amount` tokens from contract balance to `to`. */
    function _transferFromContractBalance(
        address to,
        uint256 amount
    ) internal virtual;
}

File 3 of 8 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

File 4 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

File 5 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

File 6 of 8 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 7 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

File 8 of 8 : draft-IERC6093.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 20000
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_taxRecipient","type":"address"},{"internalType":"address","name":"_taxManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidParameters","type":"error"},{"inputs":[],"name":"InvalidState","type":"error"},{"inputs":[],"name":"InvalidSwapThreshold","type":"error"},{"inputs":[],"name":"InvalidTax","type":"error"},{"inputs":[],"name":"MaxAccountLimitExceeded","type":"error"},{"inputs":[],"name":"NoCommittments","type":"error"},{"inputs":[],"name":"NoContract","type":"error"},{"inputs":[],"name":"NothingCommitted","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PresaleIsClosed","type":"error"},{"inputs":[],"name":"PresaleNotCompleted","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CommitedToPresale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isExchangePool","type":"bool"}],"name":"ExchangePoolStateChanged","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PresaleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalCommitments","type":"uint256"}],"name":"PresaleClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalCommitments","type":"uint256"}],"name":"PresaleCompleted","type":"event"},{"anonymous":false,"inputs":[],"name":"PresaleOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapThresholdEth","type":"uint256"}],"name":"SwapThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"taxFree","type":"bool"}],"name":"TaxFreeStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"taxManager","type":"address"}],"name":"TaxManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"taxRecipient","type":"address"}],"name":"TaxRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"TaxesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxesWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_ACCOUNT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_OTHER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_THRESHOLD_ETH_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_THRESHOLD_ETH_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"changeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commitToPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"commitment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"completePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSellTax","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":"","type":"address"}],"name":"isExchangePool","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":"openPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleState","outputs":[{"internalType":"enum TheTribe.PresaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exchangePool","type":"bool"}],"name":"setExchangePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapThresholdEth","type":"uint256"}],"name":"setSwapThresholdEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"taxFree","type":"bool"}],"name":"setTaxFreeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxRecipient","type":"address"}],"name":"setTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThresholdEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThresholdToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxFreeAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCommitments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":[{"internalType":"address","name":"newTaxManager","type":"address"}],"name":"transferTaxManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclaimedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e060405267016345785d8a00006009556000600b556019600c556000196012553480156200002d57600080fd5b5060405162003c1538038062003c15833981016040819052620000509162000ba4565b826040518060400160405280600981526020016854686520547269626560b81b81525060405180604001604052806005815260200164545249424560d81b8152508160039081620000a2919062000c92565b506004620000b1828262000c92565b5050506001600160a01b038116620000e457604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000ef81620004cb565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23081811060c0526040516364e329cb60e11b815260048101919091526024810191909152735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9063c9c65396906044016020604051808303816000875af115801562000168573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018e919062000d5e565b6001600160a01b031660a05260405173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290620001be9062000b79565b6001600160a01b039091168152602001604051809103906000f080158015620001eb573d6000803e3d6000fd5b506001600160a01b03908116608052600a80546001600160a01b03191691831691821790556040517f4f06221442f29c68561a21b361dae6cd59eeb67b7cded6395d590a4e1d2fd3a290600090a2600680546001600160a01b0319166001600160a01b0384169081179091556040517f252e37823f8325a28d11c9bfaa110c2e0587d3e41cf2a02d5de57536c058e68990600090a2600080805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805460ff1916600190811790915560405190919060008051602062003bf5833981519152908290a36001600160a01b038216600081815260076020526040808220805460ff19166001908117909155905190929160008051602062003bf583398151915291a330600081815260076020526040808220805460ff19166001908117909155905190929160008051602062003bf583398151915291a360a0516001600160a01b0316600081815260086020526040808220805460ff1916600190811790915590519092917fd3763f1074087e38245af8391cfa3acdb23e0553090104fd7b85667d7328752991a37f5eee0b95930ee59011f34615b0b7dc6cc58c01d1f07d04a01a3a1e70d2554cf0600b54600c54604051620003d6929190918252602082015260400190565b60405180910390a1620004473061271062000400610b226b033b2e3c9fd0803ce800000062000d99565b6200040c919062000db3565b612710620004296117706b033b2e3c9fd0803ce800000062000d99565b62000435919062000db3565b62000441919062000dd6565b6200051d565b620004c28261271062000469610b226b033b2e3c9fd0803ce800000062000d99565b62000475919062000db3565b612710620004926117706b033b2e3c9fd0803ce800000062000d99565b6200049e919062000db3565b620004b6906b033b2e3c9fd0803ce800000062000dec565b62000441919062000dec565b50505062000ee4565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620005495760405163ec442f0560e01b815260006004820152602401620000db565b62000557600083836200055b565b5050565b6001600160a01b03831660009081526007602052604090205460ff161580156200059e57506001600160a01b03821660009081526007602052604090205460ff16155b8015620005bb57503360009081526007602052604090205460ff16155b1562000650576001600160a01b03831660009081526008602052604081205461271090620005ec9060ff1662000662565b620005f8908462000d99565b62000604919062000db3565b905062000613843083620006a3565b6001600160a01b038316600090815260086020526040902054918190039160ff16156200064e576200064e62000648620007d6565b62000831565b505b6200065d838383620006a3565b505050565b600081620006865760125442106200067d57600c546200069d565b6113886200069d565b60125442106200069957600b546200069d565b61012c5b92915050565b6001600160a01b038316620006d2578060026000828254620006c6919062000dd6565b90915550620007469050565b6001600160a01b03831660009081526020819052604090205481811015620007275760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000db565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620007645760028054829003905562000783565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620007c991815260200190565b60405180910390a3505050565b60008080620007e4620008ab565b909250905060006064620007fa83600562000d99565b62000806919062000db3565b90506200082981600954116200081f5760095462000821565b815b848462000944565b935050505090565b6127106200084e6117706b033b2e3c9fd0803ce800000062000d99565b6200085a919062000db3565b62000866908262000dd6565b6010543060009081526020819052604090205462000885919062000dd6565b10156200088f5750565b600654620008a89082906001600160a01b0316620009a4565b50565b60008060008060a0516001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015620008f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000917919062000e1a565b9150915060c0516200092b5780826200092e565b81815b6001600160701b03918216969116945092505050565b60008062000953858562000d99565b62000961906103e862000d99565b9050600062000971868562000dec565b6200097f906103e562000d99565b90506200098d818362000db3565b6200099a90600162000dd6565b9695505050505050565b6000620009b18362000b01565b9050620009c760a0518462000b6c60201b60201c565b60a0516001600160a01b031663022c0d9f60c051620009e75782620009ea565b60005b60c051620009fa576000620009fc565b835b608051604080516000815260208101918290526001600160e01b031960e087901b1690915262000a33939291906024810162000e52565b600060405180830381600087803b15801562000a4e57600080fd5b505af115801562000a63573d6000803e3d6000fd5b50506080516040516323b872dd60e01b81526001600160a01b03918216600482015290851660248201526044810184905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292506323b872dd91506064016020604051808303816000875af115801562000ad5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000afb919062000ec0565b50505050565b6000808062000b0f620008ab565b9092509050600062000b24856103e562000d99565b9050600062000b34838362000d99565b905060008262000b47866103e862000d99565b62000b53919062000dd6565b905062000b61818362000db3565b979650505050505050565b62000557308383620006a3565b6101478062003aae83390190565b80516001600160a01b038116811462000b9f57600080fd5b919050565b60008060006060848603121562000bba57600080fd5b62000bc58462000b87565b925062000bd56020850162000b87565b915062000be56040850162000b87565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000c1957607f821691505b60208210810362000c3a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200065d57600081815260208120601f850160051c8101602086101562000c695750805b601f850160051c820191505b8181101562000c8a5782815560010162000c75565b505050505050565b81516001600160401b0381111562000cae5762000cae62000bee565b62000cc68162000cbf845462000c04565b8462000c40565b602080601f83116001811462000cfe576000841562000ce55750858301515b600019600386901b1c1916600185901b17855562000c8a565b600085815260208120601f198616915b8281101562000d2f5788860151825594840194600190910190840162000d0e565b508582101562000d4e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000d7157600080fd5b62000d7c8262000b87565b9392505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200069d576200069d62000d83565b60008262000dd157634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200069d576200069d62000d83565b818103818111156200069d576200069d62000d83565b80516001600160701b038116811462000b9f57600080fd5b6000806040838503121562000e2e57600080fd5b62000e398362000e02565b915062000e496020840162000e02565b90509250929050565b84815260006020858184015260018060a01b038516604084015260806060840152835180608085015260005b8181101562000e9c5785810183015185820160a00152820162000e7e565b50600060a0828601015260a0601f19601f8301168501019250505095945050505050565b60006020828403121562000ed357600080fd5b8151801515811462000d7c57600080fd5b60805160a05160c051612b5b62000f5360003960008181611d6101528181612516015261254401526000818161075d01528181611ccf0152818161221b0152818161228301528181612357015281816124b301526124da0152600081816125b201526126480152612b5b6000f3fe6080604052600436106103175760003560e01c806378bb86d31161019a578063a960c65f116100e1578063ddf4d5191161008a578063f2fde38b11610064578063f2fde38b146108d2578063f5a4fa1e146108f2578063fe2314d61461092257600080fd5b8063ddf4d51914610880578063dfc56b1114610895578063e09d6bc6146108b257600080fd5b8063cc1776d3116100bb578063cc1776d314610801578063d54ad2a114610817578063dd62ed3e1461082d57600080fd5b8063a960c65f1461079f578063b18f0de2146107cc578063bda347be146107f957600080fd5b80638dd9831211610143578063a2aa18ad1161011d578063a2aa18ad1461072b578063a8aa1b311461074b578063a9059cbb1461077f57600080fd5b80638dd98312146106eb57806395d89b411461070057806399fbde7d1461071557600080fd5b806383e03b341161017457806383e03b341461069657806386a35f25146106ab5780638da5cb5b146106c057600080fd5b806378bb86d31461064557806378e3079e1461065b57806381e172ca1461067b57600080fd5b8063468298311161025e57806367cf6f1011610207578063715018a6116101e1578063715018a6146105ee578063737ea06e14610603578063774378e41461063057600080fd5b806367cf6f101461057a57806370a082311461058f57806370e7c575146105d257600080fd5b806352fd28a61161023857806352fd28a6146105305780635afefc091461055057806363cea4501461056557600080fd5b806346829831146104b35780634d237730146104c85780634f7041a51461051a57600080fd5b806318f60b69116102c05780632cb686fe1161029a5780632cb686fe1461046b578063313ce567146104815780634201ed1b1461049d57600080fd5b806318f60b69146103fb57806323b872dd1461042b578063263b82371461044b57600080fd5b80630d0c31b7116102f15780630d0c31b71461039b5780631465000e146103c257806318160ddd146103e657600080fd5b8063046ef9a51461032b57806306fdde0314610340578063095ea7b31461036b57600080fd5b3661032657610324610942565b005b600080fd5b34801561033757600080fd5b50610324610adf565b34801561034c57600080fd5b50610355610d32565b60405161036291906127a4565b60405180910390f35b34801561037757600080fd5b5061038b6103863660046127e7565b610dc4565b6040519015158152602001610362565b3480156103a757600080fd5b506011546103b59060ff1681565b6040516103629190612840565b3480156103ce57600080fd5b506103d860095481565b604051908152602001610362565b3480156103f257600080fd5b506002546103d8565b34801561040757600080fd5b5061038b610416366004612881565b60086020526000908152604090205460ff1681565b34801561043757600080fd5b5061038b61044636600461289c565b610dde565b34801561045757600080fd5b506103246104663660046128e6565b610e02565b34801561047757600080fd5b506103d861177081565b34801561048d57600080fd5b5060405160128152602001610362565b3480156104a957600080fd5b506103d861047e81565b3480156104bf57600080fd5b50610324610f39565b3480156104d457600080fd5b50600a546104f59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610362565b34801561052657600080fd5b506103d8600b5481565b34801561053c57600080fd5b5061032461054b3660046128e6565b610ffd565b34801561055c57600080fd5b506103d8611134565b34801561057157600080fd5b5061032461116e565b34801561058657600080fd5b50610324611265565b34801561059b57600080fd5b506103d86105aa366004612881565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3480156105de57600080fd5b506103d8670de0b6b3a764000081565b3480156105fa57600080fd5b50610324611401565b34801561060f57600080fd5b506006546104f59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561063c57600080fd5b506103d8611415565b34801561065157600080fd5b506103d8600f5481565b34801561066757600080fd5b50610324610676366004612881565b611421565b34801561068757600080fd5b506103d86611c37937e0800081565b3480156106a257600080fd5b506103d8611536565b3480156106b757600080fd5b506103d8601981565b3480156106cc57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff166104f5565b3480156106f757600080fd5b50610324611542565b34801561070c57600080fd5b506103556115f0565b34801561072157600080fd5b506103d8610b2281565b34801561073757600080fd5b50610324610746366004612881565b6115ff565b34801561075757600080fd5b506104f57f000000000000000000000000000000000000000000000000000000000000000081565b34801561078b57600080fd5b5061038b61079a3660046127e7565b611714565b3480156107ab57600080fd5b506103d86107ba366004612881565b600e6020526000908152604090205481565b3480156107d857600080fd5b506103d86107e7366004612881565b600d6020526000908152604090205481565b610324610942565b34801561080d57600080fd5b506103d8600c5481565b34801561082357600080fd5b506103d860105481565b34801561083957600080fd5b506103d861084836600461291d565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b34801561088c57600080fd5b506103d8611722565b3480156108a157600080fd5b506103d86802b5e3af16b188000081565b3480156108be57600080fd5b506103246108cd366004612950565b611774565b3480156108de57600080fd5b506103246108ed366004612881565b61185a565b3480156108fe57600080fd5b5061038b61090d366004612881565b60076020526000908152604090205460ff1681565b34801561092e57600080fd5b5061032461093d366004612969565b6118c0565b33803b63ffffffff1615610982576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160115460ff16600381111561099b5761099b612811565b146109d2576040517f7f9a7e5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600d602052604081208054349290610a079084906129ba565b9250508190555034600f6000828254610a2091906129ba565b909155505073ffffffffffffffffffffffffffffffffffffffff81166000908152600d6020526040902054670de0b6b3a76400001015610a8c576040517f1ba602ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f5b32366e01f1031d9eea11f55e693d225ce96b46c3761591c85f4ee8c34baa0834604051610ad491815260200190565b60405180910390a250565b33803b63ffffffff1615610b1f576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360115460ff166003811115610b3857610b38612811565b14610b6f576040517fcebeeca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600d60205260408120549003610bcd576040517f835a24b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600e602052604090205415610c2a576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5473ffffffffffffffffffffffffffffffffffffffff82166000908152600d6020526040812054909190612710610c716117706b033b2e3c9fd0803ce80000006129cd565b610c7b91906129e4565b610c8591906129cd565b610c8f91906129e4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e60205260408120829055601080549293508392909190610cce9084906129ba565b90915550610cde9050828261199e565b8173ffffffffffffffffffffffffffffffffffffffff167f0352332f702f094a528e3002d331329d6bdab7dfd9b1f45864ca583ea0636ee882604051610d2691815260200190565b60405180910390a25050565b606060038054610d4190612a1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6d90612a1f565b8015610dba5780601f10610d8f57610100808354040283529160200191610dba565b820191906000526020600020905b815481529060010190602001808311610d9d57829003601f168201915b5050505050905090565b600033610dd28185856119ad565b60019150505b92915050565b600033610dec8582856119bf565b610df7858585611a8e565b506001949350505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610e53576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205481151560ff909116151503610eba576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915590519092917fd3763f1074087e38245af8391cfa3acdb23e0553090104fd7b85667d7328752991a35050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610f8a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b306000908152602081905260409020548015610ffa57600654610fc590309073ffffffffffffffffffffffffffffffffffffffff1683611a8e565b6040518181527f37cc5ea62b518495d042cabfa45c5e43aeae690552efa3b7341854331e05662f906020015b60405180910390a15b50565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461104e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205481151560ff9091161515036110b5576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526007602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915590519092917f02ebf20869d52e173b3abfc35a2c8f7efc7901edff0691526afa5d21fa2ce92291a35050565b6010546000906127106111556117706b033b2e3c9fd0803ce80000006129cd565b61115f91906129e4565b6111699190612a72565b905090565b611176611b39565b600160115460ff16600381111561118f5761118f612811565b146111c6576040517fbaf3f0f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f54600003611202576040517f725699da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055600f546040519081527f227b593cbecd51a8479fc7c8362590fcba561971b9ecb0d25c4a27178df253e79060200160405180910390a1565b61126d611b39565b600260115460ff16600381111561128657611286612811565b146112bd576040517fbaf3f0f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127106112da6117706b033b2e3c9fd0803ce80000006129cd565b6112e491906129e4565b6127106112ff610b226b033b2e3c9fd0803ce80000006129cd565b61130991906129e4565b600f5461131691906129cd565b61132091906129e4565b905061136a612710611340610b226b033b2e3c9fd0803ce80000006129cd565b61134a91906129e4565b600654839073ffffffffffffffffffffffffffffffffffffffff16611b8c565b60065461138c9073ffffffffffffffffffffffffffffffffffffffff16611c0c565b6113986104b0426129ba565b6012556113a3611401565b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166003179055600f546040519081527f6882b4e9381959c371492b71e5cc926ee0b176e95804510eeac6c20044b5b5a290602001610ff1565b611409611b39565b6114136000611c16565b565b60006111696000611c8d565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611472576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065473ffffffffffffffffffffffffffffffffffffffff908116908216036114c7576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f252e37823f8325a28d11c9bfaa110c2e0587d3e41cf2a02d5de57536c058e68990600090a250565b60006111696001611c8d565b61154a611b39565b600060115460ff16600381111561156357611563612811565b1461159a576040517fbaf3f0f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517fbac8edc4f6a45ce4a46327dbea4b1181366b50f7356984a5e1c92ebe3cb21c1290600090a1565b606060048054610d4190612a1f565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611650576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff908116908216036116a5576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4f06221442f29c68561a21b361dae6cd59eeb67b7cded6395d590a4e1d2fd3a290600090a250565b600033610dd2818585611a8e565b600080600061172f611cc7565b9092509050600060646117438360056129cd565b61174d91906129e4565b905061176c816009541161176357600954611765565b815b8484611dab565b935050505090565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146117c5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6611c37937e080008110806117e257506802b5e3af16b188000081115b806117ee575060095481145b15611825576040517fcb9e92ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098190556040518181527f9ff241d1f1e0c30788ac08c45391c423cc5ef3e67f66a46b95a9a8f394759f3690602001610ff1565b611862611b39565b73ffffffffffffffffffffffffffffffffffffffff81166118b7576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610ffa81611c16565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611911576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60198211806119205750601981115b15611957576040517f37d4ed5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b829055600c81905560408051838152602081018390527f5eee0b95930ee59011f34615b0b7dc6cc58c01d1f07d04a01a3a1e70d2554cf0910160405180910390a15050565b6119a9308383611dff565b5050565b6119ba8383836001611faa565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a885781811015611a79576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016118ae565b611a8884848484036000611faa565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316611ade576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b73ffffffffffffffffffffffffffffffffffffffff8216611b2e576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b6119ba8383836120f2565b60055473ffffffffffffffffffffffffffffffffffffffff163314611413576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016118ae565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611be857600080fd5b505af1158015611bfc573d6000803e3d6000fd5b50505050506119ba838383612216565b610ffa81476123b8565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611cad576012544210611ca557600c54610dd8565b611388610dd8565b6012544210611cbe57600b54610dd8565b61012c92915050565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015611d37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5b9190612aa3565b915091507f0000000000000000000000000000000000000000000000000000000000000000611d8b578082611d8e565b81815b6dffffffffffffffffffffffffffff918216969116945092505050565b600080611db885856129cd565b611dc4906103e86129cd565b90506000611dd28685612a72565b611dde906103e56129cd565b9050611dea81836129e4565b611df59060016129ba565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316611e37578060026000828254611e2c91906129ba565b90915550611ee99050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611ebd576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016118ae565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216611f1257600280548290039055611f3e565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f9d91815260200190565b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8416611ffa576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b73ffffffffffffffffffffffffffffffffffffffff831661204a576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015611a88578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516120e491815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205460ff1615801561214e575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205460ff16155b801561216a57503360009081526007602052604090205460ff16155b1561220b5773ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040812054612710906121a59060ff16611c8d565b6121af90846129cd565b6121b991906129e4565b90506121c6843083611dff565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902054918190039160ff161561220957612209612204611722565b61242d565b505b6119ba838383611dff565b6122407f00000000000000000000000000000000000000000000000000000000000000008461199e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd906064016020604051808303816000875af11580156122ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123119190612acd565b506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636a62784290602401600060405180830381600087803b15801561239b57600080fd5b505af11580156123af573d6000803e3d6000fd5b50505050505050565b600080600080600085875af19050806119ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016118ae565b6127106124486117706b033b2e3c9fd0803ce80000006129cd565b61245291906129e4565b61245c90826129ba565b6010543060009081526020819052604090205461247991906129ba565b10156124825750565b600654610ffa90829073ffffffffffffffffffffffffffffffffffffffff1660006124ac836126e0565b90506124d87f00000000000000000000000000000000000000000000000000000000000000008461199e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663022c0d9f7f000000000000000000000000000000000000000000000000000000000000000061253f5782612542565b60005b7f000000000000000000000000000000000000000000000000000000000000000061256e576000612570565b835b604080516000815260208101918290527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b169091526125db9291907f00000000000000000000000000000000000000000000000000000000000000009060248101612aea565b600060405180830381600087803b1580156125f557600080fd5b505af1158015612609573d6000803e3d6000fd5b50506040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152851660248201526044810184905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292506323b872dd91506064016020604051808303816000875af11580156126bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a889190612acd565b60008060006126ed611cc7565b90925090506000612700856103e56129cd565b9050600061270e83836129cd565b905060008261271f866103e86129cd565b61272991906129ba565b905061273581836129e4565b979650505050505050565b6000815180845260005b818110156127665760208185018101518683018201520161274a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006127b76020830184612740565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146127e257600080fd5b919050565b600080604083850312156127fa57600080fd5b612803836127be565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016004831061287b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60006020828403121561289357600080fd5b6127b7826127be565b6000806000606084860312156128b157600080fd5b6128ba846127be565b92506128c8602085016127be565b9150604084013590509250925092565b8015158114610ffa57600080fd5b600080604083850312156128f957600080fd5b612902836127be565b91506020830135612912816128d8565b809150509250929050565b6000806040838503121561293057600080fd5b612939836127be565b9150612947602084016127be565b90509250929050565b60006020828403121561296257600080fd5b5035919050565b6000806040838503121561297c57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610dd857610dd861298b565b8082028115828204841417610dd857610dd861298b565b600082612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680612a3357607f821691505b602082108103612a6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610dd857610dd861298b565b80516dffffffffffffffffffffffffffff811681146127e257600080fd5b60008060408385031215612ab657600080fd5b612abf83612a85565b915061294760208401612a85565b600060208284031215612adf57600080fd5b81516127b7816128d8565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000611df5608083018461274056fea2646970667358221220aa7ff1433d6aee5232f913027d011dac699c6fa92e76ff43493802da0286843864736f6c63430008140033608060405234801561001057600080fd5b5060405161014738038061014783398101604081905261002f916100a8565b60405163095ea7b360e01b815233600482015260001960248201526001600160a01b0382169063095ea7b3906044016020604051808303816000875af115801561007d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100a191906100d8565b50506100fa565b6000602082840312156100ba57600080fd5b81516001600160a01b03811681146100d157600080fd5b9392505050565b6000602082840312156100ea57600080fd5b815180151581146100d157600080fd5b603f806101086000396000f3fe6080604052600080fdfea2646970667358221220785200f3783e1e7f98cc5338d4fc4ca532017957c46ef46db458a4bfb41c27fd64736f6c6343000814003302ebf20869d52e173b3abfc35a2c8f7efc7901edff0691526afa5d21fa2ce9220000000000000000000000000f2bc587ecedf80ccbba5edf9ef94589f0f2a0c60000000000000000000000000a19847c5967007586c6e796feff8f753d46362d0000000000000000000000000a19847c5967007586c6e796feff8f753d46362d

Deployed Bytecode

0x6080604052600436106103175760003560e01c806378bb86d31161019a578063a960c65f116100e1578063ddf4d5191161008a578063f2fde38b11610064578063f2fde38b146108d2578063f5a4fa1e146108f2578063fe2314d61461092257600080fd5b8063ddf4d51914610880578063dfc56b1114610895578063e09d6bc6146108b257600080fd5b8063cc1776d3116100bb578063cc1776d314610801578063d54ad2a114610817578063dd62ed3e1461082d57600080fd5b8063a960c65f1461079f578063b18f0de2146107cc578063bda347be146107f957600080fd5b80638dd9831211610143578063a2aa18ad1161011d578063a2aa18ad1461072b578063a8aa1b311461074b578063a9059cbb1461077f57600080fd5b80638dd98312146106eb57806395d89b411461070057806399fbde7d1461071557600080fd5b806383e03b341161017457806383e03b341461069657806386a35f25146106ab5780638da5cb5b146106c057600080fd5b806378bb86d31461064557806378e3079e1461065b57806381e172ca1461067b57600080fd5b8063468298311161025e57806367cf6f1011610207578063715018a6116101e1578063715018a6146105ee578063737ea06e14610603578063774378e41461063057600080fd5b806367cf6f101461057a57806370a082311461058f57806370e7c575146105d257600080fd5b806352fd28a61161023857806352fd28a6146105305780635afefc091461055057806363cea4501461056557600080fd5b806346829831146104b35780634d237730146104c85780634f7041a51461051a57600080fd5b806318f60b69116102c05780632cb686fe1161029a5780632cb686fe1461046b578063313ce567146104815780634201ed1b1461049d57600080fd5b806318f60b69146103fb57806323b872dd1461042b578063263b82371461044b57600080fd5b80630d0c31b7116102f15780630d0c31b71461039b5780631465000e146103c257806318160ddd146103e657600080fd5b8063046ef9a51461032b57806306fdde0314610340578063095ea7b31461036b57600080fd5b3661032657610324610942565b005b600080fd5b34801561033757600080fd5b50610324610adf565b34801561034c57600080fd5b50610355610d32565b60405161036291906127a4565b60405180910390f35b34801561037757600080fd5b5061038b6103863660046127e7565b610dc4565b6040519015158152602001610362565b3480156103a757600080fd5b506011546103b59060ff1681565b6040516103629190612840565b3480156103ce57600080fd5b506103d860095481565b604051908152602001610362565b3480156103f257600080fd5b506002546103d8565b34801561040757600080fd5b5061038b610416366004612881565b60086020526000908152604090205460ff1681565b34801561043757600080fd5b5061038b61044636600461289c565b610dde565b34801561045757600080fd5b506103246104663660046128e6565b610e02565b34801561047757600080fd5b506103d861177081565b34801561048d57600080fd5b5060405160128152602001610362565b3480156104a957600080fd5b506103d861047e81565b3480156104bf57600080fd5b50610324610f39565b3480156104d457600080fd5b50600a546104f59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610362565b34801561052657600080fd5b506103d8600b5481565b34801561053c57600080fd5b5061032461054b3660046128e6565b610ffd565b34801561055c57600080fd5b506103d8611134565b34801561057157600080fd5b5061032461116e565b34801561058657600080fd5b50610324611265565b34801561059b57600080fd5b506103d86105aa366004612881565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3480156105de57600080fd5b506103d8670de0b6b3a764000081565b3480156105fa57600080fd5b50610324611401565b34801561060f57600080fd5b506006546104f59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561063c57600080fd5b506103d8611415565b34801561065157600080fd5b506103d8600f5481565b34801561066757600080fd5b50610324610676366004612881565b611421565b34801561068757600080fd5b506103d86611c37937e0800081565b3480156106a257600080fd5b506103d8611536565b3480156106b757600080fd5b506103d8601981565b3480156106cc57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff166104f5565b3480156106f757600080fd5b50610324611542565b34801561070c57600080fd5b506103556115f0565b34801561072157600080fd5b506103d8610b2281565b34801561073757600080fd5b50610324610746366004612881565b6115ff565b34801561075757600080fd5b506104f57f00000000000000000000000035ec40bd9ae9179097f06ccbc0e9c3f2d051cc3081565b34801561078b57600080fd5b5061038b61079a3660046127e7565b611714565b3480156107ab57600080fd5b506103d86107ba366004612881565b600e6020526000908152604090205481565b3480156107d857600080fd5b506103d86107e7366004612881565b600d6020526000908152604090205481565b610324610942565b34801561080d57600080fd5b506103d8600c5481565b34801561082357600080fd5b506103d860105481565b34801561083957600080fd5b506103d861084836600461291d565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b34801561088c57600080fd5b506103d8611722565b3480156108a157600080fd5b506103d86802b5e3af16b188000081565b3480156108be57600080fd5b506103246108cd366004612950565b611774565b3480156108de57600080fd5b506103246108ed366004612881565b61185a565b3480156108fe57600080fd5b5061038b61090d366004612881565b60076020526000908152604090205460ff1681565b34801561092e57600080fd5b5061032461093d366004612969565b6118c0565b33803b63ffffffff1615610982576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160115460ff16600381111561099b5761099b612811565b146109d2576040517f7f9a7e5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600d602052604081208054349290610a079084906129ba565b9250508190555034600f6000828254610a2091906129ba565b909155505073ffffffffffffffffffffffffffffffffffffffff81166000908152600d6020526040902054670de0b6b3a76400001015610a8c576040517f1ba602ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f5b32366e01f1031d9eea11f55e693d225ce96b46c3761591c85f4ee8c34baa0834604051610ad491815260200190565b60405180910390a250565b33803b63ffffffff1615610b1f576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360115460ff166003811115610b3857610b38612811565b14610b6f576040517fcebeeca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600d60205260408120549003610bcd576040517f835a24b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600e602052604090205415610c2a576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5473ffffffffffffffffffffffffffffffffffffffff82166000908152600d6020526040812054909190612710610c716117706b033b2e3c9fd0803ce80000006129cd565b610c7b91906129e4565b610c8591906129cd565b610c8f91906129e4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e60205260408120829055601080549293508392909190610cce9084906129ba565b90915550610cde9050828261199e565b8173ffffffffffffffffffffffffffffffffffffffff167f0352332f702f094a528e3002d331329d6bdab7dfd9b1f45864ca583ea0636ee882604051610d2691815260200190565b60405180910390a25050565b606060038054610d4190612a1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6d90612a1f565b8015610dba5780601f10610d8f57610100808354040283529160200191610dba565b820191906000526020600020905b815481529060010190602001808311610d9d57829003601f168201915b5050505050905090565b600033610dd28185856119ad565b60019150505b92915050565b600033610dec8582856119bf565b610df7858585611a8e565b506001949350505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610e53576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205481151560ff909116151503610eba576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915590519092917fd3763f1074087e38245af8391cfa3acdb23e0553090104fd7b85667d7328752991a35050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610f8a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b306000908152602081905260409020548015610ffa57600654610fc590309073ffffffffffffffffffffffffffffffffffffffff1683611a8e565b6040518181527f37cc5ea62b518495d042cabfa45c5e43aeae690552efa3b7341854331e05662f906020015b60405180910390a15b50565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461104e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205481151560ff9091161515036110b5576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526007602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915590519092917f02ebf20869d52e173b3abfc35a2c8f7efc7901edff0691526afa5d21fa2ce92291a35050565b6010546000906127106111556117706b033b2e3c9fd0803ce80000006129cd565b61115f91906129e4565b6111699190612a72565b905090565b611176611b39565b600160115460ff16600381111561118f5761118f612811565b146111c6576040517fbaf3f0f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f54600003611202576040517f725699da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055600f546040519081527f227b593cbecd51a8479fc7c8362590fcba561971b9ecb0d25c4a27178df253e79060200160405180910390a1565b61126d611b39565b600260115460ff16600381111561128657611286612811565b146112bd576040517fbaf3f0f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127106112da6117706b033b2e3c9fd0803ce80000006129cd565b6112e491906129e4565b6127106112ff610b226b033b2e3c9fd0803ce80000006129cd565b61130991906129e4565b600f5461131691906129cd565b61132091906129e4565b905061136a612710611340610b226b033b2e3c9fd0803ce80000006129cd565b61134a91906129e4565b600654839073ffffffffffffffffffffffffffffffffffffffff16611b8c565b60065461138c9073ffffffffffffffffffffffffffffffffffffffff16611c0c565b6113986104b0426129ba565b6012556113a3611401565b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166003179055600f546040519081527f6882b4e9381959c371492b71e5cc926ee0b176e95804510eeac6c20044b5b5a290602001610ff1565b611409611b39565b6114136000611c16565b565b60006111696000611c8d565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611472576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065473ffffffffffffffffffffffffffffffffffffffff908116908216036114c7576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f252e37823f8325a28d11c9bfaa110c2e0587d3e41cf2a02d5de57536c058e68990600090a250565b60006111696001611c8d565b61154a611b39565b600060115460ff16600381111561156357611563612811565b1461159a576040517fbaf3f0f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517fbac8edc4f6a45ce4a46327dbea4b1181366b50f7356984a5e1c92ebe3cb21c1290600090a1565b606060048054610d4190612a1f565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611650576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff908116908216036116a5576040517fe523909000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4f06221442f29c68561a21b361dae6cd59eeb67b7cded6395d590a4e1d2fd3a290600090a250565b600033610dd2818585611a8e565b600080600061172f611cc7565b9092509050600060646117438360056129cd565b61174d91906129e4565b905061176c816009541161176357600954611765565b815b8484611dab565b935050505090565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146117c5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6611c37937e080008110806117e257506802b5e3af16b188000081115b806117ee575060095481145b15611825576040517fcb9e92ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098190556040518181527f9ff241d1f1e0c30788ac08c45391c423cc5ef3e67f66a46b95a9a8f394759f3690602001610ff1565b611862611b39565b73ffffffffffffffffffffffffffffffffffffffff81166118b7576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610ffa81611c16565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611911576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60198211806119205750601981115b15611957576040517f37d4ed5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b829055600c81905560408051838152602081018390527f5eee0b95930ee59011f34615b0b7dc6cc58c01d1f07d04a01a3a1e70d2554cf0910160405180910390a15050565b6119a9308383611dff565b5050565b6119ba8383836001611faa565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a885781811015611a79576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016118ae565b611a8884848484036000611faa565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316611ade576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b73ffffffffffffffffffffffffffffffffffffffff8216611b2e576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b6119ba8383836120f2565b60055473ffffffffffffffffffffffffffffffffffffffff163314611413576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016118ae565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611be857600080fd5b505af1158015611bfc573d6000803e3d6000fd5b50505050506119ba838383612216565b610ffa81476123b8565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611cad576012544210611ca557600c54610dd8565b611388610dd8565b6012544210611cbe57600b54610dd8565b61012c92915050565b6000806000807f00000000000000000000000035ec40bd9ae9179097f06ccbc0e9c3f2d051cc3073ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015611d37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5b9190612aa3565b915091507f0000000000000000000000000000000000000000000000000000000000000000611d8b578082611d8e565b81815b6dffffffffffffffffffffffffffff918216969116945092505050565b600080611db885856129cd565b611dc4906103e86129cd565b90506000611dd28685612a72565b611dde906103e56129cd565b9050611dea81836129e4565b611df59060016129ba565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316611e37578060026000828254611e2c91906129ba565b90915550611ee99050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611ebd576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016118ae565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216611f1257600280548290039055611f3e565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f9d91815260200190565b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8416611ffa576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b73ffffffffffffffffffffffffffffffffffffffff831661204a576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016118ae565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015611a88578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516120e491815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205460ff1615801561214e575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205460ff16155b801561216a57503360009081526007602052604090205460ff16155b1561220b5773ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040812054612710906121a59060ff16611c8d565b6121af90846129cd565b6121b991906129e4565b90506121c6843083611dff565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902054918190039160ff161561220957612209612204611722565b61242d565b505b6119ba838383611dff565b6122407f00000000000000000000000035ec40bd9ae9179097f06ccbc0e9c3f2d051cc308461199e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000035ec40bd9ae9179097f06ccbc0e9c3f2d051cc301660248201526044810183905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd906064016020604051808303816000875af11580156122ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123119190612acd565b506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f00000000000000000000000035ec40bd9ae9179097f06ccbc0e9c3f2d051cc301690636a62784290602401600060405180830381600087803b15801561239b57600080fd5b505af11580156123af573d6000803e3d6000fd5b50505050505050565b600080600080600085875af19050806119ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016118ae565b6127106124486117706b033b2e3c9fd0803ce80000006129cd565b61245291906129e4565b61245c90826129ba565b6010543060009081526020819052604090205461247991906129ba565b10156124825750565b600654610ffa90829073ffffffffffffffffffffffffffffffffffffffff1660006124ac836126e0565b90506124d87f00000000000000000000000035ec40bd9ae9179097f06ccbc0e9c3f2d051cc308461199e565b7f00000000000000000000000035ec40bd9ae9179097f06ccbc0e9c3f2d051cc3073ffffffffffffffffffffffffffffffffffffffff1663022c0d9f7f000000000000000000000000000000000000000000000000000000000000000061253f5782612542565b60005b7f000000000000000000000000000000000000000000000000000000000000000061256e576000612570565b835b604080516000815260208101918290527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b169091526125db9291907f000000000000000000000000c40efb578bce2145b96bd37be0d7d22963e479aa9060248101612aea565b600060405180830381600087803b1580156125f557600080fd5b505af1158015612609573d6000803e3d6000fd5b50506040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c40efb578bce2145b96bd37be0d7d22963e479aa81166004830152851660248201526044810184905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292506323b872dd91506064016020604051808303816000875af11580156126bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a889190612acd565b60008060006126ed611cc7565b90925090506000612700856103e56129cd565b9050600061270e83836129cd565b905060008261271f866103e86129cd565b61272991906129ba565b905061273581836129e4565b979650505050505050565b6000815180845260005b818110156127665760208185018101518683018201520161274a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006127b76020830184612740565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146127e257600080fd5b919050565b600080604083850312156127fa57600080fd5b612803836127be565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016004831061287b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60006020828403121561289357600080fd5b6127b7826127be565b6000806000606084860312156128b157600080fd5b6128ba846127be565b92506128c8602085016127be565b9150604084013590509250925092565b8015158114610ffa57600080fd5b600080604083850312156128f957600080fd5b612902836127be565b91506020830135612912816128d8565b809150509250929050565b6000806040838503121561293057600080fd5b612939836127be565b9150612947602084016127be565b90509250929050565b60006020828403121561296257600080fd5b5035919050565b6000806040838503121561297c57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610dd857610dd861298b565b8082028115828204841417610dd857610dd861298b565b600082612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680612a3357607f821691505b602082108103612a6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610dd857610dd861298b565b80516dffffffffffffffffffffffffffff811681146127e257600080fd5b60008060408385031215612ab657600080fd5b612abf83612a85565b915061294760208401612a85565b600060208284031215612adf57600080fd5b81516127b7816128d8565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000611df5608083018461274056fea2646970667358221220aa7ff1433d6aee5232f913027d011dac699c6fa92e76ff43493802da0286843864736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000f2bc587ecedf80ccbba5edf9ef94589f0f2a0c60000000000000000000000000a19847c5967007586c6e796feff8f753d46362d0000000000000000000000000a19847c5967007586c6e796feff8f753d46362d

-----Decoded View---------------
Arg [0] : _owner (address): 0x0f2bc587ECedf80CcbbA5EDf9ef94589F0F2a0c6
Arg [1] : _taxRecipient (address): 0x0a19847C5967007586c6E796FeFf8F753d46362d
Arg [2] : _taxManager (address): 0x0a19847C5967007586c6E796FeFf8F753d46362d

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000f2bc587ecedf80ccbba5edf9ef94589f0f2a0c6
Arg [1] : 0000000000000000000000000a19847c5967007586c6e796feff8f753d46362d
Arg [2] : 0000000000000000000000000a19847c5967007586c6e796feff8f753d46362d


Deployed Bytecode Sourcemap

275:15170:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5439:17;:15;:17::i;:::-;275:15170;;;;;6455:747;;;;;;;;;;;;;:::i;2074:89:2:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4293:186;;;;;;;;;;-1:-1:-1;4293:186:2;;;;;:::i;:::-;;:::i;:::-;;;1351:14:8;;1344:22;1326:41;;1314:2;1299:18;4293:186:2;1186:187:8;3129:32:7;;;;;;;;;;-1:-1:-1;3129:32:7;;;;;;;;;;;;;;;:::i;2288:43::-;;;;;;;;;;;;;;;;;;;2120:25:8;;;2108:2;2093:18;2288:43:7;1974:177:8;3144:97:2;;;;;;;;;;-1:-1:-1;3222:12:2;;3144:97;;2147:46:7;;;;;;;;;;-1:-1:-1;2147:46:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;5039:244:2;;;;;;;;;;-1:-1:-1;5039:244:2;;;;;:::i;:::-;;:::i;9864:329:7:-;;;;;;;;;;-1:-1:-1;9864:329:7;;;;;:::i;:::-;;:::i;560:45::-;;;;;;;;;;;;600:5;560:45;;3002:82:2;;;;;;;;;;-1:-1:-1;3002:82:2;;3075:2;3265:36:8;;3253:2;3238:18;3002:82:2;3123:184:8;843:43:7;;;;;;;;;;;;881:5;843:43;;11230:254;;;;;;;;;;;;;:::i;2369:25::-;;;;;;;;;;-1:-1:-1;2369:25:7;;;;;;;;;;;3488:42:8;3476:55;;;3458:74;;3446:2;3431:18;2369:25:7;3312:226:8;2504:25:7;;;;;;;;;;;;;;;;9278:306;;;;;;;;;;-1:-1:-1;9278:306:7;;;;;:::i;:::-;;:::i;7291:113::-;;;;;;;;;;;;;:::i;7807:320::-;;;;;;;;;;;;;:::i;8397:622::-;;;;;;;;;;;;;:::i;3299:116:2:-;;;;;;;;;;-1:-1:-1;3299:116:2;;;;;:::i;:::-;3390:18;;3364:7;3390:18;;;;;;;;;;;;3299:116;957:55:7;;;;;;;;;;;;1005:7;957:55;;2293:101:0;;;;;;;;;;;;;:::i;1941:27:7:-;;;;;;;;;;-1:-1:-1;1941:27:7;;;;;;;;13542:94;;;;;;;;;;;;;:::i;2958:31::-;;;;;;;;;;;;;;;;10789:269;;;;;;;;;;-1:-1:-1;10789:269:7;;;;;:::i;:::-;;:::i;1087:60::-;;;;;;;;;;;;1136:11;1087:60;;13373:92;;;;;;;;;;;;;:::i;1324:36::-;;;;;;;;;;;;1358:2;1324:36;;1638:85:0;;;;;;;;;;-1:-1:-1;1710:6:0;;;;1638:85;;7502:215:7;;;;;;;;;;;;;:::i;2276:93:2:-;;;;;;;;;;;;;:::i;691:47:7:-;;;;;;;;;;;;733:5;691:47;;10359:258;;;;;;;;;;-1:-1:-1;10359:258:7;;;;;:::i;:::-;;:::i;1381:29:6:-;;;;;;;;;;;;;;;3610:178:2;;;;;;;;;;-1:-1:-1;3610:178:2;;;;;:::i;:::-;;:::i;2852:48:7:-;;;;;;;;;;-1:-1:-1;2852:48:7;;;;;:::i;:::-;;;;;;;;;;;;;;2736:45;;;;;;;;;;-1:-1:-1;2736:45:7;;;;;:::i;:::-;;;;;;;;;;;;;;5808:536;;;:::i;2645:27::-;;;;;;;;;;;;;;;;3054;;;;;;;;;;;;;;;;3846:140:2;;;;;;;;;;-1:-1:-1;3846:140:2;;;;;:::i;:::-;3952:18;;;;3926:7;3952:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3846:140;12916:380:7;;;;;;;;;;;;;:::i;1222:57::-;;;;;;;;;;;;1271:8;1222:57;;11699:457;;;;;;;;;;-1:-1:-1;11699:457:7;;;;;:::i;:::-;;:::i;2543:215:0:-;;;;;;;;;;-1:-1:-1;2543:215:0;;;;;:::i;:::-;;:::i;2039:46:7:-;;;;;;;;;;-1:-1:-1;2039:46:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;12362:323;;;;;;;;;;-1:-1:-1;12362:323:7;;;;;:::i;:::-;;:::i;5808:536::-;5878:10;6587:21:6;;6635:8;;;5898:70:7;;5945:12;;;;;;;;;;;;;;5898:70;6010:17;5994:12;;;;:33;;;;;;;;:::i;:::-;;5977:110;;6059:17;;;;;;;;;;;;;;5977:110;6097:19;;;;;;;:10;:19;;;;;:32;;6120:9;;6097:19;:32;;6120:9;;6097:32;:::i;:::-;;;;;;;;6159:9;6139:16;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;6183:19:7;;;;;;;:10;:19;;;;;;1005:7;-1:-1:-1;6179:106:7;;;6249:25;;;;;;;;;;;;;;6179:106;6318:7;6300:37;;;6327:9;6300:37;;;;2120:25:8;;2108:2;2093:18;;1974:177;6300:37:7;;;;;;;;5850:494;5808:536::o;6455:747::-;6516:10;6587:21:6;;6635:8;;;6537:70:7;;6584:12;;;;;;;;;;;;;;6537:70;6636:22;6620:12;;;;:38;;;;;;;;:::i;:::-;;6616:97;;6681:21;;;;;;;;;;;;;;6616:97;6726:19;;;;;;;:10;:19;;;;;;:24;;6722:80;;6773:18;;;;;;;;;;;;;;6722:80;6815:22;;;;;;;:13;:22;;;;;;:27;6811:81;;6865:16;;;;;;;;;;;;;;6811:81;6979:16;;6944:19;;;6902:20;6944:19;;;:10;:19;;;;;;6902:20;;6979:16;1514:6;1483:27;600:5;1406:19;1483:27;:::i;:::-;1482:38;;;;:::i;:::-;6926:37;;;;:::i;:::-;6925:70;;;;:::i;:::-;7005:22;;;;;;;:13;:22;;;;;:37;;;7052:12;:28;;6902:93;;-1:-1:-1;6902:93:7;;7052:12;;7005:22;7052:28;;6902:93;;7052:28;:::i;:::-;;;;-1:-1:-1;7091:51:7;;-1:-1:-1;7120:7:7;7129:12;7091:28;:51::i;:::-;7173:7;7158:37;;;7182:12;7158:37;;;;2120:25:8;;2108:2;2093:18;;1974:177;7158:37:7;;;;;;;;6488:714;;6455:747::o;2074:89:2:-;2119:13;2151:5;2144:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2074:89;:::o;4293:186::-;4366:4;735:10:5;4420:31:2;735:10:5;4436:7:2;4445:5;4420:8;:31::i;:::-;4468:4;4461:11;;;4293:186;;;;;:::o;5039:244::-;5126:4;735:10:5;5182:37:2;5198:4;735:10:5;5213:5:2;5182:15;:37::i;:::-;5229:26;5239:4;5245:2;5249:5;5229:9;:26::i;:::-;-1:-1:-1;5272:4:2;;5039:244;-1:-1:-1;;;;5039:244:2:o;9864:329:7:-;4373:10;;;;4359;:24;4355:76;;4406:14;;;;;;;;;;;;;;4355:76;9985:23:::1;::::0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:39;::::1;;:23;::::0;;::::1;:39;;::::0;9981:96:::1;;10047:19;;;;;;;;;;;;;;9981:96;10086:23;::::0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:38;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;10139:47;;10086:38;;:23;10139:47:::1;::::0;::::1;9864:329:::0;;:::o;11230:254::-;4373:10;;;;4359;:24;4355:76;;4406:14;;;;;;;;;;;;;;4355:76;11325:4:::1;11289:15;3390:18:2::0;;;;;;;;;;;11345:11:7;;11341:137:::1;;11403:12;::::0;11372:53:::1;::::0;11396:4:::1;::::0;11403:12:::1;;11417:7:::0;11372:15:::1;:53::i;:::-;11444:23;::::0;2120:25:8;;;11444:23:7::1;::::0;2108:2:8;2093:18;11444:23:7::1;;;;;;;;11341:137;11279:205;11230:254::o:0;9278:306::-;4373:10;;;;4359;:24;4355:76;;4406:14;;;;;;;;;;;;;;4355:76;9396:23:::1;::::0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:34;::::1;;:23;::::0;;::::1;:34;;::::0;9392:91:::1;;9453:19;;;;;;;;;;;;;;9392:91;9492:23;::::0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:33;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;9540:37;;9492:33;;:23;9540:37:::1;::::0;::::1;9278:306:::0;;:::o;7291:113::-;7385:12;;7341:7;;1514:6;1483:27;600:5;1406:19;1483:27;:::i;:::-;1482:38;;;;:::i;:::-;7367:30;;;;:::i;:::-;7360:37;;7291:113;:::o;7807:320::-;1531:13:0;:11;:13::i;:::-;7880:17:7::1;7864:12;::::0;::::1;;:33;::::0;::::1;;;;;;:::i;:::-;;7860:85;;7920:14;;;;;;;;;;;;;;7860:85;7958:16;;7978:1;7958:21:::0;7954:75:::1;;8002:16;;;;;;;;;;;;;;7954:75;8039:12;:34:::0;;;::::1;8054:19;8039:34;::::0;;8103:16:::1;::::0;8089:31:::1;::::0;2120:25:8;;;8089:31:7::1;::::0;2108:2:8;2093:18;8089:31:7::1;;;;;;;7807:320::o:0;8397:622::-;1531:13:0;:11;:13::i;:::-;8473:19:7::1;8457:12;::::0;::::1;;:35;::::0;::::1;;;;;;:::i;:::-;;8453:87;;8515:14;;;;;;;;;;;;;;8453:87;8550:29;1514:6;1483:27;600:5;1406:19;1483:27;:::i;:::-;1482:38;;;;:::i;:::-;1613:6;1580:29;733:5;1406:19;1580:29;:::i;:::-;1579:40;;;;:::i;:::-;8583:16;;:36;;;;:::i;:::-;8582:68;;;;:::i;:::-;8550:100:::0;-1:-1:-1;8660:125:7::1;1613:6;1580:29;733:5;1406:19;1580:29;:::i;:::-;1579:40;;;;:::i;:::-;8763:12;::::0;8728:21;;8763:12:::1;;8660:23;:125::i;:::-;8806:12;::::0;8796:23:::1;::::0;8806:12:::1;;8796:9;:23::i;:::-;8849:36;1883:10;8849:15;:36;:::i;:::-;8830:16;:55:::0;8895:19:::1;:17;:19::i;:::-;8925:12;:37:::0;;;::::1;8940:22;8925:37;::::0;;8995:16:::1;::::0;8978:34:::1;::::0;2120:25:8;;;8978:34:7::1;::::0;2108:2:8;2093:18;8978:34:7::1;1974:177:8::0;2293:101:0;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;13542:94:7:-;13589:7;13615:14;13623:5;13615:7;:14::i;10789:269::-;4373:10;;;;4359;:24;4355:76;;4406:14;;;;;;;;;;;;;;4355:76;10896:12:::1;::::0;::::1;::::0;;::::1;10877:31:::0;;::::1;::::0;10873:88:::1;;10931:19;;;;;;;;;;;;;;10873:88;10970:12;:30:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;11015:36:::1;::::0;::::1;::::0;-1:-1:-1;;11015:36:7::1;10789:269:::0;:::o;13373:92::-;13419:7;13445:13;13453:4;13445:7;:13::i;7502:215::-;1531:13:0;:11;:13::i;:::-;7574:17:7::1;7558:12;::::0;::::1;;:33;::::0;::::1;;;;;;:::i;:::-;;7554:85;;7614:14;;;;;;;;;;;;;;7554:85;7648:12;:32:::0;;;::::1;7663:17;7648:32;::::0;;7695:15:::1;::::0;::::1;::::0;-1:-1:-1;;7695:15:7::1;7502:215::o:0;2276:93:2:-;2323:13;2355:7;2348:14;;;;;:::i;10359:258:7:-;4373:10;;;;4359;:24;4355:76;;4406:14;;;;;;;;;;;;;;4355:76;10465:10:::1;::::0;::::1;::::0;;::::1;10448:27:::0;;::::1;::::0;10444:84:::1;;10498:19;;;;;;;;;;;;;;10444:84;10537:10;:26:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;10578:32:::1;::::0;::::1;::::0;-1:-1:-1;;10578:32:7::1;10359:258:::0;:::o;3610:178:2:-;3679:4;735:10:5;3733:27:2;735:10:5;3750:2:2;3754:5;3733:9;:27::i;12916:380:7:-;12967:7;12987:17;13006:16;13026:13;:11;:13::i;:::-;12986:53;;-1:-1:-1;12986:53:7;-1:-1:-1;13049:18:7;13090:3;13071:15;12986:53;13085:1;13071:15;:::i;:::-;13070:23;;;;:::i;:::-;13049:44;;13122:167;13174:10;13155:16;;:29;:61;;13200:16;;13155:61;;;13187:10;13155:61;13234:12;13264:11;13122:15;:167::i;:::-;13103:186;;;;;12916:380;:::o;11699:457::-;4373:10;;;;4359;:24;4355:76;;4406:14;;;;;;;;;;;;;;4355:76;1136:11:::1;11822:19;:44;:104;;;;1271:8;11882:19;:44;11822:104;:159;;;;11965:16;;11942:19;:39;11822:159;11805:241;;;12013:22;;;;;;;;;;;;;;11805:241;12055:16;:38:::0;;;12108:41:::1;::::0;2120:25:8;;;12108:41:7::1;::::0;2108:2:8;2093:18;12108:41:7::1;1974:177:8::0;2543:215:0;1531:13;:11;:13::i;:::-;2627:22:::1;::::0;::::1;2623:91;;2672:31;::::0;::::1;::::0;;2700:1:::1;2672:31;::::0;::::1;3458:74:8::0;3431:18;;2672:31:0::1;;;;;;;;2623:91;2723:28;2742:8;2723:18;:28::i;12362:323:7:-:0;4373:10;;;;4359;:24;4355:76;;4406:14;;;;;;;;;;;;;;4355:76;1358:2:::1;12482:9;:19;:43;;;;1358:2;12505:10;:20;12482:43;12478:93;;;12548:12;;;;;;;;;;;;;;12478:93;12580:6;:18:::0;;;12608:7:::1;:20:::0;;;12643:35:::1;::::0;;5766:25:8;;;5822:2;5807:18;;5800:34;;;12643:35:7::1;::::0;5739:18:8;12643:35:7::1;;;;;;;12362:323:::0;;:::o;14940:163::-;15056:40;15078:4;15085:2;15089:6;15056:13;:40::i;:::-;14940:163;;:::o;8989:128:2:-;9073:37;9082:5;9089:7;9098:5;9105:4;9073:8;:37::i;:::-;8989:128;;;:::o;10663:477::-;3952:18;;;;10762:24;3952:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;10848:17;10828:37;;10824:310;;10904:5;10885:16;:24;10881:130;;;10936:60;;;;;6077:42:8;6065:55;;10936:60:2;;;6047:74:8;6137:18;;;6130:34;;;6180:18;;;6173:34;;;6020:18;;10936:60:2;5845:368:8;10881:130:2;11052:57;11061:5;11068:7;11096:5;11077:16;:24;11103:5;11052:8;:57::i;:::-;10752:388;10663:477;;;:::o;5656:300::-;5739:18;;;5735:86;;5780:30;;;;;5807:1;5780:30;;;3458:74:8;3431:18;;5780:30:2;3312:226:8;5735:86:2;5834:16;;;5830:86;;5873:32;;;;;5902:1;5873:32;;;3458:74:8;3431:18;;5873:32:2;3312:226:8;5830:86:2;5925:24;5933:4;5939:2;5943:5;5925:7;:24::i;1796:162:0:-;1710:6;;1855:23;1710:6;735:10:5;1855:23:0;1851:101;;1901:40;;;;;735:10:5;1901:40:0;;;3458:74:8;3431:18;;1901:40:0;3312:226:8;3614:232:6;1198:42;3742:19;;;3769:9;3742:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3791:48;3812:11;3825:9;3836:2;3791:20;:48::i;4187:100::-;4237:43;4254:2;4258:21;4237:16;:43::i;2912:187:0:-;3004:6;;;;3020:17;;;;;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;14423:439:7:-;14474:7;14512:5;:343;;14744:16;;14726:15;:34;:111;;14830:7;;14512:343;;14726:111;1826:5;14512:343;;;14576:16;;14558:15;:34;:109;;14661:6;;14558:109;;;1772:4;14493:362;14423:439;-1:-1:-1;;14423:439:7:o;5555:330:6:-;5625:17;5644:16;5677:21;5700;5740:4;5725:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5676:83;;;;5799:13;:79;;5849:13;5864;5799:79;;;5816:13;5831;5799:79;5769:109;;;;;;;;-1:-1:-1;5555:330:6;-1:-1:-1;;;5555:330:6:o;5184:327::-;5315:16;;5360:24;5375:9;5360:12;:24;:::i;:::-;:31;;5387:4;5360:31;:::i;:::-;5343:48;-1:-1:-1;5401:16:6;5421:23;5435:9;5421:11;:23;:::i;:::-;5420:31;;5448:3;5420:31;:::i;:::-;5401:50;-1:-1:-1;5476:23:6;5401:50;5476:9;:23;:::i;:::-;5475:29;;5503:1;5475:29;:::i;:::-;5461:43;5184:327;-1:-1:-1;;;;;;5184:327:6:o;6271:1107:2:-;6360:18;;;6356:540;;6512:5;6496:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;6356:540:2;;-1:-1:-1;6356:540:2;;6570:15;;;6548:19;6570:15;;;;;;;;;;;6603:19;;;6599:115;;;6649:50;;;;;6077:42:8;6065:55;;6649:50:2;;;6047:74:8;6137:18;;;6130:34;;;6180:18;;;6173:34;;;6020:18;;6649:50:2;5845:368:8;6599:115:2;6834:15;;;:9;:15;;;;;;;;;;6852:19;;;;6834:37;;6356:540;6910:16;;;6906:425;;7073:12;:21;;;;;;;6906:425;;;7284:13;;;:9;:13;;;;;;;;;;:22;;;;;;6906:425;7361:2;7346:25;;7355:4;7346:25;;;7365:5;7346:25;;;;2120::8;;2108:2;2093:18;;1974:177;7346:25:2;;;;;;;;6271:1107;;;:::o;9949:432::-;10061:19;;;10057:89;;10103:32;;;;;10132:1;10103:32;;;3458:74:8;3431:18;;10103:32:2;3312:226:8;10057:89:2;10159:21;;;10155:90;;10203:31;;;;;10231:1;10203:31;;;3458:74:8;3431:18;;10203:31:2;3312:226:8;10155:90:2;10254:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;10299:76;;;;10349:7;10333:31;;10342:5;10333:31;;;10358:5;10333:31;;;;2120:25:8;;2108:2;2093:18;;1974:177;10333:31:2;;;;;;;;9949:432;;;;:::o;13714:625:7:-;13857:20;;;;;;;:14;:20;;;;;;;;13856:21;:56;;;;-1:-1:-1;13894:18:7;;;;;;;:14;:18;;;;;;;;13893:19;13856:56;:99;;;;-1:-1:-1;13944:10:7;13929:26;;;;:14;:26;;;;;;;;13928:27;13856:99;13839:453;;;14011:20;;;13980:11;14011:20;;;:14;:20;;;;;;14035:6;;14003:29;;14011:20;;14003:7;:29::i;:::-;13994:38;;:6;:38;:::i;:::-;:47;;;;:::i;:::-;13980:61;;14055:39;14069:4;14083;14090:3;14055:13;:39::i;:::-;14182:18;;;;;;;:14;:18;;;;;;14136:13;;;;;14182:18;;14178:104;;;14234:33;14246:20;:18;:20::i;:::-;14234:11;:33::i;:::-;13966:326;13839:453;14301:31;14315:4;14321:2;14325:6;14301:13;:31::i;3074:287:6:-;3200:47;3229:4;3235:11;3200:28;:47::i;:::-;3257:58;;;;;3291:4;3257:58;;;6972:34:8;6921:42;3298:4:6;7042:15:8;7022:18;;;7015:43;7074:18;;;7067:34;;;1198:42:6;;3257:25;;6884:18:8;;3257:58:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3325:29:6;;;;;:25;3476:55:8;;;3325:29:6;;;3458:74:8;3340:4:6;3325:25;;;;3431:18:8;;3325:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3074:287;;;:::o;5954:383::-;6027:12;6269:1;6266;6263;6260;6252:6;6248:2;6241:5;6236:35;6225:46;;6299:7;6291:39;;;;;;;7564:2:8;6291:39:6;;;7546:21:8;7603:2;7583:18;;;7576:30;7642:21;7622:18;;;7615:49;7681:18;;6291:39:6;7362:343:8;15218:225:7;1514:6;1483:27;600:5;1406:19;1483:27;:::i;:::-;1482:38;;;;:::i;:::-;15325:29;;:11;:29;:::i;:::-;15310:12;;15301:4;3364:7:2;3390:18;;;;;;;;;;;15283:39:7;;;;:::i;:::-;:71;15279:108;;;15218:225;:::o;15279:108::-;15423:12;;15397:39;;15410:11;;15423:12;;1895:15:6;1913:27;1928:11;1913:14;:27::i;:::-;1895:45;;1950:47;1979:4;1985:11;1950:28;:47::i;:::-;2094:4;2079:25;;;2105:13;:30;;2125:10;2105:30;;;2121:1;2105:30;2137:13;:30;;2166:1;2137:30;;;2153:10;2137:30;2183:12;;;2193:1;2183:12;;;;;;;;;2079:117;;;;;;;;;;;;;2169:12;;2079:117;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2206:55:6;;;;;6921:42:8;2232:12:6;6990:15:8;;2206:55:6;;;6972:34:8;7042:15;;7022:18;;;7015:43;7074:18;;;7067:34;;;1198:42:6;;-1:-1:-1;2206:25:6;;-1:-1:-1;6884:18:8;;2206:55:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4695:393::-;4773:15;4801:17;4820:16;4840:13;:11;:13::i;:::-;4800:53;;-1:-1:-1;4800:53:6;-1:-1:-1;4863:23:6;4889:16;:10;4902:3;4889:16;:::i;:::-;4863:42;-1:-1:-1;4915:14:6;4932:32;4953:11;4863:42;4932:32;:::i;:::-;4915:49;-1:-1:-1;4974:16:6;5017:18;4994:19;:12;5009:4;4994:19;:::i;:::-;4993:42;;;;:::i;:::-;4974:61;-1:-1:-1;5058:23:6;4974:61;5058:9;:23;:::i;:::-;5045:36;4695:393;-1:-1:-1;;;;;;;4695:393:6:o;14:482:8:-;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;160:3;363:1;356:4;347:6;342:3;338:16;334:27;327:38;485:4;415:66;410:2;402:6;398:15;394:88;389:3;385:98;381:109;374:116;;;14:482;;;;:::o;501:220::-;650:2;639:9;632:21;613:4;670:45;711:2;700:9;696:18;688:6;670:45;:::i;:::-;662:53;501:220;-1:-1:-1;;;501:220:8:o;726:196::-;794:20;;854:42;843:54;;833:65;;823:93;;912:1;909;902:12;823:93;726:196;;;:::o;927:254::-;995:6;1003;1056:2;1044:9;1035:7;1031:23;1027:32;1024:52;;;1072:1;1069;1062:12;1024:52;1095:29;1114:9;1095:29;:::i;:::-;1085:39;1171:2;1156:18;;;;1143:32;;-1:-1:-1;;;927:254:8:o;1378:184::-;1430:77;1427:1;1420:88;1527:4;1524:1;1517:15;1551:4;1548:1;1541:15;1567:402;1716:2;1701:18;;1749:1;1738:13;;1728:201;;1785:77;1782:1;1775:88;1886:4;1883:1;1876:15;1914:4;1911:1;1904:15;1728:201;1938:25;;;1567:402;:::o;2156:186::-;2215:6;2268:2;2256:9;2247:7;2243:23;2239:32;2236:52;;;2284:1;2281;2274:12;2236:52;2307:29;2326:9;2307:29;:::i;2347:328::-;2424:6;2432;2440;2493:2;2481:9;2472:7;2468:23;2464:32;2461:52;;;2509:1;2506;2499:12;2461:52;2532:29;2551:9;2532:29;:::i;:::-;2522:39;;2580:38;2614:2;2603:9;2599:18;2580:38;:::i;:::-;2570:48;;2665:2;2654:9;2650:18;2637:32;2627:42;;2347:328;;;;;:::o;2680:118::-;2766:5;2759:13;2752:21;2745:5;2742:32;2732:60;;2788:1;2785;2778:12;2803:315;2868:6;2876;2929:2;2917:9;2908:7;2904:23;2900:32;2897:52;;;2945:1;2942;2935:12;2897:52;2968:29;2987:9;2968:29;:::i;:::-;2958:39;;3047:2;3036:9;3032:18;3019:32;3060:28;3082:5;3060:28;:::i;:::-;3107:5;3097:15;;;2803:315;;;;;:::o;3543:260::-;3611:6;3619;3672:2;3660:9;3651:7;3647:23;3643:32;3640:52;;;3688:1;3685;3678:12;3640:52;3711:29;3730:9;3711:29;:::i;:::-;3701:39;;3759:38;3793:2;3782:9;3778:18;3759:38;:::i;:::-;3749:48;;3543:260;;;;;:::o;3808:180::-;3867:6;3920:2;3908:9;3899:7;3895:23;3891:32;3888:52;;;3936:1;3933;3926:12;3888:52;-1:-1:-1;3959:23:8;;3808:180;-1:-1:-1;3808:180:8:o;3993:248::-;4061:6;4069;4122:2;4110:9;4101:7;4097:23;4093:32;4090:52;;;4138:1;4135;4128:12;4090:52;-1:-1:-1;;4161:23:8;;;4231:2;4216:18;;;4203:32;;-1:-1:-1;3993:248:8:o;4246:184::-;4298:77;4295:1;4288:88;4395:4;4392:1;4385:15;4419:4;4416:1;4409:15;4435:125;4500:9;;;4521:10;;;4518:36;;;4534:18;;:::i;4565:168::-;4638:9;;;4669;;4686:15;;;4680:22;;4666:37;4656:71;;4707:18;;:::i;4738:274::-;4778:1;4804;4794:189;;4839:77;4836:1;4829:88;4940:4;4937:1;4930:15;4968:4;4965:1;4958:15;4794:189;-1:-1:-1;4997:9:8;;4738:274::o;5017:437::-;5096:1;5092:12;;;;5139;;;5160:61;;5214:4;5206:6;5202:17;5192:27;;5160:61;5267:2;5259:6;5256:14;5236:18;5233:38;5230:218;;5304:77;5301:1;5294:88;5405:4;5402:1;5395:15;5433:4;5430:1;5423:15;5230:218;;5017:437;;;:::o;5459:128::-;5526:9;;;5547:11;;;5544:37;;;5561:18;;:::i;6218:188::-;6297:13;;6350:30;6339:42;;6329:53;;6319:81;;6396:1;6393;6386:12;6411:293;6490:6;6498;6551:2;6539:9;6530:7;6526:23;6522:32;6519:52;;;6567:1;6564;6557:12;6519:52;6590:40;6620:9;6590:40;:::i;:::-;6580:50;;6649:49;6694:2;6683:9;6679:18;6649:49;:::i;7112:245::-;7179:6;7232:2;7220:9;7211:7;7207:23;7203:32;7200:52;;;7248:1;7245;7238:12;7200:52;7280:9;7274:16;7299:28;7321:5;7299:28;:::i;7899:482::-;8130:6;8119:9;8112:25;8173:6;8168:2;8157:9;8153:18;8146:34;8228:42;8220:6;8216:55;8211:2;8200:9;8196:18;8189:83;8308:3;8303:2;8292:9;8288:18;8281:31;8093:4;8329:46;8370:3;8359:9;8355:19;8347:6;8329:46;:::i

Swarm Source

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