ETH Price: $2,370.25 (-0.80%)

Token

Puppies Network (PPN)
 

Overview

Max Total Supply

1,000,000,000,000,000 PPN

Holders

312

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
150,381,654,485.840963178 PPN

Value
$0.00
0xcb7cf158db32e0f508b275486f8533081d559b54
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:
PuppyToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 8 of 9: PuppyToken.sol
pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./Ownable.sol";
import "./IUniswapV2Router02.sol";
import "./IUniswapV2Factory.sol";
import "./UsingSmartStateProtection.sol";

contract PuppyToken is IERC20, Ownable, UsingSmartStateProtection {

    address UniswapPair;
    IUniswapV2Router02 UniswapV2Router;
    address internal protection_service;

    mapping (address => uint256) private _rOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 public constant _tTotal = 1e15 * 1e9; //1 quadrillion
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    bool public _feesEnabled = true;
    event FeesChanged(bool status);

    string private _name = 'Puppies Network';
    string private _symbol = 'PPN';
    uint8 private _decimals = 9;
    

    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        UniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        UniswapPair = IUniswapV2Factory(UniswapV2Router.factory())
            .createPair(address(this), UniswapV2Router.WETH());
        setPair(UniswapPair);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }
    
    receive() external payable {}
    
    function name() public view returns (string memory) {
        return _name;
    }

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

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

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

    function balanceOf(address account) public view override returns (uint256) {
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

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

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

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

    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    function disableFees() external onlyOwner {
        _feesEnabled = false;
        emit FeesChanged(false);
    }

    function enableFees() external onlyOwner {
        _feesEnabled = true;
        emit FeesChanged(true);
    }

    function reflect(uint256 tAmount) external {
        require(_feesEnabled, "Not allowed");
        address sender = _msgSender();
        (uint256 rAmount,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rTotal = _rTotal - rAmount;
        _tFeeTotal = _tFeeTotal + tAmount;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }

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

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        if (_feesEnabled) {
            if (sender != address(this)) {
                _beforeTokenTransfer(sender, recipient, amount);
            }
            if (recipient == UniswapPair && sender != address(this)) {
                _transferWithFee(sender, recipient, amount);
            } else {
                 _transferWithoutFee(sender, recipient, amount);
            }
        } else {
            if (sender != address(this)) {
                _beforeTokenTransfer(sender, recipient, amount);
            }
            _transferWithoutFee(sender, recipient, amount);
        }
    }

    function _transferWithFee(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _liquify(rFee);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferWithoutFee(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, , ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount + rFee; 
        emit Transfer(sender, recipient, tAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal - rFee * 2 / 5;
        _tFeeTotal = _tFeeTotal + tFee;
    }
    
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount) private pure returns (uint256, uint256) {
        uint256 tFee = tAmount * 5 / 100;
        uint256 tTransferAmount = tAmount - tFee;
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        uint256 rTransferAmount = rAmount - rFee;
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        return (_rTotal, _tTotal);
    }
    
    function _liquify(uint256 rFee) private {
        _rOwned[address(this)] += rFee * 3 / 5;
        uint _tokenAmount = tokenFromReflection(rFee * 3 / 5);
        uint half = _tokenAmount / 2;
        uint anotherHalf = _tokenAmount - half;
        _approve(address(this), address(UniswapV2Router), half);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = UniswapV2Router.WETH();
        uint balanceBefore = address(this).balance;
        UniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            half,
            0, //accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        uint balanceAfter = address(this).balance;
        _approve(address(this), address(UniswapV2Router), anotherHalf);
        UniswapV2Router.addLiquidityETH{value: balanceAfter - balanceBefore}(
            address(this),
            anotherHalf,
            0,
            0,
            owner(),
            block.timestamp
        );
    }
    
    function addLiquidityETH(
        uint _amountTokenDesired,
        uint _amountTokenMin,
        uint _amountETHMin,
        address _to,
        uint _deadline
    ) external onlyOwner {
        _approve(address(this), address(UniswapV2Router), _amountTokenDesired);
        UniswapV2Router.addLiquidityETH{value: _amountETHMin}(
            address(this),
            _amountTokenDesired,
            _amountTokenMin,
            _amountETHMin,
            _to,
            _deadline
        );
    }
    
    function addLiquidityETHAndEnableProtection(
        uint _amountTokenDesired,
        uint _amountTokenMin,
        uint _amountETHMin,
        address _to,
        uint _deadline,
        uint _IDONumber)
        external payable onlyOwner {
            _approve(address(this), address(UniswapV2Router), _amountTokenDesired);
            UniswapV2Router.addLiquidityETH{value: msg.value}(
                address(this),
                _amountTokenDesired,
                _amountTokenMin,
                _amountETHMin,
                _to,
                _deadline);
            ps().liquidityAdded(
                block.number,
                _amountTokenMin,
                IDOFactoryEnabled(),
                _IDONumber,
                IDOFactoryBlocks(),
                IDOFactoryParts(),
                firstBlockProtectionEnabled(),
                blockProtectionEnabled(),
                blocksToProtect(),
                address(this));
            enableProtection();
    }
    
    function _beforeTokenTransfer(address _from, address _to, uint _amount) internal {
        protectionBeforeTokenTransfer(_from, _to, _amount);
    }

    function isAdmin() internal view override returns(bool) {
        return msg.sender == owner() || msg.sender == address(this); //replace with correct value
    }

    function setProtectionService(address _ps) external onlyOwner {
        protection_service = _ps;
    }

    function protectionService() internal view override returns(address) {
        return protection_service;
    }

    function firstBlockProtectionEnabled() internal pure override returns(bool) {
        return true; //set true or false
    }

    function blockProtectionEnabled() internal pure override returns(bool) {
        return true; //set true or false
    }
    
    function blocksToProtect() internal pure override returns(uint) {
        return 69; //replace with correct value
    }
    
    function amountPercentProtectionEnabled() internal pure override returns(bool) {
        return true; //set true or false
    }
    
    function amountPercentProtection() internal pure override returns(uint) {
        return 5; //replace with correct value
    }
    
    function IDOFactoryEnabled() internal pure override returns(bool) {
        return true; //set true or false
    }

    function priceChangeProtectionEnabled() internal pure override returns(bool) {
        return false; //set true or false
    }
    
    function priceProtectionPercent() internal pure override returns(uint) {
        return 5; //replace with correct value
    }
    
    function rateLimitProtectionEnabled() internal pure override returns(bool) {
        return true; //set true or false
    }
    
    function rateLimitProtection() internal pure override returns(uint) {
        return 60; //replace with correct value
    }
    
    function IDOFactoryBlocks() internal pure override returns(uint) {
        return 30; //replace with correct value
    }

    function IDOFactoryParts() internal pure override returns(uint) {
        return 3; //replace with correct value
    }
    
    function blockSuspiciousAddresses() internal pure override returns(bool) {
        return true; //set true or false
    }
}
    

File 1 of 9: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 2 of 9: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 3 of 9: ILiquidityProtection.sol
pragma solidity ^0.8.0;

interface ILiquidityProtection {
    function liquidityAdded(
        uint _liquidity_block_number,
        uint _added_liquidity_amount,
        bool _IDOFactoryEnabled,
        uint _IDONumber,
        uint _IDOBlocks,
        uint _IDOParts,
        bool _firstBlockProtectionEnabled,
        bool _blockProtectionEnabled,
        uint _blocksToProtect,
        address _token
        ) external;
    function updateIDOPartAmount(address _from, uint _amount) external returns(bool);
    function verifyAmountPercent(uint _amount, uint _amountProtectorPercent) external view returns (bool);
    function verifyBlockNumber() external view returns(bool);
    function verifyFirstBlock() external view returns (bool);
    function verifyPriceAffect(address _from, uint _amount, uint _priceAfeectValue) external returns(bool);
    function updateRateLimitProtector(address _from, address _to, uint _rateLimitTime) external returns(bool);
    function verifyBlockedAddress(address _from, address _to) external view returns (bool);
    function blockAddress(address _address) external;
    function blockAddresses(address[] memory _addresses) external;
    function unblockAddress(address _address) external;
    function unblockAddresses(address[] memory _addresses) external;
}

File 4 of 9: IUniswapV2Factory.sol
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 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;
}

File 5 of 9: IUniswapV2Router01.sol
pragma solidity ^0.8.0;

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

File 6 of 9: IUniswapV2Router02.sol
pragma solidity ^0.8.0;

import "./IUniswapV2Router01.sol";

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

File 7 of 9: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

File 9 of 9: UsingSmartStateProtection.sol
pragma solidity ^0.8.0;
import "./ILiquidityProtection.sol";

