ETH Price: $3,096.73 (+1.19%)
Gas: 7 Gwei

Token

dogira.lol || dogira.eth.link (DOGIRA)
 

Overview

Max Total Supply

100,000,000 DOGIRA

Holders

3,261 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,787.178454666615403374 DOGIRA

Value
$0.00
0xF5AA937c2f2EDfc93e40129412BB0eaC7a8B00Ce
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:
Dogira

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 420 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-08
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 migrator() 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;
    function setMigrator(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;
}

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

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

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

contract Owned is Context {
    address private _owner;
    address private _pendingOwner;

    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 ownerOnly {
        require(_owner == _msgSender(), "Owner only");
        _;
    }
    modifier pendingOnly {
        require (_pendingOwner == msg.sender, "cannot claim");
        _;
    }

    function pendingOwner() public view returns (address) {
        return _pendingOwner;
    }

    function renounceOwnership() public virtual ownerOnly {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public ownerOnly {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _pendingOwner = newOwner;
    }

    function cancelTransfer() public ownerOnly {
        require(_pendingOwner != address(0), "no pending owner");
        _pendingOwner = address(0);
    }

    function claimOwnership() public pendingOnly {
        _pendingOwner = address(0);
        emit OwnershipTransferred(_owner, _msgSender());
        _owner = _msgSender();
    }
}

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

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

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

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

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

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

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

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

contract Pool {}

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

contract Storage {

    struct Addresses {
        address pool;
        address router;
        address pair;
        address protocol;
        address dogecity;
        address prizePool;
        address buyBonusPool;
        address presale;
        address rng;
        address farm;
    }

    struct Balance {
        uint256 tokenSupply;
        uint256 networkSupply;
        uint256 targetSupply;
        uint256 pairSupply;
        uint256 lpSupply;
        uint256 fees;
        uint256 burned;
    }

    struct Account {
        bool feeless;
        bool transferPair;
        bool excluded;
        uint256 lastDogeIt;
        uint256 tTotal;
        uint256 rTotal;
        uint256 lastShill;
        uint256 communityPoints;
        uint256 lastAward;
    }

    struct Divisors {
        uint8 buy;
        uint8 sell;
        // multiplied by 10000
        uint8 dogecity;
        uint8 bonus;
        uint8 tokenLPBurn;
        uint8 inflate;
        uint8 buyCounter;
        uint8 tx;
        uint8 dogeitpayout;
        uint256 dogeify;
    }

    struct S {
        bool initialized;
        bool paused;
        uint8 decimals;
        uint8 odds;
        Addresses addresses;
        Balance balances;
        Divisors divisors;
        uint256 random;
        uint256 buyFee;
        uint256 sellFee;
        uint256 minBuyForBonus;
        uint256 buys;
        uint256 sells;
        uint256 lastAttack;
        uint256 attackCooldown;
        mapping(address => Account) accounts;
        mapping(address => mapping(address => uint256)) allowances;

        address[] entries;
        string symbol;
        string name;
        EnumerableSet.AddressSet excludedAccounts;

    }

}

contract State {
    Storage.S state;
    TState lastTState;

    enum TxType { FromExcluded, ToExcluded, BothExcluded, Standard }
    enum TState { Buy, Sell, Normal }
}

contract Getters is State {

    function canIDogeIt() public view returns(bool) {
        return state.accounts[msg.sender].lastDogeIt + state.divisors.dogeify < block.timestamp;
    }

    function isMinBuyForBonus(uint256 amount) public view returns(bool) {
        return amount > state.minBuyForBonus * (10 ** state.decimals);
    }

    function isFeelessTx(address sender, address recipient) public view returns(bool) {
        if(sender == state.addresses.presale) {
            return true;
        }
        return state.accounts[sender].feeless || state.accounts[recipient].feeless;
    }

    function getAccount(address account) public view returns(Storage.Account memory) {
        return state.accounts[account];
    }

    function getDivisors() external view returns(Storage.Divisors memory) {
        return state.divisors;
    }

    function getBurned() external view returns(uint256) {
        return state.balances.burned;
    }

    function getFees() external view returns(uint256) {
        return state.balances.fees;
    }

    function getExcluded(address account) public view returns(bool) {
        return state.accounts[account].excluded;
    }

    function getCurrentLPBal() public view returns(uint256) {
        return IERC20(state.addresses.pool).totalSupply();
    }

    function getLPBalanceOf(address account) external view returns(uint256) {
        return IERC20(state.addresses.pool).balanceOf(account);
    }

    function getFeeless(address account) external view returns (bool) {
        return state.accounts[account].feeless;
    }

    function getTState(address sender, address recipient, uint256 lpAmount) public view returns(TState t) {
        if(state.accounts[sender].transferPair) {
            if(state.balances.lpSupply != lpAmount) { // withdraw vs buy
                t = TState.Normal;
            } else {
                t = TState.Buy;
            }
        } else if(state.accounts[recipient].transferPair) {
            t = TState.Sell;
        } else {
            t = TState.Normal;
        }
        return t;
    }

    function getRouter() external view returns(address) {
        return state.addresses.router;
    }

    function getPair() external view returns(address) {
        return state.addresses.pair;
    }

    function getPool() external view returns(address) {
        return state.addresses.pool;
    }

    function getCirculatingSupply() public view returns(uint256, uint256) {
        uint256 rSupply = state.balances.networkSupply;
        uint256 tSupply = state.balances.tokenSupply;
        for (uint256 i = 0; i < EnumerableSet.length(state.excludedAccounts); i++) {
            address account = EnumerableSet.at(state.excludedAccounts, i);
            uint256 rBalance = state.accounts[account].rTotal;
            uint256 tBalance = state.accounts[account].tTotal;
            if (rBalance > rSupply || tBalance > tSupply) return (state.balances.networkSupply, state.balances.tokenSupply);
            rSupply -= rBalance;
            tSupply -= tBalance;
        }
        if (rSupply < state.balances.networkSupply / state.balances.tokenSupply) return (state.balances.networkSupply, state.balances.tokenSupply);
        return (rSupply, tSupply);
    }

    function getTxType(address sender, address recipient) public view returns(TxType t) {
        bool isSenderExcluded = state.accounts[sender].excluded;
        bool isRecipientExcluded = state.accounts[recipient].excluded;
        if (isSenderExcluded && !isRecipientExcluded) {
            t = TxType.FromExcluded;
        } else if (!isSenderExcluded && isRecipientExcluded) {
            t = TxType.ToExcluded;
        } else if (!isSenderExcluded && !isRecipientExcluded) {
            t = TxType.Standard;
        } else if (isSenderExcluded && isRecipientExcluded) {
            t = TxType.BothExcluded;
        } else {
            t = TxType.Standard;
        }
    }

    function getFee(uint256 amount, uint256 divisor) public pure returns (uint256) {
        return amount / divisor;
    }

    function getPrizePoolAddress() public view returns(address) {
        return state.addresses.prizePool;
    }

    function getPrizePoolAmount() public view returns(uint256) {
        return state.accounts[getPrizePoolAddress()].rTotal / ratio();
    }

    function getBuyPoolAmount() public view returns(uint256) {
        return state.accounts[getBuyBonusPoolAddress()].rTotal / ratio();
    }

    function getBuyBonusPoolAddress() public view returns(address) {
        return state.addresses.buyBonusPool;
    }

    function getAmountForMinBuyTax() public view returns(uint256) {
        return (state.balances.tokenSupply / 100);
    }

    function getBuyTax(uint256 amount) public view returns(uint256) {
        uint256 _ratio = amount * 100000 / state.balances.tokenSupply;
        if(_ratio < 1) { // .001%
            return state.divisors.buy; // charges whatever max buy fee is at, to discourage gaming the prizepool.
        } else if (_ratio >= 1000) { // 1%
            return state.divisors.buy * 5; // charges 1/5th of buy fee, from default is 1%
        } else if (_ratio >= 10 && _ratio < 100){
            return state.divisors.buy * 2; // and so on.
        } else if (_ratio >= 100 && _ratio < 500) {
            return state.divisors.buy * 3;
        } else if (_ratio >= 500 && _ratio < 1000) {
            return state.divisors.buy * 4;
        } else { // shouldn't hit this
            return state.divisors.buy;
        }
    }

    function getTimeTillNextAttack() public view returns(uint256) {
        uint256 time = (state.lastAttack + state.attackCooldown);
        return block.timestamp > time ? block.timestamp - time : 0;
    }

    function getMaxBetAmount() public view returns(uint256) {
        return state.accounts[state.addresses.buyBonusPool].tTotal / state.divisors.dogeitpayout;
    }

    function getLastTState() public view returns(TState) {
        return lastTState;
    }

    function getLevel(address account) public view returns(uint256 level) {
        level = state.accounts[account].communityPoints % 1000;
        return level == 0 ? 1 : level;
    }

    function getXP(address account) public view returns(uint256) {
        return state.accounts[account].communityPoints;
    }

    function getBuyAfterSellBonus(uint256 amount) public view returns(uint256 bonus) {
        uint256 total = state.accounts[state.addresses.buyBonusPool].tTotal;
        if(amount >= total / 100) { // 1% of the pool
            bonus = total / state.divisors.bonus;
        } else if(amount >= total / 200) { // .5% of the pool
            bonus = total / (state.divisors.bonus * 2);
        } else if(amount >= total / 500) {
            bonus = total / (state.divisors.bonus * 3);
        } else if(amount >= total / 1000) {
            bonus = total / (state.divisors.bonus * 4);
        } else {
            bonus = total / (state.divisors.bonus * 5);
        }
    }

    function getBuyAfterBuyBonus() public view returns(uint256 bonus) {
        bonus = state.accounts[state.addresses.buyBonusPool].tTotal / 500;
    }

    function getBuyBonus(uint256 amount) public view returns(uint256) {
        uint256 bonus;
        if(lastTState == TState.Sell && amount > state.minBuyForBonus) {
            bonus = getBuyAfterSellBonus(amount);
        } else if(lastTState == TState.Buy && amount > state.minBuyForBonus) {
            bonus = getBuyAfterBuyBonus();
        } else {
            bonus = 0;
        }
        return bonus > state.accounts[state.addresses.buyBonusPool].tTotal ? 0 : bonus;
    }

    function ratio() public view returns(uint256) {
        return state.balances.networkSupply / state.balances.tokenSupply;
    }

}

interface IDogira {
    function setRandomSeed(uint256 amount) external;
}

contract Dogira is IDogira, IERC20, Getters, Owned {

    struct TxValue {
        uint256 amount;
        uint256 transferAmount;
        uint256 fee;
        uint256 buyFee;
        uint256 sellFee;
        uint256 buyBonus;
        uint256 operationalFee;
    }
    event BonusAwarded(address account, uint256 amount);
    event Kek(address account, uint256 amount);
    event Doge(address account, uint256 amount);
    event Winner(address account, uint256 amount);
    event Smashed(uint256 amount);
    event Atomacized(uint256 amount);
    event Blazed(uint256 amount);
    mapping(address => bool) admins;

    event FarmAdded(address farm);
    event XPAdded(address awardee, uint256 points);
    event Hooray(address awardee, uint256 points);
    event TransferredToFarm(uint256 amount);

    uint256 timeLock;
    uint256 dogeCityInitial;
    uint256 public lastTeamSell;
    uint256 levelCap;
    bool rngSet;
    bool presaleSet;

    modifier onlyAdminOrOwner {
        require(admins[msg.sender] || msg.sender == owner(), "invalid caller");
        _;
    }

    constructor() {
        initialize();
    }

    uint256 constant private TOKEN_SUPPLY = 100_000_000;

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

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

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

    function initialize() public {
        require(!state.initialized, "Contract instance has already been initialized");
        state.initialized = true;
        state.decimals = 18;
        state.symbol = "DOGIRA";
        state.name = "dogira.lol || dogira.eth.link";
        state.balances.tokenSupply = TOKEN_SUPPLY * (10 ** state.decimals);
        state.balances.networkSupply = (~uint256(0) - (~uint256(0) % TOKEN_SUPPLY));
        state.divisors.buy = 20; // 5% max - 1% depending on buy size.
        state.divisors.sell = 20; // 5%
        state.divisors.bonus = 50;
        state.divisors.dogecity = 100;
        state.divisors.inflate = 50;
        state.divisors.tokenLPBurn = 50;
        state.divisors.tx = 100;
        state.divisors.dogeitpayout = 100;
        state.divisors.dogeify = 1 hours; // 3600 seconds
        state.divisors.buyCounter = 10;
        state.odds = 4; // 1 / 4
        state.minBuyForBonus = 35000e18;
        state.addresses.prizePool = address(new Pool());
        state.addresses.buyBonusPool = address(new Pool());
        state.addresses.router = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        state.addresses.dogecity = address(0xfEDD9544b47a6D4A1967D385575866BD6f7A2b37);
        state.addresses.pair = IUniswapV2Router02(state.addresses.router).WETH();
        state.addresses.pool =
            IUniswapV2Factory(IUniswapV2Router02(state.addresses.router).factory()).createPair(address(this), state.addresses.pair);
        state.accounts[address(0)].feeless = true;
        state.accounts[msg.sender].feeless = true;
        //state.accounts[state.addresses.pool].feeless = true;
        state.accounts[state.addresses.pool].transferPair = true;
        uint256 locked = state.balances.networkSupply / 5; // 20%
        uint256 amount = state.balances.networkSupply - locked;
        state.accounts[msg.sender].rTotal = amount; // 80%
        dogeCityInitial = locked - (locked / 4);
        state.accounts[state.addresses.dogecity].feeless = true;
        state.accounts[state.addresses.dogecity].rTotal = dogeCityInitial; // 15%
        state.accounts[state.addresses.buyBonusPool].rTotal = locked / 4; // 5%
        state.accounts[state.addresses.buyBonusPool].tTotal = state.balances.tokenSupply / 20; // 5%
        state.paused = true;
        state.attackCooldown = 10 minutes;
        levelCap = 10;
        timeLock = block.timestamp + 3 days;

    }

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

    function balanceOf(address account) public view override returns (uint256) {
        return getExcluded(account) ? state.accounts[account].tTotal : state.accounts[account].rTotal / ratio();
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        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");

        state.allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

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

    function totalSupply() public view override returns (uint256) {
        return state.balances.tokenSupply;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

    function _transfer(address sender, address recipient, uint256 amount) internal returns(bool) {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(sender == state.addresses.pool) { // for presales
            require(state.paused == false, "Transfers are paused");
        }
        // removed setter for dogecity to prevent changing the address and making this branch useless.
        if(sender == state.addresses.dogecity) {
            require(amount <= dogeCityInitial / 20, "too much"); // 5% per day
            require(lastTeamSell + 1 days < block.timestamp, "too soon");
            require(recipient == state.addresses.pool, "can only sell to uniswap pool");
            lastTeamSell = block.timestamp;
        }
        bool noFee = isFeelessTx(sender, recipient);
        uint256 rate = ratio();
        uint256 lpAmount = getCurrentLPBal();
        (TxValue memory t, TState ts, TxType txType) = tValues(sender, recipient, amount, noFee, lpAmount);
        state.balances.lpSupply = lpAmount;
        handleTRV(recipient, rate, ts, t);
        rTransfer(sender, recipient, rate, t, txType);
        state.balances.fees += t.fee;
        state.balances.networkSupply -= (t.fee * rate);
        lastTState = ts;
        emit Transfer(msg.sender, recipient, t.transferAmount);
        return true;
    }

    function transferToFarm(uint256 amount) external ownerOnly {
        require(timeLock < block.timestamp, "too soon");
        uint256 r = amount * ratio();
        state.accounts[state.addresses.dogecity].rTotal -= r;
        state.accounts[state.addresses.farm].rTotal += r;
        emit TransferredToFarm(amount);
    }

    function rTransfer(address sender, address recipient, uint256 rate, TxValue memory t, TxType txType) internal {
        if (txType == TxType.ToExcluded) {
            state.accounts[sender].rTotal         -= t.amount * rate;
            state.accounts[recipient].tTotal      += (t.transferAmount);
            state.accounts[recipient].rTotal      += t.transferAmount * rate;
        } else if (txType == TxType.FromExcluded) {
            state.accounts[sender].tTotal         -= t.amount;
            state.accounts[sender].rTotal         -= t.amount * rate;
            state.accounts[recipient].rTotal      += t.transferAmount * rate;
        } else if (txType == TxType.BothExcluded) {
            state.accounts[sender].tTotal         -= t.amount;
            state.accounts[sender].rTotal         -= (t.amount * rate);
            state.accounts[recipient].tTotal      += t.transferAmount;
            state.accounts[recipient].rTotal      += (t.transferAmount * rate);
        } else {
            state.accounts[sender].rTotal         -= (t.amount * rate);
            state.accounts[recipient].rTotal      += (t.transferAmount * rate);
        }
    }

    // burn supply, not negative rebase
    function verysmashed() external  {
        require(!state.paused, "still paused");
        require(state.lastAttack + state.attackCooldown < block.timestamp, "Dogira coolingdown");
        uint256 rLp = state.accounts[state.addresses.pool].rTotal;
        uint256 amountToDeflate = (rLp / (state.divisors.tokenLPBurn));
        uint256 burned = amountToDeflate / ratio();
        state.accounts[state.addresses.pool].rTotal -= amountToDeflate;
        state.accounts[address(0)].rTotal += amountToDeflate;
        state.accounts[address(0)].tTotal += burned;
        state.balances.burned += burned;
        state.lastAttack = block.timestamp;
        syncPool();
        emit Smashed(burned);
    }

    // positive rebase
    function dogebreath() external {
        require(!state.paused, "still paused");
        require(state.lastAttack + state.attackCooldown < block.timestamp, "Dogira coolingdown");
        uint256 rate = ratio();
        uint256 target = state.balances.burned == 0 ? state.balances.tokenSupply : state.balances.burned;
        uint256 amountToInflate = target / state.divisors.inflate;
        if(state.balances.burned > amountToInflate) {
            state.balances.burned -= amountToInflate;
            state.accounts[address(0)].rTotal -= amountToInflate * rate;
            state.accounts[address(0)].tTotal -= amountToInflate;
        }
        // positive rebase
        state.balances.networkSupply -= amountToInflate * rate;
        state.lastAttack = block.timestamp;
        syncPool();
        emit Atomacized(amountToInflate);
    }

    // disperse amount to all holders
    function wow(uint256 amount) external {
        address sender = msg.sender;
        uint256 rate = ratio();
        require(!getExcluded(sender), "Excluded addresses can't call this function");
        require(amount * rate < state.accounts[sender].rTotal, "too much");
        state.accounts[sender].rTotal -= (amount * rate);
        state.balances.networkSupply -= amount * rate;
        state.balances.fees += amount;
    }

    // award community members from the treasury
    function muchSupport(address awardee, uint256 multiplier) external onlyAdminOrOwner {
        uint256 n = block.timestamp;
        require(!state.paused, "still paused");
        require(state.accounts[awardee].lastShill + 1 days < n, "nice shill but need to wait");
        require(!getExcluded(awardee), "excluded addresses can't be awarded");
        require(multiplier <= 100 && multiplier > 0, "can't be more than .1% of dogecity reward");
        uint256 level = getLevel(awardee);
        if(level > levelCap) {
            level = levelCap; // capped at 10
        } else if (level <= 0) {
            level = 1;
        }
        uint256 p = ((state.accounts[state.addresses.dogecity].rTotal / 100000) * multiplier) * level; // .001% * m of dogecity * level
        state.accounts[state.addresses.dogecity].rTotal -= p;
        state.accounts[awardee].rTotal += p;
        state.accounts[awardee].lastShill = block.timestamp;
        state.accounts[awardee].communityPoints += multiplier;
        emit Hooray(awardee, p);
    }


    function yayCommunity(address awardee, uint256 points) external onlyAdminOrOwner {
        uint256 n = block.timestamp;
        require(!state.paused, "still paused");
        require(state.accounts[awardee].lastAward + 1 days < n, "nice help but need to wait");
        require(!getExcluded(awardee), "excluded addresses can't be awarded");
        require(points <= 1000 && points > 0, "can't be more than a full level");
        state.accounts[awardee].communityPoints += points;
        state.accounts[awardee].lastAward = block.timestamp;
        emit XPAdded(awardee, points);
    }

    // burn amount, for cex integration?
    function suchburn(uint256 amount) external {
        address sender = msg.sender;
        uint256 rate = ratio();
        require(!getExcluded(sender), "Excluded addresses can't call this function");
        require(amount * rate < state.accounts[sender].rTotal, "too much");
        state.accounts[sender].rTotal -= (amount * rate);
        state.accounts[address(0)].rTotal += (amount * rate);
        state.accounts[address(0)].tTotal += (amount);
        state.balances.burned += amount;
        syncPool();
        emit Blazed(amount);
    }

    function dogeit(uint256 amount) external {
        require(!state.paused, "still paused");
        require(!getExcluded(msg.sender), "excluded can't call");
        uint256 rAmount = amount * ratio();
        require(state.accounts[msg.sender].lastDogeIt + state.divisors.dogeify < block.timestamp, "you need to wait to doge");
        require(amount > 0, "don't waste your gas");
        require(rAmount <= state.accounts[state.addresses.buyBonusPool].rTotal / state.divisors.dogeitpayout, "can't kek too much");
        state.accounts[msg.sender].lastDogeIt = block.timestamp;
        if((state.random + block.timestamp + block.number) % state.odds == 0) {
            state.accounts[state.addresses.buyBonusPool].rTotal -= rAmount;
            state.accounts[msg.sender].rTotal += rAmount;
            emit Doge(msg.sender, amount);
        } else {
            state.accounts[msg.sender].rTotal -= rAmount;
            state.accounts[state.addresses.buyBonusPool].rTotal += rAmount;
            emit Kek(msg.sender, amount);
        }
    }

    function handleTRV(address recipient, uint256 rate, TState ts, TxValue memory t) internal {
        state.accounts[state.addresses.dogecity].rTotal += (t.operationalFee * rate);
        if(ts == TState.Sell) {
            state.accounts[state.addresses.buyBonusPool].rTotal += t.sellFee * rate;
            state.accounts[state.addresses.buyBonusPool].tTotal += t.sellFee;
        }
        if(ts == TState.Buy) {
            state.buys++;
            uint256 br = t.buyFee * rate;
            if(state.buys % state.divisors.buyCounter == 0) {
                uint256 a = state.accounts[state.addresses.prizePool].rTotal + (br);
                state.accounts[state.addresses.prizePool].rTotal = 0;
                state.accounts[state.addresses.prizePool].tTotal = 0;
                state.accounts[recipient].rTotal += a;
                emit Winner(recipient, a);
            } else {
                state.accounts[state.addresses.prizePool].rTotal += br;
                state.accounts[state.addresses.prizePool].tTotal += t.buyFee;
            }
            uint256 r = t.buyBonus * rate;
            state.accounts[state.addresses.buyBonusPool].rTotal -= r;
            state.accounts[state.addresses.buyBonusPool].tTotal -= t.buyBonus;
            state.accounts[recipient].rTotal += r;
            emit BonusAwarded(recipient, t.buyBonus);
        }
    }

    function tValues(address sender, address recipient, uint256 amount, bool noFee, uint256 lpAmount) public view returns (TxValue memory t, TState ts, TxType txType) {
        ts = getTState(sender, recipient, lpAmount);
        txType = getTxType(sender, recipient);
        t.amount = amount;
        if(!noFee) {
            t.fee = getFee(amount, state.divisors.tx);
            t.operationalFee = getFee(amount, state.divisors.dogecity);
            if(ts == TState.Sell) {
                uint256 sellFee = getFee(amount, state.divisors.sell);
                uint256 sellLevel = sellFee == 0 ? 0 : ((sellFee * getLevel(sender)) / levelCap);
                t.sellFee = sellFee - sellLevel;
            }
            if(ts == TState.Buy) {
                t.buyFee = getFee(amount, getBuyTax(amount));
                uint256 bonus = getBuyBonus(amount);
                uint256 levelBonus = bonus == 0 ? 0 : ((bonus * getLevel(recipient)) / levelCap);
                t.buyBonus = bonus + levelBonus;
            }
        }
        t.transferAmount = t.amount - t.fee - t.sellFee - t.buyFee - t.operationalFee;
        return (t, ts, txType);
    }

    function include(address account) external ownerOnly {
        require(state.accounts[account].excluded, "Account is already excluded");
        state.accounts[account].tTotal = 0;
        EnumerableSet.remove(state.excludedAccounts, account);
    }

    function exclude(address account) external ownerOnly {
        require(!state.accounts[account].excluded, "Account is already excluded");
        state.accounts[account].excluded = true;
        if(state.accounts[account].rTotal > 0) {
            state.accounts[account].tTotal = state.accounts[account].rTotal / ratio();
        }
        state.accounts[account].excluded = true;
        EnumerableSet.add(state.excludedAccounts, account);
    }

    function syncPool() public  {
        IUniswapV2Pair(state.addresses.pool).sync();
    }

    function enableTrading() external ownerOnly {
        state.paused = false;
    }

    function adjustOdds(uint8 odds) external ownerOnly {
        require(odds >= 2, "can't be more than 50/50");
        state.odds = odds;
    }

    function setPresale(address account) external ownerOnly {
        if(!presaleSet) {
            state.addresses.presale = account;
            state.accounts[account].feeless = true;
            presaleSet = true;
        }
    }

    function setBuyBonusDivisor(uint8 fd) external ownerOnly {
        require(fd >= 20, "can't be more than 5%");
        state.divisors.bonus = fd;
    }

    function setMinBuyForBuyBonus(uint256 amount) external ownerOnly {
        require(amount > 10000e18, "can't be less than 10k tokens");
        state.minBuyForBonus = amount * (10 ** state.decimals); 
    }

    function setFeeless(address account, bool value) external ownerOnly {
        state.accounts[account].feeless = value;
    }

    function setBuyFee(uint8 fd) external ownerOnly {
        require(fd >= 20, "can't be more than 5%");
        state.divisors.buy = fd;
    }

    function setSellFee(uint8 fd) external ownerOnly {
        require(fd >= 10, "can't be more than 10%");
        state.divisors.sell = fd;
    }

    function setFarm(address farm) external ownerOnly {
        require(state.addresses.farm == address(0), "farm already set");
        uint256 _codeLength;
        assembly {_codeLength := extcodesize(farm)}
        require(_codeLength > 0, "must be a contract");
        state.addresses.farm = farm;
        emit FarmAdded(farm);
    }

    function setRandomSeed(uint256 random) override external {
        if(!rngSet){
            require(msg.sender == owner(), "not valid caller"); // once chainlink is set random can't be called by owner
        } else {
            require(msg.sender == state.addresses.rng, "not valid caller"); // for chainlink VRF
        }
        require(state.random != random, "can't use the same one twice");
        state.random = random;
    }

    function setRngAddr(address addr) external ownerOnly {
        state.addresses.rng = addr;
        rngSet = true;
    }

    function setLevelCap(uint256 l) external ownerOnly {
        require(l >= 10 && l <= 100, "can't be lower than 10 or greater than 100");
        levelCap = l;
    }

    function setCooldown(uint256 timeInSeconds) external ownerOnly {
        require(timeInSeconds > 1 minutes, "too short a time");
        state.attackCooldown = timeInSeconds;
    }

    function setBuyCounter(uint8 counter) external ownerOnly {
        require(counter > 5, "too few people");
        state.divisors.buyCounter = counter;
    }

    function setDogeItCooldown(uint256 time) external ownerOnly {
        require(time > 5 minutes, "too quick");
        state.divisors.dogeify = time;
    }

    function setTokenLPBurn(uint8 fd) external ownerOnly {
        require(fd > 20, "can't be more than 5%");
        state.divisors.tokenLPBurn = fd;
    }

    function setInflation(uint8 fd) external ownerOnly {
        require(fd > 20, "can't be more than 5%");
        state.divisors.inflate = fd;
    }

    function setDogeItPayoutLimit(uint8 fd) external ownerOnly {
        require(fd >= 50, "can't be more than 2% of the buy bonus supply");
        state.divisors.dogeitpayout = fd;
    }

    function setAdmin(address account, bool value) external ownerOnly {
        admins[account] = value;
    }

    function setDogeCityDivisor(uint8 fd) external ownerOnly {
        require(fd >= 50, "can't be more than 2%");
        state.divisors.dogecity = fd;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Atomacized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Blazed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BonusAwarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Doge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"farm","type":"address"}],"name":"FarmAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"awardee","type":"address"},{"indexed":false,"internalType":"uint256","name":"points","type":"uint256"}],"name":"Hooray","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Kek","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Smashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferredToFarm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Winner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"awardee","type":"address"},{"indexed":false,"internalType":"uint256","name":"points","type":"uint256"}],"name":"XPAdded","type":"event"},{"inputs":[{"internalType":"uint8","name":"odds","type":"uint8"}],"name":"adjustOdds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canIDogeIt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dogebreath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"dogeit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccount","outputs":[{"components":[{"internalType":"bool","name":"feeless","type":"bool"},{"internalType":"bool","name":"transferPair","type":"bool"},{"internalType":"bool","name":"excluded","type":"bool"},{"internalType":"uint256","name":"lastDogeIt","type":"uint256"},{"internalType":"uint256","name":"tTotal","type":"uint256"},{"internalType":"uint256","name":"rTotal","type":"uint256"},{"internalType":"uint256","name":"lastShill","type":"uint256"},{"internalType":"uint256","name":"communityPoints","type":"uint256"},{"internalType":"uint256","name":"lastAward","type":"uint256"}],"internalType":"struct Storage.Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAmountForMinBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyAfterBuyBonus","outputs":[{"internalType":"uint256","name":"bonus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBuyAfterSellBonus","outputs":[{"internalType":"uint256","name":"bonus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBuyBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyBonusPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyPoolAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentLPBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDivisors","outputs":[{"components":[{"internalType":"uint8","name":"buy","type":"uint8"},{"internalType":"uint8","name":"sell","type":"uint8"},{"internalType":"uint8","name":"dogecity","type":"uint8"},{"internalType":"uint8","name":"bonus","type":"uint8"},{"internalType":"uint8","name":"tokenLPBurn","type":"uint8"},{"internalType":"uint8","name":"inflate","type":"uint8"},{"internalType":"uint8","name":"buyCounter","type":"uint8"},{"internalType":"uint8","name":"tx","type":"uint8"},{"internalType":"uint8","name":"dogeitpayout","type":"uint8"},{"internalType":"uint256","name":"dogeify","type":"uint256"}],"internalType":"struct Storage.Divisors","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getFeeless","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLPBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTState","outputs":[{"internalType":"enum State.TState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLevel","outputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrizePoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrizePoolAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"getTState","outputs":[{"internalType":"enum State.TState","name":"t","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeTillNextAttack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"getTxType","outputs":[{"internalType":"enum State.TxType","name":"t","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"include","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":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"isFeelessTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isMinBuyForBonus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTeamSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"awardee","type":"address"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"muchSupport","outputs":[],"stateMutability":"nonpayable","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":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fd","type":"uint8"}],"name":"setBuyBonusDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"counter","type":"uint8"}],"name":"setBuyCounter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fd","type":"uint8"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeInSeconds","type":"uint256"}],"name":"setCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fd","type":"uint8"}],"name":"setDogeCityDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setDogeItCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fd","type":"uint8"}],"name":"setDogeItPayoutLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"farm","type":"address"}],"name":"setFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeeless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fd","type":"uint8"}],"name":"setInflation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"l","type":"uint256"}],"name":"setLevelCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBuyForBuyBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"random","type":"uint256"}],"name":"setRandomSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setRngAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fd","type":"uint8"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fd","type":"uint8"}],"name":"setTokenLPBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"suchburn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"syncPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"noFee","type":"bool"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"tValues","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"buyBonus","type":"uint256"},{"internalType":"uint256","name":"operationalFee","type":"uint256"}],"internalType":"struct Dogira.TxValue","name":"t","type":"tuple"},{"internalType":"enum State.TState","name":"ts","type":"uint8"},{"internalType":"enum State.TxType","name":"txType","type":"uint8"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verysmashed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"awardee","type":"address"},{"internalType":"uint256","name":"points","type":"uint256"}],"name":"yayCommunity","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060006200001e62000084565b60238054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200007e62000088565b62000a8e565b3390565b60005460ff1615620000b75760405162461bcd60e51b8152600401620000ae906200081a565b60405180910390fd5b60008054600160ff199091161762ff000019166212000017905560408051808201909152600680825265444f4749524160d01b60209092019182526200010091601f916200071d565b5060408051808201909152601d8082527f646f676972612e6c6f6c207c7c20646f676972612e6574682e6c696e6b00000060209283019081526200014592916200071d565b506000546200015f9062010000900460ff16600a620008e7565b6200016f906305f5e100620009d2565b600b55620001846305f5e10060001962000a4b565b6200019290600019620009f4565b6000600b01600101819055506014600060120160000160006101000a81548160ff021916908360ff1602179055506014600060120160000160016101000a81548160ff021916908360ff1602179055506032600060120160000160036101000a81548160ff021916908360ff1602179055506064600060120160000160026101000a81548160ff021916908360ff1602179055506032600060120160000160056101000a81548160ff021916908360ff1602179055506032600060120160000160046101000a81548160ff021916908360ff1602179055506064600060120160000160076101000a81548160ff021916908360ff1602179055506064600060120160000160086101000a81548160ff021916908360ff160217905550610e10600060120160010181905550600a600060120160000160066101000a81548160ff021916908360ff16021790555060046000800160036101000a81548160ff021916908360ff1602179055506907695a92c20d6fe000006000601701819055506040516200031f90620007ac565b604051809103906000f0801580156200033c573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b03929092169190911790556040516200036b90620007ac565b604051809103906000f08015801562000388573d6000803e3d6000fd5b50600780546001600160a01b039283166001600160a01b031991821617909155600280548216737a250d5630b4cf539739df2c5dacb4c659f2488d17908190556005805490921673fedd9544b47a6d4a1967d385575866bd6f7a2b3717909155604080516315ab88c960e31b81529051919092169163ad5c4648916004828101926020929190829003018186803b1580156200042357600080fd5b505afa15801562000438573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045e9190620007d0565b600380546001600160a01b0319166001600160a01b039283161790556002546040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b158015620004b857600080fd5b505afa158015620004cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004f39190620007d0565b6003546040516364e329cb60e11b81526001600160a01b039283169263c9c6539692620005299230929091169060040162000800565b602060405180830381600087803b1580156200054457600080fd5b505af115801562000559573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200057f9190620007d0565b600180546001600160a01b039283166001600160a01b0319909116178155601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f849805460ff19908116831790915533600090815260408082208054909316841790925591549092168152908120805461ff001916610100179055600c546200060d9060059062000883565b600c5490915060009062000623908390620009f4565b336000908152601c6020526040902060030181905590506200064760048362000883565b620006539083620009f4565b6027908155600580546001600160a01b039081166000908152601c6020526040808220805460ff1916600117905593549254909116815291909120600301556200069f60048362000883565b6007546001600160a01b03166000908152601c6020526040902060030155600b54620006ce9060149062000883565b6007546001600160a01b03166000908152601c6020526040812060020191909155805461ff001916610100179055610258601b55600a60295562000716426203f48062000868565b6026555050565b8280546200072b9062000a0e565b90600052602060002090601f0160209004810192826200074f57600085556200079a565b82601f106200076a57805160ff19168380011785556200079a565b828001600101855582156200079a579182015b828111156200079a5782518255916020019190600101906200077d565b50620007a8929150620007b9565b5090565b605c80620062bb83390190565b5b80821115620007a85760008155600101620007ba565b600060208284031215620007e2578081fd5b81516001600160a01b0381168114620007f9578182fd5b9392505050565b6001600160a01b0392831681529116602082015260400190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b600082198211156200087e576200087e62000a62565b500190565b60008262000895576200089562000a78565b500490565b80825b6001808611620008ae5750620008de565b818704821115620008c357620008c362000a62565b80861615620008d157918102915b9490941c9380026200089d565b94509492505050565b6000620007f960001960ff8516846000826200090657506001620007f9565b816200091557506000620007f9565b81600181146200092e576002811462000939576200096d565b6001915050620007f9565b60ff8411156200094d576200094d62000a62565b6001841b91508482111562000966576200096662000a62565b50620007f9565b5060208310610133831016604e8410600b8410161715620009a5575081810a838111156200099f576200099f62000a62565b620007f9565b620009b484848460016200089a565b808604821115620009c957620009c962000a62565b02949350505050565b6000816000190483118215151615620009ef57620009ef62000a62565b500290565b60008282101562000a095762000a0962000a62565b500390565b60028104600182168062000a2357607f821691505b6020821081141562000a4557634e487b7160e01b600052602260045260246000fd5b50919050565b60008262000a5d5762000a5d62000a78565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b61581d8062000a9e6000396000f3fe608060405234801561001057600080fd5b50600436106104ec5760003560e01c80637ae8c32a1161028d578063b8e255be11610161578063dd62ed3e116100de578063f00fd44d116100a2578063f6fe87271161007c578063f6fe872714610a19578063fba8dda614610a21578063fbcbc0f114610a34576104ec565b8063f00fd44d146109eb578063f2fde38b146109fe578063f5afbb7814610a11576104ec565b8063dd62ed3e146109a2578063e30c3978146109b5578063e343bd12146109bd578063e7e50560146109d0578063efbc9de7146109d8576104ec565b8063c867392811610125578063c86739281461094e578063d250185c14610961578063d4f26c5114610974578063d5fcc7b614610987578063db8d55f11461099a576104ec565b8063b8e255be14610905578063b996b71314610918578063b9b5f5211461092b578063c1f1b1b514610933578063c6b7b5951461093b576104ec565b80639302bc371161020a578063ad7e01be116101ce578063b4a64966116101a8578063b4a64966146108bb578063b524c663146108ce578063b61bd3ab146108e3576104ec565b8063ad7e01be14610898578063b0f479a1146108a0578063b41e41ea146108a8576104ec565b80639302bc371461084457806395d89b4114610857578063a26077c61461085f578063a457c2d714610872578063a9059cbb14610885576104ec565b80638a8c523c116102515780638a8c523c1461081c5780638b529854146108245780638cc265eb1461082c5780638da5cb5b146108345780638fc9a9d81461083c576104ec565b80637ae8c32a146107c65780638129fc1c146107d9578063817c8966146107e157806381981d07146107f457806389377d4f14610807576104ec565b80634563d5ae116103c457806359ef0781116103415780636fea47e31161030557806371ca337d116102df57806371ca337d1461079857806373b29dee146107a057806376c6ab94146107b3576104ec565b80636fea47e31461077557806370a082311461077d578063715018a614610790576104ec565b806359ef0781146107215780635cf3da1f14610734578063612cc51414610747578063639487f41461074f57806366fea1d414610762576104ec565b80634e71e0c8116103885780634e71e0c8146106e35780634fc3f41a146106eb5780634febf53d146106fe57806353a4041314610711578063550ed1f014610719576104ec565b80634563d5ae1461068457806347d894751461069757806348feb7d1146106aa5780634b0bddd2146106bd5780634c784efa146106d0576104ec565b8063219653511161046d578063313ce56711610431578063395093511161040b578063395093511461063e57806341280008146106515780634412c22314610671576104ec565b8063313ce5671461060e578063358cfda21461062357806337d543c414610636576104ec565b806321965351146105b7578063235d8232146105ca57806323b872dd146105dd57806329f911a6146105f05780632b112e49146105f8576104ec565b80630ab9411b116104b45780630ab9411b1461056c5780630c3d29a21461058157806312644acb1461058957806313fe0dd61461059c57806318160ddd146105af576104ec565b8063026b1d5f146104f15780630663ddcc1461050f57806306fdde031461052457806308f822f614610539578063095ea7b31461054c575b600080fd5b6104f9610a54565b604051610506919061496a565b60405180910390f35b61052261051d366004614918565b610a63565b005b61052c610aef565b60405161050691906149d8565b6105226105473660046148c7565b610b84565b61055f61055a36600461489c565b610c98565b60405161050691906149b1565b610574610cb6565b604051610506919061550e565b610574610cff565b61052261059736600461489c565b610d7c565b6105746105aa366004614760565b610fe1565b61057461106a565b61055f6105c5366004614760565b611070565b6105226105d836600461489c565b611094565b61055f6105eb3660046147d0565b61123a565b6105746112b1565b6106006112c3565b604051610506929190615517565b6106166113a0565b6040516105069190615525565b6105226106313660046148c7565b6113af565b61057461140f565b61055f61064c36600461489c565b611415565b61066461065f366004614798565b611464565b60405161050691906149ca565b61057461067f3660046148c7565b61150c565b610522610692366004614918565b611611565b6105226106a5366004614918565b611692565b61055f6106b8366004614760565b611710565b6105226106cb366004614868565b61172e565b6105226106de366004614760565b611793565b6105226117fc565b6105226106f93660046148c7565b6118b0565b61052261070c366004614760565b61190f565b610574611a39565b610574611a64565b61055f61072f366004614798565b611a9c565b6105746107423660046148c7565b611b00565b61055f611bc6565b61057461075d366004614760565b611bf0565b6105226107703660046148c7565b611c0e565b610574611ca6565b61057461078b366004614760565b611cac565b610522611d0d565b610574611da4565b61055f6107ae3660046148c7565b611db6565b6105226107c13660046148c7565b611de3565b6105226107d4366004614918565b61206b565b6105226120e5565b6105746107ef366004614760565b612740565b6105226108023660046148c7565b61277f565b61080f6127ec565b60405161050691906149bc565b6105226127f5565b61052261283c565b6105226128b0565b6104f9612a61565b610574612a75565b6105226108523660046148c7565b612aaa565b61052c612b9b565b61052261086d3660046148c7565b612bad565b61055f61088036600461489c565b612c37565b61055f61089336600461489c565b612c86565b610522612c93565b6104f9612d0c565b6105226108b63660046148c7565b612d1b565b61080f6108c93660046147d0565b612ea8565b6108d6612f20565b60405161050691906153e5565b6108f66108f1366004614810565b612fc6565b604051610506939291906154a2565b610522610913366004614918565b61318f565b6105746109263660046148c7565b613203565b6104f96132e4565b6104f96132f3565b610522610949366004614918565b613302565b61052261095c366004614760565b613380565b61057461096f3660046148f7565b61341f565b610522610982366004614760565b61342b565b610522610995366004614760565b6134f8565b61057461358c565b6105746109b0366004614798565b613592565b6104f96135bd565b6105226109cb366004614918565b6135cc565b61052261364f565b6105226109e6366004614868565b6137f7565b6105226109f9366004614918565b61385c565b610522610a0c366004614760565b6138d8565b6104f961395a565b610574613969565b610522610a2f366004614918565b61397f565b610a47610a42366004614760565b6139fe565b6040516105069190615373565b6001546001600160a01b031690565b610a6b613a95565b60235461010090046001600160a01b03908116911614610aa65760405162461bcd60e51b8152600401610a9d90614fd1565b60405180910390fd5b60058160ff1611610ac95760405162461bcd60e51b8152600401610a9d90614b80565b6012805460ff90921666010000000000000266ff00000000000019909216919091179055565b606060006020018054610b01906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906156d0565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b610b8c613a95565b60235461010090046001600160a01b03908116911614610bbe5760405162461bcd60e51b8152600401610a9d90614fd1565b4260265410610bdf5760405162461bcd60e51b8152600401610a9d90614cc6565b6000610be9611da4565b610bf39083615671565b6005546001600160a01b03166000908152601c6020526040812060030180549293508392909190610c259084906156b9565b9091555050600a546001600160a01b03166000908152601c602052604081206003018054839290610c57908490615533565b90915550506040517fcb78204ddf35079782f7e64e0550726f3e21fc3773f225dadb8708a2ed5fb75190610c8c90849061550e565b60405180910390a15050565b6000610cac610ca5613a95565b8484613a99565b5060015b92915050565b6000610cc0611da4565b601c6000610ccc6132e4565b6001600160a01b03166001600160a01b0316815260200190815260200160002060030154610cfa919061554b565b905090565b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610d4457600080fd5b505afa158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa91906148df565b3360009081526025602052604090205460ff1680610db25750610d9d612a61565b6001600160a01b0316336001600160a01b0316145b610dce5760405162461bcd60e51b8152600401610a9d90614c30565b6000544290610100900460ff1615610df85760405162461bcd60e51b8152600401610a9d90614ea5565b6001600160a01b0383166000908152601c60205260409020600401548190610e239062015180615533565b10610e405760405162461bcd60e51b8152600401610a9d90614b49565b610e4983611070565b15610e665760405162461bcd60e51b8152600401610a9d90615277565b60648211158015610e775750600082115b610e935760405162461bcd60e51b8152600401610a9d90614e25565b6000610e9e84612740565b9050602954811115610eb35750602954610ebf565b60008111610ebf575060015b6005546001600160a01b03166000908152601c602052604081206003015482908590610eef90620186a09061554b565b610ef99190615671565b610f039190615671565b6005546001600160a01b03166000908152601c6020526040812060030180549293508392909190610f359084906156b9565b90915550506001600160a01b0385166000908152601c602052604081206003018054839290610f65908490615533565b90915550506001600160a01b0385166000908152601c602052604081204260048201556005018054869290610f9b908490615533565b90915550506040517fdb007e93c45ce72d2a719188d2b08b4c17f80653ac7624d83431bfa5715320a690610fd29087908490614998565b60405180910390a15050505050565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061101290859060040161496a565b60206040518083038186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106291906148df565b90505b919050565b600b5490565b6001600160a01b03166000908152601c602052604090205462010000900460ff1690565b3360009081526025602052604090205460ff16806110ca57506110b5612a61565b6001600160a01b0316336001600160a01b0316145b6110e65760405162461bcd60e51b8152600401610a9d90614c30565b6000544290610100900460ff16156111105760405162461bcd60e51b8152600401610a9d90614ea5565b6001600160a01b0383166000908152601c6020526040902060060154819061113b9062015180615533565b106111585760405162461bcd60e51b8152600401610a9d90614f9a565b61116183611070565b1561117e5760405162461bcd60e51b8152600401610a9d90615277565b6103e882111580156111905750600082115b6111ac5760405162461bcd60e51b8152600401610a9d906150b2565b6001600160a01b0383166000908152601c6020526040812060050180548492906111d7908490615533565b90915550506001600160a01b0383166000908152601c60205260409081902042600690910155517f3b7cda1261f5c43e1022832b581103320671193233be8f67412e7566656b4b809061122d9085908590614998565b60405180910390a1505050565b6000611247848484613b4d565b506112a684611254613a95565b6001600160a01b0387166000908152601d602052604081208691611276613a95565b6001600160a01b03166001600160a01b03168152602001908152602001600020546112a191906156b9565b613a99565b5060015b9392505050565b600b54600090610cfa9060649061554b565b600c54600b546000918291825b6112da6021613dcf565b81101561136c5760006112ee602183613dda565b6001600160a01b0381166000908152601c602052604090206003810154600290910154919250908582118061132257508481115b1561133e575050600c54600b54909650945061139c9350505050565b61134882876156b9565b955061135481866156b9565b9450505050808061136490615705565b9150506112d0565b50600b54600c5461137d919061554b565b821015611396575050600c54600b54909250905061139c565b90925090505b9091565b60005462010000900460ff1690565b6113b7613a95565b60235461010090046001600160a01b039081169116146113e95760405162461bcd60e51b8152600401610a9d90614fd1565b61012c811161140a5760405162461bcd60e51b8152600401610a9d9061514a565b601355565b60285481565b6000610cac611422613a95565b8484601d6000611430613a95565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546112a19190615533565b6001600160a01b038083166000908152601c6020526040808220549284168252812054909160ff620100009182900481169291909104168180156114a6575080155b156114b45760009250611504565b811580156114bf5750805b156114cd5760019250611504565b811580156114d9575080155b156114e75760039250611504565b8180156114f15750805b156114ff5760029250611504565b600392505b505092915050565b6007546001600160a01b03166000908152601c602052604081206002015461153560648261554b565b831061155957601254611552906301000000900460ff168261554b565b915061160b565b61156460c88261554b565b831061158f57601254611582906301000000900460ff166002615690565b6115529060ff168261554b565b61159b6101f48261554b565b83106115b957601254611582906301000000900460ff166003615690565b6115c56103e88261554b565b83106115e357601254611582906301000000900460ff166004615690565b6012546115fb906301000000900460ff166005615690565b6116089060ff168261554b565b91505b50919050565b611619613a95565b60235461010090046001600160a01b0390811691161461164b5760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff161161166e5760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff909216650100000000000265ff000000000019909216919091179055565b61169a613a95565b60235461010090046001600160a01b039081169116146116cc5760405162461bcd60e51b8152600401610a9d90614fd1565b60028160ff1610156116f05760405162461bcd60e51b8152600401610a9d906151b2565b6000805460ff90921663010000000263ff00000019909216919091179055565b6001600160a01b03166000908152601c602052604090205460ff1690565b611736613a95565b60235461010090046001600160a01b039081169116146117685760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b61179b613a95565b60235461010090046001600160a01b039081169116146117cd5760405162461bcd60e51b8152600401610a9d90614fd1565b600980546001600160a01b0319166001600160a01b0392909216919091179055602a805460ff19166001179055565b6024546001600160a01b031633146118265760405162461bcd60e51b8152600401610a9d9061508c565b602480546001600160a01b031916905561183e613a95565b6023546040516001600160a01b0392831692610100909204909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3611888613a95565b602360016101000a8154816001600160a01b0302191690836001600160a01b03160217905550565b6118b8613a95565b60235461010090046001600160a01b039081169116146118ea5760405162461bcd60e51b8152600401610a9d90614fd1565b603c811161190a5760405162461bcd60e51b8152600401610a9d90614f02565b601b55565b611917613a95565b60235461010090046001600160a01b039081169116146119495760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b0381166000908152601c602052604090205462010000900460ff16156119885760405162461bcd60e51b8152600401610a9d90614d1f565b6001600160a01b0381166000908152601c60205260409020805462ff00001916620100001781556003015415611a03576119c0611da4565b6001600160a01b0382166000908152601c60205260409020600301546119e6919061554b565b6001600160a01b0382166000908152601c60205260409020600201555b6001600160a01b0381166000908152601c60205260409020805462ff0000191662010000179055611a35602182613de6565b5050565b6007546001600160a01b03166000908152601c6020526040812060020154610cfa906101f49061554b565b6012546007546001600160a01b03166000908152601c60205260408120600201549091610cfa91600160401b90910460ff169061554b565b6008546000906001600160a01b0384811691161415611abd57506001610cb0565b6001600160a01b0383166000908152601c602052604090205460ff16806112aa5750506001600160a01b03166000908152601c602052604090205460ff16919050565b600080600160235460ff166002811115611b2a57634e487b7160e01b600052602160045260246000fd5b148015611b38575060175483115b15611b4d57611b468361150c565b9050611b93565b600060235460ff166002811115611b7457634e487b7160e01b600052602160045260246000fd5b148015611b82575060175483115b15611b8f57611b46611a39565b5060005b6007546001600160a01b03166000908152601c60205260409020600201548111611bbd5780611608565b50600092915050565b601354336000908152601c602052604081206001015490914291611bea9190615533565b10905090565b6001600160a01b03166000908152601c602052604090206005015490565b602a5460ff16611c5557611c20612a61565b6001600160a01b0316336001600160a01b031614611c505760405162461bcd60e51b8152600401610a9d906150e9565b611c7f565b6009546001600160a01b03163314611c7f5760405162461bcd60e51b8152600401610a9d906150e9565b601454811415611ca15760405162461bcd60e51b8152600401610a9d90614dee565b601455565b60115490565b6000611cb782611070565b611cee57611cc3611da4565b6001600160a01b0383166000908152601c6020526040902060030154611ce9919061554b565b611062565b506001600160a01b03166000908152601c602052604090206002015490565b611d15613a95565b60235461010090046001600160a01b03908116911614611d475760405162461bcd60e51b8152600401610a9d90614fd1565b60235460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36023805474ffffffffffffffffffffffffffffffffffffffff0019169055565b600b54600c54600091610cfa9161554b565b60008054611dce9062010000900460ff16600a6155a5565b601754611ddb9190615671565b909111919050565b600054610100900460ff1615611e0b5760405162461bcd60e51b8152600401610a9d90614ea5565b611e1433611070565b15611e315760405162461bcd60e51b8152600401610a9d90614d56565b6000611e3b611da4565b611e459083615671565b601354336000908152601c60205260409020600101549192504291611e6a9190615533565b10611e875760405162461bcd60e51b8152600401610a9d9061533c565b60008211611ea75760405162461bcd60e51b8152600401610a9d906152ba565b6012546007546001600160a01b03166000908152601c6020526040902060030154611edc91600160401b900460ff169061554b565b811115611efb5760405162461bcd60e51b8152600401610a9d90614f63565b336000908152601c602052604081204260019091018190559054601454630100000090910460ff16914391611f309190615533565b611f3a9190615533565b611f449190615720565b611fe0576007546001600160a01b03166000908152601c602052604081206003018054839290611f759084906156b9565b9091555050336000908152601c602052604081206003018054839290611f9c908490615533565b90915550506040517f757836b3ce7ad0e51b0fe4bed57c1b672ab1b831cecd483669e298099ce33c3390611fd39033908590614998565b60405180910390a1611a35565b336000908152601c6020526040812060030180548392906120029084906156b9565b90915550506007546001600160a01b03166000908152601c602052604081206003018054839290612034908490615533565b90915550506040517fa77497b556f4aea76b14ecf80e749b85a2b4562f73ca2adf6764583c5d59b08390610c8c9033908590614998565b612073613a95565b60235461010090046001600160a01b039081169116146120a55760405162461bcd60e51b8152600401610a9d90614fd1565b600a8160ff1610156120c95760405162461bcd60e51b8152600401610a9d90614f2c565b6012805460ff9092166101000261ff0019909216919091179055565b60005460ff16156121085760405162461bcd60e51b8152600401610a9d9061503e565b60008054600160ff199091161762ff000019166212000017905560408051808201909152600680825265444f4749524160d01b602090920191825261214f91601f916145c8565b5060408051808201909152601d8082527f646f676972612e6c6f6c207c7c20646f676972612e6574682e6c696e6b000000602092830190815261219292916145c8565b506000546121aa9062010000900460ff16600a6155a5565b6121b8906305f5e100615671565b600b556121cb6305f5e100600019615720565b6121d7906000196156b9565b6000600b01600101819055506014600060120160000160006101000a81548160ff021916908360ff1602179055506014600060120160000160016101000a81548160ff021916908360ff1602179055506032600060120160000160036101000a81548160ff021916908360ff1602179055506064600060120160000160026101000a81548160ff021916908360ff1602179055506032600060120160000160056101000a81548160ff021916908360ff1602179055506032600060120160000160046101000a81548160ff021916908360ff1602179055506064600060120160000160076101000a81548160ff021916908360ff1602179055506064600060120160000160086101000a81548160ff021916908360ff160217905550610e10600060120160010181905550600a600060120160000160066101000a81548160ff021916908360ff16021790555060046000800160036101000a81548160ff021916908360ff1602179055506907695a92c20d6fe000006000601701819055506040516123629061464c565b604051809103906000f08015801561237e573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b03929092169190911790556040516123ab9061464c565b604051809103906000f0801580156123c7573d6000803e3d6000fd5b50600780546001600160a01b039283166001600160a01b031991821617909155600280548216737a250d5630b4cf539739df2c5dacb4c659f2488d17908190556005805490921673fedd9544b47a6d4a1967d385575866bd6f7a2b3717909155604080516315ab88c960e31b81529051919092169163ad5c4648916004828101926020929190829003018186803b15801561246157600080fd5b505afa158015612475573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612499919061477c565b600380546001600160a01b0319166001600160a01b039283161790556002546040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b1580156124f257600080fd5b505afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a919061477c565b6003546040516364e329cb60e11b81526001600160a01b039283169263c9c653969261255e9230929091169060040161497e565b602060405180830381600087803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b0919061477c565b600180546001600160a01b039283166001600160a01b0319909116178155601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f849805460ff19908116831790915533600090815260408082208054909316841790925591549092168152908120805461ff001916610100179055600c5461263c9060059061554b565b600c549091506000906126509083906156b9565b336000908152601c60205260409020600301819055905061267260048361554b565b61267c90836156b9565b6027908155600580546001600160a01b039081166000908152601c6020526040808220805460ff1916600117905593549254909116815291909120600301556126c660048361554b565b6007546001600160a01b03166000908152601c6020526040902060030155600b546126f39060149061554b565b6007546001600160a01b03166000908152601c6020526040812060020191909155805461ff001916610100179055610258601b55600a602955612739426203f480615533565b6026555050565b6001600160a01b0381166000908152601c6020526040812060050154612769906103e890615720565b905080156127775780611062565b506001919050565b612787613a95565b60235461010090046001600160a01b039081169116146127b95760405162461bcd60e51b8152600401610a9d90614fd1565b600a81101580156127cb575060648111155b6127e75760405162461bcd60e51b8152600401610a9d9061522d565b602955565b60235460ff1690565b6127fd613a95565b60235461010090046001600160a01b0390811691161461282f5760405162461bcd60e51b8152600401610a9d90614fd1565b6000805461ff0019169055565b612844613a95565b60235461010090046001600160a01b039081169116146128765760405162461bcd60e51b8152600401610a9d90614fd1565b6024546001600160a01b031661289e5760405162461bcd60e51b8152600401610a9d90614b1f565b602480546001600160a01b0319169055565b600054610100900460ff16156128d85760405162461bcd60e51b8152600401610a9d90614ea5565b601b54601a5442916128e991615533565b106129065760405162461bcd60e51b8152600401610a9d90614e6e565b6001546001600160a01b03166000908152601c602052604081206003015460125490919061293f90640100000000900460ff168361554b565b9050600061294b611da4565b612955908361554b565b6001546001600160a01b03166000908152601c60205260408120600301805492935084929091906129879084906156b9565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84c80548492906129c7908490615533565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84b8054839290612a07908490615533565b909155505060118054829190600090612a21908490615533565b909155505042601a55612a32612c93565b7f4acb597af16b6650a7028129045cb4d1779b97e359b0956584faa8892a4ec4b98160405161122d919061550e565b60235461010090046001600160a01b031690565b601b54601a546000918291612a8a9190615533565b9050804211612a9a576000612aa4565b612aa481426156b9565b91505090565b336000612ab5611da4565b9050612ac082611070565b15612add5760405162461bcd60e51b8152600401610a9d906152f1565b6001600160a01b0382166000908152601c6020526040902060030154612b038285615671565b10612b205760405162461bcd60e51b8152600401610a9d90614a2b565b612b2a8184615671565b6001600160a01b0383166000908152601c602052604081206003018054909190612b559084906156b9565b90915550612b6590508184615671565b600c8054600090612b779084906156b9565b909155505060108054849190600090612b91908490615533565b9091555050505050565b60606000601f018054610b01906156d0565b612bb5613a95565b60235461010090046001600160a01b03908116911614612be75760405162461bcd60e51b8152600401610a9d90614fd1565b69021e19e0c9bab24000008111612c105760405162461bcd60e51b8152600401610a9d90614ecb565b600054612c279062010000900460ff16600a6155a5565b612c319082615671565b60175550565b6000610cac612c44613a95565b8484601d6000612c52613a95565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546112a191906156b9565b60006112a6338484613b4d565b600154604080517ffff6cae900000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163fff6cae99160048082019260009290919082900301818387803b158015612cf257600080fd5b505af1158015612d06573d6000803e3d6000fd5b50505050565b6002546001600160a01b031690565b336000612d26611da4565b9050612d3182611070565b15612d4e5760405162461bcd60e51b8152600401610a9d906152f1565b6001600160a01b0382166000908152601c6020526040902060030154612d748285615671565b10612d915760405162461bcd60e51b8152600401610a9d90614a2b565b612d9b8184615671565b6001600160a01b0383166000908152601c602052604081206003018054909190612dc69084906156b9565b90915550612dd690508184615671565b6000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84c8054909190612e11908490615533565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84b8054859290612e51908490615533565b909155505060118054849190600090612e6b908490615533565b90915550612e799050612c93565b7f5cda1501a74cd6ec9eb0a1315d6d11eb8f609345603746a5d2e3af97f4aac7ba8360405161122d919061550e565b6001600160a01b0383166000908152601c6020526040812054610100900460ff1615612ee857600f548214612edf57506002612ee3565b5060005b6112aa565b6001600160a01b0383166000908152601c6020526040902054610100900460ff1615612f16575060016112aa565b5060029392505050565b612f28614658565b50604080516101408101825260125460ff8082168352610100808304821660208501526201000083048216948401949094526301000000820481166060840152640100000000820481166080840152650100000000008204811660a084015266010000000000008204811660c08401526701000000000000008204811660e0840152600160401b909104169181019190915260135461012082015290565b612fce6146ac565b600080612fdc888886612ea8565b9150612fe88888611464565b8684529050846131415760125461300e908790670100000000000000900460ff1661341f565b604084015260125461302a90879062010000900460ff1661341f565b60c0840152600182600281111561305157634e487b7160e01b600052602160045260246000fd5b14156130b657601254600090613070908890610100900460ff1661341f565b90506000811561309f576029546130868b612740565b6130909084615671565b61309a919061554b565b6130a2565b60005b90506130ae81836156b9565b608086015250505b60008260028111156130d857634e487b7160e01b600052602160045260246000fd5b1415613141576130eb8661096f88613203565b606084015260006130fb87611b00565b90506000811561312a576029546131118a612740565b61311b9084615671565b613125919061554b565b61312d565b60005b90506131398183615533565b60a086015250505b60c0830151606084015160808501516040860151865161316191906156b9565b61316b91906156b9565b61317591906156b9565b61317f91906156b9565b6020840152955095509592505050565b613197613a95565b60235461010090046001600160a01b039081169116146131c95760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff1610156131ed5760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff191660ff92909216919091179055565b600b54600090819061321884620186a0615671565b613222919061554b565b9050600181101561323a57505060125460ff16611065565b6103e8811061325f576012546132549060ff166005615690565b60ff16915050611065565b600a81101580156132705750606481105b15613286576012546132549060ff166002615690565b6064811015801561329857506101f481105b156132ae576012546132549060ff166003615690565b6101f481101580156132c157506103e881105b156132d7576012546132549060ff166004615690565b505060125460ff16611065565b6007546001600160a01b031690565b6003546001600160a01b031690565b61330a613a95565b60235461010090046001600160a01b0390811691161461333c5760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff1610156133605760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff90921663010000000263ff00000019909216919091179055565b613388613a95565b60235461010090046001600160a01b039081169116146133ba5760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b0381166000908152601c602052604090205462010000900460ff166133f85760405162461bcd60e51b8152600401610a9d90614d1f565b6001600160a01b0381166000908152601c6020526040812060020155611a35602182613dfb565b60006112aa828461554b565b613433613a95565b60235461010090046001600160a01b039081169116146134655760405162461bcd60e51b8152600401610a9d90614fd1565b600a546001600160a01b03161561348e5760405162461bcd60e51b8152600401610a9d90614d8d565b803b806134ad5760405162461bcd60e51b8152600401610a9d90614c8f565b600a80546001600160a01b0319166001600160a01b0384161790556040517fbfca0af3a33c0bcae29f7d07934c90e392c5d6c2ba686ce898528ee63bea8f5290610c8c90849061496a565b613500613a95565b60235461010090046001600160a01b039081169116146135325760405162461bcd60e51b8152600401610a9d90614fd1565b602a54610100900460ff1661358957600880546001600160a01b0383166001600160a01b031990911681179091556000908152601c60205260409020805460ff19166001179055602a805461ff0019166101001790555b50565b60105490565b6001600160a01b039182166000908152601d6020908152604080832093909416825291909152205490565b6024546001600160a01b031690565b6135d4613a95565b60235461010090046001600160a01b039081169116146136065760405162461bcd60e51b8152600401610a9d90614fd1565b60328160ff16101561362a5760405162461bcd60e51b8152600401610a9d90614ad2565b6012805460ff909216600160401b0268ff000000000000000019909216919091179055565b600054610100900460ff16156136775760405162461bcd60e51b8152600401610a9d90614ea5565b601b54601a54429161368891615533565b106136a55760405162461bcd60e51b8152600401610a9d90614e6e565b60006136af611da4565b601154909150600090156136c5576011546136c9565b600b545b6012549091506000906136e89065010000000000900460ff168361554b565b60115490915081101561379b576011805482919060009061370a9084906156b9565b9091555061371a90508382615671565b6000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84c80549091906137559084906156b9565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84b80548392906137959084906156b9565b90915550505b6137a58382615671565b600c80546000906137b79084906156b9565b909155505042601a556137c8612c93565b7f4d0885014b9e2b7d05af2e851acb4501f546c37f2670e4c3c2c87681d98c1b418160405161122d919061550e565b6137ff613a95565b60235461010090046001600160a01b039081169116146138315760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b613864613a95565b60235461010090046001600160a01b039081169116146138965760405162461bcd60e51b8152600401610a9d90614fd1565b60328160ff1610156138ba5760405162461bcd60e51b8152600401610a9d90614c58565b6012805460ff909216620100000262ff000019909216919091179055565b6138e0613a95565b60235461010090046001600160a01b039081169116146139125760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b0381166139385760405162461bcd60e51b8152600401610a9d90614ba8565b602480546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031690565b6000613973611da4565b601c6000610ccc61395a565b613987613a95565b60235461010090046001600160a01b039081169116146139b95760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff16116139dc5760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff9092166401000000000264ff0000000019909216919091179055565b613a066146e9565b506001600160a01b03166000908152601c6020908152604091829020825161012081018452815460ff80821615158352610100808304821615159584019590955262010000909104161515938101939093526001810154606084015260028101546080840152600381015460a0840152600481015460c0840152600581015460e0840152600601549082015290565b3390565b6001600160a01b038316613abf5760405162461bcd60e51b8152600401610a9d906151e9565b6001600160a01b038216613ae55760405162461bcd60e51b8152600401610a9d90614bee565b6001600160a01b038084166000818152601d602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613b4090859061550e565b60405180910390a3505050565b60006001600160a01b038416613b755760405162461bcd60e51b8152600401610a9d9061516d565b6001600160a01b038316613b9b5760405162461bcd60e51b8152600401610a9d90614a8f565b60008211613bbb5760405162461bcd60e51b8152600401610a9d90614ff5565b6001546001600160a01b0385811691161415613bf957600054610100900460ff1615613bf95760405162461bcd60e51b8152600401610a9d90614ce8565b6005546001600160a01b0385811691161415613c9e576014602754613c1e919061554b565b821115613c3d5760405162461bcd60e51b8152600401610a9d90614a2b565b4260285462015180613c4f9190615533565b10613c6c5760405162461bcd60e51b8152600401610a9d90614cc6565b6001546001600160a01b03848116911614613c995760405162461bcd60e51b8152600401610a9d90614db7565b426028555b6000613caa8585611a9c565b90506000613cb6611da4565b90506000613cc2610cff565b90506000806000613cd68a8a8a8988612fc6565b600f87905591945092509050613cee89868486613e10565b613cfb8a8a87868561418c565b604083015160108054600090613d12908490615533565b90915550506040830151613d27908690615671565b600c8054600090613d399084906156b9565b90915550506023805483919060ff19166001836002811115613d6b57634e487b7160e01b600052602160045260246000fd5b0217905550886001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560200151604051613db7919061550e565b60405180910390a35060019998505050505050505050565b6000611062826143ec565b60006112aa83836143f0565b60006112aa836001600160a01b038416614449565b60006112aa836001600160a01b038416614493565b828160c00151613e209190615671565b6005546001600160a01b03166000908152601c602052604081206003018054909190613e4d908490615533565b9091555060019050826002811115613e7557634e487b7160e01b600052602160045260246000fd5b1415613ef557828160800151613e8b9190615671565b6007546001600160a01b03166000908152601c602052604081206003018054909190613eb8908490615533565b909155505060808101516007546001600160a01b03166000908152601c602052604081206002018054909190613eef908490615533565b90915550505b6000826002811115613f1757634e487b7160e01b600052602160045260246000fd5b1415612d065760188054906000613f2d83615705565b91905055506000838260600151613f449190615671565b601254601854919250613f6591660100000000000090910460ff1690615720565b61402c576006546001600160a01b03166000908152601c6020526040812060030154613f92908390615533565b600680546001600160a01b039081166000908152601c60205260408082206003908101839055935483168252808220600201829055918a16815290812090910180549293508392909190613fe7908490615533565b90915550506040517f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e209061401e9088908490614998565b60405180910390a150614096565b6006546001600160a01b03166000908152601c602052604081206003018054839290614059908490615533565b909155505060608201516006546001600160a01b03166000908152601c602052604081206002018054909190614090908490615533565b90915550505b6000848360a001516140a89190615671565b6007546001600160a01b03166000908152601c60205260408120600301805492935083929091906140da9084906156b9565b909155505060a08301516007546001600160a01b03166000908152601c6020526040812060020180549091906141119084906156b9565b90915550506001600160a01b0386166000908152601c602052604081206003018054839290614141908490615533565b909155505060a08301516040517f9cf92e896d7fce8c4a7600daa08f0a39e68eb99cd4413843df33e0fdb75535389161417c91899190614998565b60405180910390a1505050505050565b60018160038111156141ae57634e487b7160e01b600052602160045260246000fd5b141561426e5781516141c1908490615671565b6001600160a01b0386166000908152601c6020526040812060030180549091906141ec9084906156b9565b90915550506020808301516001600160a01b0386166000908152601c90925260408220600201805491929091614223908490615533565b90915550506020820151614238908490615671565b6001600160a01b0385166000908152601c602052604081206003018054909190614263908490615533565b909155506143e59050565b600081600381111561429057634e487b7160e01b600052602160045260246000fd5b14156143005781516001600160a01b0386166000908152601c6020526040812060020180549091906142c39084906156b9565b909155505081516142d5908490615671565b6001600160a01b0386166000908152601c6020526040812060030180549091906142239084906156b9565b600281600381111561432257634e487b7160e01b600052602160045260246000fd5b14156143675781516001600160a01b0386166000908152601c6020526040812060020180549091906143559084906156b9565b909155505081516141c1908490615671565b8151614374908490615671565b6001600160a01b0386166000908152601c60205260408120600301805490919061439f9084906156b9565b909155505060208201516143b4908490615671565b6001600160a01b0385166000908152601c6020526040812060030180549091906143df908490615533565b90915550505b5050505050565b5490565b815460009082106144135760405162461bcd60e51b8152600401610a9d90614a4d565b82600001828154811061443657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600061445583836145b0565b61448b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610cb0565b506000610cb0565b600081815260018301602052604081205480156145a65760006144b76001836156b9565b85549091506000906144cb906001906156b9565b905060008660000182815481106144f257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061452357634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561453a836001615533565b6000828152600189016020526040902055865487908061456a57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610cb0565b6000915050610cb0565b60009081526001919091016020526040902054151590565b8280546145d4906156d0565b90600052602060002090601f0160209004810192826145f6576000855561463c565b82601f1061460f57805160ff191683800117855561463c565b8280016001018555821561463c579182015b8281111561463c578251825591602001919060010190614621565b5061464892915061473b565b5090565b605c8061578c83390190565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000151581526020016000151581526020016000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115614648576000815560010161473c565b8035801515811461106557600080fd5b600060208284031215614771578081fd5b81356112aa81615776565b60006020828403121561478d578081fd5b81516112aa81615776565b600080604083850312156147aa578081fd5b82356147b581615776565b915060208301356147c581615776565b809150509250929050565b6000806000606084860312156147e4578081fd5b83356147ef81615776565b925060208401356147ff81615776565b929592945050506040919091013590565b600080600080600060a08688031215614827578081fd5b853561483281615776565b9450602086013561484281615776565b93506040860135925061485760608701614750565b949793965091946080013592915050565b6000806040838503121561487a578182fd5b823561488581615776565b915061489360208401614750565b90509250929050565b600080604083850312156148ae578182fd5b82356148b981615776565b946020939093013593505050565b6000602082840312156148d8578081fd5b5035919050565b6000602082840312156148f0578081fd5b5051919050565b60008060408385031215614909578182fd5b50508035926020909101359150565b600060208284031215614929578081fd5b813560ff811681146112aa578182fd5b15159052565b6003811061494f5761494f615760565b9052565b6004811061494f5761494f615760565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60208101610cb0828461493f565b60208101610cb08284614953565b6000602080835283518082850152825b81811015614a04578581018301518582016040015282016149e8565b81811115614a155783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600890820152670e8dede40daeac6d60c31b604082015260600190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602d908201527f63616e2774206265206d6f7265207468616e203225206f66207468652062757960408201526c20626f6e757320737570706c7960981b606082015260800190565b60208082526010908201526f3737903832b73234b7339037bbb732b960811b604082015260600190565b6020808252601b908201527f6e696365207368696c6c20627574206e65656420746f20776169740000000000604082015260600190565b6020808252600e908201526d746f6f206665772070656f706c6560901b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252600e908201526d34b73b30b634b21031b0b63632b960911b604082015260600190565b60208082526015908201527f63616e2774206265206d6f7265207468616e2032250000000000000000000000604082015260600190565b60208082526012908201527f6d757374206265206120636f6e74726163740000000000000000000000000000604082015260600190565b6020808252600890820152673a37b79039b7b7b760c11b604082015260600190565b60208082526014908201527f5472616e73666572732061726520706175736564000000000000000000000000604082015260600190565b6020808252601b908201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604082015260600190565b60208082526013908201527f6578636c756465642063616e27742063616c6c00000000000000000000000000604082015260600190565b60208082526010908201526f19985c9b48185b1c9958591e481cd95d60821b604082015260600190565b6020808252601d908201527f63616e206f6e6c792073656c6c20746f20756e697377617020706f6f6c000000604082015260600190565b6020808252601c908201527f63616e277420757365207468652073616d65206f6e6520747769636500000000604082015260600190565b60208082526029908201527f63616e2774206265206d6f7265207468616e202e3125206f6620646f676563696040820152681d1e481c995dd85c9960ba1b606082015260800190565b60208082526012908201527f446f6769726120636f6f6c696e67646f776e0000000000000000000000000000604082015260600190565b6020808252600c908201526b1cdd1a5b1b081c185d5cd95960a21b604082015260600190565b6020808252601d908201527f63616e2774206265206c657373207468616e2031306b20746f6b656e73000000604082015260600190565b60208082526010908201526f746f6f2073686f727420612074696d6560801b604082015260600190565b60208082526016908201527f63616e2774206265206d6f7265207468616e2031302500000000000000000000604082015260600190565b60208082526012908201527f63616e2774206b656b20746f6f206d7563680000000000000000000000000000604082015260600190565b6020808252601a908201527f6e6963652068656c7020627574206e65656420746f2077616974000000000000604082015260600190565b6020808252600a90820152694f776e6572206f6e6c7960b01b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600c908201526b63616e6e6f7420636c61696d60a01b604082015260600190565b6020808252601f908201527f63616e2774206265206d6f7265207468616e20612066756c6c206c6576656c00604082015260600190565b60208082526010908201526f3737ba103b30b634b21031b0b63632b960811b604082015260600190565b60208082526015908201527f63616e2774206265206d6f7265207468616e2035250000000000000000000000604082015260600190565b602080825260099082015268746f6f20717569636b60b81b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526018908201527f63616e2774206265206d6f7265207468616e2035302f35300000000000000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602a908201527f63616e2774206265206c6f776572207468616e203130206f7220677265617465604082015269072207468616e203130360b41b606082015260800190565b60208082526023908201527f6578636c75646564206164647265737365732063616e2774206265206177617260408201526219195960ea1b606082015260800190565b60208082526014908201527f646f6e277420776173746520796f757220676173000000000000000000000000604082015260600190565b6020808252602b908201527f4578636c75646564206164647265737365732063616e27742063616c6c20746860408201526a34b990333ab731ba34b7b760a91b606082015260800190565b60208082526018908201527f796f75206e65656420746f207761697420746f20646f67650000000000000000604082015260600190565b60006101208201905082511515825260208301511515602083015260408301516153a06040840182614939565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525092915050565b6000610140820190506153f9828451614963565b602083015161540b6020840182614963565b50604083015161541e6040840182614963565b5060608301516154316060840182614963565b5060808301516154446080840182614963565b5060a083015161545760a0840182614963565b5060c083015161546a60c0840182614963565b5060e083015161547d60e0840182614963565b506101008084015161549182850182614963565b505061012092830151919092015290565b600061012082019050845182526020850151602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c08301526154f860e083018561493f565b615506610100830184614953565b949350505050565b90815260200190565b918252602082015260400190565b60ff91909116815260200190565b6000821982111561554657615546615734565b500190565b60008261555a5761555a61574a565b500490565b80825b6001808611615571575061559c565b81870482111561558357615583615734565b8086161561559057918102915b9490941c938002615562565b94509492505050565b60006112aa60001960ff8516846000826155c1575060016112aa565b816155ce575060006112aa565b81600181146155e457600281146155ee5761561b565b60019150506112aa565b60ff8411156155ff576155ff615734565b6001841b91508482111561561557615615615734565b506112aa565b5060208310610133831016604e8410600b8410161715615649575081810a83811115612ee357612ee3615734565b615656848484600161555f565b80860482111561566857615668615734565b02949350505050565b600081600019048311821515161561568b5761568b615734565b500290565b600060ff821660ff84168160ff04811182151516156156b1576156b1615734565b029392505050565b6000828210156156cb576156cb615734565b500390565b6002810460018216806156e457607f821691505b6020821081141561160b57634e487b7160e01b600052602260045260246000fd5b600060001982141561571957615719615734565b5060010190565b60008261572f5761572f61574a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038116811461358957600080fdfe6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220135137c4ade22b7f735777a2fc6c8efcb1b9117c246593f293cc61b07449f50d64736f6c63430008010033a26469706673582212202409d15672711167790a9a314fc6e4e6aeb24643a29176294734248b3501add164736f6c634300080100336080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220135137c4ade22b7f735777a2fc6c8efcb1b9117c246593f293cc61b07449f50d64736f6c63430008010033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104ec5760003560e01c80637ae8c32a1161028d578063b8e255be11610161578063dd62ed3e116100de578063f00fd44d116100a2578063f6fe87271161007c578063f6fe872714610a19578063fba8dda614610a21578063fbcbc0f114610a34576104ec565b8063f00fd44d146109eb578063f2fde38b146109fe578063f5afbb7814610a11576104ec565b8063dd62ed3e146109a2578063e30c3978146109b5578063e343bd12146109bd578063e7e50560146109d0578063efbc9de7146109d8576104ec565b8063c867392811610125578063c86739281461094e578063d250185c14610961578063d4f26c5114610974578063d5fcc7b614610987578063db8d55f11461099a576104ec565b8063b8e255be14610905578063b996b71314610918578063b9b5f5211461092b578063c1f1b1b514610933578063c6b7b5951461093b576104ec565b80639302bc371161020a578063ad7e01be116101ce578063b4a64966116101a8578063b4a64966146108bb578063b524c663146108ce578063b61bd3ab146108e3576104ec565b8063ad7e01be14610898578063b0f479a1146108a0578063b41e41ea146108a8576104ec565b80639302bc371461084457806395d89b4114610857578063a26077c61461085f578063a457c2d714610872578063a9059cbb14610885576104ec565b80638a8c523c116102515780638a8c523c1461081c5780638b529854146108245780638cc265eb1461082c5780638da5cb5b146108345780638fc9a9d81461083c576104ec565b80637ae8c32a146107c65780638129fc1c146107d9578063817c8966146107e157806381981d07146107f457806389377d4f14610807576104ec565b80634563d5ae116103c457806359ef0781116103415780636fea47e31161030557806371ca337d116102df57806371ca337d1461079857806373b29dee146107a057806376c6ab94146107b3576104ec565b80636fea47e31461077557806370a082311461077d578063715018a614610790576104ec565b806359ef0781146107215780635cf3da1f14610734578063612cc51414610747578063639487f41461074f57806366fea1d414610762576104ec565b80634e71e0c8116103885780634e71e0c8146106e35780634fc3f41a146106eb5780634febf53d146106fe57806353a4041314610711578063550ed1f014610719576104ec565b80634563d5ae1461068457806347d894751461069757806348feb7d1146106aa5780634b0bddd2146106bd5780634c784efa146106d0576104ec565b8063219653511161046d578063313ce56711610431578063395093511161040b578063395093511461063e57806341280008146106515780634412c22314610671576104ec565b8063313ce5671461060e578063358cfda21461062357806337d543c414610636576104ec565b806321965351146105b7578063235d8232146105ca57806323b872dd146105dd57806329f911a6146105f05780632b112e49146105f8576104ec565b80630ab9411b116104b45780630ab9411b1461056c5780630c3d29a21461058157806312644acb1461058957806313fe0dd61461059c57806318160ddd146105af576104ec565b8063026b1d5f146104f15780630663ddcc1461050f57806306fdde031461052457806308f822f614610539578063095ea7b31461054c575b600080fd5b6104f9610a54565b604051610506919061496a565b60405180910390f35b61052261051d366004614918565b610a63565b005b61052c610aef565b60405161050691906149d8565b6105226105473660046148c7565b610b84565b61055f61055a36600461489c565b610c98565b60405161050691906149b1565b610574610cb6565b604051610506919061550e565b610574610cff565b61052261059736600461489c565b610d7c565b6105746105aa366004614760565b610fe1565b61057461106a565b61055f6105c5366004614760565b611070565b6105226105d836600461489c565b611094565b61055f6105eb3660046147d0565b61123a565b6105746112b1565b6106006112c3565b604051610506929190615517565b6106166113a0565b6040516105069190615525565b6105226106313660046148c7565b6113af565b61057461140f565b61055f61064c36600461489c565b611415565b61066461065f366004614798565b611464565b60405161050691906149ca565b61057461067f3660046148c7565b61150c565b610522610692366004614918565b611611565b6105226106a5366004614918565b611692565b61055f6106b8366004614760565b611710565b6105226106cb366004614868565b61172e565b6105226106de366004614760565b611793565b6105226117fc565b6105226106f93660046148c7565b6118b0565b61052261070c366004614760565b61190f565b610574611a39565b610574611a64565b61055f61072f366004614798565b611a9c565b6105746107423660046148c7565b611b00565b61055f611bc6565b61057461075d366004614760565b611bf0565b6105226107703660046148c7565b611c0e565b610574611ca6565b61057461078b366004614760565b611cac565b610522611d0d565b610574611da4565b61055f6107ae3660046148c7565b611db6565b6105226107c13660046148c7565b611de3565b6105226107d4366004614918565b61206b565b6105226120e5565b6105746107ef366004614760565b612740565b6105226108023660046148c7565b61277f565b61080f6127ec565b60405161050691906149bc565b6105226127f5565b61052261283c565b6105226128b0565b6104f9612a61565b610574612a75565b6105226108523660046148c7565b612aaa565b61052c612b9b565b61052261086d3660046148c7565b612bad565b61055f61088036600461489c565b612c37565b61055f61089336600461489c565b612c86565b610522612c93565b6104f9612d0c565b6105226108b63660046148c7565b612d1b565b61080f6108c93660046147d0565b612ea8565b6108d6612f20565b60405161050691906153e5565b6108f66108f1366004614810565b612fc6565b604051610506939291906154a2565b610522610913366004614918565b61318f565b6105746109263660046148c7565b613203565b6104f96132e4565b6104f96132f3565b610522610949366004614918565b613302565b61052261095c366004614760565b613380565b61057461096f3660046148f7565b61341f565b610522610982366004614760565b61342b565b610522610995366004614760565b6134f8565b61057461358c565b6105746109b0366004614798565b613592565b6104f96135bd565b6105226109cb366004614918565b6135cc565b61052261364f565b6105226109e6366004614868565b6137f7565b6105226109f9366004614918565b61385c565b610522610a0c366004614760565b6138d8565b6104f961395a565b610574613969565b610522610a2f366004614918565b61397f565b610a47610a42366004614760565b6139fe565b6040516105069190615373565b6001546001600160a01b031690565b610a6b613a95565b60235461010090046001600160a01b03908116911614610aa65760405162461bcd60e51b8152600401610a9d90614fd1565b60405180910390fd5b60058160ff1611610ac95760405162461bcd60e51b8152600401610a9d90614b80565b6012805460ff90921666010000000000000266ff00000000000019909216919091179055565b606060006020018054610b01906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906156d0565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b610b8c613a95565b60235461010090046001600160a01b03908116911614610bbe5760405162461bcd60e51b8152600401610a9d90614fd1565b4260265410610bdf5760405162461bcd60e51b8152600401610a9d90614cc6565b6000610be9611da4565b610bf39083615671565b6005546001600160a01b03166000908152601c6020526040812060030180549293508392909190610c259084906156b9565b9091555050600a546001600160a01b03166000908152601c602052604081206003018054839290610c57908490615533565b90915550506040517fcb78204ddf35079782f7e64e0550726f3e21fc3773f225dadb8708a2ed5fb75190610c8c90849061550e565b60405180910390a15050565b6000610cac610ca5613a95565b8484613a99565b5060015b92915050565b6000610cc0611da4565b601c6000610ccc6132e4565b6001600160a01b03166001600160a01b0316815260200190815260200160002060030154610cfa919061554b565b905090565b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610d4457600080fd5b505afa158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa91906148df565b3360009081526025602052604090205460ff1680610db25750610d9d612a61565b6001600160a01b0316336001600160a01b0316145b610dce5760405162461bcd60e51b8152600401610a9d90614c30565b6000544290610100900460ff1615610df85760405162461bcd60e51b8152600401610a9d90614ea5565b6001600160a01b0383166000908152601c60205260409020600401548190610e239062015180615533565b10610e405760405162461bcd60e51b8152600401610a9d90614b49565b610e4983611070565b15610e665760405162461bcd60e51b8152600401610a9d90615277565b60648211158015610e775750600082115b610e935760405162461bcd60e51b8152600401610a9d90614e25565b6000610e9e84612740565b9050602954811115610eb35750602954610ebf565b60008111610ebf575060015b6005546001600160a01b03166000908152601c602052604081206003015482908590610eef90620186a09061554b565b610ef99190615671565b610f039190615671565b6005546001600160a01b03166000908152601c6020526040812060030180549293508392909190610f359084906156b9565b90915550506001600160a01b0385166000908152601c602052604081206003018054839290610f65908490615533565b90915550506001600160a01b0385166000908152601c602052604081204260048201556005018054869290610f9b908490615533565b90915550506040517fdb007e93c45ce72d2a719188d2b08b4c17f80653ac7624d83431bfa5715320a690610fd29087908490614998565b60405180910390a15050505050565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061101290859060040161496a565b60206040518083038186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106291906148df565b90505b919050565b600b5490565b6001600160a01b03166000908152601c602052604090205462010000900460ff1690565b3360009081526025602052604090205460ff16806110ca57506110b5612a61565b6001600160a01b0316336001600160a01b0316145b6110e65760405162461bcd60e51b8152600401610a9d90614c30565b6000544290610100900460ff16156111105760405162461bcd60e51b8152600401610a9d90614ea5565b6001600160a01b0383166000908152601c6020526040902060060154819061113b9062015180615533565b106111585760405162461bcd60e51b8152600401610a9d90614f9a565b61116183611070565b1561117e5760405162461bcd60e51b8152600401610a9d90615277565b6103e882111580156111905750600082115b6111ac5760405162461bcd60e51b8152600401610a9d906150b2565b6001600160a01b0383166000908152601c6020526040812060050180548492906111d7908490615533565b90915550506001600160a01b0383166000908152601c60205260409081902042600690910155517f3b7cda1261f5c43e1022832b581103320671193233be8f67412e7566656b4b809061122d9085908590614998565b60405180910390a1505050565b6000611247848484613b4d565b506112a684611254613a95565b6001600160a01b0387166000908152601d602052604081208691611276613a95565b6001600160a01b03166001600160a01b03168152602001908152602001600020546112a191906156b9565b613a99565b5060015b9392505050565b600b54600090610cfa9060649061554b565b600c54600b546000918291825b6112da6021613dcf565b81101561136c5760006112ee602183613dda565b6001600160a01b0381166000908152601c602052604090206003810154600290910154919250908582118061132257508481115b1561133e575050600c54600b54909650945061139c9350505050565b61134882876156b9565b955061135481866156b9565b9450505050808061136490615705565b9150506112d0565b50600b54600c5461137d919061554b565b821015611396575050600c54600b54909250905061139c565b90925090505b9091565b60005462010000900460ff1690565b6113b7613a95565b60235461010090046001600160a01b039081169116146113e95760405162461bcd60e51b8152600401610a9d90614fd1565b61012c811161140a5760405162461bcd60e51b8152600401610a9d9061514a565b601355565b60285481565b6000610cac611422613a95565b8484601d6000611430613a95565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546112a19190615533565b6001600160a01b038083166000908152601c6020526040808220549284168252812054909160ff620100009182900481169291909104168180156114a6575080155b156114b45760009250611504565b811580156114bf5750805b156114cd5760019250611504565b811580156114d9575080155b156114e75760039250611504565b8180156114f15750805b156114ff5760029250611504565b600392505b505092915050565b6007546001600160a01b03166000908152601c602052604081206002015461153560648261554b565b831061155957601254611552906301000000900460ff168261554b565b915061160b565b61156460c88261554b565b831061158f57601254611582906301000000900460ff166002615690565b6115529060ff168261554b565b61159b6101f48261554b565b83106115b957601254611582906301000000900460ff166003615690565b6115c56103e88261554b565b83106115e357601254611582906301000000900460ff166004615690565b6012546115fb906301000000900460ff166005615690565b6116089060ff168261554b565b91505b50919050565b611619613a95565b60235461010090046001600160a01b0390811691161461164b5760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff161161166e5760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff909216650100000000000265ff000000000019909216919091179055565b61169a613a95565b60235461010090046001600160a01b039081169116146116cc5760405162461bcd60e51b8152600401610a9d90614fd1565b60028160ff1610156116f05760405162461bcd60e51b8152600401610a9d906151b2565b6000805460ff90921663010000000263ff00000019909216919091179055565b6001600160a01b03166000908152601c602052604090205460ff1690565b611736613a95565b60235461010090046001600160a01b039081169116146117685760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b61179b613a95565b60235461010090046001600160a01b039081169116146117cd5760405162461bcd60e51b8152600401610a9d90614fd1565b600980546001600160a01b0319166001600160a01b0392909216919091179055602a805460ff19166001179055565b6024546001600160a01b031633146118265760405162461bcd60e51b8152600401610a9d9061508c565b602480546001600160a01b031916905561183e613a95565b6023546040516001600160a01b0392831692610100909204909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3611888613a95565b602360016101000a8154816001600160a01b0302191690836001600160a01b03160217905550565b6118b8613a95565b60235461010090046001600160a01b039081169116146118ea5760405162461bcd60e51b8152600401610a9d90614fd1565b603c811161190a5760405162461bcd60e51b8152600401610a9d90614f02565b601b55565b611917613a95565b60235461010090046001600160a01b039081169116146119495760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b0381166000908152601c602052604090205462010000900460ff16156119885760405162461bcd60e51b8152600401610a9d90614d1f565b6001600160a01b0381166000908152601c60205260409020805462ff00001916620100001781556003015415611a03576119c0611da4565b6001600160a01b0382166000908152601c60205260409020600301546119e6919061554b565b6001600160a01b0382166000908152601c60205260409020600201555b6001600160a01b0381166000908152601c60205260409020805462ff0000191662010000179055611a35602182613de6565b5050565b6007546001600160a01b03166000908152601c6020526040812060020154610cfa906101f49061554b565b6012546007546001600160a01b03166000908152601c60205260408120600201549091610cfa91600160401b90910460ff169061554b565b6008546000906001600160a01b0384811691161415611abd57506001610cb0565b6001600160a01b0383166000908152601c602052604090205460ff16806112aa5750506001600160a01b03166000908152601c602052604090205460ff16919050565b600080600160235460ff166002811115611b2a57634e487b7160e01b600052602160045260246000fd5b148015611b38575060175483115b15611b4d57611b468361150c565b9050611b93565b600060235460ff166002811115611b7457634e487b7160e01b600052602160045260246000fd5b148015611b82575060175483115b15611b8f57611b46611a39565b5060005b6007546001600160a01b03166000908152601c60205260409020600201548111611bbd5780611608565b50600092915050565b601354336000908152601c602052604081206001015490914291611bea9190615533565b10905090565b6001600160a01b03166000908152601c602052604090206005015490565b602a5460ff16611c5557611c20612a61565b6001600160a01b0316336001600160a01b031614611c505760405162461bcd60e51b8152600401610a9d906150e9565b611c7f565b6009546001600160a01b03163314611c7f5760405162461bcd60e51b8152600401610a9d906150e9565b601454811415611ca15760405162461bcd60e51b8152600401610a9d90614dee565b601455565b60115490565b6000611cb782611070565b611cee57611cc3611da4565b6001600160a01b0383166000908152601c6020526040902060030154611ce9919061554b565b611062565b506001600160a01b03166000908152601c602052604090206002015490565b611d15613a95565b60235461010090046001600160a01b03908116911614611d475760405162461bcd60e51b8152600401610a9d90614fd1565b60235460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36023805474ffffffffffffffffffffffffffffffffffffffff0019169055565b600b54600c54600091610cfa9161554b565b60008054611dce9062010000900460ff16600a6155a5565b601754611ddb9190615671565b909111919050565b600054610100900460ff1615611e0b5760405162461bcd60e51b8152600401610a9d90614ea5565b611e1433611070565b15611e315760405162461bcd60e51b8152600401610a9d90614d56565b6000611e3b611da4565b611e459083615671565b601354336000908152601c60205260409020600101549192504291611e6a9190615533565b10611e875760405162461bcd60e51b8152600401610a9d9061533c565b60008211611ea75760405162461bcd60e51b8152600401610a9d906152ba565b6012546007546001600160a01b03166000908152601c6020526040902060030154611edc91600160401b900460ff169061554b565b811115611efb5760405162461bcd60e51b8152600401610a9d90614f63565b336000908152601c602052604081204260019091018190559054601454630100000090910460ff16914391611f309190615533565b611f3a9190615533565b611f449190615720565b611fe0576007546001600160a01b03166000908152601c602052604081206003018054839290611f759084906156b9565b9091555050336000908152601c602052604081206003018054839290611f9c908490615533565b90915550506040517f757836b3ce7ad0e51b0fe4bed57c1b672ab1b831cecd483669e298099ce33c3390611fd39033908590614998565b60405180910390a1611a35565b336000908152601c6020526040812060030180548392906120029084906156b9565b90915550506007546001600160a01b03166000908152601c602052604081206003018054839290612034908490615533565b90915550506040517fa77497b556f4aea76b14ecf80e749b85a2b4562f73ca2adf6764583c5d59b08390610c8c9033908590614998565b612073613a95565b60235461010090046001600160a01b039081169116146120a55760405162461bcd60e51b8152600401610a9d90614fd1565b600a8160ff1610156120c95760405162461bcd60e51b8152600401610a9d90614f2c565b6012805460ff9092166101000261ff0019909216919091179055565b60005460ff16156121085760405162461bcd60e51b8152600401610a9d9061503e565b60008054600160ff199091161762ff000019166212000017905560408051808201909152600680825265444f4749524160d01b602090920191825261214f91601f916145c8565b5060408051808201909152601d8082527f646f676972612e6c6f6c207c7c20646f676972612e6574682e6c696e6b000000602092830190815261219292916145c8565b506000546121aa9062010000900460ff16600a6155a5565b6121b8906305f5e100615671565b600b556121cb6305f5e100600019615720565b6121d7906000196156b9565b6000600b01600101819055506014600060120160000160006101000a81548160ff021916908360ff1602179055506014600060120160000160016101000a81548160ff021916908360ff1602179055506032600060120160000160036101000a81548160ff021916908360ff1602179055506064600060120160000160026101000a81548160ff021916908360ff1602179055506032600060120160000160056101000a81548160ff021916908360ff1602179055506032600060120160000160046101000a81548160ff021916908360ff1602179055506064600060120160000160076101000a81548160ff021916908360ff1602179055506064600060120160000160086101000a81548160ff021916908360ff160217905550610e10600060120160010181905550600a600060120160000160066101000a81548160ff021916908360ff16021790555060046000800160036101000a81548160ff021916908360ff1602179055506907695a92c20d6fe000006000601701819055506040516123629061464c565b604051809103906000f08015801561237e573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b03929092169190911790556040516123ab9061464c565b604051809103906000f0801580156123c7573d6000803e3d6000fd5b50600780546001600160a01b039283166001600160a01b031991821617909155600280548216737a250d5630b4cf539739df2c5dacb4c659f2488d17908190556005805490921673fedd9544b47a6d4a1967d385575866bd6f7a2b3717909155604080516315ab88c960e31b81529051919092169163ad5c4648916004828101926020929190829003018186803b15801561246157600080fd5b505afa158015612475573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612499919061477c565b600380546001600160a01b0319166001600160a01b039283161790556002546040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b1580156124f257600080fd5b505afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a919061477c565b6003546040516364e329cb60e11b81526001600160a01b039283169263c9c653969261255e9230929091169060040161497e565b602060405180830381600087803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b0919061477c565b600180546001600160a01b039283166001600160a01b0319909116178155601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f849805460ff19908116831790915533600090815260408082208054909316841790925591549092168152908120805461ff001916610100179055600c5461263c9060059061554b565b600c549091506000906126509083906156b9565b336000908152601c60205260409020600301819055905061267260048361554b565b61267c90836156b9565b6027908155600580546001600160a01b039081166000908152601c6020526040808220805460ff1916600117905593549254909116815291909120600301556126c660048361554b565b6007546001600160a01b03166000908152601c6020526040902060030155600b546126f39060149061554b565b6007546001600160a01b03166000908152601c6020526040812060020191909155805461ff001916610100179055610258601b55600a602955612739426203f480615533565b6026555050565b6001600160a01b0381166000908152601c6020526040812060050154612769906103e890615720565b905080156127775780611062565b506001919050565b612787613a95565b60235461010090046001600160a01b039081169116146127b95760405162461bcd60e51b8152600401610a9d90614fd1565b600a81101580156127cb575060648111155b6127e75760405162461bcd60e51b8152600401610a9d9061522d565b602955565b60235460ff1690565b6127fd613a95565b60235461010090046001600160a01b0390811691161461282f5760405162461bcd60e51b8152600401610a9d90614fd1565b6000805461ff0019169055565b612844613a95565b60235461010090046001600160a01b039081169116146128765760405162461bcd60e51b8152600401610a9d90614fd1565b6024546001600160a01b031661289e5760405162461bcd60e51b8152600401610a9d90614b1f565b602480546001600160a01b0319169055565b600054610100900460ff16156128d85760405162461bcd60e51b8152600401610a9d90614ea5565b601b54601a5442916128e991615533565b106129065760405162461bcd60e51b8152600401610a9d90614e6e565b6001546001600160a01b03166000908152601c602052604081206003015460125490919061293f90640100000000900460ff168361554b565b9050600061294b611da4565b612955908361554b565b6001546001600160a01b03166000908152601c60205260408120600301805492935084929091906129879084906156b9565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84c80548492906129c7908490615533565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84b8054839290612a07908490615533565b909155505060118054829190600090612a21908490615533565b909155505042601a55612a32612c93565b7f4acb597af16b6650a7028129045cb4d1779b97e359b0956584faa8892a4ec4b98160405161122d919061550e565b60235461010090046001600160a01b031690565b601b54601a546000918291612a8a9190615533565b9050804211612a9a576000612aa4565b612aa481426156b9565b91505090565b336000612ab5611da4565b9050612ac082611070565b15612add5760405162461bcd60e51b8152600401610a9d906152f1565b6001600160a01b0382166000908152601c6020526040902060030154612b038285615671565b10612b205760405162461bcd60e51b8152600401610a9d90614a2b565b612b2a8184615671565b6001600160a01b0383166000908152601c602052604081206003018054909190612b559084906156b9565b90915550612b6590508184615671565b600c8054600090612b779084906156b9565b909155505060108054849190600090612b91908490615533565b9091555050505050565b60606000601f018054610b01906156d0565b612bb5613a95565b60235461010090046001600160a01b03908116911614612be75760405162461bcd60e51b8152600401610a9d90614fd1565b69021e19e0c9bab24000008111612c105760405162461bcd60e51b8152600401610a9d90614ecb565b600054612c279062010000900460ff16600a6155a5565b612c319082615671565b60175550565b6000610cac612c44613a95565b8484601d6000612c52613a95565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546112a191906156b9565b60006112a6338484613b4d565b600154604080517ffff6cae900000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163fff6cae99160048082019260009290919082900301818387803b158015612cf257600080fd5b505af1158015612d06573d6000803e3d6000fd5b50505050565b6002546001600160a01b031690565b336000612d26611da4565b9050612d3182611070565b15612d4e5760405162461bcd60e51b8152600401610a9d906152f1565b6001600160a01b0382166000908152601c6020526040902060030154612d748285615671565b10612d915760405162461bcd60e51b8152600401610a9d90614a2b565b612d9b8184615671565b6001600160a01b0383166000908152601c602052604081206003018054909190612dc69084906156b9565b90915550612dd690508184615671565b6000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84c8054909190612e11908490615533565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84b8054859290612e51908490615533565b909155505060118054849190600090612e6b908490615533565b90915550612e799050612c93565b7f5cda1501a74cd6ec9eb0a1315d6d11eb8f609345603746a5d2e3af97f4aac7ba8360405161122d919061550e565b6001600160a01b0383166000908152601c6020526040812054610100900460ff1615612ee857600f548214612edf57506002612ee3565b5060005b6112aa565b6001600160a01b0383166000908152601c6020526040902054610100900460ff1615612f16575060016112aa565b5060029392505050565b612f28614658565b50604080516101408101825260125460ff8082168352610100808304821660208501526201000083048216948401949094526301000000820481166060840152640100000000820481166080840152650100000000008204811660a084015266010000000000008204811660c08401526701000000000000008204811660e0840152600160401b909104169181019190915260135461012082015290565b612fce6146ac565b600080612fdc888886612ea8565b9150612fe88888611464565b8684529050846131415760125461300e908790670100000000000000900460ff1661341f565b604084015260125461302a90879062010000900460ff1661341f565b60c0840152600182600281111561305157634e487b7160e01b600052602160045260246000fd5b14156130b657601254600090613070908890610100900460ff1661341f565b90506000811561309f576029546130868b612740565b6130909084615671565b61309a919061554b565b6130a2565b60005b90506130ae81836156b9565b608086015250505b60008260028111156130d857634e487b7160e01b600052602160045260246000fd5b1415613141576130eb8661096f88613203565b606084015260006130fb87611b00565b90506000811561312a576029546131118a612740565b61311b9084615671565b613125919061554b565b61312d565b60005b90506131398183615533565b60a086015250505b60c0830151606084015160808501516040860151865161316191906156b9565b61316b91906156b9565b61317591906156b9565b61317f91906156b9565b6020840152955095509592505050565b613197613a95565b60235461010090046001600160a01b039081169116146131c95760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff1610156131ed5760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff191660ff92909216919091179055565b600b54600090819061321884620186a0615671565b613222919061554b565b9050600181101561323a57505060125460ff16611065565b6103e8811061325f576012546132549060ff166005615690565b60ff16915050611065565b600a81101580156132705750606481105b15613286576012546132549060ff166002615690565b6064811015801561329857506101f481105b156132ae576012546132549060ff166003615690565b6101f481101580156132c157506103e881105b156132d7576012546132549060ff166004615690565b505060125460ff16611065565b6007546001600160a01b031690565b6003546001600160a01b031690565b61330a613a95565b60235461010090046001600160a01b0390811691161461333c5760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff1610156133605760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff90921663010000000263ff00000019909216919091179055565b613388613a95565b60235461010090046001600160a01b039081169116146133ba5760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b0381166000908152601c602052604090205462010000900460ff166133f85760405162461bcd60e51b8152600401610a9d90614d1f565b6001600160a01b0381166000908152601c6020526040812060020155611a35602182613dfb565b60006112aa828461554b565b613433613a95565b60235461010090046001600160a01b039081169116146134655760405162461bcd60e51b8152600401610a9d90614fd1565b600a546001600160a01b03161561348e5760405162461bcd60e51b8152600401610a9d90614d8d565b803b806134ad5760405162461bcd60e51b8152600401610a9d90614c8f565b600a80546001600160a01b0319166001600160a01b0384161790556040517fbfca0af3a33c0bcae29f7d07934c90e392c5d6c2ba686ce898528ee63bea8f5290610c8c90849061496a565b613500613a95565b60235461010090046001600160a01b039081169116146135325760405162461bcd60e51b8152600401610a9d90614fd1565b602a54610100900460ff1661358957600880546001600160a01b0383166001600160a01b031990911681179091556000908152601c60205260409020805460ff19166001179055602a805461ff0019166101001790555b50565b60105490565b6001600160a01b039182166000908152601d6020908152604080832093909416825291909152205490565b6024546001600160a01b031690565b6135d4613a95565b60235461010090046001600160a01b039081169116146136065760405162461bcd60e51b8152600401610a9d90614fd1565b60328160ff16101561362a5760405162461bcd60e51b8152600401610a9d90614ad2565b6012805460ff909216600160401b0268ff000000000000000019909216919091179055565b600054610100900460ff16156136775760405162461bcd60e51b8152600401610a9d90614ea5565b601b54601a54429161368891615533565b106136a55760405162461bcd60e51b8152600401610a9d90614e6e565b60006136af611da4565b601154909150600090156136c5576011546136c9565b600b545b6012549091506000906136e89065010000000000900460ff168361554b565b60115490915081101561379b576011805482919060009061370a9084906156b9565b9091555061371a90508382615671565b6000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84c80549091906137559084906156b9565b90915550506000808052601c6020527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84b80548392906137959084906156b9565b90915550505b6137a58382615671565b600c80546000906137b79084906156b9565b909155505042601a556137c8612c93565b7f4d0885014b9e2b7d05af2e851acb4501f546c37f2670e4c3c2c87681d98c1b418160405161122d919061550e565b6137ff613a95565b60235461010090046001600160a01b039081169116146138315760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b613864613a95565b60235461010090046001600160a01b039081169116146138965760405162461bcd60e51b8152600401610a9d90614fd1565b60328160ff1610156138ba5760405162461bcd60e51b8152600401610a9d90614c58565b6012805460ff909216620100000262ff000019909216919091179055565b6138e0613a95565b60235461010090046001600160a01b039081169116146139125760405162461bcd60e51b8152600401610a9d90614fd1565b6001600160a01b0381166139385760405162461bcd60e51b8152600401610a9d90614ba8565b602480546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031690565b6000613973611da4565b601c6000610ccc61395a565b613987613a95565b60235461010090046001600160a01b039081169116146139b95760405162461bcd60e51b8152600401610a9d90614fd1565b60148160ff16116139dc5760405162461bcd60e51b8152600401610a9d90615113565b6012805460ff9092166401000000000264ff0000000019909216919091179055565b613a066146e9565b506001600160a01b03166000908152601c6020908152604091829020825161012081018452815460ff80821615158352610100808304821615159584019590955262010000909104161515938101939093526001810154606084015260028101546080840152600381015460a0840152600481015460c0840152600581015460e0840152600601549082015290565b3390565b6001600160a01b038316613abf5760405162461bcd60e51b8152600401610a9d906151e9565b6001600160a01b038216613ae55760405162461bcd60e51b8152600401610a9d90614bee565b6001600160a01b038084166000818152601d602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613b4090859061550e565b60405180910390a3505050565b60006001600160a01b038416613b755760405162461bcd60e51b8152600401610a9d9061516d565b6001600160a01b038316613b9b5760405162461bcd60e51b8152600401610a9d90614a8f565b60008211613bbb5760405162461bcd60e51b8152600401610a9d90614ff5565b6001546001600160a01b0385811691161415613bf957600054610100900460ff1615613bf95760405162461bcd60e51b8152600401610a9d90614ce8565b6005546001600160a01b0385811691161415613c9e576014602754613c1e919061554b565b821115613c3d5760405162461bcd60e51b8152600401610a9d90614a2b565b4260285462015180613c4f9190615533565b10613c6c5760405162461bcd60e51b8152600401610a9d90614cc6565b6001546001600160a01b03848116911614613c995760405162461bcd60e51b8152600401610a9d90614db7565b426028555b6000613caa8585611a9c565b90506000613cb6611da4565b90506000613cc2610cff565b90506000806000613cd68a8a8a8988612fc6565b600f87905591945092509050613cee89868486613e10565b613cfb8a8a87868561418c565b604083015160108054600090613d12908490615533565b90915550506040830151613d27908690615671565b600c8054600090613d399084906156b9565b90915550506023805483919060ff19166001836002811115613d6b57634e487b7160e01b600052602160045260246000fd5b0217905550886001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560200151604051613db7919061550e565b60405180910390a35060019998505050505050505050565b6000611062826143ec565b60006112aa83836143f0565b60006112aa836001600160a01b038416614449565b60006112aa836001600160a01b038416614493565b828160c00151613e209190615671565b6005546001600160a01b03166000908152601c602052604081206003018054909190613e4d908490615533565b9091555060019050826002811115613e7557634e487b7160e01b600052602160045260246000fd5b1415613ef557828160800151613e8b9190615671565b6007546001600160a01b03166000908152601c602052604081206003018054909190613eb8908490615533565b909155505060808101516007546001600160a01b03166000908152601c602052604081206002018054909190613eef908490615533565b90915550505b6000826002811115613f1757634e487b7160e01b600052602160045260246000fd5b1415612d065760188054906000613f2d83615705565b91905055506000838260600151613f449190615671565b601254601854919250613f6591660100000000000090910460ff1690615720565b61402c576006546001600160a01b03166000908152601c6020526040812060030154613f92908390615533565b600680546001600160a01b039081166000908152601c60205260408082206003908101839055935483168252808220600201829055918a16815290812090910180549293508392909190613fe7908490615533565b90915550506040517f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e209061401e9088908490614998565b60405180910390a150614096565b6006546001600160a01b03166000908152601c602052604081206003018054839290614059908490615533565b909155505060608201516006546001600160a01b03166000908152601c602052604081206002018054909190614090908490615533565b90915550505b6000848360a001516140a89190615671565b6007546001600160a01b03166000908152601c60205260408120600301805492935083929091906140da9084906156b9565b909155505060a08301516007546001600160a01b03166000908152601c6020526040812060020180549091906141119084906156b9565b90915550506001600160a01b0386166000908152601c602052604081206003018054839290614141908490615533565b909155505060a08301516040517f9cf92e896d7fce8c4a7600daa08f0a39e68eb99cd4413843df33e0fdb75535389161417c91899190614998565b60405180910390a1505050505050565b60018160038111156141ae57634e487b7160e01b600052602160045260246000fd5b141561426e5781516141c1908490615671565b6001600160a01b0386166000908152601c6020526040812060030180549091906141ec9084906156b9565b90915550506020808301516001600160a01b0386166000908152601c90925260408220600201805491929091614223908490615533565b90915550506020820151614238908490615671565b6001600160a01b0385166000908152601c602052604081206003018054909190614263908490615533565b909155506143e59050565b600081600381111561429057634e487b7160e01b600052602160045260246000fd5b14156143005781516001600160a01b0386166000908152601c6020526040812060020180549091906142c39084906156b9565b909155505081516142d5908490615671565b6001600160a01b0386166000908152601c6020526040812060030180549091906142239084906156b9565b600281600381111561432257634e487b7160e01b600052602160045260246000fd5b14156143675781516001600160a01b0386166000908152601c6020526040812060020180549091906143559084906156b9565b909155505081516141c1908490615671565b8151614374908490615671565b6001600160a01b0386166000908152601c60205260408120600301805490919061439f9084906156b9565b909155505060208201516143b4908490615671565b6001600160a01b0385166000908152601c6020526040812060030180549091906143df908490615533565b90915550505b5050505050565b5490565b815460009082106144135760405162461bcd60e51b8152600401610a9d90614a4d565b82600001828154811061443657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600061445583836145b0565b61448b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610cb0565b506000610cb0565b600081815260018301602052604081205480156145a65760006144b76001836156b9565b85549091506000906144cb906001906156b9565b905060008660000182815481106144f257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061452357634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561453a836001615533565b6000828152600189016020526040902055865487908061456a57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610cb0565b6000915050610cb0565b60009081526001919091016020526040902054151590565b8280546145d4906156d0565b90600052602060002090601f0160209004810192826145f6576000855561463c565b82601f1061460f57805160ff191683800117855561463c565b8280016001018555821561463c579182015b8281111561463c578251825591602001919060010190614621565b5061464892915061473b565b5090565b605c8061578c83390190565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000151581526020016000151581526020016000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115614648576000815560010161473c565b8035801515811461106557600080fd5b600060208284031215614771578081fd5b81356112aa81615776565b60006020828403121561478d578081fd5b81516112aa81615776565b600080604083850312156147aa578081fd5b82356147b581615776565b915060208301356147c581615776565b809150509250929050565b6000806000606084860312156147e4578081fd5b83356147ef81615776565b925060208401356147ff81615776565b929592945050506040919091013590565b600080600080600060a08688031215614827578081fd5b853561483281615776565b9450602086013561484281615776565b93506040860135925061485760608701614750565b949793965091946080013592915050565b6000806040838503121561487a578182fd5b823561488581615776565b915061489360208401614750565b90509250929050565b600080604083850312156148ae578182fd5b82356148b981615776565b946020939093013593505050565b6000602082840312156148d8578081fd5b5035919050565b6000602082840312156148f0578081fd5b5051919050565b60008060408385031215614909578182fd5b50508035926020909101359150565b600060208284031215614929578081fd5b813560ff811681146112aa578182fd5b15159052565b6003811061494f5761494f615760565b9052565b6004811061494f5761494f615760565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60208101610cb0828461493f565b60208101610cb08284614953565b6000602080835283518082850152825b81811015614a04578581018301518582016040015282016149e8565b81811115614a155783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600890820152670e8dede40daeac6d60c31b604082015260600190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602d908201527f63616e2774206265206d6f7265207468616e203225206f66207468652062757960408201526c20626f6e757320737570706c7960981b606082015260800190565b60208082526010908201526f3737903832b73234b7339037bbb732b960811b604082015260600190565b6020808252601b908201527f6e696365207368696c6c20627574206e65656420746f20776169740000000000604082015260600190565b6020808252600e908201526d746f6f206665772070656f706c6560901b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252600e908201526d34b73b30b634b21031b0b63632b960911b604082015260600190565b60208082526015908201527f63616e2774206265206d6f7265207468616e2032250000000000000000000000604082015260600190565b60208082526012908201527f6d757374206265206120636f6e74726163740000000000000000000000000000604082015260600190565b6020808252600890820152673a37b79039b7b7b760c11b604082015260600190565b60208082526014908201527f5472616e73666572732061726520706175736564000000000000000000000000604082015260600190565b6020808252601b908201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604082015260600190565b60208082526013908201527f6578636c756465642063616e27742063616c6c00000000000000000000000000604082015260600190565b60208082526010908201526f19985c9b48185b1c9958591e481cd95d60821b604082015260600190565b6020808252601d908201527f63616e206f6e6c792073656c6c20746f20756e697377617020706f6f6c000000604082015260600190565b6020808252601c908201527f63616e277420757365207468652073616d65206f6e6520747769636500000000604082015260600190565b60208082526029908201527f63616e2774206265206d6f7265207468616e202e3125206f6620646f676563696040820152681d1e481c995dd85c9960ba1b606082015260800190565b60208082526012908201527f446f6769726120636f6f6c696e67646f776e0000000000000000000000000000604082015260600190565b6020808252600c908201526b1cdd1a5b1b081c185d5cd95960a21b604082015260600190565b6020808252601d908201527f63616e2774206265206c657373207468616e2031306b20746f6b656e73000000604082015260600190565b60208082526010908201526f746f6f2073686f727420612074696d6560801b604082015260600190565b60208082526016908201527f63616e2774206265206d6f7265207468616e2031302500000000000000000000604082015260600190565b60208082526012908201527f63616e2774206b656b20746f6f206d7563680000000000000000000000000000604082015260600190565b6020808252601a908201527f6e6963652068656c7020627574206e65656420746f2077616974000000000000604082015260600190565b6020808252600a90820152694f776e6572206f6e6c7960b01b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600c908201526b63616e6e6f7420636c61696d60a01b604082015260600190565b6020808252601f908201527f63616e2774206265206d6f7265207468616e20612066756c6c206c6576656c00604082015260600190565b60208082526010908201526f3737ba103b30b634b21031b0b63632b960811b604082015260600190565b60208082526015908201527f63616e2774206265206d6f7265207468616e2035250000000000000000000000604082015260600190565b602080825260099082015268746f6f20717569636b60b81b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526018908201527f63616e2774206265206d6f7265207468616e2035302f35300000000000000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602a908201527f63616e2774206265206c6f776572207468616e203130206f7220677265617465604082015269072207468616e203130360b41b606082015260800190565b60208082526023908201527f6578636c75646564206164647265737365732063616e2774206265206177617260408201526219195960ea1b606082015260800190565b60208082526014908201527f646f6e277420776173746520796f757220676173000000000000000000000000604082015260600190565b6020808252602b908201527f4578636c75646564206164647265737365732063616e27742063616c6c20746860408201526a34b990333ab731ba34b7b760a91b606082015260800190565b60208082526018908201527f796f75206e65656420746f207761697420746f20646f67650000000000000000604082015260600190565b60006101208201905082511515825260208301511515602083015260408301516153a06040840182614939565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525092915050565b6000610140820190506153f9828451614963565b602083015161540b6020840182614963565b50604083015161541e6040840182614963565b5060608301516154316060840182614963565b5060808301516154446080840182614963565b5060a083015161545760a0840182614963565b5060c083015161546a60c0840182614963565b5060e083015161547d60e0840182614963565b506101008084015161549182850182614963565b505061012092830151919092015290565b600061012082019050845182526020850151602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c08301526154f860e083018561493f565b615506610100830184614953565b949350505050565b90815260200190565b918252602082015260400190565b60ff91909116815260200190565b6000821982111561554657615546615734565b500190565b60008261555a5761555a61574a565b500490565b80825b6001808611615571575061559c565b81870482111561558357615583615734565b8086161561559057918102915b9490941c938002615562565b94509492505050565b60006112aa60001960ff8516846000826155c1575060016112aa565b816155ce575060006112aa565b81600181146155e457600281146155ee5761561b565b60019150506112aa565b60ff8411156155ff576155ff615734565b6001841b91508482111561561557615615615734565b506112aa565b5060208310610133831016604e8410600b8410161715615649575081810a83811115612ee357612ee3615734565b615656848484600161555f565b80860482111561566857615668615734565b02949350505050565b600081600019048311821515161561568b5761568b615734565b500290565b600060ff821660ff84168160ff04811182151516156156b1576156b1615734565b029392505050565b6000828210156156cb576156cb615734565b500390565b6002810460018216806156e457607f821691505b6020821081141561160b57634e487b7160e01b600052602260045260246000fd5b600060001982141561571957615719615734565b5060010190565b60008261572f5761572f61574a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038116811461358957600080fdfe6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220135137c4ade22b7f735777a2fc6c8efcb1b9117c246593f293cc61b07449f50d64736f6c63430008010033a26469706673582212202409d15672711167790a9a314fc6e4e6aeb24643a29176294734248b3501add164736f6c63430008010033

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.