ETH Price: $3,161.91 (-8.00%)
Gas: 10 Gwei

Token

Shiba After Dark (SAD)
 

Overview

Max Total Supply

1,000,000,000 SAD

Holders

17

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
0x0789.eth
Balance
3,640,000 SAD

Value
$0.00
0x8d160063e641252f4b424a9af89e88b24e04e444
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ShibaAfterDark

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-20
*/

/*

Shiba After Dark

https://t.me/ShibaAfterDark


 Buy tax:
     Tax is the same no matter the time:
         9% to the house wallet
 Sell tax:
     If selling within 3 days:
         9% sent to the house wallet
         9% sent to the burn wallet
     If selling within 3-6 days:
         9% sent to the house wallet
         6% sent to the burn wallet
     If selling within 6-9 days:
         9% sent to the house wallet
         3% sent the burn wallet
     If selling after 9 days:
         9% sent to the house wallet



*/

// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.9;

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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



contract ShibaAfterDark is Context, IERC20, Ownable {
    struct TimedTransactions {
        uint[] txBlockTimes;
        mapping (uint => uint256) timedTxAmount;
        uint256 totalBalance;
    }
    
    mapping(address => bool) _blacklist;
    
    event BlacklistUpdated(address indexed user, bool value);

    // Track the transaction history of the user
    mapping (address => TimedTransactions) private _timedTransactionsMap;

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

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _onlyDiamondHandTxs;

    uint256 constant DEFAULT_HOUSE_FEE = 9;
    uint256 private _currentHouseFee = 9;

    uint256 constant DEFAULT_PAPER_HAND_FEE = 9;
    uint256 private _currentPaperHandFee = 9;
    uint256 private _paperHandTime = 3 days;

    uint256 constant DEFAULT_GATE1_FEE = 6;
    uint256 private _currentGate1Fee = 6;
    uint256 private _gate1Time = 3 days;

    uint256 constant DEFAULT_GATE2_FEE = 3;
    uint256 private _currentGate2Fee = 3;
    uint256 private _gate2Time = 3 days;

    string private _name = "Shiba After Dark";
    string private _symbol = "SAD";
    uint8 private _decimals = 9;
	
	uint256 public allowTradeAt;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    // This unix time is used to aggregate all transaction block times. It is over 21 days and therefore will
    // trigger the lowest tax rate possible
    uint256 constant OVER_21_DAYS_BLOCK_TIME = 1577836800;

    // Prevent reentrancy by only allowing one swap at a time
    bool swapInProgress;

    modifier lockTheSwap {
        swapInProgress = true;
        _;
        swapInProgress = false;
    }

    bool private _swapEnabled = true;
    bool private _burnEnabled = true;

    uint256 private _totalTokens = 1000 * 10**6 * 10**9;
    uint256 private _minTokensBeforeSwap = 1000 * 10**3 * 10**9;

    address payable private _houseContract = payable(0x9910f4D0369FBbdA158e5afB2533025641c3fCE9);
    address private _deadAddress = 0x000000000000000000000000000000000000dEaD;

    constructor() {
        // UniSwap V2 address
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        // Add initial balances
        _timedTransactionsMap[owner()].totalBalance = _totalTokens;
        _timedTransactionsMap[owner()].txBlockTimes.push(OVER_21_DAYS_BLOCK_TIME);
        _timedTransactionsMap[owner()].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = _totalTokens;

        // Track balance in the dead wallet
        _timedTransactionsMap[_deadAddress].totalBalance = 0;
        _timedTransactionsMap[_deadAddress].txBlockTimes.push(OVER_21_DAYS_BLOCK_TIME);
        _timedTransactionsMap[_deadAddress].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = 0;

        // Exclude contract and owner from fees to prevent contract functions from having a tax
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[_houseContract] = true;

        emit Transfer(address(0), _msgSender(), _totalTokens);
    }

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

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

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

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

    function balanceOf(address account) public view override returns (uint256) {
        return _timedTransactionsMap[account].totalBalance;
    }

    function balanceLessThan7Days(address account) external view returns (uint256) {
        uint256 totalTokens = 0;

        for (uint i = 0; i < _timedTransactionsMap[account].txBlockTimes.length; i++) {
            uint txTime = _timedTransactionsMap[account].txBlockTimes[i];
            uint256 tokensAtTime = _timedTransactionsMap[account].timedTxAmount[txTime];

            // Only add up balance in the last 7 days
            if (txTime > block.timestamp - _paperHandTime) {
                totalTokens = totalTokens + tokensAtTime;
            }
        }

        return totalTokens;
    }
    
     function blacklistUpdate(address user, bool value) public virtual onlyOwner {
        // require(_owner == _msgSender(), "Only owner is allowed to modify blacklist.");
        _blacklist[user] = value;
        emit BlacklistUpdated(user, value);
    }
    
    function isBlackListed(address user) public view returns (bool) {
        return _blacklist[user];
    }

    function balanceBetween7And14Days(address account) external view returns (uint256) {
        uint256 totalTokens = 0;

        for (uint i = 0; i < _timedTransactionsMap[account].txBlockTimes.length; i++) {
            uint txTime = _timedTransactionsMap[account].txBlockTimes[i];
            uint256 tokensAtTime = _timedTransactionsMap[account].timedTxAmount[txTime];

            // Only add up balance in the last 7-14 days
            if (txTime < block.timestamp - _paperHandTime && txTime > block.timestamp - _gate1Time) {
                totalTokens = totalTokens + tokensAtTime;
            }
        }

        return totalTokens;
    }

    function balanceBetween14And21Days(address account) external view returns (uint256) {
        uint256 totalTokens = 0;

        for (uint i = 0; i < _timedTransactionsMap[account].txBlockTimes.length; i++) {
            uint txTime = _timedTransactionsMap[account].txBlockTimes[i];
            uint256 tokensAtTime = _timedTransactionsMap[account].timedTxAmount[txTime];

            // Only add up balance in the last 14-21 days
            if (txTime < block.timestamp - _gate1Time && txTime > block.timestamp - _gate2Time) {
                totalTokens = totalTokens + tokensAtTime;
            }
        }

        return totalTokens;
    }

    function balanceOver21Days(address account) public view returns (uint256) {
        uint256 totalTokens = 0;

        for (uint i = 0; i < _timedTransactionsMap[account].txBlockTimes.length; i++) {
            uint txTime = _timedTransactionsMap[account].txBlockTimes[i];
            uint256 tokensAtTime = _timedTransactionsMap[account].timedTxAmount[txTime];

            // Only add up balance over the last 21 days
            if (txTime < block.timestamp - _gate2Time) {
                totalTokens = totalTokens + tokensAtTime;
            }
        }

        return totalTokens;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
    require (!isBlackListed(_msgSender()), "blacklisted sorry");
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
        return true;
    }

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

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
	
	function enableFairLaunch() external onlyOwner() {
    require(msg.sender != address(0), "ERC20: approve from the zero address");
    allowTradeAt = block.timestamp;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
		if ((block.timestamp < allowTradeAt + 30 minutes && amount >= 40 * 10**6 * 10**9) && (from != owner()) ) {

        revert("You cannot transfer more than 1% now");  }

        // Selective competitions are based on "diamond hand only" and transfers will only be allowed
        // when the tokens are in the "diamond hand" group
        bool isOnlyDiamondHandTx = _onlyDiamondHandTxs[from] || _onlyDiamondHandTxs[to];
        if (isOnlyDiamondHandTx) {
            require(balanceOver21Days(from) >= amount, "Insufficient diamond hand token balance");
        }

        // Reduce balance of sending including calculating and removing all taxes
        uint256 transferAmount = _reduceSenderBalance(from, to, amount);

        // Increase balance of the recipient address
        _increaseRecipientBalance(to, transferAmount, isOnlyDiamondHandTx);

        emit Transfer(from, to, transferAmount);
    }

    function _reduceSenderBalance(address sender, address recipient, uint256 initialTransferAmount) private returns (uint256) {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(initialTransferAmount > 0, "Transfer amount must be greater than zero");

        // Keep track of the tokens that haven't had a tax calculated against them
        uint256 remainingTokens = initialTransferAmount;

        // Keep track of the amount of tokens that are to be burned
        uint256 taxedBurnTokens = 0;

        // Keep track of the index for which tokens still exist in the bucket
        uint lastIndexToDelete = 0;

        // Loop over the blockTimes
        for (uint i = 0; i < _timedTransactionsMap[sender].txBlockTimes.length; i++) {
            uint txTime = _timedTransactionsMap[sender].txBlockTimes[i];
            uint256 tokensAtTime = _timedTransactionsMap[sender].timedTxAmount[txTime];

            // If there are more tokens purchased at the current time than those that are remaining to
            // fulfill the tokens at this transaction then only use the remainingTokens
            if (tokensAtTime > remainingTokens) {
                tokensAtTime = remainingTokens;
            } else {
                // There are more elements to iterate through
                lastIndexToDelete = i + 1;
            }

            // Depending on when the tokens were bought, tax the correct amount. This is proportional
            // to when the user bought each set of tokens.
            if (txTime > block.timestamp - _paperHandTime) {
                taxedBurnTokens = taxedBurnTokens + ((tokensAtTime * _currentPaperHandFee) / 100);
            } else if (txTime > block.timestamp - _gate1Time) {
                taxedBurnTokens = taxedBurnTokens + ((tokensAtTime * _currentGate1Fee) / 100);
            } else if (txTime > block.timestamp - _gate2Time) {
                taxedBurnTokens = taxedBurnTokens + ((tokensAtTime * _currentGate2Fee) / 100);
            }

            // Decrease the tokens in the map
            _timedTransactionsMap[sender].timedTxAmount[txTime] = _timedTransactionsMap[sender].timedTxAmount[txTime] - tokensAtTime;

            remainingTokens = remainingTokens - tokensAtTime;

            // If there are no more tokens to sell then exit the loop
            if (remainingTokens == 0) {
                break;
            }
        }

        _sliceBlockTimeArray(sender, lastIndexToDelete);

        // Update the senders balance
        _timedTransactionsMap[sender].totalBalance = _timedTransactionsMap[sender].totalBalance - initialTransferAmount;

        // Only burn tokens if the burn is enabled, the sender address is not excluded and it is performed on a sell
        if (!_burnEnabled || _isExcludedFromFees[sender] || _isExcludedFromFees[recipient] || recipient != uniswapV2Pair) {
            taxedBurnTokens = 0;
        }

        if (taxedBurnTokens > 0) {
            _timedTransactionsMap[_deadAddress].totalBalance = _timedTransactionsMap[_deadAddress].totalBalance + taxedBurnTokens;
            _timedTransactionsMap[_deadAddress].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = _timedTransactionsMap[_deadAddress].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] + taxedBurnTokens;
        }

        uint256 taxedHouseTokens = _calculateHouseFee(initialTransferAmount);

        // Always collect house tokens unless address is excluded
        if (_isExcludedFromFees[sender] || _isExcludedFromFees[recipient]) {
            taxedHouseTokens = 0;
        }

        // Add taxed tokens to the contract total
        _increaseTaxBalance(taxedHouseTokens);

        uint256 contractTokenBalance = balanceOf(address(this));

        // Only swap tokens when threshold has been met, a swap isn't already in progress,
        // the swap is enabled and never on a buy
        if (
            contractTokenBalance >= _minTokensBeforeSwap &&
            !swapInProgress &&
            _swapEnabled &&
            sender != uniswapV2Pair
        ) {
            // Always swap a set amount of tokens to prevent large dumps
            _swapTokensForHouse(_minTokensBeforeSwap);
        }

        // The amount to be transferred is the initial amount minus the taxed and burned tokens
        return initialTransferAmount - taxedHouseTokens - taxedBurnTokens;
    }

    function _increaseTaxBalance(uint256 amount) private {
        _timedTransactionsMap[address(this)].totalBalance = _timedTransactionsMap[address(this)].totalBalance + amount;
        _timedTransactionsMap[address(this)].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = _timedTransactionsMap[address(this)].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] + amount;
    }

    function _increaseRecipientBalance(address recipient, uint256 transferAmount, bool isDiamondHandOnlyTx) private {
        _aggregateOldTransactions(recipient);

        _timedTransactionsMap[recipient].totalBalance = _timedTransactionsMap[recipient].totalBalance + transferAmount;

        uint256 totalTxs = _timedTransactionsMap[recipient].txBlockTimes.length;

        if (isDiamondHandOnlyTx) {
            // If it's the first transaction then just add the oldest time to the map and array
            if (totalTxs < 1) {
                _timedTransactionsMap[recipient].txBlockTimes.push(OVER_21_DAYS_BLOCK_TIME);
                _timedTransactionsMap[recipient].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = transferAmount;
                return;
            }

            // If the first position in the array is already the oldest block time then just increase the value in the map
            if (_timedTransactionsMap[recipient].txBlockTimes[0] == OVER_21_DAYS_BLOCK_TIME) {
                _timedTransactionsMap[recipient].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = _timedTransactionsMap[recipient].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] + transferAmount;
                return;
            }

            // Shift the array with the oldest block time in the 0 position and add the value in the map
            _timedTransactionsMap[recipient].txBlockTimes.push(_timedTransactionsMap[recipient].txBlockTimes[totalTxs - 1]);
            for (uint i = totalTxs - 1; i > 0; i--) {
                _timedTransactionsMap[recipient].txBlockTimes[i] = _timedTransactionsMap[recipient].txBlockTimes[i - 1];
            }
            _timedTransactionsMap[recipient].txBlockTimes[0] = OVER_21_DAYS_BLOCK_TIME;
            _timedTransactionsMap[recipient].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = transferAmount;
            return;
        }

        if (totalTxs < 1) {
            _timedTransactionsMap[recipient].txBlockTimes.push(block.timestamp);
            _timedTransactionsMap[recipient].timedTxAmount[block.timestamp] = transferAmount;
            return;
        }

        uint256 lastTxTime = _timedTransactionsMap[recipient].txBlockTimes[totalTxs - 1];

        // If transaction was within the past 12 hours then keep as part of the same bucket for efficiency
        if (lastTxTime > block.timestamp - 12 hours) {
            _timedTransactionsMap[recipient].timedTxAmount[lastTxTime] = _timedTransactionsMap[recipient].timedTxAmount[lastTxTime] + transferAmount;
            return;
        }

        _timedTransactionsMap[recipient].txBlockTimes.push(block.timestamp);
        _timedTransactionsMap[recipient].timedTxAmount[block.timestamp] = transferAmount;
    }

    function _calculateHouseFee(uint256 initialAmount) private view returns (uint256) {
        return (initialAmount * _currentHouseFee) / 100;
    }

    function _swapTokensForHouse(uint256 tokensToSwap) private lockTheSwap {
        uint256 initialBalance = address(this).balance;

        // Swap to BNB and send to house wallet
        _swapTokensForEth(tokensToSwap);

        // Total BNB that has been swapped
        uint256 bnbSwapped = address(this).balance - initialBalance;

        // Transfer the BNB to the house contract
        (bool success, ) = _houseContract.call{value:bnbSwapped}("");
        require(success, "Unable to send to house contract");
    }

    //to receive ETH from uniswapV2Router when swapping
    receive() external payable {}

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

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

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

    function setBurnEnabled(bool enabled) external onlyOwner {
        _burnEnabled = enabled;
    }

    function setSwapEnabled(bool enabled) external onlyOwner {
        _swapEnabled = enabled;
    }

    function removeHouseFee() external onlyOwner {
        _currentHouseFee = 0;
    }

    function reinstateHouseFee() external onlyOwner {
        _currentHouseFee = DEFAULT_HOUSE_FEE;
    }

    function removeBurnFees() external onlyOwner {
        _currentPaperHandFee = 0;
        _currentGate1Fee = 0;
        _currentGate2Fee = 0;
    }

    function reinstateBurnFees() external onlyOwner {
        _currentPaperHandFee = DEFAULT_PAPER_HAND_FEE;
        _currentGate1Fee = DEFAULT_GATE1_FEE;
        _currentGate2Fee = DEFAULT_GATE2_FEE;
    }

    function removeAllFees() external onlyOwner {
        _currentHouseFee = 0;
        _currentPaperHandFee = 0;
        _currentGate1Fee = 0;
        _currentGate2Fee = 0;
    }

    function reinstateAllFees() external onlyOwner {
        _currentHouseFee = DEFAULT_HOUSE_FEE;
        _currentPaperHandFee = DEFAULT_PAPER_HAND_FEE;
        _currentGate1Fee = DEFAULT_GATE1_FEE;
        _currentGate2Fee = DEFAULT_GATE2_FEE;
    }

    // Update minimum tokens accumulated on the contract before a swap is performed
    function updateMinTokensBeforeSwap(uint256 newAmount) external onlyOwner {
        uint256 circulatingTokens = _totalTokens - balanceOf(_deadAddress);

        uint256 maxTokensBeforeSwap = circulatingTokens / 110;
        uint256 newMinTokensBeforeSwap = newAmount * 10**9;

        require(newMinTokensBeforeSwap < maxTokensBeforeSwap, "Amount must be less than 1 percent of the circulating supply");
        _minTokensBeforeSwap = newMinTokensBeforeSwap;
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFees[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFees[account] = false;
    }

    function addToOnlyDiamondHandTxs(address account) public onlyOwner {
        _onlyDiamondHandTxs[account] = true;
    }

    function removeFromOnlyDiamondHandTxs(address account) public onlyOwner {
        _onlyDiamondHandTxs[account] = false;
    }

    // If there is a PCS upgrade then add the ability to change the router and pairs to the new version
    function changeRouterVersion(address _router) public onlyOwner returns (address) {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_router);

        address newPair = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(address(this), _uniswapV2Router.WETH());
        if(newPair == address(0)){
            // Pair doesn't exist
            newPair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        }
        // Set the new pair
        uniswapV2Pair = newPair;

        // Set the router of the contract variables
        uniswapV2Router = _uniswapV2Router;

        return newPair;
    }

    // Check all transactions and group transactions older than 21 days into their own bucket
    function _aggregateOldTransactions(address sender) private {
        uint256 totalBlockTimes = _timedTransactionsMap[sender].txBlockTimes.length;

        if (totalBlockTimes < 1) {
            return;
        }

        uint256 oldestBlockTime = block.timestamp - _gate2Time;

        // If the first transaction is not yet 21 days old then do not aggregate
        if (_timedTransactionsMap[sender].txBlockTimes[0] > oldestBlockTime) {
            return;
        }

        uint lastAggregateIndex = 0;
        uint256 totalTokens = 0;
        for (uint i = 0; i < totalBlockTimes; i++) {
            uint256 txBlockTime = _timedTransactionsMap[sender].txBlockTimes[i];

            if (txBlockTime > oldestBlockTime) {
                break;
            }

            totalTokens = totalTokens + _timedTransactionsMap[sender].timedTxAmount[txBlockTime];
            lastAggregateIndex = i;
        }

        _sliceBlockTimeArray(sender, lastAggregateIndex);

        _timedTransactionsMap[sender].txBlockTimes[0] = OVER_21_DAYS_BLOCK_TIME;
        _timedTransactionsMap[sender].timedTxAmount[OVER_21_DAYS_BLOCK_TIME] = totalTokens;
    }

    // _sliceBlockTimeArray removes elements before the provided index from the transaction block
    // time array for the given account. This is in order to keep an ordered list of transaction block
    // times.
    function _sliceBlockTimeArray(address account, uint indexFrom) private {
        uint oldArrayLength = _timedTransactionsMap[account].txBlockTimes.length;

        if (indexFrom <= 0) return;

        if (indexFrom >= oldArrayLength) {
            while (_timedTransactionsMap[account].txBlockTimes.length != 0) {
                _timedTransactionsMap[account].txBlockTimes.pop();
            }
            return;
        }

        uint newArrayLength = oldArrayLength - indexFrom;

        uint counter = 0;
        for (uint i = indexFrom; i < oldArrayLength; i++) {
            _timedTransactionsMap[account].txBlockTimes[counter] = _timedTransactionsMap[account].txBlockTimes[i];
            counter++;
        }

        while (newArrayLength != _timedTransactionsMap[account].txBlockTimes.length) {
            _timedTransactionsMap[account].txBlockTimes.pop();
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"BlacklistUpdated","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToOnlyDiamondHandTxs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowTradeAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceBetween14And21Days","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceBetween7And14Days","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceLessThan7Days","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOver21Days","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"changeRouterVersion","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableFairLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reinstateAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reinstateBurnFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reinstateHouseFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeBurnFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromOnlyDiamondHandTxs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeHouseFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBurnEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6009600781905560088190556203f480908190556006600a55600b8190556003600c55600d5560c0604052601060808190526f5368696261204166746572204461726b60801b60a09081526200005991600e9190620004b4565b506040805180820190915260038082526214d05160ea1b60209092019182526200008691600f91620004b4565b506010805460ff191660091790556013805461010160a81b61ffff60a81b19909116179055670de0b6b3a764000060145566038d7ea4c68000601555601680546001600160a01b0319908116739910f4d0369fbbda158e5afb2533025641c3fce9179091556017805490911661dead1790553480156200010557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200019a57600080fd5b505afa158015620001af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d591906200055a565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021e57600080fd5b505afa15801562000233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025991906200055a565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002a257600080fd5b505af1158015620002b7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002dd91906200055a565b601380546001600160a01b03199081166001600160a01b03938416179091556012805490911691831691909117905560145460036000620003266000546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020600201819055506003600062000361620004a560201b60201c565b6001600160a01b0316815260208082019290925260400160009081208054600181018255908252918120635e0be10092019190915560145490600390620003b06000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120635e0be100808352600191820186528483209690965560178054841683526003865284832060020183905580548416835284832080548084018255908452868420018790555483168252838220958252948501845282812081905580548216815260058452828120805460ff199081168717909155308252838220805482168717905560165490921681528281208054909216909417905560145490519081523392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350620005c9565b6000546001600160a01b031690565b828054620004c2906200058c565b90600052602060002090601f016020900481019282620004e6576000855562000531565b82601f106200050157805160ff191683800117855562000531565b8280016001018555821562000531579182015b828111156200053157825182559160200191906001019062000514565b506200053f92915062000543565b5090565b5b808211156200053f576000815560010162000544565b6000602082840312156200056d57600080fd5b81516001600160a01b03811681146200058557600080fd5b9392505050565b600181811c90821680620005a157607f821691505b60208210811415620005c357634e487b7160e01b600052602260045260246000fd5b50919050565b612c0f80620005d96000396000f3fe6080604052600436106102295760003560e01c80638da5cb5b11610123578063e01af92c116100ab578063ecd75ecc1161006f578063ecd75ecc1461069f578063f2fde38b146106b4578063f482758c146106d4578063f4f38bde146106e9578063fd2628ca146106ff57600080fd5b8063e01af92c146105fc578063e1574a651461061c578063e47d606014610631578063e8e8f8991461066a578063ea2f0b371461067f57600080fd5b8063a457c2d7116100f2578063a457c2d714610536578063a473a03514610556578063a9059cbb14610576578063b351dfe814610596578063dd62ed3e146105b657600080fd5b80638da5cb5b146104c357806395d89b41146104e15780639ea4bd20146104f65780639ec3fcfb1461051657600080fd5b806349bd5a5e116101b15780636b130f9a116101755780636b130f9a1461042057806370a0823114610435578063715018a61461046e5780637b2c835f1461048357806385d6f7b2146104a357600080fd5b806349bd5a5e1461038b5780634b3cc7cc146103ab5780634e89e76c146103cb5780635881f3ef146103e0578063618890431461040057600080fd5b806323b872dd116101f857806323b872dd146102e75780632b4c8ec014610307578063313ce56714610329578063395093511461034b578063437823ec1461036b57600080fd5b806306fdde0314610235578063095ea7b3146102605780631694505e1461029057806318160ddd146102c857600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610714565b6040516102579190612732565b60405180910390f35b34801561026c57600080fd5b5061028061027b36600461279f565b6107a6565b6040519015158152602001610257565b34801561029c57600080fd5b506012546102b0906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b3480156102d457600080fd5b506014545b604051908152602001610257565b3480156102f357600080fd5b506102806103023660046127cb565b6107bc565b34801561031357600080fd5b5061032761032236600461280c565b61080e565b005b34801561033557600080fd5b5060105460405160ff9091168152602001610257565b34801561035757600080fd5b5061028061036636600461279f565b61090c565b34801561037757600080fd5b50610327610386366004612825565b610943565b34801561039757600080fd5b506013546102b0906001600160a01b031681565b3480156103b757600080fd5b506102d96103c6366004612825565b610991565b3480156103d757600080fd5b50610327610a50565b3480156103ec57600080fd5b506102b06103fb366004612825565b610a8b565b34801561040c57600080fd5b506102d961041b366004612825565b610de8565b34801561042c57600080fd5b50610327610eb7565b34801561044157600080fd5b506102d9610450366004612825565b6001600160a01b031660009081526003602052604090206002015490565b34801561047a57600080fd5b50610327610ef7565b34801561048f57600080fd5b5061032761049e366004612859565b610f6b565b3480156104af57600080fd5b506102d96104be366004612825565b610fb3565b3480156104cf57600080fd5b506000546001600160a01b03166102b0565b3480156104ed57600080fd5b5061024a61106b565b34801561050257600080fd5b50610327610511366004612825565b61107a565b34801561052257600080fd5b506102d9610531366004612825565b6110c5565b34801561054257600080fd5b5061028061055136600461279f565b611194565b34801561056257600080fd5b50610327610571366004612825565b6111cb565b34801561058257600080fd5b5061028061059136600461279f565b611219565b3480156105a257600080fd5b506103276105b1366004612874565b611270565b3480156105c257600080fd5b506102d96105d13660046128a9565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561060857600080fd5b50610327610617366004612859565b6112f9565b34801561062857600080fd5b50610327611341565b34801561063d57600080fd5b5061028061064c366004612825565b6001600160a01b031660009081526002602052604090205460ff1690565b34801561067657600080fd5b5061032761138e565b34801561068b57600080fd5b5061032761069a366004612825565b6113bf565b3480156106ab57600080fd5b5061032761140a565b3480156106c057600080fd5b506103276106cf366004612825565b611445565b3480156106e057600080fd5b5061032761152f565b3480156106f557600080fd5b506102d960115481565b34801561070b57600080fd5b50610327611560565b6060600e8054610723906128e2565b80601f016020809104026020016040519081016040528092919081815260200182805461074f906128e2565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b33384846115a0565b50600192915050565b60006107c9848484611688565b6001600160a01b0384166000908152600460209081526040808320338085529252909120546108049186916107ff908690612933565b6115a0565b5060019392505050565b6000546001600160a01b031633146108415760405162461bcd60e51b81526004016108389061294a565b60405180910390fd5b6017546001600160a01b031660009081526003602052604081206002015460145461086c9190612933565b9050600061087b606e8361297f565b9050600061088d84633b9aca006129a1565b90508181106109045760405162461bcd60e51b815260206004820152603c60248201527f416d6f756e74206d757374206265206c657373207468616e203120706572636560448201527f6e74206f66207468652063697263756c6174696e6720737570706c79000000006064820152608401610838565b601555505050565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916107b39185906107ff9086906129c0565b6000546001600160a01b0316331461096d5760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b03841660009081526003602052604081208054839081106109e0576109e06129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600d5491925090610a209042612933565b821015610a3457610a3181856129c0565b93505b50508080610a41906129ee565b915050610996565b5092915050565b6000546001600160a01b03163314610a7a5760405162461bcd60e51b81526004016108389061294a565b60006008819055600a819055600c55565b600080546001600160a01b03163314610ab65760405162461bcd60e51b81526004016108389061294a565b60008290506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610af657600080fd5b505afa158015610b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2e9190612a09565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610b7657600080fd5b505afa158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190612a09565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015610bf457600080fd5b505afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c9190612a09565b90506001600160a01b038116610db057816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7557600080fd5b505afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190612a09565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d9190612a09565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610d7557600080fd5b505af1158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad9190612a09565b90505b601380546001600160a01b038084166001600160a01b031992831617909255601280549490921693169290921790915590505b919050565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b0384166000908152600360205260408120805483908110610e3757610e376129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600b5491925090610e779042612933565b82108015610e905750600d54610e8d9042612933565b82115b15610ea257610e9f81856129c0565b93505b50508080610eaf906129ee565b915050610ded565b6000546001600160a01b03163314610ee15760405162461bcd60e51b81526004016108389061294a565b600060078190556008819055600a819055600c55565b6000546001600160a01b03163314610f215760405162461bcd60e51b81526004016108389061294a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610f955760405162461bcd60e51b81526004016108389061294a565b60138054911515600160b01b0260ff60b01b19909216919091179055565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b0384166000908152600360205260408120805483908110611002576110026129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600954919250906110429042612933565b8211156110565761105381856129c0565b93505b50508080611063906129ee565b915050610fb8565b6060600f8054610723906128e2565b6000546001600160a01b031633146110a45760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600660205260409020805460ff19169055565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b0384166000908152600360205260408120805483908110611114576111146129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600954919250906111549042612933565b8210801561116d5750600b5461116a9042612933565b82115b1561117f5761117c81856129c0565b93505b5050808061118c906129ee565b9150506110ca565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916107b39185906107ff908690612933565b6000546001600160a01b031633146111f55760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60006112243361064c565b156112655760405162461bcd60e51b8152602060048201526011602482015270626c61636b6c697374656420736f72727960781b6044820152606401610838565b6107b3338484611688565b6000546001600160a01b0316331461129a5760405162461bcd60e51b81526004016108389061294a565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915591519182527f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac910160405180910390a25050565b6000546001600160a01b031633146113235760405162461bcd60e51b81526004016108389061294a565b60138054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b0316331461136b5760405162461bcd60e51b81526004016108389061294a565b336113885760405162461bcd60e51b815260040161083890612a26565b42601155565b6000546001600160a01b031633146113b85760405162461bcd60e51b81526004016108389061294a565b6000600755565b6000546001600160a01b031633146113e95760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6000546001600160a01b031633146114345760405162461bcd60e51b81526004016108389061294a565b60096008556006600a556003600c55565b6000546001600160a01b0316331461146f5760405162461bcd60e51b81526004016108389061294a565b6001600160a01b0381166114d45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610838565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146115595760405162461bcd60e51b81526004016108389061294a565b6009600755565b6000546001600160a01b0316331461158a5760405162461bcd60e51b81526004016108389061294a565b600960078190556008556006600a556003600c55565b6001600160a01b0383166115c65760405162461bcd60e51b815260040161083890612a26565b6001600160a01b0382166116275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610838565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116ae5760405162461bcd60e51b815260040161083890612a6a565b6001600160a01b0382166116d45760405162461bcd60e51b815260040161083890612aaf565b600081116116f45760405162461bcd60e51b815260040161083890612af2565b601154611703906107086129c0565b421080156117185750668e1bc9bf0400008110155b801561173257506000546001600160a01b03848116911614155b1561178b5760405162461bcd60e51b8152602060048201526024808201527f596f752063616e6e6f74207472616e73666572206d6f7265207468616e203125604482015263206e6f7760e01b6064820152608401610838565b6001600160a01b03831660009081526006602052604081205460ff16806117ca57506001600160a01b03831660009081526006602052604090205460ff165b9050801561183a57816117dc85610991565b101561183a5760405162461bcd60e51b815260206004820152602760248201527f496e73756666696369656e74206469616d6f6e642068616e6420746f6b656e2060448201526662616c616e636560c81b6064820152608401610838565b60006118478585856118a8565b9050611854848284611d35565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161189991815260200190565b60405180910390a35050505050565b60006001600160a01b0384166118d05760405162461bcd60e51b815260040161083890612a6a565b6001600160a01b0383166118f65760405162461bcd60e51b815260040161083890612aaf565b600082116119165760405162461bcd60e51b815260040161083890612af2565b81600080805b6001600160a01b038816600090815260036020526040902054811015611ad9576001600160a01b0388166000908152600360205260408120805483908110611966576119666129d8565b60009182526020808320909101546001600160a01b038c168352600382526040808420828552600101909252912054909150858111156119a75750846119b5565b6119b28360016129c0565b93505b6009546119c29042612933565b8211156119f4576064600854826119d991906129a1565b6119e3919061297f565b6119ed90866129c0565b9450611a53565b600b54611a019042612933565b821115611a18576064600a54826119d991906129a1565b600d54611a259042612933565b821115611a53576064600c5482611a3c91906129a1565b611a46919061297f565b611a5090866129c0565b94505b6001600160a01b038a166000908152600360209081526040808320858452600101909152902054611a85908290612933565b6001600160a01b038b166000908152600360209081526040808320868452600101909152902055611ab68187612933565b955085611ac4575050611ad9565b50508080611ad1906129ee565b91505061191c565b50611ae4878261211c565b6001600160a01b038716600090815260036020526040902060020154611b0b908690612933565b6001600160a01b038816600090815260036020526040902060020155601354600160b01b900460ff161580611b5857506001600160a01b03871660009081526005602052604090205460ff165b80611b7b57506001600160a01b03861660009081526005602052604090205460ff165b80611b9457506013546001600160a01b03878116911614155b15611b9e57600091505b8115611c46576017546001600160a01b0316600090815260036020526040902060020154611bcd9083906129c0565b601780546001600160a01b0390811660009081526003602090815260408083206002019590955592549091168152828120635e0be10082526001019091522054611c189083906129c0565b6017546001600160a01b03166000908152600360209081526040808320635e0be10084526001019091529020555b6000611c51866122bc565b6001600160a01b03891660009081526005602052604090205490915060ff1680611c9357506001600160a01b03871660009081526005602052604090205460ff165b15611c9c575060005b611ca5816122de565b306000908152600360205260409020600201546015548110801590611cd45750601354600160a01b900460ff16155b8015611ce95750601354600160a81b900460ff165b8015611d0357506013546001600160a01b038a8116911614155b15611d1357611d13601554612356565b83611d1e8389612933565b611d289190612933565b9998505050505050505050565b611d3e8361243a565b6001600160a01b038316600090815260036020526040902060020154611d659083906129c0565b6001600160a01b03841660009081526003602052604090206002810191909155548115611fdd576001811015611dd85750506001600160a01b039091166000908152600360209081526040808320805460018181018355828652848620635e0be100920182905590855201909152902055565b6001600160a01b03841660009081526003602052604081208054635e0be1009290611e0557611e056129d8565b90600052602060002001541415611e80576001600160a01b0384166000908152600360209081526040808320635e0be1008452600101909152902054611e4c9084906129c0565b6001600160a01b039094166000908152600360209081526040808320635e0be1008452600101909152902093909355505050565b6001600160a01b038416600090815260036020526040902080611ea4600184612933565b81548110611eb457611eb46129d8565b60009182526020808320909101548354600181810186559484529183209091015590611ee09083612933565b90505b8015611f70576001600160a01b0385166000908152600360205260409020611f0c600183612933565b81548110611f1c57611f1c6129d8565b60009182526020808320909101546001600160a01b038816835260039091526040909120805483908110611f5257611f526129d8565b60009182526020909120015580611f6881612b3b565b915050611ee3565b506001600160a01b03841660009081526003602052604081208054635e0be1009290611f9e57611f9e6129d8565b60009182526020808320909101929092556001600160a01b039095168552600381526040808620635e0be1008752600101909152909320919091555050565b60018110156120255750506001600160a01b03909116600090815260036020908152604080832080546001818101835582865284862042920182905590855201909152902055565b6001600160a01b0384166000908152600360205260408120612048600184612933565b81548110612058576120586129d8565b9060005260206000200154905061a8c0426120739190612933565b8111156120dc576001600160a01b03851660009081526003602090815260408083208484526001019091529020546120ac9085906129c0565b6001600160a01b039095166000908152600360209081526040808320938352600190930190522093909355505050565b5050506001600160a01b03909116600090815260036020908152604080832080546001818101835582865284862042920182905590855201909152902055565b6001600160a01b0382166000908152600360205260409020548161213f57505050565b8082106121ac575b6001600160a01b038316600090815260036020526040902054156121a7576001600160a01b038316600090815260036020526040902080548061218c5761218c612b52565b60019003818190600052602060002001600090559055612147565b505050565b60006121b88383612933565b90506000835b83811015612252576001600160a01b03861660009081526003602052604090208054829081106121f0576121f06129d8565b60009182526020808320909101546001600160a01b038916835260039091526040909120805484908110612226576122266129d8565b6000918252602090912001558161223c816129ee565b925050808061224a906129ee565b9150506121be565b505b6001600160a01b03851660009081526003602052604090205482146122b5576001600160a01b038516600090815260036020526040902080548061229a5761229a612b52565b60019003818190600052602060002001600090559055612254565b5050505050565b60006064600754836122ce91906129a1565b6122d8919061297f565b92915050565b306000908152600360205260409020600201546122fc9082906129c0565b3060009081526003602090815260408083206002810194909455635e0be10083526001909301905220546123319082906129c0565b306000908152600360209081526040808320635e0be100845260010190915290205550565b6013805460ff60a01b1916600160a01b17905547612373826125c9565b600061237f8247612933565b6016546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146123d1576040519150601f19603f3d011682016040523d82523d6000602084013e6123d6565b606091505b50509050806124275760405162461bcd60e51b815260206004820181905260248201527f556e61626c6520746f2073656e6420746f20686f75736520636f6e74726163746044820152606401610838565b50506013805460ff60a01b191690555050565b6001600160a01b0381166000908152600360205260409020546001811015612460575050565b6000600d54426124709190612933565b6001600160a01b03841660009081526003602052604081208054929350839290919061249e5761249e6129d8565b906000526020600020015411156124b457505050565b60008060005b84811015612551576001600160a01b03861660009081526003602052604081208054839081106124ec576124ec6129d8565b90600052602060002001549050848111156125075750612551565b6001600160a01b038716600090815260036020908152604080832084845260010190915290205461253890846129c0565b9250819350508080612549906129ee565b9150506124ba565b5061255c858361211c565b6001600160a01b03851660009081526003602052604081208054635e0be1009290612589576125896129d8565b60009182526020808320909101929092556001600160a01b039096168652600381526040808720635e0be100885260010190915290942093909355505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106125fe576125fe6129d8565b6001600160a01b03928316602091820292909201810191909152601254604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561265257600080fd5b505afa158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a9190612a09565b8160018151811061269d5761269d6129d8565b6001600160a01b0392831660209182029290920101526012546126c391309116846115a0565b60125460405163791ac94760e01b81526001600160a01b039091169063791ac947906126fc908590600090869030904290600401612b68565b600060405180830381600087803b15801561271657600080fd5b505af115801561272a573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b8181101561275f57858101830151858201604001528201612743565b81811115612771576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461279c57600080fd5b50565b600080604083850312156127b257600080fd5b82356127bd81612787565b946020939093013593505050565b6000806000606084860312156127e057600080fd5b83356127eb81612787565b925060208401356127fb81612787565b929592945050506040919091013590565b60006020828403121561281e57600080fd5b5035919050565b60006020828403121561283757600080fd5b813561284281612787565b9392505050565b80358015158114610de357600080fd5b60006020828403121561286b57600080fd5b61284282612849565b6000806040838503121561288757600080fd5b823561289281612787565b91506128a060208401612849565b90509250929050565b600080604083850312156128bc57600080fd5b82356128c781612787565b915060208301356128d781612787565b809150509250929050565b600181811c908216806128f657607f821691505b6020821081141561291757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156129455761294561291d565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008261299c57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156129bb576129bb61291d565b500290565b600082198211156129d3576129d361291d565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612a0257612a0261291d565b5060010190565b600060208284031215612a1b57600080fd5b815161284281612787565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b600081612b4a57612b4a61291d565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612bb85784516001600160a01b031683529383019391830191600101612b93565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220564e0f17668a4d3807cd97dd611591b6bc1d6b48d01f38f37231fff9c6f2051964736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102295760003560e01c80638da5cb5b11610123578063e01af92c116100ab578063ecd75ecc1161006f578063ecd75ecc1461069f578063f2fde38b146106b4578063f482758c146106d4578063f4f38bde146106e9578063fd2628ca146106ff57600080fd5b8063e01af92c146105fc578063e1574a651461061c578063e47d606014610631578063e8e8f8991461066a578063ea2f0b371461067f57600080fd5b8063a457c2d7116100f2578063a457c2d714610536578063a473a03514610556578063a9059cbb14610576578063b351dfe814610596578063dd62ed3e146105b657600080fd5b80638da5cb5b146104c357806395d89b41146104e15780639ea4bd20146104f65780639ec3fcfb1461051657600080fd5b806349bd5a5e116101b15780636b130f9a116101755780636b130f9a1461042057806370a0823114610435578063715018a61461046e5780637b2c835f1461048357806385d6f7b2146104a357600080fd5b806349bd5a5e1461038b5780634b3cc7cc146103ab5780634e89e76c146103cb5780635881f3ef146103e0578063618890431461040057600080fd5b806323b872dd116101f857806323b872dd146102e75780632b4c8ec014610307578063313ce56714610329578063395093511461034b578063437823ec1461036b57600080fd5b806306fdde0314610235578063095ea7b3146102605780631694505e1461029057806318160ddd146102c857600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610714565b6040516102579190612732565b60405180910390f35b34801561026c57600080fd5b5061028061027b36600461279f565b6107a6565b6040519015158152602001610257565b34801561029c57600080fd5b506012546102b0906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b3480156102d457600080fd5b506014545b604051908152602001610257565b3480156102f357600080fd5b506102806103023660046127cb565b6107bc565b34801561031357600080fd5b5061032761032236600461280c565b61080e565b005b34801561033557600080fd5b5060105460405160ff9091168152602001610257565b34801561035757600080fd5b5061028061036636600461279f565b61090c565b34801561037757600080fd5b50610327610386366004612825565b610943565b34801561039757600080fd5b506013546102b0906001600160a01b031681565b3480156103b757600080fd5b506102d96103c6366004612825565b610991565b3480156103d757600080fd5b50610327610a50565b3480156103ec57600080fd5b506102b06103fb366004612825565b610a8b565b34801561040c57600080fd5b506102d961041b366004612825565b610de8565b34801561042c57600080fd5b50610327610eb7565b34801561044157600080fd5b506102d9610450366004612825565b6001600160a01b031660009081526003602052604090206002015490565b34801561047a57600080fd5b50610327610ef7565b34801561048f57600080fd5b5061032761049e366004612859565b610f6b565b3480156104af57600080fd5b506102d96104be366004612825565b610fb3565b3480156104cf57600080fd5b506000546001600160a01b03166102b0565b3480156104ed57600080fd5b5061024a61106b565b34801561050257600080fd5b50610327610511366004612825565b61107a565b34801561052257600080fd5b506102d9610531366004612825565b6110c5565b34801561054257600080fd5b5061028061055136600461279f565b611194565b34801561056257600080fd5b50610327610571366004612825565b6111cb565b34801561058257600080fd5b5061028061059136600461279f565b611219565b3480156105a257600080fd5b506103276105b1366004612874565b611270565b3480156105c257600080fd5b506102d96105d13660046128a9565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561060857600080fd5b50610327610617366004612859565b6112f9565b34801561062857600080fd5b50610327611341565b34801561063d57600080fd5b5061028061064c366004612825565b6001600160a01b031660009081526002602052604090205460ff1690565b34801561067657600080fd5b5061032761138e565b34801561068b57600080fd5b5061032761069a366004612825565b6113bf565b3480156106ab57600080fd5b5061032761140a565b3480156106c057600080fd5b506103276106cf366004612825565b611445565b3480156106e057600080fd5b5061032761152f565b3480156106f557600080fd5b506102d960115481565b34801561070b57600080fd5b50610327611560565b6060600e8054610723906128e2565b80601f016020809104026020016040519081016040528092919081815260200182805461074f906128e2565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b33384846115a0565b50600192915050565b60006107c9848484611688565b6001600160a01b0384166000908152600460209081526040808320338085529252909120546108049186916107ff908690612933565b6115a0565b5060019392505050565b6000546001600160a01b031633146108415760405162461bcd60e51b81526004016108389061294a565b60405180910390fd5b6017546001600160a01b031660009081526003602052604081206002015460145461086c9190612933565b9050600061087b606e8361297f565b9050600061088d84633b9aca006129a1565b90508181106109045760405162461bcd60e51b815260206004820152603c60248201527f416d6f756e74206d757374206265206c657373207468616e203120706572636560448201527f6e74206f66207468652063697263756c6174696e6720737570706c79000000006064820152608401610838565b601555505050565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916107b39185906107ff9086906129c0565b6000546001600160a01b0316331461096d5760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b03841660009081526003602052604081208054839081106109e0576109e06129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600d5491925090610a209042612933565b821015610a3457610a3181856129c0565b93505b50508080610a41906129ee565b915050610996565b5092915050565b6000546001600160a01b03163314610a7a5760405162461bcd60e51b81526004016108389061294a565b60006008819055600a819055600c55565b600080546001600160a01b03163314610ab65760405162461bcd60e51b81526004016108389061294a565b60008290506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610af657600080fd5b505afa158015610b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2e9190612a09565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610b7657600080fd5b505afa158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190612a09565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015610bf457600080fd5b505afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c9190612a09565b90506001600160a01b038116610db057816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7557600080fd5b505afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190612a09565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d9190612a09565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610d7557600080fd5b505af1158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad9190612a09565b90505b601380546001600160a01b038084166001600160a01b031992831617909255601280549490921693169290921790915590505b919050565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b0384166000908152600360205260408120805483908110610e3757610e376129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600b5491925090610e779042612933565b82108015610e905750600d54610e8d9042612933565b82115b15610ea257610e9f81856129c0565b93505b50508080610eaf906129ee565b915050610ded565b6000546001600160a01b03163314610ee15760405162461bcd60e51b81526004016108389061294a565b600060078190556008819055600a819055600c55565b6000546001600160a01b03163314610f215760405162461bcd60e51b81526004016108389061294a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610f955760405162461bcd60e51b81526004016108389061294a565b60138054911515600160b01b0260ff60b01b19909216919091179055565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b0384166000908152600360205260408120805483908110611002576110026129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600954919250906110429042612933565b8211156110565761105381856129c0565b93505b50508080611063906129ee565b915050610fb8565b6060600f8054610723906128e2565b6000546001600160a01b031633146110a45760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600660205260409020805460ff19169055565b600080805b6001600160a01b038416600090815260036020526040902054811015610a49576001600160a01b0384166000908152600360205260408120805483908110611114576111146129d8565b60009182526020808320909101546001600160a01b0388168352600382526040808420828552600101909252912054600954919250906111549042612933565b8210801561116d5750600b5461116a9042612933565b82115b1561117f5761117c81856129c0565b93505b5050808061118c906129ee565b9150506110ca565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916107b39185906107ff908690612933565b6000546001600160a01b031633146111f55760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60006112243361064c565b156112655760405162461bcd60e51b8152602060048201526011602482015270626c61636b6c697374656420736f72727960781b6044820152606401610838565b6107b3338484611688565b6000546001600160a01b0316331461129a5760405162461bcd60e51b81526004016108389061294a565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915591519182527f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac910160405180910390a25050565b6000546001600160a01b031633146113235760405162461bcd60e51b81526004016108389061294a565b60138054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b0316331461136b5760405162461bcd60e51b81526004016108389061294a565b336113885760405162461bcd60e51b815260040161083890612a26565b42601155565b6000546001600160a01b031633146113b85760405162461bcd60e51b81526004016108389061294a565b6000600755565b6000546001600160a01b031633146113e95760405162461bcd60e51b81526004016108389061294a565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6000546001600160a01b031633146114345760405162461bcd60e51b81526004016108389061294a565b60096008556006600a556003600c55565b6000546001600160a01b0316331461146f5760405162461bcd60e51b81526004016108389061294a565b6001600160a01b0381166114d45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610838565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146115595760405162461bcd60e51b81526004016108389061294a565b6009600755565b6000546001600160a01b0316331461158a5760405162461bcd60e51b81526004016108389061294a565b600960078190556008556006600a556003600c55565b6001600160a01b0383166115c65760405162461bcd60e51b815260040161083890612a26565b6001600160a01b0382166116275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610838565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116ae5760405162461bcd60e51b815260040161083890612a6a565b6001600160a01b0382166116d45760405162461bcd60e51b815260040161083890612aaf565b600081116116f45760405162461bcd60e51b815260040161083890612af2565b601154611703906107086129c0565b421080156117185750668e1bc9bf0400008110155b801561173257506000546001600160a01b03848116911614155b1561178b5760405162461bcd60e51b8152602060048201526024808201527f596f752063616e6e6f74207472616e73666572206d6f7265207468616e203125604482015263206e6f7760e01b6064820152608401610838565b6001600160a01b03831660009081526006602052604081205460ff16806117ca57506001600160a01b03831660009081526006602052604090205460ff165b9050801561183a57816117dc85610991565b101561183a5760405162461bcd60e51b815260206004820152602760248201527f496e73756666696369656e74206469616d6f6e642068616e6420746f6b656e2060448201526662616c616e636560c81b6064820152608401610838565b60006118478585856118a8565b9050611854848284611d35565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161189991815260200190565b60405180910390a35050505050565b60006001600160a01b0384166118d05760405162461bcd60e51b815260040161083890612a6a565b6001600160a01b0383166118f65760405162461bcd60e51b815260040161083890612aaf565b600082116119165760405162461bcd60e51b815260040161083890612af2565b81600080805b6001600160a01b038816600090815260036020526040902054811015611ad9576001600160a01b0388166000908152600360205260408120805483908110611966576119666129d8565b60009182526020808320909101546001600160a01b038c168352600382526040808420828552600101909252912054909150858111156119a75750846119b5565b6119b28360016129c0565b93505b6009546119c29042612933565b8211156119f4576064600854826119d991906129a1565b6119e3919061297f565b6119ed90866129c0565b9450611a53565b600b54611a019042612933565b821115611a18576064600a54826119d991906129a1565b600d54611a259042612933565b821115611a53576064600c5482611a3c91906129a1565b611a46919061297f565b611a5090866129c0565b94505b6001600160a01b038a166000908152600360209081526040808320858452600101909152902054611a85908290612933565b6001600160a01b038b166000908152600360209081526040808320868452600101909152902055611ab68187612933565b955085611ac4575050611ad9565b50508080611ad1906129ee565b91505061191c565b50611ae4878261211c565b6001600160a01b038716600090815260036020526040902060020154611b0b908690612933565b6001600160a01b038816600090815260036020526040902060020155601354600160b01b900460ff161580611b5857506001600160a01b03871660009081526005602052604090205460ff165b80611b7b57506001600160a01b03861660009081526005602052604090205460ff165b80611b9457506013546001600160a01b03878116911614155b15611b9e57600091505b8115611c46576017546001600160a01b0316600090815260036020526040902060020154611bcd9083906129c0565b601780546001600160a01b0390811660009081526003602090815260408083206002019590955592549091168152828120635e0be10082526001019091522054611c189083906129c0565b6017546001600160a01b03166000908152600360209081526040808320635e0be10084526001019091529020555b6000611c51866122bc565b6001600160a01b03891660009081526005602052604090205490915060ff1680611c9357506001600160a01b03871660009081526005602052604090205460ff165b15611c9c575060005b611ca5816122de565b306000908152600360205260409020600201546015548110801590611cd45750601354600160a01b900460ff16155b8015611ce95750601354600160a81b900460ff165b8015611d0357506013546001600160a01b038a8116911614155b15611d1357611d13601554612356565b83611d1e8389612933565b611d289190612933565b9998505050505050505050565b611d3e8361243a565b6001600160a01b038316600090815260036020526040902060020154611d659083906129c0565b6001600160a01b03841660009081526003602052604090206002810191909155548115611fdd576001811015611dd85750506001600160a01b039091166000908152600360209081526040808320805460018181018355828652848620635e0be100920182905590855201909152902055565b6001600160a01b03841660009081526003602052604081208054635e0be1009290611e0557611e056129d8565b90600052602060002001541415611e80576001600160a01b0384166000908152600360209081526040808320635e0be1008452600101909152902054611e4c9084906129c0565b6001600160a01b039094166000908152600360209081526040808320635e0be1008452600101909152902093909355505050565b6001600160a01b038416600090815260036020526040902080611ea4600184612933565b81548110611eb457611eb46129d8565b60009182526020808320909101548354600181810186559484529183209091015590611ee09083612933565b90505b8015611f70576001600160a01b0385166000908152600360205260409020611f0c600183612933565b81548110611f1c57611f1c6129d8565b60009182526020808320909101546001600160a01b038816835260039091526040909120805483908110611f5257611f526129d8565b60009182526020909120015580611f6881612b3b565b915050611ee3565b506001600160a01b03841660009081526003602052604081208054635e0be1009290611f9e57611f9e6129d8565b60009182526020808320909101929092556001600160a01b039095168552600381526040808620635e0be1008752600101909152909320919091555050565b60018110156120255750506001600160a01b03909116600090815260036020908152604080832080546001818101835582865284862042920182905590855201909152902055565b6001600160a01b0384166000908152600360205260408120612048600184612933565b81548110612058576120586129d8565b9060005260206000200154905061a8c0426120739190612933565b8111156120dc576001600160a01b03851660009081526003602090815260408083208484526001019091529020546120ac9085906129c0565b6001600160a01b039095166000908152600360209081526040808320938352600190930190522093909355505050565b5050506001600160a01b03909116600090815260036020908152604080832080546001818101835582865284862042920182905590855201909152902055565b6001600160a01b0382166000908152600360205260409020548161213f57505050565b8082106121ac575b6001600160a01b038316600090815260036020526040902054156121a7576001600160a01b038316600090815260036020526040902080548061218c5761218c612b52565b60019003818190600052602060002001600090559055612147565b505050565b60006121b88383612933565b90506000835b83811015612252576001600160a01b03861660009081526003602052604090208054829081106121f0576121f06129d8565b60009182526020808320909101546001600160a01b038916835260039091526040909120805484908110612226576122266129d8565b6000918252602090912001558161223c816129ee565b925050808061224a906129ee565b9150506121be565b505b6001600160a01b03851660009081526003602052604090205482146122b5576001600160a01b038516600090815260036020526040902080548061229a5761229a612b52565b60019003818190600052602060002001600090559055612254565b5050505050565b60006064600754836122ce91906129a1565b6122d8919061297f565b92915050565b306000908152600360205260409020600201546122fc9082906129c0565b3060009081526003602090815260408083206002810194909455635e0be10083526001909301905220546123319082906129c0565b306000908152600360209081526040808320635e0be100845260010190915290205550565b6013805460ff60a01b1916600160a01b17905547612373826125c9565b600061237f8247612933565b6016546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146123d1576040519150601f19603f3d011682016040523d82523d6000602084013e6123d6565b606091505b50509050806124275760405162461bcd60e51b815260206004820181905260248201527f556e61626c6520746f2073656e6420746f20686f75736520636f6e74726163746044820152606401610838565b50506013805460ff60a01b191690555050565b6001600160a01b0381166000908152600360205260409020546001811015612460575050565b6000600d54426124709190612933565b6001600160a01b03841660009081526003602052604081208054929350839290919061249e5761249e6129d8565b906000526020600020015411156124b457505050565b60008060005b84811015612551576001600160a01b03861660009081526003602052604081208054839081106124ec576124ec6129d8565b90600052602060002001549050848111156125075750612551565b6001600160a01b038716600090815260036020908152604080832084845260010190915290205461253890846129c0565b9250819350508080612549906129ee565b9150506124ba565b5061255c858361211c565b6001600160a01b03851660009081526003602052604081208054635e0be1009290612589576125896129d8565b60009182526020808320909101929092556001600160a01b039096168652600381526040808720635e0be100885260010190915290942093909355505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106125fe576125fe6129d8565b6001600160a01b03928316602091820292909201810191909152601254604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561265257600080fd5b505afa158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a9190612a09565b8160018151811061269d5761269d6129d8565b6001600160a01b0392831660209182029290920101526012546126c391309116846115a0565b60125460405163791ac94760e01b81526001600160a01b039091169063791ac947906126fc908590600090869030904290600401612b68565b600060405180830381600087803b15801561271657600080fd5b505af115801561272a573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b8181101561275f57858101830151858201604001528201612743565b81811115612771576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461279c57600080fd5b50565b600080604083850312156127b257600080fd5b82356127bd81612787565b946020939093013593505050565b6000806000606084860312156127e057600080fd5b83356127eb81612787565b925060208401356127fb81612787565b929592945050506040919091013590565b60006020828403121561281e57600080fd5b5035919050565b60006020828403121561283757600080fd5b813561284281612787565b9392505050565b80358015158114610de357600080fd5b60006020828403121561286b57600080fd5b61284282612849565b6000806040838503121561288757600080fd5b823561289281612787565b91506128a060208401612849565b90509250929050565b600080604083850312156128bc57600080fd5b82356128c781612787565b915060208301356128d781612787565b809150509250929050565b600181811c908216806128f657607f821691505b6020821081141561291757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156129455761294561291d565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008261299c57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156129bb576129bb61291d565b500290565b600082198211156129d3576129d361291d565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612a0257612a0261291d565b5060010190565b600060208284031215612a1b57600080fd5b815161284281612787565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b600081612b4a57612b4a61291d565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612bb85784516001600160a01b031683529383019391830191600101612b93565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220564e0f17668a4d3807cd97dd611591b6bc1d6b48d01f38f37231fff9c6f2051964736f6c63430008090033

Deployed Bytecode Sourcemap

13741:24612:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17239:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21122:161;;;;;;;;;;-1:-1:-1;21122:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;21122:161:0;1072:187:1;15050:41:0;;;;;;;;;;-1:-1:-1;15050:41:0;;;;-1:-1:-1;;;;;15050:41:0;;;;;;-1:-1:-1;;;;;1454:32:1;;;1436:51;;1424:2;1409:18;15050:41:0;1264:229:1;17516:100:0;;;;;;;;;;-1:-1:-1;17596:12:0;;17516:100;;;1644:25:1;;;1632:2;1617:18;17516:100:0;1498:177:1;21291:266:0;;;;;;;;;;-1:-1:-1;21291:266:0;;;;;:::i;:::-;;:::i;34156:471::-;;;;;;;;;;-1:-1:-1;34156:471:0;;;;;:::i;:::-;;:::i;:::-;;17425:83;;;;;;;;;;-1:-1:-1;17491:9:0;;17425:83;;17491:9;;;;2468:36:1;;2456:2;2441:18;17425:83:0;2326:184:1;21565:215:0;;;;;;;;;;-1:-1:-1;21565:215:0;;;;;:::i;:::-;;:::i;34635:112::-;;;;;;;;;;-1:-1:-1;34635:112:0;;;;;:::i;:::-;;:::i;15098:28::-;;;;;;;;;;-1:-1:-1;15098:28:0;;;;-1:-1:-1;;;;;15098:28:0;;;20116:606;;;;;;;;;;-1:-1:-1;20116:606:0;;;;;:::i;:::-;;:::i;33251:150::-;;;;;;;;;;;;;:::i;35243:696::-;;;;;;;;;;-1:-1:-1;35243:696:0;;;;;:::i;:::-;;:::i;19450:658::-;;;;;;;;;;-1:-1:-1;19450:658:0;;;;;:::i;:::-;;:::i;33623:180::-;;;;;;;;;;;;;:::i;17624:144::-;;;;;;;;;;-1:-1:-1;17624:144:0;;;;;:::i;:::-;-1:-1:-1;;;;;17717:30:0;17690:7;17717:30;;;:21;:30;;;;;:43;;;;17624:144;5260:148;;;;;;;;;;;;;:::i;32836:98::-;;;;;;;;;;-1:-1:-1;32836:98:0;;;;;:::i;:::-;;:::i;17776:612::-;;;;;;;;;;-1:-1:-1;17776:612:0;;;;;:::i;:::-;;:::i;4624:79::-;;;;;;;;;;-1:-1:-1;4662:7:0;4689:6;-1:-1:-1;;;;;4689:6:0;4624:79;;17330:87;;;;;;;;;;;;;:::i;35003:127::-;;;;;;;;;;-1:-1:-1;35003:127:0;;;;;:::i;:::-;;:::i;18782:660::-;;;;;;;;;;-1:-1:-1;18782:660:0;;;;;:::i;:::-;;:::i;21788:225::-;;;;;;;;;;-1:-1:-1;21788:225:0;;;;;:::i;:::-;;:::i;34874:121::-;;;;;;;;;;-1:-1:-1;34874:121:0;;;;;:::i;:::-;;:::i;20730:233::-;;;;;;;;;;-1:-1:-1;20730:233:0;;;;;:::i;:::-;;:::i;18401:255::-;;;;;;;;;;-1:-1:-1;18401:255:0;;;;;:::i;:::-;;:::i;20971:143::-;;;;;;;;;;-1:-1:-1;20971:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;21079:18:0;;;21052:7;21079:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20971:143;32942:98;;;;;;;;;;-1:-1:-1;32942:98:0;;;;;:::i;:::-;;:::i;22364:174::-;;;;;;;;;;;;;:::i;18668:106::-;;;;;;;;;;-1:-1:-1;18668:106:0;;;;;:::i;:::-;-1:-1:-1;;;;;18750:16:0;18726:4;18750:16;;;:10;:16;;;;;;;;;18668:106;33048:84;;;;;;;;;;;;;:::i;34755:111::-;;;;;;;;;;-1:-1:-1;34755:111:0;;;;;:::i;:::-;;:::i;33409:206::-;;;;;;;;;;;;;:::i;5563:244::-;;;;;;;;;;-1:-1:-1;5563:244:0;;;;;:::i;:::-;;:::i;33140:103::-;;;;;;;;;;;;;:::i;15014:27::-;;;;;;;;;;;;;;;;33811:252;;;;;;;;;;;;;:::i;17239:83::-;17276:13;17309:5;17302:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17239:83;:::o;21122:161::-;21197:4;21214:39;3321:10;21237:7;21246:6;21214:8;:39::i;:::-;-1:-1:-1;21271:4:0;21122:161;;;;:::o;21291:266::-;21389:4;21406:36;21416:6;21424:9;21435:6;21406:9;:36::i;:::-;-1:-1:-1;;;;;21484:19:0;;;;;;:11;:19;;;;;;;;3321:10;21484:33;;;;;;;;;21453:74;;21462:6;;21484:42;;21520:6;;21484:42;:::i;:::-;21453:8;:74::i;:::-;-1:-1:-1;21545:4:0;21291:266;;;;;:::o;34156:471::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;;;;;;;;;34293:12:::1;::::0;-1:-1:-1;;;;;34293:12:0::1;34240:25;17717:30:::0;;;:21;:30;;;;;:43;;;34268:12:::1;;:38;;;;:::i;:::-;34240:66:::0;-1:-1:-1;34319:27:0::1;34349:23;34369:3;34240:66:::0;34349:23:::1;:::i;:::-;34319:53:::0;-1:-1:-1;34383:30:0::1;34416:17;:9:::0;34428:5:::1;34416:17;:::i;:::-;34383:50;;34479:19;34454:22;:44;34446:117;;;::::0;-1:-1:-1;;;34446:117:0;;5643:2:1;34446:117:0::1;::::0;::::1;5625:21:1::0;5682:2;5662:18;;;5655:30;5721:34;5701:18;;;5694:62;5792:30;5772:18;;;5765:58;5840:19;;34446:117:0::1;5441:424:1::0;34446:117:0::1;34574:20;:45:::0;-1:-1:-1;;;34156:471:0:o;21565:215::-;3321:10;21653:4;21702:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21702:34:0;;;;;;;;;;21653:4;;21670:80;;21693:7;;21702:47;;21739:10;;21702:47;:::i;34635:112::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34704:28:0::1;;::::0;;;:19:::1;:28;::::0;;;;:35;;-1:-1:-1;;34704:35:0::1;34735:4;34704:35;::::0;;34635:112::o;20116:606::-;20181:7;;;20237:447;-1:-1:-1;;;;;20258:30:0;;;;;;:21;:30;;;;;:50;20254:54;;20237:447;;;-1:-1:-1;;;;;20344:30:0;;20330:11;20344:30;;;:21;:30;;;;;:46;;20388:1;;20344:46;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;20428:30:0;;;;:21;:30;;;;;;:52;;;:44;;:52;;;;;;20586:10;;20344:46;;-1:-1:-1;20428:52:0;20568:28;;:15;:28;:::i;:::-;20559:6;:37;20555:118;;;20631:26;20645:12;20631:11;:26;:::i;:::-;20617:40;;20555:118;20315:369;;20310:3;;;;;:::i;:::-;;;;20237:447;;;-1:-1:-1;20703:11:0;20116:606;-1:-1:-1;;20116:606:0:o;33251:150::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;33330:1:::1;33307:20;:24:::0;;;33342:16:::1;:20:::0;;;33373:16:::1;:20:::0;33251:150::o;35243:696::-;35315:7;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;35335:35:::1;35392:7;35335:65;;35413:15;35449:16;-1:-1:-1::0;;;;;35449:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35431:53:0::1;;35493:4;35500:16;-1:-1:-1::0;;;;;35500:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35431:93;::::0;-1:-1:-1;;;;;;35431:93:0::1;::::0;;;;;;-1:-1:-1;;;;;6761:15:1;;;35431:93:0::1;::::0;::::1;6743:34:1::0;6813:15;;6793:18;;;6786:43;6678:18;;35431:93:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35413:111:::0;-1:-1:-1;;;;;;35538:21:0;::::1;35535:207;;35638:16;-1:-1:-1::0;;;;;35638:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35620:70:0::1;;35699:4;35706:16;-1:-1:-1::0;;;;;35706:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35620:110;::::0;-1:-1:-1;;;;;;35620:110:0::1;::::0;;;;;;-1:-1:-1;;;;;6761:15:1;;;35620:110:0::1;::::0;::::1;6743:34:1::0;6813:15;;6793:18;;;6786:43;6678:18;;35620:110:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35610:120;;35535:207;35781:13;:23:::0;;-1:-1:-1;;;;;35781:23:0;;::::1;-1:-1:-1::0;;;;;;35781:23:0;;::::1;;::::0;;;35870:15:::1;:34:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;35797:7;-1:-1:-1;4906:1:0::1;35243:696:::0;;;:::o;19450:658::-;19525:7;;;19581:489;-1:-1:-1;;;;;19602:30:0;;;;;;:21;:30;;;;;:50;19598:54;;19581:489;;;-1:-1:-1;;;;;19688:30:0;;19674:11;19688:30;;;:21;:30;;;;;:46;;19732:1;;19688:46;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;19772:30:0;;;;:21;:30;;;;;;:52;;;:44;;:52;;;;;;19931:10;;19688:46;;-1:-1:-1;19772:52:0;19913:28;;:15;:28;:::i;:::-;19904:6;:37;:78;;;;-1:-1:-1;19972:10:0;;19954:28;;:15;:28;:::i;:::-;19945:6;:37;19904:78;19900:159;;;20017:26;20031:12;20017:11;:26;:::i;:::-;20003:40;;19900:159;19659:411;;19654:3;;;;;:::i;:::-;;;;19581:489;;33623:180;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;33697:1:::1;33678:16;:20:::0;;;33709::::1;:24:::0;;;33744:16:::1;:20:::0;;;33775:16:::1;:20:::0;33623:180::o;5260:148::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;5367:1:::1;5351:6:::0;;5330:40:::1;::::0;-1:-1:-1;;;;;5351:6:0;;::::1;::::0;5330:40:::1;::::0;5367:1;;5330:40:::1;5398:1;5381:19:::0;;-1:-1:-1;;;;;;5381:19:0::1;::::0;;5260:148::o;32836:98::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;32904:12:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;32904:22:0::1;-1:-1:-1::0;;;;32904:22:0;;::::1;::::0;;;::::1;::::0;;32836:98::o;17776:612::-;17846:7;;;17902:448;-1:-1:-1;;;;;17923:30:0;;;;;;:21;:30;;;;;:50;17919:54;;17902:448;;;-1:-1:-1;;;;;18009:30:0;;17995:11;18009:30;;;:21;:30;;;;;:46;;18053:1;;18009:46;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;18093:30:0;;;;:21;:30;;;;;;:52;;;:44;;:52;;;;;;18248:14;;18009:46;;-1:-1:-1;18093:52:0;18230:32;;:15;:32;:::i;:::-;18221:6;:41;18217:122;;;18297:26;18311:12;18297:11;:26;:::i;:::-;18283:40;;18217:122;17980:370;;17975:3;;;;;:::i;:::-;;;;17902:448;;17330:87;17369:13;17402:7;17395:14;;;;;:::i;35003:127::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35086:28:0::1;35117:5;35086:28:::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;35086:36:0::1;::::0;;35003:127::o;18782:660::-;18856:7;;;18912:492;-1:-1:-1;;;;;18933:30:0;;;;;;:21;:30;;;;;:50;18929:54;;18912:492;;;-1:-1:-1;;;;;19019:30:0;;19005:11;19019:30;;;:21;:30;;;;;:46;;19063:1;;19019:46;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;19103:30:0;;;;:21;:30;;;;;;:52;;;:44;;:52;;;;;;19261:14;;19019:46;;-1:-1:-1;19103:52:0;19243:32;;:15;:32;:::i;:::-;19234:6;:41;:82;;;;-1:-1:-1;19306:10:0;;19288:28;;:15;:28;:::i;:::-;19279:6;:37;19234:82;19230:163;;;19351:26;19365:12;19351:11;:26;:::i;:::-;19337:40;;19230:163;18990:414;;18985:3;;;;;:::i;:::-;;;;18912:492;;21788:225;3321:10;21881:4;21930:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21930:34:0;;;;;;;;;;21881:4;;21898:85;;21921:7;;21930:52;;21967:15;;21930:52;:::i;34874:121::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34952:28:0::1;;::::0;;;:19:::1;:28;::::0;;;;:35;;-1:-1:-1;;34952:35:0::1;34983:4;34952:35;::::0;;34874:121::o;20730:233::-;20808:4;20831:27;3321:10;20845:12;3225:115;20831:27;20830:28;20821:59;;;;-1:-1:-1;;;20821:59:0;;7042:2:1;20821:59:0;;;7024:21:1;7081:2;7061:18;;;7054:30;-1:-1:-1;;;7100:18:1;;;7093:47;7157:18;;20821:59:0;6840:341:1;20821:59:0;20891:42;3321:10;20915:9;20926:6;20891:9;:42::i;18401:255::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18579:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;;;:24;;-1:-1:-1;;18579:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;18619:29;;1212:41:1;;;18619:29:0::1;::::0;1185:18:1;18619:29:0::1;;;;;;;18401:255:::0;;:::o;32942:98::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;33010:12:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;33010:22:0::1;-1:-1:-1::0;;;;33010:22:0;;::::1;::::0;;;::::1;::::0;;32942:98::o;22364:174::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;22428:10:::1;22420:73;;;;-1:-1:-1::0;;;22420:73:0::1;;;;;;;:::i;:::-;22515:15;22500:12;:30:::0;22364:174::o;33048:84::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;33123:1:::1;33104:16;:20:::0;33048:84::o;34755:111::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34822:28:0::1;34853:5;34822:28:::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;34822:36:0::1;::::0;;34755:111::o;33409:206::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;14528:1:::1;33468:20;:45:::0;14668:1:::1;33524:16;:36:::0;14800:1:::1;33571:16;:36:::0;33409:206::o;5563:244::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5652:22:0;::::1;5644:73;;;::::0;-1:-1:-1;;;5644:73:0;;7793:2:1;5644:73:0::1;::::0;::::1;7775:21:1::0;7832:2;7812:18;;;7805:30;7871:34;7851:18;;;7844:62;-1:-1:-1;;;7922:18:1;;;7915:36;7968:19;;5644:73:0::1;7591:402:1::0;5644:73:0::1;5754:6;::::0;;5733:38:::1;::::0;-1:-1:-1;;;;;5733:38:0;;::::1;::::0;5754:6;::::1;::::0;5733:38:::1;::::0;::::1;5782:6;:17:::0;;-1:-1:-1;;;;;;5782:17:0::1;-1:-1:-1::0;;;;;5782:17:0;;;::::1;::::0;;;::::1;::::0;;5563:244::o;33140:103::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;14433:1:::1;33199:16;:36:::0;33140:103::o;33811:252::-;4836:6;;-1:-1:-1;;;;;4836:6:0;3321:10;4836:22;4828:67;;;;-1:-1:-1;;;4828:67:0;;;;;;;:::i;:::-;14433:1:::1;33869:16;:36:::0;;;33916:20:::1;:45:::0;14668:1:::1;33972:16;:36:::0;14800:1:::1;34019:16;:36:::0;33811:252::o;22021:337::-;-1:-1:-1;;;;;22114:19:0;;22106:68;;;;-1:-1:-1;;;22106:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22193:21:0;;22185:68;;;;-1:-1:-1;;;22185:68:0;;8200:2:1;22185:68:0;;;8182:21:1;8239:2;8219:18;;;8212:30;8278:34;8258:18;;;8251:62;-1:-1:-1;;;8329:18:1;;;8322:32;8371:19;;22185:68:0;7998:398:1;22185:68:0;-1:-1:-1;;;;;22266:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22318:32;;1644:25:1;;;22318:32:0;;1617:18:1;22318:32:0;;;;;;;22021:337;;;:::o;22546:1258::-;-1:-1:-1;;;;;22668:18:0;;22660:68;;;;-1:-1:-1;;;22660:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22747:16:0;;22739:64;;;;-1:-1:-1;;;22739:64:0;;;;;;;:::i;:::-;22831:1;22822:6;:10;22814:64;;;;-1:-1:-1;;;22814:64:0;;;;;;;:::i;:::-;22906:12;;:25;;22921:10;22906:25;:::i;:::-;22888:15;:43;:75;;;;;22945:18;22935:6;:28;;22888:75;22887:98;;;;-1:-1:-1;4662:7:0;4689:6;-1:-1:-1;;;;;22969:15:0;;;4689:6;;22969:15;;22887:98;22883:168;;;23001:46;;-1:-1:-1;;;23001:46:0;;9823:2:1;23001:46:0;;;9805:21:1;9862:2;9842:18;;;9835:30;9901:34;9881:18;;;9874:62;-1:-1:-1;;;9952:18:1;;;9945:34;9996:19;;23001:46:0;9621:400:1;22883:168:0;-1:-1:-1;;;;;23253:25:0;;23226:24;23253:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;23282:23:0;;;;;;:19;:23;;;;;;;;23253:52;23226:79;;23320:19;23316:137;;;23391:6;23364:23;23382:4;23364:17;:23::i;:::-;:33;;23356:85;;;;-1:-1:-1;;;23356:85:0;;10228:2:1;23356:85:0;;;10210:21:1;10267:2;10247:18;;;10240:30;10306:34;10286:18;;;10279:62;-1:-1:-1;;;10357:18:1;;;10350:37;10404:19;;23356:85:0;10026:403:1;23356:85:0;23548:22;23573:38;23594:4;23600:2;23604:6;23573:20;:38::i;:::-;23548:63;;23678:66;23704:2;23708:14;23724:19;23678:25;:66::i;:::-;23777:2;-1:-1:-1;;;;;23762:34:0;23771:4;-1:-1:-1;;;;;23762:34:0;;23781:14;23762:34;;;;1644:25:1;;1632:2;1617:18;;1498:177;23762:34:0;;;;;;;;22649:1155;;22546:1258;;;:::o;23812:4528::-;23925:7;-1:-1:-1;;;;;23953:20:0;;23945:70;;;;-1:-1:-1;;;23945:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24034:23:0;;24026:71;;;;-1:-1:-1;;;24026:71:0;;;;;;;:::i;:::-;24140:1;24116:21;:25;24108:79;;;;-1:-1:-1;;;24108:79:0;;;;;;;:::i;:::-;24310:21;24284:23;;;24608:1757;-1:-1:-1;;;;;24629:29:0;;;;;;:21;:29;;;;;:49;24625:53;;24608:1757;;;-1:-1:-1;;;;;24714:29:0;;24700:11;24714:29;;;:21;:29;;;;;:45;;24757:1;;24714:45;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;24797:29:0;;;;:21;:29;;;;;;:51;;;:43;;:51;;;;;;24714:45;;-1:-1:-1;25062:30:0;;;25058:230;;;-1:-1:-1;25128:15:0;25058:230;;;25267:5;:1;25271;25267:5;:::i;:::-;25247:25;;25058:230;25498:14;;25480:32;;:15;:32;:::i;:::-;25471:6;:41;25467:485;;;25610:3;25586:20;;25571:12;:35;;;;:::i;:::-;25570:43;;;;:::i;:::-;25551:63;;:15;:63;:::i;:::-;25533:81;;25467:485;;;25667:10;;25649:28;;:15;:28;:::i;:::-;25640:6;:37;25636:316;;;25771:3;25751:16;;25736:12;:31;;;;:::i;25636:316::-;25828:10;;25810:28;;:15;:28;:::i;:::-;25801:6;:37;25797:155;;;25932:3;25912:16;;25897:12;:31;;;;:::i;:::-;25896:39;;;;:::i;:::-;25877:59;;:15;:59;:::i;:::-;25859:77;;25797:155;-1:-1:-1;;;;;26069:29:0;;;;;;:21;:29;;;;;;;;:51;;;:43;;:51;;;;;;:66;;26123:12;;26069:66;:::i;:::-;-1:-1:-1;;;;;26015:29:0;;;;;;:21;:29;;;;;;;;:51;;;:43;;:51;;;;;:120;26170:30;26188:12;26170:15;:30;:::i;:::-;26152:48;-1:-1:-1;26292:20:0;26288:66;;26333:5;;;;26288:66;24685:1680;;24680:3;;;;;:::i;:::-;;;;24608:1757;;;;26377:47;26398:6;26406:17;26377:20;:47::i;:::-;-1:-1:-1;;;;;26521:29:0;;;;;;:21;:29;;;;;:42;;;:66;;26566:21;;26521:66;:::i;:::-;-1:-1:-1;;;;;26476:29:0;;;;;;:21;:29;;;;;:42;;:111;26723:12;;-1:-1:-1;;;26723:12:0;;;;26722:13;;:44;;-1:-1:-1;;;;;;26739:27:0;;;;;;:19;:27;;;;;;;;26722:44;:78;;;-1:-1:-1;;;;;;26770:30:0;;;;;;:19;:30;;;;;;;;26722:78;:108;;;-1:-1:-1;26817:13:0;;-1:-1:-1;;;;;26804:26:0;;;26817:13;;26804:26;;26722:108;26718:160;;;26865:1;26847:19;;26718:160;26894:19;;26890:353;;27003:12;;-1:-1:-1;;;;;27003:12:0;26981:35;;;;:21;:35;;;;;:48;;;:66;;27032:15;;26981:66;:::i;:::-;26952:12;;;-1:-1:-1;;;;;26952:12:0;;;26930:35;;;;:21;:35;;;;;;;;:48;;:117;;;;27161:12;;;;;27139:35;;;;;15334:10;27139:74;;26952:12;27139:49;:74;;;;;:92;;27216:15;;27139:92;:::i;:::-;27084:12;;-1:-1:-1;;;;;27084:12:0;27062:35;;;;:21;:35;;;;;;;;15334:10;27062:74;;27084:12;27062:49;:74;;;;;:169;26890:353;27255:24;27282:41;27301:21;27282:18;:41::i;:::-;-1:-1:-1;;;;;27407:27:0;;;;;;:19;:27;;;;;;27255:68;;-1:-1:-1;27407:27:0;;;:61;;-1:-1:-1;;;;;;27438:30:0;;;;;;:19;:30;;;;;;;;27407:61;27403:114;;;-1:-1:-1;27504:1:0;27403:114;27580:37;27600:16;27580:19;:37::i;:::-;27679:4;27630:28;17717:30;;;:21;:30;;;;;:43;;;27883:20;;27859:44;;;;;:76;;-1:-1:-1;27921:14:0;;-1:-1:-1;;;27921:14:0;;;;27920:15;27859:76;:105;;;;-1:-1:-1;27952:12:0;;-1:-1:-1;;;27952:12:0;;;;27859:105;:145;;;;-1:-1:-1;27991:13:0;;-1:-1:-1;;;;;27981:23:0;;;27991:13;;27981:23;;27859:145;27841:317;;;28105:41;28125:20;;28105:19;:41::i;:::-;28317:15;28274:40;28298:16;28274:21;:40;:::i;:::-;:58;;;;:::i;:::-;28267:65;23812:4528;-1:-1:-1;;;;;;;;;23812:4528:0:o;28711:2729::-;28834:36;28860:9;28834:25;:36::i;:::-;-1:-1:-1;;;;;28931:32:0;;;;;;:21;:32;;;;;:45;;;:62;;28979:14;;28931:62;:::i;:::-;-1:-1:-1;;;;;28883:32:0;;;;;;:21;:32;;;;;:45;;;:110;;;;29025:52;29090:1490;;;;29242:1;29231:8;:12;29227:260;;;-1:-1:-1;;;;;;;29264:32:0;;;;;;;:21;:32;;;;;;;;:75;;;;;;;;;;;;;;15334:10;29264:75;;;;;29358:71;;;:46;:71;;;;;:88;28711:2729::o;29227:260::-;-1:-1:-1;;;;;29631:32:0;;;;;;:21;:32;;;;;:48;;15334:10;;29631:32;:48;;;;:::i;:::-;;;;;;;;;:75;29627:303;;;-1:-1:-1;;;;;29801:32:0;;;;;;:21;:32;;;;;;;;15334:10;29801:71;;:46;;:71;;;;;;:88;;29875:14;;29801:88;:::i;:::-;-1:-1:-1;;;;;29727:32:0;;;;;;;:21;:32;;;;;;;;15334:10;29727:71;;:46;;:71;;;;;:162;;;;-1:-1:-1;;;28711:2729:0:o;29627:303::-;-1:-1:-1;;;;;30052:32:0;;;;;;:21;:32;;;;;;30149:12;30160:1;30149:8;:12;:::i;:::-;30103:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;30052:111;;;;;;;;;;;;;;;;;;30103:59;30192:12;;:8;:12;:::i;:::-;30183:21;;30178:178;30206:5;;30178:178;;-1:-1:-1;;;;;30288:32:0;;;;;;:21;:32;;;;;30334:5;30338:1;30334;:5;:::i;:::-;30288:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30237:32:0;;;;:21;:32;;;;;;;:48;;30283:1;;30237:48;;;;;;:::i;:::-;;;;;;;;;;:103;30213:3;;;;:::i;:::-;;;;30178:178;;;-1:-1:-1;;;;;;30370:32:0;;;;;;:21;:32;;;;;:48;;15334:10;;30370:32;:48;;;;:::i;:::-;;;;;;;;;;;;:74;;;;-1:-1:-1;;;;;30459:32:0;;;;;:21;:32;;;;;;15334:10;30459:71;;:46;;:71;;;;;;:88;;;;-1:-1:-1;;28711:2729:0:o;29090:1490::-;30607:1;30596:8;:12;30592:228;;;-1:-1:-1;;;;;;;30625:32:0;;;;;;;:21;:32;;;;;;;;:67;;;;;;;;;;;;;;30676:15;30625:67;;;;;30707:63;;;:46;:63;;;;;:80;28711:2729::o;30592:228::-;-1:-1:-1;;;;;30853:32:0;;30832:18;30853:32;;;:21;:32;;;;;30899:12;30910:1;30899:8;:12;:::i;:::-;30853:59;;;;;;;;:::i;:::-;;;;;;;;;30832:80;;31068:8;31050:15;:26;;;;:::i;:::-;31037:10;:39;31033:229;;;-1:-1:-1;;;;;31154:32:0;;;;;;:21;:32;;;;;;;;:58;;;:46;;:58;;;;;;:75;;31215:14;;31154:75;:::i;:::-;-1:-1:-1;;;;;31093:32:0;;;;;;;:21;:32;;;;;;;;:58;;;:46;;;;:58;;;:136;;;;-1:-1:-1;;;28711:2729:0:o;31033:229::-;-1:-1:-1;;;;;;;;31274:32:0;;;;;;;:21;:32;;;;;;;;:67;;;;;;;;;;;;;;31325:15;31274:67;;;;;31352:63;;;:46;:63;;;;;:80;28711:2729::o;37442:908::-;-1:-1:-1;;;;;37546:30:0;;37524:19;37546:30;;;:21;:30;;;;;:50;37613:14;37609:27;;37629:7;37442:908;;:::o;37609:27::-;37665:14;37652:9;:27;37648:228;;37696:148;-1:-1:-1;;;;;37703:30:0;;;;;;:21;:30;;;;;:50;:55;37696:148;;-1:-1:-1;;;;;37779:30:0;;;;;;:21;:30;;;;;:49;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37696:148;;;37858:7;37442:908;;:::o;37648:228::-;37888:19;37910:26;37927:9;37910:14;:26;:::i;:::-;37888:48;-1:-1:-1;37949:12:0;37990:9;37976:202;38005:14;38001:1;:18;37976:202;;;-1:-1:-1;;;;;38096:30:0;;;;;;:21;:30;;;;;:46;;38140:1;;38096:46;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;38041:30:0;;;;:21;:30;;;;;;;:52;;38085:7;;38041:52;;;;;;:::i;:::-;;;;;;;;;;:101;38157:9;;;;:::i;:::-;;;;38021:3;;;;;:::i;:::-;;;;37976:202;;;;38190:153;-1:-1:-1;;;;;38215:30:0;;;;;;:21;:30;;;;;:50;38197:68;;38190:153;;-1:-1:-1;;;;;38282:30:0;;;;;;:21;:30;;;;;:49;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38190:153;;;37513:837;;;37442:908;;:::o;31448:148::-;31521:7;31585:3;31565:16;;31549:13;:32;;;;:::i;:::-;31548:40;;;;:::i;:::-;31541:47;31448:148;-1:-1:-1;;31448:148:0:o;28348:355::-;28494:4;28464:36;;;;:21;:36;;;;;:49;;;:58;;28516:6;;28464:58;:::i;:::-;28442:4;28412:36;;;;:21;:36;;;;;;;;:49;;;:110;;;;15334:10;28611:75;;:50;;;;:75;;;;:84;;28689:6;;28611:84;:::i;:::-;28563:4;28533:36;;;;:21;:36;;;;;;;;15334:10;28533:75;;:50;;:75;;;;;:162;-1:-1:-1;28348:355:0:o;31604:532::-;15476:14;:21;;-1:-1:-1;;;;15476:21:0;-1:-1:-1;;;15476:21:0;;;31711::::1;31794:31;31812:12:::0;31794:17:::1;:31::i;:::-;31882:18;31903:38;31927:14:::0;31903:21:::1;:38;:::i;:::-;32024:14;::::0;:41:::1;::::0;31882:59;;-1:-1:-1;32006:12:0::1;::::0;-1:-1:-1;;;;;32024:14:0;;::::1;::::0;31882:59;;32006:12;32024:41;32006:12;32024:41;31882:59;32024:14;:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32005:60;;;32084:7;32076:52;;;::::0;-1:-1:-1;;;32076:52:0;;11119:2:1;32076:52:0::1;::::0;::::1;11101:21:1::0;;;11138:18;;;11131:30;11197:34;11177:18;;;11170:62;11249:18;;32076:52:0::1;10917:356:1::0;32076:52:0::1;-1:-1:-1::0;;15520:14:0;:22;;-1:-1:-1;;;;15520:22:0;;;-1:-1:-1;;31604:532:0:o;36042:1174::-;-1:-1:-1;;;;;36138:29:0;;36112:23;36138:29;;;:21;:29;;;;;:49;36222:1;36204:19;;36200:58;;;36240:7;36042:1174;:::o;36200:58::-;36270:23;36314:10;;36296:15;:28;;;;:::i;:::-;-1:-1:-1;;;;;36423:29:0;;;;;;:21;:29;;;;;:45;;36270:54;;-1:-1:-1;36270:54:0;;36423:29;;;:45;;;;:::i;:::-;;;;;;;;;:63;36419:102;;;36503:7;;36042:1174;:::o;36419:102::-;36533:23;36571:19;36610:6;36605:366;36626:15;36622:1;:19;36605:366;;;-1:-1:-1;;;;;36685:29:0;;36663:19;36685:29;;;:21;:29;;;;;:45;;36728:1;;36685:45;;;;;;:::i;:::-;;;;;;;;;36663:67;;36765:15;36751:11;:29;36747:75;;;36801:5;;;36747:75;-1:-1:-1;;;;;36866:29:0;;;;;;:21;:29;;;;;;;;:56;;;:43;;:56;;;;;;36852:70;;:11;:70;:::i;:::-;36838:84;;36958:1;36937:22;;36648:323;36643:3;;;;;:::i;:::-;;;;36605:366;;;;36983:48;37004:6;37012:18;36983:20;:48::i;:::-;-1:-1:-1;;;;;37044:29:0;;;;;;:21;:29;;;;;:45;;15334:10;;37044:29;:45;;;;:::i;:::-;;;;;;;;;;;;:71;;;;-1:-1:-1;;;;;37126:29:0;;;;;:21;:29;;;;;;15334:10;37126:68;;:43;;:68;;;;;;:82;;;;-1:-1:-1;;;36042:1174:0:o;32238:590::-;32389:16;;;32403:1;32389:16;;;;;;;;32365:21;;32389:16;;;;;;;;;;-1:-1:-1;32389:16:0;32365:40;;32434:4;32416;32421:1;32416:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32416:23:0;;;:7;;;;;;;;;;:23;;;;32460:15;;:22;;;-1:-1:-1;;;32460:22:0;;;;:15;;;;;:20;;:22;;;;;32416:7;;32460:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32450:4;32455:1;32450:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32450:32:0;;;:7;;;;;;;;;:32;32527:15;;32495:62;;32512:4;;32527:15;32545:11;32495:8;:62::i;:::-;32596:15;;:224;;-1:-1:-1;;;32596:224:0;;-1:-1:-1;;;;;32596:15:0;;;;:66;;:224;;32677:11;;32596:15;;32747:4;;32774;;32794:15;;32596:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32294:534;32238:590;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;671:70;616:131;:::o;752:315::-;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1680:456::-;1757:6;1765;1773;1826:2;1814:9;1805:7;1801:23;1797:32;1794:52;;;1842:1;1839;1832:12;1794:52;1881:9;1868:23;1900:31;1925:5;1900:31;:::i;:::-;1950:5;-1:-1:-1;2007:2:1;1992:18;;1979:32;2020:33;1979:32;2020:33;:::i;:::-;1680:456;;2072:7;;-1:-1:-1;;;2126:2:1;2111:18;;;;2098:32;;1680:456::o;2141:180::-;2200:6;2253:2;2241:9;2232:7;2228:23;2224:32;2221:52;;;2269:1;2266;2259:12;2221:52;-1:-1:-1;2292:23:1;;2141:180;-1:-1:-1;2141:180:1:o;2515:247::-;2574:6;2627:2;2615:9;2606:7;2602:23;2598:32;2595:52;;;2643:1;2640;2633:12;2595:52;2682:9;2669:23;2701:31;2726:5;2701:31;:::i;:::-;2751:5;2515:247;-1:-1:-1;;;2515:247:1:o;2975:160::-;3040:20;;3096:13;;3089:21;3079:32;;3069:60;;3125:1;3122;3115:12;3140:180;3196:6;3249:2;3237:9;3228:7;3224:23;3220:32;3217:52;;;3265:1;3262;3255:12;3217:52;3288:26;3304:9;3288:26;:::i;3325:315::-;3390:6;3398;3451:2;3439:9;3430:7;3426:23;3422:32;3419:52;;;3467:1;3464;3457:12;3419:52;3506:9;3493:23;3525:31;3550:5;3525:31;:::i;:::-;3575:5;-1:-1:-1;3599:35:1;3630:2;3615:18;;3599:35;:::i;:::-;3589:45;;3325:315;;;;;:::o;3645:388::-;3713:6;3721;3774:2;3762:9;3753:7;3749:23;3745:32;3742:52;;;3790:1;3787;3780:12;3742:52;3829:9;3816:23;3848:31;3873:5;3848:31;:::i;:::-;3898:5;-1:-1:-1;3955:2:1;3940:18;;3927:32;3968:33;3927:32;3968:33;:::i;:::-;4020:7;4010:17;;;3645:388;;;;;:::o;4038:380::-;4117:1;4113:12;;;;4160;;;4181:61;;4235:4;4227:6;4223:17;4213:27;;4181:61;4288:2;4280:6;4277:14;4257:18;4254:38;4251:161;;;4334:10;4329:3;4325:20;4322:1;4315:31;4369:4;4366:1;4359:15;4397:4;4394:1;4387:15;4251:161;;4038:380;;;:::o;4423:127::-;4484:10;4479:3;4475:20;4472:1;4465:31;4515:4;4512:1;4505:15;4539:4;4536:1;4529:15;4555:125;4595:4;4623:1;4620;4617:8;4614:34;;;4628:18;;:::i;:::-;-1:-1:-1;4665:9:1;;4555:125::o;4685:356::-;4887:2;4869:21;;;4906:18;;;4899:30;4965:34;4960:2;4945:18;;4938:62;5032:2;5017:18;;4685:356::o;5046:217::-;5086:1;5112;5102:132;;5156:10;5151:3;5147:20;5144:1;5137:31;5191:4;5188:1;5181:15;5219:4;5216:1;5209:15;5102:132;-1:-1:-1;5248:9:1;;5046:217::o;5268:168::-;5308:7;5374:1;5370;5366:6;5362:14;5359:1;5356:21;5351:1;5344:9;5337:17;5333:45;5330:71;;;5381:18;;:::i;:::-;-1:-1:-1;5421:9:1;;5268:168::o;5870:128::-;5910:3;5941:1;5937:6;5934:1;5931:13;5928:39;;;5947:18;;:::i;:::-;-1:-1:-1;5983:9:1;;5870:128::o;6003:127::-;6064:10;6059:3;6055:20;6052:1;6045:31;6095:4;6092:1;6085:15;6119:4;6116:1;6109:15;6135:135;6174:3;-1:-1:-1;;6195:17:1;;6192:43;;;6215:18;;:::i;:::-;-1:-1:-1;6262:1:1;6251:13;;6135:135::o;6275:251::-;6345:6;6398:2;6386:9;6377:7;6373:23;6369:32;6366:52;;;6414:1;6411;6404:12;6366:52;6446:9;6440:16;6465:31;6490:5;6465:31;:::i;7186:400::-;7388:2;7370:21;;;7427:2;7407:18;;;7400:30;7466:34;7461:2;7446:18;;7439:62;-1:-1:-1;;;7532:2:1;7517:18;;7510:34;7576:3;7561:19;;7186:400::o;8401:401::-;8603:2;8585:21;;;8642:2;8622:18;;;8615:30;8681:34;8676:2;8661:18;;8654:62;-1:-1:-1;;;8747:2:1;8732:18;;8725:35;8792:3;8777:19;;8401:401::o;8807:399::-;9009:2;8991:21;;;9048:2;9028:18;;;9021:30;9087:34;9082:2;9067:18;;9060:62;-1:-1:-1;;;9153:2:1;9138:18;;9131:33;9196:3;9181:19;;8807:399::o;9211:405::-;9413:2;9395:21;;;9452:2;9432:18;;;9425:30;9491:34;9486:2;9471:18;;9464:62;-1:-1:-1;;;9557:2:1;9542:18;;9535:39;9606:3;9591:19;;9211:405::o;10434:136::-;10473:3;10501:5;10491:39;;10510:18;;:::i;:::-;-1:-1:-1;;;10546:18:1;;10434:136::o;10575:127::-;10636:10;10631:3;10627:20;10624:1;10617:31;10667:4;10664:1;10657:15;10691:4;10688:1;10681:15;11410:980;11672:4;11720:3;11709:9;11705:19;11751:6;11740:9;11733:25;11777:2;11815:6;11810:2;11799:9;11795:18;11788:34;11858:3;11853:2;11842:9;11838:18;11831:31;11882:6;11917;11911:13;11948:6;11940;11933:22;11986:3;11975:9;11971:19;11964:26;;12025:2;12017:6;12013:15;11999:29;;12046:1;12056:195;12070:6;12067:1;12064:13;12056:195;;;12135:13;;-1:-1:-1;;;;;12131:39:1;12119:52;;12226:15;;;;12191:12;;;;12167:1;12085:9;12056:195;;;-1:-1:-1;;;;;;;12307:32:1;;;;12302:2;12287:18;;12280:60;-1:-1:-1;;;12371:3:1;12356:19;12349:35;12268:3;11410:980;-1:-1:-1;;;11410:980:1:o

Swarm Source

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