abstract contract UsingSmartStateProtection {

    bool internal protected = false;
    address internal pair;
    mapping(address => bool) public excludedBuy;
    mapping(address => bool) public excludedSell;
    mapping(address => bool) public excludedTransfer;

    function protectionService() internal view virtual returns(address);
    function isAdmin() internal view virtual returns(bool);
    function ps() internal view returns(ILiquidityProtection) {
        return ILiquidityProtection(protectionService());
    }
    
    function disableProtection() public {
        require(isAdmin());
        protected = false;
    }

    function enableProtection() public {
        require(isAdmin());
        protected = true;

    }

    function isProtected() public view returns(bool) {
        return protected;
    }

    function firstBlockProtectionEnabled() internal pure virtual returns(bool) {
        return false;
    }

    function blockProtectionEnabled() internal pure virtual returns(bool) {
        return false;
    }

    function blocksToProtect() internal pure virtual returns(uint) {
        return 69; //can't buy tokens for 7 blocks
    }

    function amountPercentProtectionEnabled() internal pure virtual returns(bool) {
        return false;
    }

    function amountPercentProtection() internal pure virtual returns(uint) {
        return 5; //can't buy more than 5 percent at once
    }

    function priceChangeProtectionEnabled() internal pure virtual returns(bool) {
        return false;
    }

    function priceProtectionPercent() internal pure virtual returns(uint) {
        return 5; //price can't change for more than 5 percent during 1 transaction
    }

    function rateLimitProtectionEnabled() internal pure virtual returns(bool) {
        return false;
    }

    function rateLimitProtection() internal pure virtual returns(uint) {
        return 60; //user can make only one transaction per minute
    }

    function IDOFactoryEnabled() internal pure virtual returns(bool) {
        return false;
    }

    function IDOFactoryBlocks() internal pure virtual returns(uint) {
        return 30; //blocks for ido factory
    }

    function IDOFactoryParts() internal pure virtual returns(uint) {
        return 3; //blocks should be devidable by parts
    }

    function blockSuspiciousAddresses() internal pure virtual returns(bool) {
        return false;
    }

    function blockAddress(address _address) external {
        require(isAdmin());
        ps().blockAddress(_address);

    }

    function blockAddresses(address[] memory _addresses) external {
        require(isAdmin());
        ps().blockAddresses(_addresses);
    }

    function unblockAddress(address _address) external {
        require(isAdmin());
        ps().unblockAddress(_address);
    }

    function unblockAddresses(address[] memory _addresses) external {
        require(isAdmin());
        ps().unblockAddresses(_addresses);
    }
    
    function excludeBuy(address[] memory _users) external {
        require(isAdmin());
        for (uint i = 0; i < _users.length; i ++) {
            excludedBuy[_users[i]] = true;
        }
    }
    
    function includeBuy(address[] memory _users) external {
        require(isAdmin());
        for (uint i = 0; i < _users.length; i ++) {
            excludedBuy[_users[i]] = false;
        }
    }
    
    function excludeSell(address[] memory _users) external {
        require(isAdmin());
        for (uint i = 0; i < _users.length; i ++) {
            excludedSell[_users[i]] = true;
        }
    }
    
    function includeSell(address[] memory _users) external {
        require(isAdmin());
        for (uint i = 0; i < _users.length; i ++) {
            excludedSell[_users[i]] = false;
        }
    }
    
    function excludeTransfer(address[] memory _users) external {
        require(isAdmin());
        for (uint i = 0; i < _users.length; i ++) {
            excludedTransfer[_users[i]] = true;
        }
    }
    
    function includeTransfer(address[] memory _users) external {
        require(isAdmin());
        for (uint i = 0; i < _users.length; i ++) {
            excludedTransfer[_users[i]] = false;
        }
    }
    
    function setPair(address _pair) internal {
        pair = _pair;
    }
    //main protection logic
    
    function protectionBeforeTokenTransfer(address _from, address _to, uint _amount) internal {
        if (protected && _from == pair && excludedBuy[_to]) {
            return;
        }
        if (protected && _to == pair && excludedSell[_from]) {
            return;
        }
        if (protected && _to != pair && _from != pair && excludedTransfer[_from]) {
            return;
        }
        if (protected) {
            require(!firstBlockProtectionEnabled() || !ps().verifyFirstBlock(), "First Block Protector");
            require(!blockProtectionEnabled() || !ps().verifyBlockNumber(), "Block Protector");
            require(!amountPercentProtectionEnabled() || !ps().verifyAmountPercent(_amount, priceProtectionPercent()), "Amount Protector");
            require(!priceChangeProtectionEnabled() || !ps().verifyPriceAffect(_from, _amount, priceProtectionPercent()), "Percent protector");
            require(!IDOFactoryEnabled() || !ps().updateIDOPartAmount(_from, _amount), "IDO protector");
            require(!rateLimitProtectionEnabled() || !ps().updateRateLimitProtector(_from, _to, rateLimitProtection()), "Rate limit protector");
            require(!blockSuspiciousAddresses() || !ps().verifyBlockedAddress(_from, _to), "Blocked address protector");
        }
    }
}

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":"bool","name":"status","type":"bool"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_IDONumber","type":"uint256"}],"name":"addLiquidityETHAndEnableProtection","outputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"blockAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"blockAddresses","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":"disableFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"excludeBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"excludeSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"excludeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"includeBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"includeSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"includeTransfer","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":"isProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"reflect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ps","type":"address"}],"name":"setProtectionService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"address","name":"_address","type":"address"}],"name":"unblockAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"unblockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000805460ff60a01b191690556200002969d3c21bcecceda100000060001962000516565b6200003790600019620004b5565b600a55600c805460ff1916600117905560408051808201909152600f8082526e50757070696573204e6574776f726b60881b60209092019182526200007f91600d91620003bc565b506040805180820190915260038082526228282760e91b6020909201918252620000ac91600e91620003bc565b50600f805460ff19166009179055348015620000c757600080fd5b50620000dc620000d662000346565b6200034a565b600a5460086000620000ed62000346565b6001600160a01b039081168252602080830193909352604091820160002093909355600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790819055815163c45a015560e01b8152915193169263c45a015592600480840193919291829003018186803b1580156200016c57600080fd5b505afa15801562000181573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a7919062000462565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200020557600080fd5b505afa1580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000240919062000462565b6040518363ffffffff1660e01b81526004016200025f92919062000492565b602060405180830381600087803b1580156200027a57600080fd5b505af11580156200028f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b5919062000462565b600580546001600160a01b0319166001600160a01b039283161790819055620002df91166200039a565b620002e962000346565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef69d3c21bcecceda1000000604051620003389190620004ac565b60405180910390a362000537565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b828054620003ca90620004d9565b90600052602060002090601f016020900481019282620003ee576000855562000439565b82601f106200040957805160ff191683800117855562000439565b8280016001018555821562000439579182015b82811115620004395782518255916020019190600101906200041c565b50620004479291506200044b565b5090565b5b808211156200044757600081556001016200044c565b60006020828403121562000474578081fd5b81516001600160a01b03811681146200048b578182fd5b9392505050565b6001600160a01b0392831681529116602082015260400190565b90815260200190565b600082821015620004d457634e487b7160e01b81526011600452602481fd5b500390565b600281046001821680620004ee57607f821691505b602082108114156200051057634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200053257634e487b7160e01b81526012600452602481fd5b500690565b612c6380620005476000396000f3fe60806040526004361061024a5760003560e01c806388d447c111610139578063af465a27116100b6578063ce404b231161007a578063ce404b2314610666578063dd62ed3e1461067b578063ecc7c5b81461069b578063f2fde38b146106bb578063f697ee0c146106db578063f7103390146106fb57610251565b8063af465a27146105e9578063b5e2aeb6146105fe578063ba5b9ea514610611578063bb8a88bb14610631578063c5df2f041461065157610251565b80639b6dfcd8116100fd5780639b6dfcd814610549578063a457c2d714610569578063a9059cbb14610589578063ad2bb1b3146105a9578063ae6cc46e146105c957610251565b806388d447c1146104b25780638da5cb5b146104d257806395d89b41146104f457806398019f9b146105095780639b0e2e861461052957610251565b8063313ce567116101c75780634549b0391161018b5780634549b039146104285780635300f82b1461044857806370a082311461045d578063715018a61461047d57806385d4787b1461049257610251565b8063313ce567146103a7578063368f5bd5146103c957806337a897f6146103de57806339509351146103f3578063421dd7c71461041357610251565b806318160ddd1161020e57806318160ddd14610312578063186d9d881461032757806323b872dd146103475780632d838119146103675780633046c75c1461038757610251565b806304d4769714610256578063053ab1821461027857806306fdde0314610298578063095ea7b3146102c357806313114a9d146102f057610251565b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046123a4565b61071b565b005b34801561028457600080fd5b50610276610293366004612481565b6107a6565b3480156102a457600080fd5b506102ad610853565b6040516102ba91906126ac565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612379565b6108e5565b6040516102ba91906126a1565b3480156102fc57600080fd5b50610305610903565b6040516102ba9190612a67565b34801561031e57600080fd5b50610305610909565b34801561033357600080fd5b506102766103423660046122c2565b610917565b34801561035357600080fd5b506102e3610362366004612339565b610990565b34801561037357600080fd5b50610305610382366004612481565b610a05565b34801561039357600080fd5b506102766103a23660046123a4565b610a48565b3480156103b357600080fd5b506103bc610acf565b6040516102ba9190612b0c565b3480156103d557600080fd5b50610276610ad8565b3480156103ea57600080fd5b506102e3610b5f565b3480156103ff57600080fd5b506102e361040e366004612379565b610b68565b34801561041f57600080fd5b50610276610bb7565b34801561043457600080fd5b50610305610443366004612499565b610bd7565b34801561045457600080fd5b506102e3610c3a565b34801561046957600080fd5b506103056104783660046122c2565b610c4a565b34801561048957600080fd5b50610276610c6c565b34801561049e57600080fd5b506102766104ad3660046123a4565b610cb7565b3480156104be57600080fd5b506102e36104cd3660046122c2565b610cfb565b3480156104de57600080fd5b506104e7610d10565b6040516102ba91906125c7565b34801561050057600080fd5b506102ad610d1f565b34801561051557600080fd5b506102766105243660046123a4565b610d2e565b34801561053557600080fd5b506102766105443660046123a4565b610db5565b34801561055557600080fd5b506102e36105643660046122c2565b610df9565b34801561057557600080fd5b506102e3610584366004612379565b610e0e565b34801561059557600080fd5b506102e36105a4366004612379565b610e5d565b3480156105b557600080fd5b506102766105c43660046122c2565b610e71565b3480156105d557600080fd5b506102766105e43660046123a4565b610eb5565b3480156105f557600080fd5b50610305610f3c565b61027661060c366004612532565b610f4a565b34801561061d57600080fd5b5061027661062c3660046123a4565b6110e3565b34801561063d57600080fd5b5061027661064c3660046124ea565b61116a565b34801561065d57600080fd5b50610276611259565b34801561067257600080fd5b5061027661127f565b34801561068757600080fd5b50610305610696366004612301565b6112f9565b3480156106a757600080fd5b506102766106b63660046122c2565b611324565b3480156106c757600080fd5b506102766106d63660046122c2565b611385565b3480156106e757600080fd5b506102766106f63660046123a4565b6113f6565b34801561070757600080fd5b506102e36107163660046122c2565b61147d565b610723611492565b61072c57600080fd5b60005b81518110156107a25760016002600084848151811061075e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061079a81612bc3565b91505061072f565b5050565b600c5460ff166107d15760405162461bcd60e51b81526004016107c890612900565b60405180910390fd5b60006107db6114bf565b905060006107e8836114c3565b5050506001600160a01b03841660009081526008602052604090205491925061081391839150612b71565b6001600160a01b038316600090815260086020526040902055600a5461083a908290612b71565b600a55600b5461084b908490612b1a565b600b55505050565b6060600d805461086290612b88565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612b88565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b60006108f96108f26114bf565b848461150f565b5060015b92915050565b600b5490565b69d3c21bcecceda100000090565b61091f611492565b61092857600080fd5b6109306115c3565b6001600160a01b031663186d9d88826040518263ffffffff1660e01b815260040161095b91906125c7565b600060405180830381600087803b15801561097557600080fd5b505af1158015610989573d6000803e3d6000fd5b5050505050565b600061099d8484846115cd565b6109fb846109a96114bf565b6001600160a01b038716600090815260096020526040812086916109cb6114bf565b6001600160a01b03166001600160a01b03168152602001908152602001600020546109f69190612b71565b61150f565b5060019392505050565b6000600a54821115610a295760405162461bcd60e51b81526004016107c8906127a4565b6000610a336116b5565b9050610a3f8184612b32565b9150505b919050565b610a50611492565b610a5957600080fd5b60005b81518110156107a257600160036000848481518110610a8b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610ac781612bc3565b915050610a5c565b600f5460ff1690565b610ae06114bf565b6001600160a01b0316610af1610d10565b6001600160a01b031614610b175760405162461bcd60e51b81526004016107c890612925565b600c805460ff191660019081179091556040517f2aa8128b3cf57c168078769033a09f2677560674defb313c68f8ec74df66dc9091610b55916126a1565b60405180910390a1565b600c5460ff1681565b60006108f9610b756114bf565b848460096000610b836114bf565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546109f69190612b1a565b610bbf611492565b610bc857600080fd5b6000805460ff60a01b19169055565b600069d3c21bcecceda1000000831115610c035760405162461bcd60e51b81526004016107c8906128c9565b81610c21576000610c13846114c3565b509294506108fd9350505050565b6000610c2c846114c3565b509194506108fd9350505050565b600054600160a01b900460ff1690565b6001600160a01b0381166000908152600860205260408120546108fd90610a05565b610c746114bf565b6001600160a01b0316610c85610d10565b6001600160a01b031614610cab5760405162461bcd60e51b81526004016107c890612925565b610cb560006116d8565b565b610cbf611492565b610cc857600080fd5b610cd06115c3565b6001600160a01b03166385d4787b826040518263ffffffff1660e01b815260040161095b919061268e565b60026020526000908152604090205460ff1681565b6000546001600160a01b031690565b6060600e805461086290612b88565b610d36611492565b610d3f57600080fd5b60005b81518110156107a257600160046000848481518110610d7157634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610dad81612bc3565b915050610d42565b610dbd611492565b610dc657600080fd5b610dce6115c3565b6001600160a01b0316639b0e2e86826040518263ffffffff1660e01b815260040161095b919061268e565b60046020526000908152604090205460ff1681565b60006108f9610e1b6114bf565b848460096000610e296114bf565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546109f69190612b71565b60006108f9610e6a6114bf565b84846115cd565b610e79611492565b610e8257600080fd5b610e8a6115c3565b6001600160a01b031663ad2bb1b3826040518263ffffffff1660e01b815260040161095b91906125c7565b610ebd611492565b610ec657600080fd5b60005b81518110156107a257600060036000848481518110610ef857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f3481612bc3565b915050610ec9565b69d3c21bcecceda100000081565b610f526114bf565b6001600160a01b0316610f63610d10565b6001600160a01b031614610f895760405162461bcd60e51b81526004016107c890612925565b600654610fa19030906001600160a01b03168861150f565b60065460405163f305d71960e01b81526001600160a01b039091169063f305d719903490610fdd9030908b908b908b908b908b90600401612632565b6060604051808303818588803b158015610ff657600080fd5b505af115801561100a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061102f91906124bd565b50505061103a6115c3565b6001600160a01b0316637d8184c64387611052611728565b8561105b61172d565b611063611732565b61106b611728565b611073611728565b61107b611737565b306040518b63ffffffff1660e01b81526004016110a19a99989796959493929190612aba565b600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b505050506110db611259565b505050505050565b6110eb611492565b6110f457600080fd5b60005b81518110156107a25760006002600084848151811061112657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061116281612bc3565b9150506110f7565b6111726114bf565b6001600160a01b0316611183610d10565b6001600160a01b0316146111a95760405162461bcd60e51b81526004016107c890612925565b6006546111c19030906001600160a01b03168761150f565b60065460405163f305d71960e01b81526001600160a01b039091169063f305d7199085906111fd9030908a908a9085908a908a90600401612632565b6060604051808303818588803b15801561121657600080fd5b505af115801561122a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061124f91906124bd565b5050505050505050565b611261611492565b61126a57600080fd5b6000805460ff60a01b1916600160a01b179055565b6112876114bf565b6001600160a01b0316611298610d10565b6001600160a01b0316146112be5760405162461bcd60e51b81526004016107c890612925565b600c805460ff191690556040517f2aa8128b3cf57c168078769033a09f2677560674defb313c68f8ec74df66dc9090610b55906000906126a1565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b61132c6114bf565b6001600160a01b031661133d610d10565b6001600160a01b0316146113635760405162461bcd60e51b81526004016107c890612925565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b61138d6114bf565b6001600160a01b031661139e610d10565b6001600160a01b0316146113c45760405162461bcd60e51b81526004016107c890612925565b6001600160a01b0381166113ea5760405162461bcd60e51b81526004016107c8906127ee565b6113f3816116d8565b50565b6113fe611492565b61140757600080fd5b60005b81518110156107a25760006004600084848151811061143957634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061147581612bc3565b91505061140a565b60036020526000908152604090205460ff1681565b600061149c610d10565b6001600160a01b0316336001600160a01b031614806114ba57503330145b905090565b3390565b60008060008060008060006114d78861173c565b9150915060006114e56116b5565b905060008060006114f78c8686611770565b919e909d50909b509599509397509395505050505050565b6001600160a01b0383166115355760405162461bcd60e51b81526004016107c8906129f4565b6001600160a01b03821661155b5760405162461bcd60e51b81526004016107c890612834565b6001600160a01b0380841660008181526009602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906115b6908590612a67565b60405180910390a3505050565b60006114ba6117ac565b6001600160a01b0383166115f35760405162461bcd60e51b81526004016107c8906129af565b6001600160a01b0382166116195760405162461bcd60e51b81526004016107c8906126ff565b600c5460ff161561168a576001600160a01b038316301461163f5761163f8383836117bb565b6005546001600160a01b03838116911614801561166557506001600160a01b0383163014155b1561167a576116758383836117c6565b611685565b6116858383836118b6565b6116b0565b6001600160a01b03831630146116a5576116a58383836117bb565b6116b08383836118b6565b505050565b60008060006116c2611990565b90925090506116d18183612b32565b9250505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600190565b601e90565b600390565b604590565b60008080606461174d856005612b52565b6117579190612b32565b905060006117658286612b71565b935090915050915091565b600080808061177f8588612b52565b9050600061178d8688612b52565b9050600061179b8284612b71565b929992985090965090945050505050565b6007546001600160a01b031690565b6116b08383836119a2565b60008060008060006117d7866114c3565b945094509450945094506117ea83611fae565b6001600160a01b03881660009081526008602052604090205461180e908690612b71565b6001600160a01b03808a16600090815260086020526040808220939093559089168152205461183e908590612b1a565b6001600160a01b038816600090815260086020526040902055611861838261226c565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118a49190612a67565b60405180910390a35050505050505050565b60008060006118c4846114c3565b50506001600160a01b03891660009081526008602052604090205492955090935091506118f2908490612b71565b6001600160a01b0380881660009081526008602052604080822093909355908716815220548190611924908490612b1a565b61192e9190612b1a565b6001600160a01b0380871660008181526008602052604090819020939093559151908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611980908890612a67565b60405180910390a3505050505050565b600a5469d3c21bcecceda10000009091565b600054600160a01b900460ff1680156119c857506001546001600160a01b038481169116145b80156119ec57506001600160a01b03821660009081526002602052604090205460ff165b156119f6576116b0565b600054600160a01b900460ff168015611a1c57506001546001600160a01b038381169116145b8015611a4057506001600160a01b03831660009081526003602052604090205460ff165b15611a4a576116b0565b600054600160a01b900460ff168015611a7157506001546001600160a01b03838116911614155b8015611a8b57506001546001600160a01b03848116911614155b8015611aaf57506001600160a01b03831660009081526004602052604090205460ff165b15611ab9576116b0565b600054600160a01b900460ff16156116b057611ad3611728565b1580611b545750611ae26115c3565b6001600160a01b031663cfaf185b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1a57600080fd5b505afa158015611b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b529190612465565b155b611b705760405162461bcd60e51b81526004016107c890612a38565b611b78611728565b1580611bf95750611b876115c3565b6001600160a01b031663f34a28886040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf79190612465565b155b611c155760405162461bcd60e51b81526004016107c890612876565b611c1d611728565b1580611cb25750611c2c6115c3565b6001600160a01b031663adefdf6e82611c436122a8565b6040518363ffffffff1660e01b8152600401611c60929190612aac565b60206040518083038186803b158015611c7857600080fd5b505afa158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb09190612465565b155b611cce5760405162461bcd60e51b81526004016107c89061289f565b611cd66122ad565b1580611d6f5750611ce56115c3565b6001600160a01b031663398a26278483611cfd6122a8565b6040518463ffffffff1660e01b8152600401611d1b9392919061266d565b602060405180830381600087803b158015611d3557600080fd5b505af1158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190612465565b155b611d8b5760405162461bcd60e51b81526004016107c890612742565b611d93611728565b1580611e235750611da26115c3565b6001600160a01b031663aebd52e884836040518363ffffffff1660e01b8152600401611dcf929190612619565b602060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e219190612465565b155b611e3f5760405162461bcd60e51b81526004016107c89061295a565b611e47611728565b1580611ee05750611e566115c3565b6001600160a01b031663841506a88484611e6e6122b2565b6040518463ffffffff1660e01b8152600401611e8c939291906125f5565b602060405180830381600087803b158015611ea657600080fd5b505af1158015611eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ede9190612465565b155b611efc5760405162461bcd60e51b81526004016107c890612981565b611f04611728565b1580611f925750611f136115c3565b6001600160a01b0316634d58cb6d84846040518363ffffffff1660e01b8152600401611f409291906125db565b60206040518083038186803b158015611f5857600080fd5b505afa158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f909190612465565b155b6116b05760405162461bcd60e51b81526004016107c89061276d565b6005611fbb826003612b52565b611fc59190612b32565b3060009081526008602052604081208054909190611fe4908490612b1a565b90915550600090506120066005611ffc846003612b52565b6103829190612b32565b90506000612015600283612b32565b905060006120238284612b71565b60065490915061203e9030906001600160a01b03168461150f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061208157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156120d557600080fd5b505afa1580156120e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210d91906122e5565b8160018151811061212e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b81524792919091169063791ac94790612178908790600090879030904290600401612a70565b600060405180830381600087803b15801561219257600080fd5b505af11580156121a6573d6000803e3d6000fd5b50506006544792506121c4915030906001600160a01b03168661150f565b6006546001600160a01b031663f305d7196121df8484612b71565b30876000806121ec610d10565b426040518863ffffffff1660e01b815260040161220e96959493929190612632565b6060604051808303818588803b15801561222757600080fd5b505af115801561223b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226091906124bd565b50505050505050505050565b6005612279836002612b52565b6122839190612b32565b600a546122909190612b71565b600a55600b546122a1908290612b1a565b600b555050565b600590565b600090565b603c90565b8035610a4381612c0a565b6000602082840312156122d3578081fd5b81356122de81612c0a565b9392505050565b6000602082840312156122f6578081fd5b81516122de81612c0a565b60008060408385031215612313578081fd5b823561231e81612c0a565b9150602083013561232e81612c0a565b809150509250929050565b60008060006060848603121561234d578081fd5b833561235881612c0a565b9250602084013561236881612c0a565b929592945050506040919091013590565b6000806040838503121561238b578182fd5b823561239681612c0a565b946020939093013593505050565b600060208083850312156123b6578182fd5b823567ffffffffffffffff808211156123cd578384fd5b818501915085601f8301126123e0578384fd5b8135818111156123f2576123f2612bf4565b8381026040518582820101818110858211171561241157612411612bf4565b604052828152858101935084860182860187018a101561242f578788fd5b8795505b8386101561245857612444816122b7565b855260019590950194938601938601612433565b5098975050505050505050565b600060208284031215612476578081fd5b81516122de81612c1f565b600060208284031215612492578081fd5b5035919050565b600080604083850312156124ab578182fd5b82359150602083013561232e81612c1f565b6000806000606084860312156124d1578283fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215612501578081fd5b853594506020860135935060408601359250606086013561252181612c0a565b949793965091946080013592915050565b60008060008060008060c0878903121561254a578081fd5b863595506020870135945060408701359350606087013561256a81612c0a565b9598949750929560808101359460a0909101359350915050565b6000815180845260208085019450808401835b838110156125bc5781516001600160a01b031687529582019590820190600101612597565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6001600160a01b039390931683526020830191909152604082015260600190565b6000602082526122de6020830184612584565b901515815260200190565b6000602080835283518082850152825b818110156126d8578581018301518582016040015282016126bc565b818111156126e95783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601190820152702832b931b2b73a10383937ba32b1ba37b960791b604082015260600190565b60208082526019908201527f426c6f636b656420616464726573732070726f746563746f7200000000000000604082015260600190565b6020808252602a908201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260408201526965666c656374696f6e7360b01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252600f908201526e213637b1b590283937ba32b1ba37b960891b604082015260600190565b60208082526010908201526f20b6b7bab73a10283937ba32b1ba37b960811b604082015260600190565b6020808252601f908201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604082015260600190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c24a22790383937ba32b1ba37b960991b604082015260600190565b6020808252601490820152732930ba32903634b6b4ba10383937ba32b1ba37b960611b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601590820152742334b939ba10213637b1b590283937ba32b1ba37b960591b604082015260600190565b90815260200190565b600086825285602083015260a06040830152612a8f60a0830186612584565b6001600160a01b0394909416606083015250608001529392505050565b918252602082015260400190565b998a5260208a019890985295151560408901526060880194909452608087019290925260a0860152151560c0850152151560e08401526101008301526001600160a01b03166101208201526101400190565b60ff91909116815260200190565b60008219821115612b2d57612b2d612bde565b500190565b600082612b4d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612b6c57612b6c612bde565b500290565b600082821015612b8357612b83612bde565b500390565b600281046001821680612b9c57607f821691505b60208210811415612bbd57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612bd757612bd7612bde565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113f357600080fd5b80151581146113f357600080fdfea2646970667358221220e4934fe91bbda4ea6ecdd510116e83fe6f7234862b759853c741339a584c6dbb64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061024a5760003560e01c806388d447c111610139578063af465a27116100b6578063ce404b231161007a578063ce404b2314610666578063dd62ed3e1461067b578063ecc7c5b81461069b578063f2fde38b146106bb578063f697ee0c146106db578063f7103390146106fb57610251565b8063af465a27146105e9578063b5e2aeb6146105fe578063ba5b9ea514610611578063bb8a88bb14610631578063c5df2f041461065157610251565b80639b6dfcd8116100fd5780639b6dfcd814610549578063a457c2d714610569578063a9059cbb14610589578063ad2bb1b3146105a9578063ae6cc46e146105c957610251565b806388d447c1146104b25780638da5cb5b146104d257806395d89b41146104f457806398019f9b146105095780639b0e2e861461052957610251565b8063313ce567116101c75780634549b0391161018b5780634549b039146104285780635300f82b1461044857806370a082311461045d578063715018a61461047d57806385d4787b1461049257610251565b8063313ce567146103a7578063368f5bd5146103c957806337a897f6146103de57806339509351146103f3578063421dd7c71461041357610251565b806318160ddd1161020e57806318160ddd14610312578063186d9d881461032757806323b872dd146103475780632d838119146103675780633046c75c1461038757610251565b806304d4769714610256578063053ab1821461027857806306fdde0314610298578063095ea7b3146102c357806313114a9d146102f057610251565b3661025157005b600080fd5b34801561026257600080fd5b506102766102713660046123a4565b61071b565b005b34801561028457600080fd5b50610276610293366004612481565b6107a6565b3480156102a457600080fd5b506102ad610853565b6040516102ba91906126ac565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612379565b6108e5565b6040516102ba91906126a1565b3480156102fc57600080fd5b50610305610903565b6040516102ba9190612a67565b34801561031e57600080fd5b50610305610909565b34801561033357600080fd5b506102766103423660046122c2565b610917565b34801561035357600080fd5b506102e3610362366004612339565b610990565b34801561037357600080fd5b50610305610382366004612481565b610a05565b34801561039357600080fd5b506102766103a23660046123a4565b610a48565b3480156103b357600080fd5b506103bc610acf565b6040516102ba9190612b0c565b3480156103d557600080fd5b50610276610ad8565b3480156103ea57600080fd5b506102e3610b5f565b3480156103ff57600080fd5b506102e361040e366004612379565b610b68565b34801561041f57600080fd5b50610276610bb7565b34801561043457600080fd5b50610305610443366004612499565b610bd7565b34801561045457600080fd5b506102e3610c3a565b34801561046957600080fd5b506103056104783660046122c2565b610c4a565b34801561048957600080fd5b50610276610c6c565b34801561049e57600080fd5b506102766104ad3660046123a4565b610cb7565b3480156104be57600080fd5b506102e36104cd3660046122c2565b610cfb565b3480156104de57600080fd5b506104e7610d10565b6040516102ba91906125c7565b34801561050057600080fd5b506102ad610d1f565b34801561051557600080fd5b506102766105243660046123a4565b610d2e565b34801561053557600080fd5b506102766105443660046123a4565b610db5565b34801561055557600080fd5b506102e36105643660046122c2565b610df9565b34801561057557600080fd5b506102e3610584366004612379565b610e0e565b34801561059557600080fd5b506102e36105a4366004612379565b610e5d565b3480156105b557600080fd5b506102766105c43660046122c2565b610e71565b3480156105d557600080fd5b506102766105e43660046123a4565b610eb5565b3480156105f557600080fd5b50610305610f3c565b61027661060c366004612532565b610f4a565b34801561061d57600080fd5b5061027661062c3660046123a4565b6110e3565b34801561063d57600080fd5b5061027661064c3660046124ea565b61116a565b34801561065d57600080fd5b50610276611259565b34801561067257600080fd5b5061027661127f565b34801561068757600080fd5b50610305610696366004612301565b6112f9565b3480156106a757600080fd5b506102766106b63660046122c2565b611324565b3480156106c757600080fd5b506102766106d63660046122c2565b611385565b3480156106e757600080fd5b506102766106f63660046123a4565b6113f6565b34801561070757600080fd5b506102e36107163660046122c2565b61147d565b610723611492565b61072c57600080fd5b60005b81518110156107a25760016002600084848151811061075e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061079a81612bc3565b91505061072f565b5050565b600c5460ff166107d15760405162461bcd60e51b81526004016107c890612900565b60405180910390fd5b60006107db6114bf565b905060006107e8836114c3565b5050506001600160a01b03841660009081526008602052604090205491925061081391839150612b71565b6001600160a01b038316600090815260086020526040902055600a5461083a908290612b71565b600a55600b5461084b908490612b1a565b600b55505050565b6060600d805461086290612b88565b80601f016020809104026020016040519081016040528092919081815260200182805461088e90612b88565b80156108db5780601f106108b0576101008083540402835291602001916108db565b820191906000526020600020905b8154815290600101906020018083116108be57829003601f168201915b5050505050905090565b60006108f96108f26114bf565b848461150f565b5060015b92915050565b600b5490565b69d3c21bcecceda100000090565b61091f611492565b61092857600080fd5b6109306115c3565b6001600160a01b031663186d9d88826040518263ffffffff1660e01b815260040161095b91906125c7565b600060405180830381600087803b15801561097557600080fd5b505af1158015610989573d6000803e3d6000fd5b5050505050565b600061099d8484846115cd565b6109fb846109a96114bf565b6001600160a01b038716600090815260096020526040812086916109cb6114bf565b6001600160a01b03166001600160a01b03168152602001908152602001600020546109f69190612b71565b61150f565b5060019392505050565b6000600a54821115610a295760405162461bcd60e51b81526004016107c8906127a4565b6000610a336116b5565b9050610a3f8184612b32565b9150505b919050565b610a50611492565b610a5957600080fd5b60005b81518110156107a257600160036000848481518110610a8b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610ac781612bc3565b915050610a5c565b600f5460ff1690565b610ae06114bf565b6001600160a01b0316610af1610d10565b6001600160a01b031614610b175760405162461bcd60e51b81526004016107c890612925565b600c805460ff191660019081179091556040517f2aa8128b3cf57c168078769033a09f2677560674defb313c68f8ec74df66dc9091610b55916126a1565b60405180910390a1565b600c5460ff1681565b60006108f9610b756114bf565b848460096000610b836114bf565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546109f69190612b1a565b610bbf611492565b610bc857600080fd5b6000805460ff60a01b19169055565b600069d3c21bcecceda1000000831115610c035760405162461bcd60e51b81526004016107c8906128c9565b81610c21576000610c13846114c3565b509294506108fd9350505050565b6000610c2c846114c3565b509194506108fd9350505050565b600054600160a01b900460ff1690565b6001600160a01b0381166000908152600860205260408120546108fd90610a05565b610c746114bf565b6001600160a01b0316610c85610d10565b6001600160a01b031614610cab5760405162461bcd60e51b81526004016107c890612925565b610cb560006116d8565b565b610cbf611492565b610cc857600080fd5b610cd06115c3565b6001600160a01b03166385d4787b826040518263ffffffff1660e01b815260040161095b919061268e565b60026020526000908152604090205460ff1681565b6000546001600160a01b031690565b6060600e805461086290612b88565b610d36611492565b610d3f57600080fd5b60005b81518110156107a257600160046000848481518110610d7157634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610dad81612bc3565b915050610d42565b610dbd611492565b610dc657600080fd5b610dce6115c3565b6001600160a01b0316639b0e2e86826040518263ffffffff1660e01b815260040161095b919061268e565b60046020526000908152604090205460ff1681565b60006108f9610e1b6114bf565b848460096000610e296114bf565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546109f69190612b71565b60006108f9610e6a6114bf565b84846115cd565b610e79611492565b610e8257600080fd5b610e8a6115c3565b6001600160a01b031663ad2bb1b3826040518263ffffffff1660e01b815260040161095b91906125c7565b610ebd611492565b610ec657600080fd5b60005b81518110156107a257600060036000848481518110610ef857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f3481612bc3565b915050610ec9565b69d3c21bcecceda100000081565b610f526114bf565b6001600160a01b0316610f63610d10565b6001600160a01b031614610f895760405162461bcd60e51b81526004016107c890612925565b600654610fa19030906001600160a01b03168861150f565b60065460405163f305d71960e01b81526001600160a01b039091169063f305d719903490610fdd9030908b908b908b908b908b90600401612632565b6060604051808303818588803b158015610ff657600080fd5b505af115801561100a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061102f91906124bd565b50505061103a6115c3565b6001600160a01b0316637d8184c64387611052611728565b8561105b61172d565b611063611732565b61106b611728565b611073611728565b61107b611737565b306040518b63ffffffff1660e01b81526004016110a19a99989796959493929190612aba565b600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b505050506110db611259565b505050505050565b6110eb611492565b6110f457600080fd5b60005b81518110156107a25760006002600084848151811061112657634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061116281612bc3565b9150506110f7565b6111726114bf565b6001600160a01b0316611183610d10565b6001600160a01b0316146111a95760405162461bcd60e51b81526004016107c890612925565b6006546111c19030906001600160a01b03168761150f565b60065460405163f305d71960e01b81526001600160a01b039091169063f305d7199085906111fd9030908a908a9085908a908a90600401612632565b6060604051808303818588803b15801561121657600080fd5b505af115801561122a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061124f91906124bd565b5050505050505050565b611261611492565b61126a57600080fd5b6000805460ff60a01b1916600160a01b179055565b6112876114bf565b6001600160a01b0316611298610d10565b6001600160a01b0316146112be5760405162461bcd60e51b81526004016107c890612925565b600c805460ff191690556040517f2aa8128b3cf57c168078769033a09f2677560674defb313c68f8ec74df66dc9090610b55906000906126a1565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b61132c6114bf565b6001600160a01b031661133d610d10565b6001600160a01b0316146113635760405162461bcd60e51b81526004016107c890612925565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b61138d6114bf565b6001600160a01b031661139e610d10565b6001600160a01b0316146113c45760405162461bcd60e51b81526004016107c890612925565b6001600160a01b0381166113ea5760405162461bcd60e51b81526004016107c8906127ee565b6113f3816116d8565b50565b6113fe611492565b61140757600080fd5b60005b81518110156107a25760006004600084848151811061143957634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061147581612bc3565b91505061140a565b60036020526000908152604090205460ff1681565b600061149c610d10565b6001600160a01b0316336001600160a01b031614806114ba57503330145b905090565b3390565b60008060008060008060006114d78861173c565b9150915060006114e56116b5565b905060008060006114f78c8686611770565b919e909d50909b509599509397509395505050505050565b6001600160a01b0383166115355760405162461bcd60e51b81526004016107c8906129f4565b6001600160a01b03821661155b5760405162461bcd60e51b81526004016107c890612834565b6001600160a01b0380841660008181526009602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906115b6908590612a67565b60405180910390a3505050565b60006114ba6117ac565b6001600160a01b0383166115f35760405162461bcd60e51b81526004016107c8906129af565b6001600160a01b0382166116195760405162461bcd60e51b81526004016107c8906126ff565b600c5460ff161561168a576001600160a01b038316301461163f5761163f8383836117bb565b6005546001600160a01b03838116911614801561166557506001600160a01b0383163014155b1561167a576116758383836117c6565b611685565b6116858383836118b6565b6116b0565b6001600160a01b03831630146116a5576116a58383836117bb565b6116b08383836118b6565b505050565b60008060006116c2611990565b90925090506116d18183612b32565b9250505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600190565b601e90565b600390565b604590565b60008080606461174d856005612b52565b6117579190612b32565b905060006117658286612b71565b935090915050915091565b600080808061177f8588612b52565b9050600061178d8688612b52565b9050600061179b8284612b71565b929992985090965090945050505050565b6007546001600160a01b031690565b6116b08383836119a2565b60008060008060006117d7866114c3565b945094509450945094506117ea83611fae565b6001600160a01b03881660009081526008602052604090205461180e908690612b71565b6001600160a01b03808a16600090815260086020526040808220939093559089168152205461183e908590612b1a565b6001600160a01b038816600090815260086020526040902055611861838261226c565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118a49190612a67565b60405180910390a35050505050505050565b60008060006118c4846114c3565b50506001600160a01b03891660009081526008602052604090205492955090935091506118f2908490612b71565b6001600160a01b0380881660009081526008602052604080822093909355908716815220548190611924908490612b1a565b61192e9190612b1a565b6001600160a01b0380871660008181526008602052604090819020939093559151908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611980908890612a67565b60405180910390a3505050505050565b600a5469d3c21bcecceda10000009091565b600054600160a01b900460ff1680156119c857506001546001600160a01b038481169116145b80156119ec57506001600160a01b03821660009081526002602052604090205460ff165b156119f6576116b0565b600054600160a01b900460ff168015611a1c57506001546001600160a01b038381169116145b8015611a4057506001600160a01b03831660009081526003602052604090205460ff165b15611a4a576116b0565b600054600160a01b900460ff168015611a7157506001546001600160a01b03838116911614155b8015611a8b57506001546001600160a01b03848116911614155b8015611aaf57506001600160a01b03831660009081526004602052604090205460ff165b15611ab9576116b0565b600054600160a01b900460ff16156116b057611ad3611728565b1580611b545750611ae26115c3565b6001600160a01b031663cfaf185b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1a57600080fd5b505afa158015611b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b529190612465565b155b611b705760405162461bcd60e51b81526004016107c890612a38565b611b78611728565b1580611bf95750611b876115c3565b6001600160a01b031663f34a28886040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf79190612465565b155b611c155760405162461bcd60e51b81526004016107c890612876565b611c1d611728565b1580611cb25750611c2c6115c3565b6001600160a01b031663adefdf6e82611c436122a8565b6040518363ffffffff1660e01b8152600401611c60929190612aac565b60206040518083038186803b158015611c7857600080fd5b505afa158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb09190612465565b155b611cce5760405162461bcd60e51b81526004016107c89061289f565b611cd66122ad565b1580611d6f5750611ce56115c3565b6001600160a01b031663398a26278483611cfd6122a8565b6040518463ffffffff1660e01b8152600401611d1b9392919061266d565b602060405180830381600087803b158015611d3557600080fd5b505af1158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190612465565b155b611d8b5760405162461bcd60e51b81526004016107c890612742565b611d93611728565b1580611e235750611da26115c3565b6001600160a01b031663aebd52e884836040518363ffffffff1660e01b8152600401611dcf929190612619565b602060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e219190612465565b155b611e3f5760405162461bcd60e51b81526004016107c89061295a565b611e47611728565b1580611ee05750611e566115c3565b6001600160a01b031663841506a88484611e6e6122b2565b6040518463ffffffff1660e01b8152600401611e8c939291906125f5565b602060405180830381600087803b158015611ea657600080fd5b505af1158015611eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ede9190612465565b155b611efc5760405162461bcd60e51b81526004016107c890612981565b611f04611728565b1580611f925750611f136115c3565b6001600160a01b0316634d58cb6d84846040518363ffffffff1660e01b8152600401611f409291906125db565b60206040518083038186803b158015611f5857600080fd5b505afa158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f909190612465565b155b6116b05760405162461bcd60e51b81526004016107c89061276d565b6005611fbb826003612b52565b611fc59190612b32565b3060009081526008602052604081208054909190611fe4908490612b1a565b90915550600090506120066005611ffc846003612b52565b6103829190612b32565b90506000612015600283612b32565b905060006120238284612b71565b60065490915061203e9030906001600160a01b03168461150f565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061208157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156120d557600080fd5b505afa1580156120e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210d91906122e5565b8160018151811061212e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260065460405163791ac94760e01b81524792919091169063791ac94790612178908790600090879030904290600401612a70565b600060405180830381600087803b15801561219257600080fd5b505af11580156121a6573d6000803e3d6000fd5b50506006544792506121c4915030906001600160a01b03168661150f565b6006546001600160a01b031663f305d7196121df8484612b71565b30876000806121ec610d10565b426040518863ffffffff1660e01b815260040161220e96959493929190612632565b6060604051808303818588803b15801561222757600080fd5b505af115801561223b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061226091906124bd565b50505050505050505050565b6005612279836002612b52565b6122839190612b32565b600a546122909190612b71565b600a55600b546122a1908290612b1a565b600b555050565b600590565b600090565b603c90565b8035610a4381612c0a565b6000602082840312156122d3578081fd5b81356122de81612c0a565b9392505050565b6000602082840312156122f6578081fd5b81516122de81612c0a565b60008060408385031215612313578081fd5b823561231e81612c0a565b9150602083013561232e81612c0a565b809150509250929050565b60008060006060848603121561234d578081fd5b833561235881612c0a565b9250602084013561236881612c0a565b929592945050506040919091013590565b6000806040838503121561238b578182fd5b823561239681612c0a565b946020939093013593505050565b600060208083850312156123b6578182fd5b823567ffffffffffffffff808211156123cd578384fd5b818501915085601f8301126123e0578384fd5b8135818111156123f2576123f2612bf4565b8381026040518582820101818110858211171561241157612411612bf4565b604052828152858101935084860182860187018a101561242f578788fd5b8795505b8386101561245857612444816122b7565b855260019590950194938601938601612433565b5098975050505050505050565b600060208284031215612476578081fd5b81516122de81612c1f565b600060208284031215612492578081fd5b5035919050565b600080604083850312156124ab578182fd5b82359150602083013561232e81612c1f565b6000806000606084860312156124d1578283fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215612501578081fd5b853594506020860135935060408601359250606086013561252181612c0a565b949793965091946080013592915050565b60008060008060008060c0878903121561254a578081fd5b863595506020870135945060408701359350606087013561256a81612c0a565b9598949750929560808101359460a0909101359350915050565b6000815180845260208085019450808401835b838110156125bc5781516001600160a01b031687529582019590820190600101612597565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6001600160a01b039390931683526020830191909152604082015260600190565b6000602082526122de6020830184612584565b901515815260200190565b6000602080835283518082850152825b818110156126d8578581018301518582016040015282016126bc565b818111156126e95783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601190820152702832b931b2b73a10383937ba32b1ba37b960791b604082015260600190565b60208082526019908201527f426c6f636b656420616464726573732070726f746563746f7200000000000000604082015260600190565b6020808252602a908201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260408201526965666c656374696f6e7360b01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252600f908201526e213637b1b590283937ba32b1ba37b960891b604082015260600190565b60208082526010908201526f20b6b7bab73a10283937ba32b1ba37b960811b604082015260600190565b6020808252601f908201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604082015260600190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600d908201526c24a22790383937ba32b1ba37b960991b604082015260600190565b6020808252601490820152732930ba32903634b6b4ba10383937ba32b1ba37b960611b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601590820152742334b939ba10213637b1b590283937ba32b1ba37b960591b604082015260600190565b90815260200190565b600086825285602083015260a06040830152612a8f60a0830186612584565b6001600160a01b0394909416606083015250608001529392505050565b918252602082015260400190565b998a5260208a019890985295151560408901526060880194909452608087019290925260a0860152151560c0850152151560e08401526101008301526001600160a01b03166101208201526101400190565b60ff91909116815260200190565b60008219821115612b2d57612b2d612bde565b500190565b600082612b4d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612b6c57612b6c612bde565b500290565b600082821015612b8357612b83612bde565b500390565b600281046001821680612b9c57607f821691505b60208210811415612bbd57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612bd757612bd7612bde565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113f357600080fd5b80151581146113f357600080fdfea2646970667358221220e4934fe91bbda4ea6ecdd510116e83fe6f7234862b759853c741339a584c6dbb64736f6c63430008000033

Deployed Bytecode Sourcemap

184:12401:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3038:194:8;;;;;;;;;;-1:-1:-1;3038:194:8;;;;;:::i;:::-;;:::i;:::-;;3337:321:7;;;;;;;;;;-1:-1:-1;3337:321:7;;;;;:::i;:::-;;:::i;1310:81::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2133:158;;;;;;;;;;-1:-1:-1;2133:158:7;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3011:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1575:93::-;;;;;;;;;;;;;:::i;2755:125:8:-;;;;;;;;;;-1:-1:-1;2755:125:8;;;;;:::i;:::-;;:::i;2297:262:7:-;;;;;;;;;;-1:-1:-1;2297:262:7;;;;;:::i;:::-;;:::i;4097:246::-;;;;;;;;;;-1:-1:-1;4097:246:7;;;;;:::i;:::-;;:::i;3447:196:8:-;;;;;;;;;;-1:-1:-1;3447:196:8;;;;;:::i;:::-;;:::i;1488:81:7:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3222:109::-;;;;;;;;;;;;;:::i;694:31::-;;;;;;;;;;;;;:::i;2565:212::-;;;;;;;;;;-1:-1:-1;2565:212:7;;;;;:::i;:::-;;:::i;597:98:8:-;;;;;;;;;;;;;:::i;3664:427:7:-;;;;;;;;;;-1:-1:-1;3664:427:7;;;;;:::i;:::-;;:::i;804:82:8:-;;;;;;;;;;;;;:::i;1674:136:7:-;;;;;;;;;;-1:-1:-1;1674:136:7;;;;;:::i;:::-;;:::i;1598:92:6:-;;;;;;;;;;;;;:::i;2611:138:8:-;;;;;;;;;;-1:-1:-1;2611:138:8;;;;;:::i;:::-;;:::i;177:43::-;;;;;;;;;;-1:-1:-1;177:43:8;;;;;:::i;:::-;;:::i;966:85:6:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1397::7:-;;;;;;;;;;;;;:::i;3860:204:8:-;;;;;;;;;;-1:-1:-1;3860:204:8;;;;;:::i;:::-;;:::i;2886:142::-;;;;;;;;;;-1:-1:-1;2886:142:8;;;;;:::i;:::-;;:::i;276:48::-;;;;;;;;;;-1:-1:-1;276:48:8;;;;;:::i;:::-;;:::i;2783:222:7:-;;;;;;;;;;-1:-1:-1;2783:222:7;;;;;:::i;:::-;;:::i;1816:164::-;;;;;;;;;;-1:-1:-1;1816:164:7;;;;;:::i;:::-;;:::i;2483:122:8:-;;;;;;;;;;-1:-1:-1;2483:122:8;;;;;:::i;:::-;;:::i;3653:197::-;;;;;;;;;;-1:-1:-1;3653:197:8;;;;;:::i;:::-;;:::i;541:44:7:-;;;;;;;;;;;;;:::i;9336:997::-;;;;;;:::i;:::-;;:::i;3242:195:8:-;;;;;;;;;;-1:-1:-1;3242:195:8;;;;;:::i;:::-;;:::i;8823:503:7:-;;;;;;;;;;-1:-1:-1;8823:503:7;;;;;:::i;:::-;;:::i;701:97:8:-;;;;;;;;;;;;;:::i;3104:112:7:-;;;;;;;;;;;;;:::i;1986:141::-;;;;;;;;;;-1:-1:-1;1986:141:7;;;;;:::i;:::-;;:::i;10664:103::-;;;;;;;;;;-1:-1:-1;10664:103:7;;;;;:::i;:::-;;:::i;1839:189:6:-;;;;;;;;;;-1:-1:-1;1839:189:6;;;;;:::i;:::-;;:::i;4074:205:8:-;;;;;;;;;;-1:-1:-1;4074:205:8;;;;;:::i;:::-;;:::i;226:44::-;;;;;;;;;;-1:-1:-1;226:44:8;;;;;:::i;:::-;;:::i;3038:194::-;3110:9;:7;:9::i;:::-;3102:18;;;;;;3135:6;3130:96;3151:6;:13;3147:1;:17;3130:96;;;3211:4;3186:11;:22;3198:6;3205:1;3198:9;;;;;;-1:-1:-1;;;3198:9:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3186:22:8;;;;;;;;;;;-1:-1:-1;3186:22:8;:29;;-1:-1:-1;;3186:29:8;;;;;;;;;;3166:4;;;;:::i;:::-;;;;3130:96;;;;3038:194;:::o;3337:321:7:-;3398:12;;;;3390:36;;;;-1:-1:-1;;;3390:36:7;;;;;;;:::i;:::-;;;;;;;;;3436:14;3453:12;:10;:12::i;:::-;3436:29;;3476:15;3499:19;3510:7;3499:10;:19::i;:::-;-1:-1:-1;;;;;;;;3546:15:7;;;;;;:7;:15;;;;;;3475:43;;-1:-1:-1;3546:25:7;;3475:43;;-1:-1:-1;3546:25:7;:::i;:::-;-1:-1:-1;;;;;3528:15:7;;;;;;:7;:15;;;;;:43;3591:7;;:17;;3601:7;;3591:17;:::i;:::-;3581:7;:27;3631:10;;:20;;3644:7;;3631:20;:::i;:::-;3618:10;:33;-1:-1:-1;;;3337:321:7:o;1310:81::-;1347:13;1379:5;1372:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1310:81;:::o;2133:158::-;2208:4;2224:39;2233:12;:10;:12::i;:::-;2247:7;2256:6;2224:8;:39::i;:::-;-1:-1:-1;2280:4:7;2133:158;;;;;:::o;3011:87::-;3081:10;;3011:87;:::o;1575:93::-;575:10;1575:93;:::o;2755:125:8:-;2824:9;:7;:9::i;:::-;2816:18;;;;;;2844:4;:2;:4::i;:::-;-1:-1:-1;;;;;2844:19:8;;2864:8;2844:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2755:125;:::o;2297:262:7:-;2395:4;2411:36;2421:6;2429:9;2440:6;2411:9;:36::i;:::-;2457:74;2466:6;2474:12;:10;:12::i;:::-;-1:-1:-1;;;;;2488:19:7;;;;;;:11;:19;;;;;2524:6;;2508:12;:10;:12::i;:::-;-1:-1:-1;;;;;2488:33:7;-1:-1:-1;;;;;2488:33:7;;;;;;;;;;;;;:42;;;;:::i;:::-;2457:8;:74::i;:::-;-1:-1:-1;2548:4:7;2297:262;;;;;:::o;4097:246::-;4163:7;4201;;4190;:18;;4182:73;;;;-1:-1:-1;;;4182:73:7;;;;;;;:::i;:::-;4265:19;4288:10;:8;:10::i;:::-;4265:33;-1:-1:-1;4315:21:7;4265:33;4315:7;:21;:::i;:::-;4308:28;;;4097:246;;;;:::o;3447:196:8:-;3520:9;:7;:9::i;:::-;3512:18;;;;;;3545:6;3540:97;3561:6;:13;3557:1;:17;3540:97;;;3622:4;3596:12;:23;3609:6;3616:1;3609:9;;;;;;-1:-1:-1;;;3609:9:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3596:23:8;;;;;;;;;;;-1:-1:-1;3596:23:8;:30;;-1:-1:-1;;3596:30:8;;;;;;;;;;3576:4;;;;:::i;:::-;;;;3540:97;;1488:81:7;1553:9;;;;1488:81;:::o;3222:109::-;1189:12:6;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:6;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:6;;1170:68;;;;-1:-1:-1;;;1170:68:6;;;;;;;:::i;:::-;3273:12:7::1;:19:::0;;-1:-1:-1;;3273:19:7::1;3288:4;3273:19:::0;;::::1;::::0;;;3307:17:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;3222:109::o:0;694:31::-;;;;;;:::o;2565:212::-;2653:4;2669:80;2678:12;:10;:12::i;:::-;2692:7;2738:10;2701:11;:25;2713:12;:10;:12::i;:::-;-1:-1:-1;;;;;2701:25:7;;;;;;;;;;;;;;;;;-1:-1:-1;2701:25:7;;;:34;;;;;;;;;;:47;;;;:::i;597:98:8:-;651:9;:7;:9::i;:::-;643:18;;;;;;683:5;671:17;;-1:-1:-1;;;;671:17:8;;;597:98::o;3664:427:7:-;3756:7;575:10;3783:7;:18;;3775:62;;;;-1:-1:-1;;;3775:62:7;;;;;;;:::i;:::-;3852:17;3847:238;;3886:15;3909:19;3920:7;3909:10;:19::i;:::-;-1:-1:-1;3885:43:7;;-1:-1:-1;3942:14:7;;-1:-1:-1;;;;3942:14:7;3847:238;3989:23;4019:19;4030:7;4019:10;:19::i;:::-;-1:-1:-1;3987:51:7;;-1:-1:-1;4052:22:7;;-1:-1:-1;;;;4052:22:7;804:82:8;847:4;870:9;-1:-1:-1;;;870:9:8;;;;;804:82::o;1674:136:7:-;-1:-1:-1;;;;;1786:16:7;;1740:7;1786:16;;;:7;:16;;;;;;1766:37;;:19;:37::i;1598:92:6:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:6;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:6;;1170:68;;;;-1:-1:-1;;;1170:68:6;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;2611:138:8:-;2691:9;:7;:9::i;:::-;2683:18;;;;;;2711:4;:2;:4::i;:::-;-1:-1:-1;;;;;2711:19:8;;2731:10;2711:31;;;;;;;;;;;;;;;:::i;177:43::-;;;;;;;;;;;;;;;:::o;966:85:6:-;1012:7;1038:6;-1:-1:-1;;;;;1038:6:6;966:85;:::o;1397::7:-;1436:13;1468:7;1461:14;;;;;:::i;3860:204:8:-;3937:9;:7;:9::i;:::-;3929:18;;;;;;3962:6;3957:101;3978:6;:13;3974:1;:17;3957:101;;;4043:4;4013:16;:27;4030:6;4037:1;4030:9;;;;;;-1:-1:-1;;;4030:9:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4013:27:8;;;;;;;;;;;-1:-1:-1;4013:27:8;:34;;-1:-1:-1;;4013:34:8;;;;;;;;;;3993:4;;;;:::i;:::-;;;;3957:101;;2886:142;2968:9;:7;:9::i;:::-;2960:18;;;;;;2988:4;:2;:4::i;:::-;-1:-1:-1;;;;;2988:21:8;;3010:10;2988:33;;;;;;;;;;;;;;;:::i;276:48::-;;;;;;;;;;;;;;;:::o;2783:222:7:-;2876:4;2892:85;2901:12;:10;:12::i;:::-;2915:7;2961:15;2924:11;:25;2936:12;:10;:12::i;:::-;-1:-1:-1;;;;;2924:25:7;;;;;;;;;;;;;;;;;-1:-1:-1;2924:25:7;;;:34;;;;;;;;;;:52;;;;:::i;1816:164::-;1894:4;1910:42;1920:12;:10;:12::i;:::-;1934:9;1945:6;1910:9;:42::i;2483:122:8:-;2550:9;:7;:9::i;:::-;2542:18;;;;;;2570:4;:2;:4::i;:::-;-1:-1:-1;;;;;2570:17:8;;2588:8;2570:27;;;;;;;;;;;;;;;:::i;3653:197::-;3726:9;:7;:9::i;:::-;3718:18;;;;;;3751:6;3746:98;3767:6;:13;3763:1;:17;3746:98;;;3828:5;3802:12;:23;3815:6;3822:1;3815:9;;;;;;-1:-1:-1;;;3815:9:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3802:23:8;;;;;;;;;;;-1:-1:-1;3802:23:8;:31;;-1:-1:-1;;3802:31:8;;;;;;;;;;3782:4;;;;:::i;:::-;;;;3746:98;;541:44:7;575:10;541:44;:::o;9336:997::-;1189:12:6;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:6;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:6;;1170:68;;;;-1:-1:-1;;;1170:68:6;;;;;;;:::i;:::-;9624:15:7::1;::::0;9592:70:::1;::::0;9609:4:::1;::::0;-1:-1:-1;;;;;9624:15:7::1;9642:19:::0;9592:8:::1;:70::i;:::-;9676:15;::::0;:230:::1;::::0;-1:-1:-1;;;9676:230:7;;-1:-1:-1;;;;;9676:15:7;;::::1;::::0;:31:::1;::::0;9715:9:::1;::::0;9676:230:::1;::::0;9751:4:::1;::::0;9774:19;;9811:15;;9844:13;;9875:3;;9896:9;;9676:230:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;9920:4;:2;:4::i;:::-;-1:-1:-1::0;;;;;9920:19:7::1;;9957:12;9987:15;10020:19;:17;:19::i;:::-;10057:10;10085:18;:16;:18::i;:::-;10121:17;:15;:17::i;:::-;10156:29;:27;:29::i;:::-;10203:24;:22;:24::i;:::-;10245:17;:15;:17::i;:::-;10288:4;9920:374;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10308:18;:16;:18::i;:::-;9336:997:::0;;;;;;:::o;3242:195:8:-;3314:9;:7;:9::i;:::-;3306:18;;;;;;3339:6;3334:97;3355:6;:13;3351:1;:17;3334:97;;;3415:5;3390:11;:22;3402:6;3409:1;3402:9;;;;;;-1:-1:-1;;;3402:9:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3390:22:8;;;;;;;;;;;-1:-1:-1;3390:22:8;:30;;-1:-1:-1;;3390:30:8;;;;;;;;;;3370:4;;;;:::i;:::-;;;;3334:97;;8823:503:7;1189:12:6;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:6;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:6;;1170:68;;;;-1:-1:-1;;;1170:68:6;;;;;;;:::i;:::-;9052:15:7::1;::::0;9020:70:::1;::::0;9037:4:::1;::::0;-1:-1:-1;;;;;9052:15:7::1;9070:19:::0;9020:8:::1;:70::i;:::-;9100:15;::::0;:219:::1;::::0;-1:-1:-1;;;9100:219:7;;-1:-1:-1;;;;;9100:15:7;;::::1;::::0;:31:::1;::::0;9139:13;;9100:219:::1;::::0;9175:4:::1;::::0;9194:19;;9227:15;;9139:13;;9283:3;;9300:9;;9100:219:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;8823:503:::0;;;;;:::o;701:97:8:-;754:9;:7;:9::i;:::-;746:18;;;;;;774:9;:16;;-1:-1:-1;;;;774:16:8;-1:-1:-1;;;774:16:8;;;701:97::o;3104:112:7:-;1189:12:6;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:6;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:6;;1170:68;;;;-1:-1:-1;;;1170:68:6;;;;;;;:::i;:::-;3156:12:7::1;:20:::0;;-1:-1:-1;;3156:20:7::1;::::0;;3191:18:::1;::::0;::::1;::::0;::::1;::::0;3171:5:::1;::::0;3191:18:::1;:::i;1986:141::-:0;-1:-1:-1;;;;;2093:18:7;;;2067:7;2093:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;1986:141::o;10664:103::-;1189:12:6;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:6;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:6;;1170:68;;;;-1:-1:-1;;;1170:68:6;;;;;;;:::i;:::-;10736:18:7::1;:24:::0;;-1:-1:-1;;;;;;10736:24:7::1;-1:-1:-1::0;;;;;10736:24:7;;;::::1;::::0;;;::::1;::::0;;10664:103::o;1839:189:6:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:6;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:6;;1170:68;;;;-1:-1:-1;;;1170:68:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:6;::::1;1919:73;;;;-1:-1:-1::0;;;1919:73:6::1;;;;;;;:::i;:::-;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;4074:205:8:-;4151:9;:7;:9::i;:::-;4143:18;;;;;;4176:6;4171:102;4192:6;:13;4188:1;:17;4171:102;;;4257:5;4227:16;:27;4244:6;4251:1;4244:9;;;;;;-1:-1:-1;;;4244:9:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4227:27:8;;;;;;;;;;;-1:-1:-1;4227:27:8;:35;;-1:-1:-1;;4227:35:8;;;;;;;;;;4207:4;;;;:::i;:::-;;;;4171:102;;226:44;;;;;;;;;;;;;;;:::o;10497:161:7:-;10547:4;10584:7;:5;:7::i;:::-;-1:-1:-1;;;;;10570:21:7;:10;-1:-1:-1;;;;;10570:21:7;;:52;;;-1:-1:-1;10595:10:7;10617:4;10595:27;10570:52;10563:59;;10497:161;:::o;587:96:0:-;666:10;587:96;:::o;6520:406:7:-;6579:7;6588;6597;6606;6615;6635:23;6660:12;6676:20;6688:7;6676:11;:20::i;:::-;6634:62;;;;6706:19;6729:10;:8;:10::i;:::-;6706:33;;6750:15;6767:23;6792:12;6808:39;6820:7;6829:4;6835:11;6808;:39::i;:::-;6749:98;;;;-1:-1:-1;6749:98:7;;-1:-1:-1;6897:15:7;;-1:-1:-1;6914:4:7;;-1:-1:-1;6520:406:7;;-1:-1:-1;;;;;;6520:406:7:o;4349:331::-;-1:-1:-1;;;;;4441:19:7;;4433:68;;;;-1:-1:-1;;;4433:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;4519:21:7;;4511:68;;;;-1:-1:-1;;;4511:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;4590:18:7;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;4641:32;;;;;4620:6;;4641:32;:::i;:::-;;;;;;;;4349:331;;;:::o;464:123:8:-;500:20;560:19;:17;:19::i;4686:837:7:-;-1:-1:-1;;;;;4782:20:7;;4774:70;;;;-1:-1:-1;;;4774:70:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;4862:23:7;;4854:71;;;;-1:-1:-1;;;4854:71:7;;;;;;;:::i;:::-;4939:12;;;;4935:582;;;-1:-1:-1;;;;;4971:23:7;;4989:4;4971:23;4967:109;;5014:47;5035:6;5043:9;5054:6;5014:20;:47::i;:::-;5106:11;;-1:-1:-1;;;;;5093:24:7;;;5106:11;;5093:24;:51;;;;-1:-1:-1;;;;;;5121:23:7;;5139:4;5121:23;;5093:51;5089:219;;;5164:43;5181:6;5189:9;5200:6;5164:16;:43::i;:::-;5089:219;;;5247:46;5267:6;5275:9;5286:6;5247:19;:46::i;:::-;4935:582;;;-1:-1:-1;;;;;5342:23:7;;5360:4;5342:23;5338:109;;5385:47;5406:6;5414:9;5425:6;5385:20;:47::i;:::-;5460:46;5480:6;5488:9;5499:6;5460:19;:46::i;:::-;4686:837;;;:::o;7481:157::-;7522:7;7542:15;7559;7578:19;:17;:19::i;:::-;7541:56;;-1:-1:-1;7541:56:7;-1:-1:-1;7614:17:7;7541:56;;7614:17;:::i;:::-;7607:24;;;;7481:157;:::o;2034:169:6:-;2089:16;2108:6;;-1:-1:-1;;;;;2124:17:6;;;-1:-1:-1;;;;;;2124:17:6;;;;;;2156:40;;2108:6;;;;;;;2156:40;;2089:16;2156:40;2034:169;;:::o;11551:114:7:-;11634:4;11551:114;:::o;12208:120::-;12290:2;12208:120;:::o;12334:118::-;12415:1;12334:118;:::o;11149:119::-;11230:2;11149:119;:::o;6932:217::-;6992:7;;;7049:3;7035:11;:7;7045:1;7035:11;:::i;:::-;:17;;;;:::i;:::-;7020:32;-1:-1:-1;7062:23:7;7088:14;7020:32;7088:7;:14;:::i;:::-;7062:40;-1:-1:-1;7137:4:7;;-1:-1:-1;;6932:217:7;;;:::o;7155:320::-;7250:7;;;;7305:21;7315:11;7305:7;:21;:::i;:::-;7287:39;-1:-1:-1;7336:12:7;7351:18;7358:11;7351:4;:18;:::i;:::-;7336:33;-1:-1:-1;7379:23:7;7405:14;7336:33;7405:7;:14;:::i;:::-;7437:7;;;;-1:-1:-1;7463:4:7;;-1:-1:-1;7155:320:7;;-1:-1:-1;;;;;7155:320:7:o;10773:111::-;10859:18;;-1:-1:-1;;;;;10859:18:7;10773:111;:::o;10343:148::-;10434:50;10464:5;10471:3;10476:7;10434:29;:50::i;5529:456::-;5626:15;5643:23;5668:12;5682:23;5707:12;5723:19;5734:7;5723:10;:19::i;:::-;5625:117;;;;;;;;;;5752:14;5761:4;5752:8;:14::i;:::-;-1:-1:-1;;;;;5794:15:7;;;;;;:7;:15;;;;;;:25;;5812:7;;5794:25;:::i;:::-;-1:-1:-1;;;;;5776:15:7;;;;;;;:7;:15;;;;;;:43;;;;5850:18;;;;;;;:36;;5871:15;;5850:36;:::i;:::-;-1:-1:-1;;;;;5829:18:7;;;;;;:7;:18;;;;;:57;5896:23;5908:4;5914;5896:11;:23::i;:::-;5951:9;-1:-1:-1;;;;;5934:44:7;5943:6;-1:-1:-1;;;;;5934:44:7;;5962:15;5934:44;;;;;;:::i;:::-;;;;;;;;5529:456;;;;;;;;:::o;5991:367::-;6091:15;6108:23;6133:12;6153:19;6164:7;6153:10;:19::i;:::-;-1:-1:-1;;;;;;;6200:15:7;;;;;;:7;:15;;;;;;6090:82;;-1:-1:-1;6090:82:7;;-1:-1:-1;6090:82:7;-1:-1:-1;6200:25:7;;6090:82;;6200:25;:::i;:::-;-1:-1:-1;;;;;6182:15:7;;;;;;;:7;:15;;;;;;:43;;;;6256:18;;;;;;;6295:4;;6256:36;;6277:15;;6256:36;:::i;:::-;:43;;;;:::i;:::-;-1:-1:-1;;;;;6235:18:7;;;;;;;:7;:18;;;;;;;:64;;;;6315:36;;;;;;;;;;6343:7;;6315:36;:::i;:::-;;;;;;;;5991:367;;;;;;:::o;7644:110::-;7730:7;;575:10;7644:110;;:::o;4397:1288:8:-;4501:9;;-1:-1:-1;;;4501:9:8;;;;:26;;;;-1:-1:-1;4523:4:8;;-1:-1:-1;;;;;4514:13:8;;;4523:4;;4514:13;4501:26;:46;;;;-1:-1:-1;;;;;;4531:16:8;;;;;;:11;:16;;;;;;;;4501:46;4497:83;;;4563:7;;4497:83;4593:9;;-1:-1:-1;;;4593:9:8;;;;:24;;;;-1:-1:-1;4613:4:8;;-1:-1:-1;;;;;4606:11:8;;;4613:4;;4606:11;4593:24;:47;;;;-1:-1:-1;;;;;;4621:19:8;;;;;;:12;:19;;;;;;;;4593:47;4589:84;;;4656:7;;4589:84;4686:9;;-1:-1:-1;;;4686:9:8;;;;:24;;;;-1:-1:-1;4706:4:8;;-1:-1:-1;;;;;4699:11:8;;;4706:4;;4699:11;;4686:24;:41;;;;-1:-1:-1;4723:4:8;;-1:-1:-1;;;;;4714:13:8;;;4723:4;;4714:13;;4686:41;:68;;;;-1:-1:-1;;;;;;4731:23:8;;;;;;:16;:23;;;;;;;;4686:68;4682:105;;;4770:7;;4682:105;4800:9;;-1:-1:-1;;;4800:9:8;;;;4796:883;;;4834:29;:27;:29::i;:::-;4833:30;:58;;;;4868:4;:2;:4::i;:::-;-1:-1:-1;;;;;4868:21:8;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4867:24;4833:58;4825:92;;;;-1:-1:-1;;;4825:92:8;;;;;;;:::i;:::-;4940:24;:22;:24::i;:::-;4939:25;:54;;;;4969:4;:2;:4::i;:::-;-1:-1:-1;;;;;4969:22:8;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4968:25;4939:54;4931:82;;;;-1:-1:-1;;;4931:82:8;;;;;;;:::i;:::-;5036:32;:30;:32::i;:::-;5035:33;:97;;;;5073:4;:2;:4::i;:::-;-1:-1:-1;;;;;5073:24:8;;5098:7;5107:24;:22;:24::i;:::-;5073:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5072:60;5035:97;5027:126;;;;-1:-1:-1;;;5027:126:8;;;;;;;:::i;:::-;5176:30;:28;:30::i;:::-;5175:31;:100;;;;5211:4;:2;:4::i;:::-;-1:-1:-1;;;;;5211:22:8;;5234:5;5241:7;5250:24;:22;:24::i;:::-;5211:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5210:65;5175:100;5167:130;;;;-1:-1:-1;;;5167:130:8;;;;;;;:::i;:::-;5320:19;:17;:19::i;:::-;5319:20;:65;;;;5344:4;:2;:4::i;:::-;-1:-1:-1;;;;;5344:24:8;;5369:5;5376:7;5344:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5343:41;5319:65;5311:91;;;;-1:-1:-1;;;5311:91:8;;;;;;;:::i;:::-;5425:28;:26;:28::i;:::-;5424:29;:98;;;;5458:4;:2;:4::i;:::-;-1:-1:-1;;;;;5458:29:8;;5488:5;5495:3;5500:21;:19;:21::i;:::-;5458:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5457:65;5424:98;5416:131;;;;-1:-1:-1;;;5416:131:8;;;;;;;:::i;:::-;5570:26;:24;:26::i;:::-;5569:27;:69;;;;5601:4;:2;:4::i;:::-;-1:-1:-1;;;;;5601:25:8;;5627:5;5634:3;5601:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5600:38;5569:69;5561:107;;;;-1:-1:-1;;;5561:107:8;;;;;;;:::i;7764:1049:7:-;7851:1;7840:8;:4;7847:1;7840:8;:::i;:::-;:12;;;;:::i;:::-;7830:4;7814:22;;;;:7;:22;;;;;:38;;:22;;;:38;;;;;:::i;:::-;;;;-1:-1:-1;7862:17:7;;-1:-1:-1;7882:33:7;7913:1;7902:8;:4;7909:1;7902:8;:::i;:::-;:12;;;;:::i;7882:33::-;7862:53;-1:-1:-1;7925:9:7;7937:16;7952:1;7862:53;7937:16;:::i;:::-;7925:28;-1:-1:-1;7963:16:7;7982:19;7925:28;7982:12;:19;:::i;:::-;8043:15;;7963:38;;-1:-1:-1;8011:55:7;;8028:4;;-1:-1:-1;;;;;8043:15:7;8061:4;8011:8;:55::i;:::-;8100:16;;;8114:1;8100:16;;;;;;;;8076:21;;8100:16;;;;;;;;;;-1:-1:-1;8100:16:7;8076:40;;8144:4;8126;8131:1;8126:7;;;;;;-1:-1:-1;;;8126:7:7;;;;;;;;;-1:-1:-1;;;;;8126:23:7;;;:7;;;;;;;;;;:23;;;;8169:15;;:22;;;-1:-1:-1;;;8169:22:7;;;;:15;;;;;:20;;:22;;;;;8126:7;;8169:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8159:4;8164:1;8159:7;;;;;;-1:-1:-1;;;8159:7:7;;;;;;;;;-1:-1:-1;;;;;8159:32:7;;;:7;;;;;;;;;:32;8253:15;;:210;;-1:-1:-1;;;8253:210:7;;8222:21;;8253:15;;;;;:66;;:210;;8333:4;;8201:18;;8393:4;;8419;;8438:15;;8253:210;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8556:15:7;;8493:21;;-1:-1:-1;8524:62:7;;-1:-1:-1;8541:4:7;;-1:-1:-1;;;;;8556:15:7;8574:11;8524:8;:62::i;:::-;8596:15;;-1:-1:-1;;;;;8596:15:7;:31;8635:28;8650:13;8635:12;:28;:::i;:::-;8686:4;8705:11;8730:1;8745;8760:7;:5;:7::i;:::-;8781:15;8596:210;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;7764:1049;;;;;;;:::o;6364:146::-;6462:1;6451:8;:4;6458:1;6451:8;:::i;:::-;:12;;;;:::i;:::-;6441:7;;:22;;;;:::i;:::-;6431:7;:32;6486:10;;:17;;6499:4;;6486:17;:::i;:::-;6473:10;:30;-1:-1:-1;;6364:146:7:o;11807:125::-;11895:1;11807:125;:::o;11671:126::-;11742:4;11671:126;:::o;12075:123::-;12160:2;12075:123;:::o;14:138:9:-;84:20;;113:33;84:20;113:33;:::i;157:259::-;;269:2;257:9;248:7;244:23;240:32;237:2;;;290:6;282;275:22;237:2;334:9;321:23;353:33;380:5;353:33;:::i;:::-;405:5;227:189;-1:-1:-1;;;227:189:9:o;421:263::-;;544:2;532:9;523:7;519:23;515:32;512:2;;;565:6;557;550:22;512:2;602:9;596:16;621:33;648:5;621:33;:::i;689:402::-;;;818:2;806:9;797:7;793:23;789:32;786:2;;;839:6;831;824:22;786:2;883:9;870:23;902:33;929:5;902:33;:::i;:::-;954:5;-1:-1:-1;1011:2:9;996:18;;983:32;1024:35;983:32;1024:35;:::i;:::-;1078:7;1068:17;;;776:315;;;;;:::o;1096:470::-;;;;1242:2;1230:9;1221:7;1217:23;1213:32;1210:2;;;1263:6;1255;1248:22;1210:2;1307:9;1294:23;1326:33;1353:5;1326:33;:::i;:::-;1378:5;-1:-1:-1;1435:2:9;1420:18;;1407:32;1448:35;1407:32;1448:35;:::i;:::-;1200:366;;1502:7;;-1:-1:-1;;;1556:2:9;1541:18;;;;1528:32;;1200:366::o;1571:327::-;;;1700:2;1688:9;1679:7;1675:23;1671:32;1668:2;;;1721:6;1713;1706:22;1668:2;1765:9;1752:23;1784:33;1811:5;1784:33;:::i;:::-;1836:5;1888:2;1873:18;;;;1860:32;;-1:-1:-1;;;1658:240:9:o;1903:1166::-;;2018:2;2061;2049:9;2040:7;2036:23;2032:32;2029:2;;;2082:6;2074;2067:22;2029:2;2127:9;2114:23;2156:18;2197:2;2189:6;2186:14;2183:2;;;2218:6;2210;2203:22;2183:2;2261:6;2250:9;2246:22;2236:32;;2306:7;2299:4;2295:2;2291:13;2287:27;2277:2;;2333:6;2325;2318:22;2277:2;2374;2361:16;2396:2;2392;2389:10;2386:2;;;2402:18;;:::i;:::-;2449:2;2445;2441:11;2481:2;2475:9;2532:2;2527;2519:6;2515:15;2511:24;2585:6;2573:10;2570:22;2565:2;2553:10;2550:18;2547:46;2544:2;;;2596:18;;:::i;:::-;2632:2;2625:22;2682:18;;;2716:15;;;;-1:-1:-1;2751:11:9;;;2781;;;2777:20;;2774:33;-1:-1:-1;2771:2:9;;;2825:6;2817;2810:22;2771:2;2852:6;2843:15;;2867:171;2881:2;2878:1;2875:9;2867:171;;;2938:25;2959:3;2938:25;:::i;:::-;2926:38;;2899:1;2892:9;;;;;2984:12;;;;3016;;2867:171;;;-1:-1:-1;3057:6:9;1998:1071;-1:-1:-1;;;;;;;;1998:1071:9:o;3074:257::-;;3194:2;3182:9;3173:7;3169:23;3165:32;3162:2;;;3215:6;3207;3200:22;3162:2;3252:9;3246:16;3271:30;3295:5;3271:30;:::i;3336:190::-;;3448:2;3436:9;3427:7;3423:23;3419:32;3416:2;;;3469:6;3461;3454:22;3416:2;-1:-1:-1;3497:23:9;;3406:120;-1:-1:-1;3406:120:9:o;3531:321::-;;;3657:2;3645:9;3636:7;3632:23;3628:32;3625:2;;;3678:6;3670;3663:22;3625:2;3719:9;3706:23;3696:33;;3779:2;3768:9;3764:18;3751:32;3792:30;3816:5;3792:30;:::i;3857:316::-;;;;4014:2;4002:9;3993:7;3989:23;3985:32;3982:2;;;4035:6;4027;4020:22;3982:2;4069:9;4063:16;4053:26;;4119:2;4108:9;4104:18;4098:25;4088:35;;4163:2;4152:9;4148:18;4142:25;4132:35;;3972:201;;;;;:::o;4178:533::-;;;;;;4358:3;4346:9;4337:7;4333:23;4329:33;4326:2;;;4380:6;4372;4365:22;4326:2;4421:9;4408:23;4398:33;;4478:2;4467:9;4463:18;4450:32;4440:42;;4529:2;4518:9;4514:18;4501:32;4491:42;;4583:2;4572:9;4568:18;4555:32;4596:33;4623:5;4596:33;:::i;:::-;4316:395;;;;-1:-1:-1;4316:395:9;;4700:3;4685:19;4672:33;;4316:395;-1:-1:-1;;4316:395:9:o;4716:602::-;;;;;;;4913:3;4901:9;4892:7;4888:23;4884:33;4881:2;;;4935:6;4927;4920:22;4881:2;4976:9;4963:23;4953:33;;5033:2;5022:9;5018:18;5005:32;4995:42;;5084:2;5073:9;5069:18;5056:32;5046:42;;5138:2;5127:9;5123:18;5110:32;5151:33;5178:5;5151:33;:::i;:::-;4871:447;;;;-1:-1:-1;4871:447:9;;5255:3;5240:19;;5227:33;;5307:3;5292:19;;;5279:33;;-1:-1:-1;4871:447:9;-1:-1:-1;;4871:447:9:o;5323:469::-;;5420:5;5414:12;5447:6;5442:3;5435:19;5473:4;5502:2;5497:3;5493:12;5486:19;;5539:2;5532:5;5528:14;5560:3;5572:195;5586:6;5583:1;5580:13;5572:195;;;5651:13;;-1:-1:-1;;;;;5647:39:9;5635:52;;5707:12;;;;5742:15;;;;5683:1;5601:9;5572:195;;;-1:-1:-1;5783:3:9;;5390:402;-1:-1:-1;;;;;5390:402:9:o;5797:203::-;-1:-1:-1;;;;;5961:32:9;;;;5943:51;;5931:2;5916:18;;5898:102::o;6005:304::-;-1:-1:-1;;;;;6235:15:9;;;6217:34;;6287:15;;6282:2;6267:18;;6260:43;6167:2;6152:18;;6134:175::o;6314:375::-;-1:-1:-1;;;;;6572:15:9;;;6554:34;;6624:15;;;;6619:2;6604:18;;6597:43;6671:2;6656:18;;6649:34;;;;6504:2;6489:18;;6471:218::o;6694:274::-;-1:-1:-1;;;;;6886:32:9;;;;6868:51;;6950:2;6935:18;;6928:34;6856:2;6841:18;;6823:145::o;6973:607::-;-1:-1:-1;;;;;7332:15:9;;;7314:34;;7379:2;7364:18;;7357:34;;;;7422:2;7407:18;;7400:34;;;;7465:2;7450:18;;7443:34;;;;7514:15;;;7508:3;7493:19;;7486:44;7294:3;7546:19;;7539:35;;;;7263:3;7248:19;;7230:350::o;7585:345::-;-1:-1:-1;;;;;7805:32:9;;;;7787:51;;7869:2;7854:18;;7847:34;;;;7912:2;7897:18;;7890:34;7775:2;7760:18;;7742:188::o;8531:267::-;;8710:2;8699:9;8692:21;8730:62;8788:2;8777:9;8773:18;8765:6;8730:62;:::i;8803:187::-;8968:14;;8961:22;8943:41;;8931:2;8916:18;;8898:92::o;8995:603::-;;9136:2;9165;9154:9;9147:21;9197:6;9191:13;9240:6;9235:2;9224:9;9220:18;9213:34;9265:4;9278:140;9292:6;9289:1;9286:13;9278:140;;;9387:14;;;9383:23;;9377:30;9353:17;;;9372:2;9349:26;9342:66;9307:10;;9278:140;;;9436:6;9433:1;9430:13;9427:2;;;9506:4;9501:2;9492:6;9481:9;9477:22;9473:31;9466:45;9427:2;-1:-1:-1;9582:2:9;9561:15;-1:-1:-1;;9557:29:9;9542:45;;;;9589:2;9538:54;;9116:482;-1:-1:-1;;;9116:482:9:o;9603:399::-;9805:2;9787:21;;;9844:2;9824:18;;;9817:30;9883:34;9878:2;9863:18;;9856:62;-1:-1:-1;;;9949:2:9;9934:18;;9927:33;9992:3;9977:19;;9777:225::o;10007:341::-;10209:2;10191:21;;;10248:2;10228:18;;;10221:30;-1:-1:-1;;;10282:2:9;10267:18;;10260:47;10339:2;10324:18;;10181:167::o;10353:349::-;10555:2;10537:21;;;10594:2;10574:18;;;10567:30;10633:27;10628:2;10613:18;;10606:55;10693:2;10678:18;;10527:175::o;10707:406::-;10909:2;10891:21;;;10948:2;10928:18;;;10921:30;10987:34;10982:2;10967:18;;10960:62;-1:-1:-1;;;11053:2:9;11038:18;;11031:40;11103:3;11088:19;;10881:232::o;11118:402::-;11320:2;11302:21;;;11359:2;11339:18;;;11332:30;11398:34;11393:2;11378:18;;11371:62;-1:-1:-1;;;11464:2:9;11449:18;;11442:36;11510:3;11495:19;;11292:228::o;11525:398::-;11727:2;11709:21;;;11766:2;11746:18;;;11739:30;11805:34;11800:2;11785:18;;11778:62;-1:-1:-1;;;11871:2:9;11856:18;;11849:32;11913:3;11898:19;;11699:224::o;11928:339::-;12130:2;12112:21;;;12169:2;12149:18;;;12142:30;-1:-1:-1;;;12203:2:9;12188:18;;12181:45;12258:2;12243:18;;12102:165::o;12272:340::-;12474:2;12456:21;;;12513:2;12493:18;;;12486:30;-1:-1:-1;;;12547:2:9;12532:18;;12525:46;12603:2;12588:18;;12446:166::o;12617:355::-;12819:2;12801:21;;;12858:2;12838:18;;;12831:30;12897:33;12892:2;12877:18;;12870:61;12963:2;12948:18;;12791:181::o;12977:335::-;13179:2;13161:21;;;13218:2;13198:18;;;13191:30;-1:-1:-1;;;13252:2:9;13237:18;;13230:41;13303:2;13288:18;;13151:161::o;13317:356::-;13519:2;13501:21;;;13538:18;;;13531:30;13597:34;13592:2;13577:18;;13570:62;13664:2;13649:18;;13491:182::o;13678:337::-;13880:2;13862:21;;;13919:2;13899:18;;;13892:30;-1:-1:-1;;;13953:2:9;13938:18;;13931:43;14006:2;13991:18;;13852:163::o;14020:344::-;14222:2;14204:21;;;14261:2;14241:18;;;14234:30;-1:-1:-1;;;14295:2:9;14280:18;;14273:50;14355:2;14340:18;;14194:170::o;14369:401::-;14571:2;14553:21;;;14610:2;14590:18;;;14583:30;14649:34;14644:2;14629:18;;14622:62;-1:-1:-1;;;14715:2:9;14700:18;;14693:35;14760:3;14745:19;;14543:227::o;14775:400::-;14977:2;14959:21;;;15016:2;14996:18;;;14989:30;15055:34;15050:2;15035:18;;15028:62;-1:-1:-1;;;15121:2:9;15106:18;;15099:34;15165:3;15150:19;;14949:226::o;15180:345::-;15382:2;15364:21;;;15421:2;15401:18;;;15394:30;-1:-1:-1;;;15455:2:9;15440:18;;15433:51;15516:2;15501:18;;15354:171::o;15530:177::-;15676:25;;;15664:2;15649:18;;15631:76::o;15712:588::-;;16011:6;16000:9;15993:25;16054:6;16049:2;16038:9;16034:18;16027:34;16097:3;16092:2;16081:9;16077:18;16070:31;16118:63;16176:3;16165:9;16161:19;16153:6;16118:63;:::i;:::-;-1:-1:-1;;;;;16217:32:9;;;;16212:2;16197:18;;16190:60;-1:-1:-1;16281:3:9;16266:19;16259:35;16110:71;15983:317;-1:-1:-1;;;15983:317:9:o;16305:248::-;16479:25;;;16535:2;16520:18;;16513:34;16467:2;16452:18;;16434:119::o;16558:879::-;16939:25;;;16995:2;16980:18;;16973:34;;;;17050:14;;17043:22;17038:2;17023:18;;17016:50;17097:2;17082:18;;17075:34;;;;17140:3;17125:19;;17118:35;;;;17184:3;17169:19;;17162:35;17241:14;17234:22;17228:3;17213:19;;17206:51;17301:14;17294:22;17288:3;17273:19;;17266:51;17348:3;17333:19;;17326:35;-1:-1:-1;;;;;17398:32:9;17392:3;17377:19;;17370:61;16926:3;16911:19;;16893:544::o;17442:184::-;17614:4;17602:17;;;;17584:36;;17572:2;17557:18;;17539:87::o;17631:128::-;;17702:1;17698:6;17695:1;17692:13;17689:2;;;17708:18;;:::i;:::-;-1:-1:-1;17744:9:9;;17679:80::o;17764:217::-;;17830:1;17820:2;;-1:-1:-1;;;17855:31:9;;17909:4;17906:1;17899:15;17937:4;17862:1;17927:15;17820:2;-1:-1:-1;17966:9:9;;17810:171::o;17986:168::-;;18092:1;18088;18084:6;18080:14;18077:1;18074:21;18069:1;18062:9;18055:17;18051:45;18048:2;;;18099:18;;:::i;:::-;-1:-1:-1;18139:9:9;;18038:116::o;18159:125::-;;18227:1;18224;18221:8;18218:2;;;18232:18;;:::i;:::-;-1:-1:-1;18269:9:9;;18208:76::o;18289:380::-;18374:1;18364:12;;18421:1;18411:12;;;18432:2;;18486:4;18478:6;18474:17;18464:27;;18432:2;18539;18531:6;18528:14;18508:18;18505:38;18502:2;;;18585:10;18580:3;18576:20;18573:1;18566:31;18620:4;18617:1;18610:15;18648:4;18645:1;18638:15;18502:2;;18344:325;;;:::o;18674:135::-;;-1:-1:-1;;18734:17:9;;18731:2;;;18754:18;;:::i;:::-;-1:-1:-1;18801:1:9;18790:13;;18721:88::o;18814:127::-;18875:10;18870:3;18866:20;18863:1;18856:31;18906:4;18903:1;18896:15;18930:4;18927:1;18920:15;18946:127;19007:10;19002:3;18998:20;18995:1;18988:31;19038:4;19035:1;19028:15;19062:4;19059:1;19052:15;19078:133;-1:-1:-1;;;;;19155:31:9;;19145:42;;19135:2;;19201:1;19198;19191:12;19216:120;19304:5;19297:13;19290:21;19283:5;19280:32;19270:2;;19326:1;19323;19316:12

Swarm Source

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