ETH Price: $3,384.99 (-2.76%)
Gas: 1 Gwei

Token

BountyProtocol (BPL)
 

Overview

Max Total Supply

66,703,078,602,298,830,606.005687053981735429 BPL

Holders

64

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,177,686,773.165997491965911367 BPL

Value
$0.00
0x758fe7e0d53d46a97801e63abea0f78c2ab73055
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:
BountyProtocol

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-31
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

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

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

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

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

contract BountyProtocol is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool private _swapping;

    address private _swapFeeReceiver;
    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    uint256 public swapTokensThreshold;
        
    bool public limitsInEffect = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _validatorFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForValidator;
    
    // validastor pool vars
    uint256 public totalStaked;
    address public stakingToken;
    address public rewardToken;
    uint256 [] public apr;

    bool public stakingEnabled = false;
    uint256 public totalClaimed;

    struct Validator {
        uint256 creationTime;
        uint256 staked;
    }

    struct Staker {
        address staker;
        uint256 start;
        uint256 staked;
        uint256 earned;
    }

    struct ClaimHistory {
        uint256[] dates;
        uint256[] amounts;
    }

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    // stake data
    mapping(address => mapping(uint256 => Staker)) private _stakers;
    mapping(address => ClaimHistory) private _claimHistory;
    Validator[] public validators;

    /**
     * @dev Throws if called by any account other than the _swapFeeReceiver
     */
    modifier teamOROwner() {
        require(_swapFeeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _swapFeeReceiver address nor owner.");
        _;
    }

    modifier isStakingEnabled() {
        require(stakingEnabled, "Bounty Protocol : Staking is not enabled.");
        _;
    }

    constructor() ERC20("BountyProtocol", "BPL") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 marketingFee = 4;
        uint256 liquidityFee = 1;
        uint256 validatorFee = 3;

        uint256 totalSupply = 5e11 * 1e18;

        maxTransactionAmount = totalSupply * 1 / 100;
        maxWallet = totalSupply * 2 / 100;
        swapTokensThreshold = totalSupply * 1 / 1000;
        
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;
        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        _swapFeeReceiver = owner();

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;
        
        stakingToken = address(this);
        rewardToken = address(this);
        apr.push(77);

        _mint(address(this), totalSupply);
    }

    /**
    * @dev Once live, can never be switched off
    */
    function startTrading() external teamOROwner {
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true;
        _automatedMarketMakerPairs[address(uniswapV2Pair)] = true;

        _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));
        uniswapV2Router.addLiquidityETH{value: address(this).balance} (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external teamOROwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public teamOROwner {
        _isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 validatorFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;

        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        require(totalFees <= 10, "Bounty Protocol  : Must keep fees at 10% or less");
    }

    function addValidatorAPR(uint256 _apr) external onlyOwner {
        require (_apr != 0, "Bounty Protocol : can not update apr to zero!");
        apr.push(_apr);
    }

    function decreaseValidatorAPR() external onlyOwner {
        apr.pop();
    }

    function updateValidatorAPR (uint256 _apr, uint256 _index) external onlyOwner {
        require (apr[_index] != _apr, "Bounty Protocol : can not update apr to same value!");
        apr[_index] = _apr;
    }

    /**
    * @dev Update wallet that receives fees and newly added LP
    */
    function updateFeeReceiver(address newWallet) external teamOROwner {
        _swapFeeReceiver = newWallet;
    }

    /**
    * @dev Very important function. 
    * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken
    */
    function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}

    /**
    * @dev Check if an address is excluded from the fee calculation
    */
    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // all to secure a smooth launch
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            _isExcludedFromFees[from] || 
            _isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForValidator += fees * _validatorFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function _swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _swapFeeReceiver,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForValidator;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        
        // half of the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForValidator = ethBalance.mul(_tokensForValidator).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForValidator;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForValidator = 0;

        payable(_swapFeeReceiver).transfer(ethForMarketing.add(ethForValidator));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    /**
    * @dev Transfer eth stuck in contract to _swapFeeReceiver
    */
    function withdrawContractETH() external {
        payable(_swapFeeReceiver).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external teamOROwner {
        _swapTokensForEth(balanceOf(address(this)));
    }

    /**
        *
        * @dev Staking part starts here
        *
    */

    /**
    * @dev Checks if holder is staking
    */
    function isStaking(address stakerAddr, uint256 validator) public view returns (bool) {
        return _stakers[stakerAddr][validator].staker == stakerAddr;
    }

    /**
    * @dev Returns how much staker is staking
    */
    function userStaked(address staker, uint256 validator) public view returns (uint256) {
        return _stakers[staker][validator].staked;
    }

    /**
    * @dev Returns how much staker has claimed over time
    */
    function userClaimHistory(address staker) public view returns (ClaimHistory memory) {
        return _claimHistory[staker];
    }

    /**
    * @dev Returns how much staker has earned
    */
    function userEarned(address staker, uint256 validator) public view returns (uint256) {
        uint256 currentlyEarned = _userEarned(staker, validator);
        uint256 previouslyEarned = _stakers[msg.sender][validator].earned;

        if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned);
        return currentlyEarned;
    }

    function _userEarned(address staker, uint256 validator) private view returns (uint256) {
        require(isStaking(staker, validator), "Bounty Protocol : User is not staking.");

        uint256 staked = userStaked(staker, validator);
        uint256 stakersStartInSeconds = _stakers[staker][validator].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);

        uint256 earn = staked.mul(apr[validator]).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        uint256 earned = rewardPerSec.mul(secondsStaked);

        return earned;
    }
 
    /**
    * @dev Stake tokens in validator
    */
    function stake(uint256 stakeAmount, uint256 validator) external isStakingEnabled {

        // Check user is registered as staker
        if (isStaking(msg.sender, validator)) {
            _stakers[msg.sender][validator].staked += stakeAmount;
            _stakers[msg.sender][validator].earned += _userEarned(msg.sender, validator);
            _stakers[msg.sender][validator].start = block.timestamp;
        } else {
            _stakers[msg.sender][validator] = Staker(msg.sender, block.timestamp, stakeAmount, 0);
        }

        validators[validator].staked += stakeAmount;
        totalStaked += stakeAmount;
        _burn(msg.sender, stakeAmount);
    }
    
    /**
    * @dev Claim earned tokens from stake in validator
    */
    function claim(uint256 validator) external isStakingEnabled {
        require(isStaking(msg.sender, validator), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, validator);

        _claimHistory[msg.sender].dates.push(block.timestamp);
        _claimHistory[msg.sender].amounts.push(reward);
        totalClaimed += reward;

        _mint(msg.sender, reward);

        _stakers[msg.sender][validator].start = block.timestamp;
        _stakers[msg.sender][validator].earned = 0;
    }

    /**
    * @dev Claim earned and staked tokens from validator
    */
    function unstake(uint256 validator) external {
        require(isStaking(msg.sender, validator), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, validator);

        if (stakingEnabled) {
            _claimHistory[msg.sender].dates.push(block.timestamp);
            _claimHistory[msg.sender].amounts.push(reward);
            totalClaimed += reward;

            _mint(msg.sender, _stakers[msg.sender][validator].staked.add(reward));
        } else {
            _mint(msg.sender, _stakers[msg.sender][validator].staked);
        }

        validators[validator].staked -= _stakers[msg.sender][validator].staked;
        totalStaked -= _stakers[msg.sender][validator].staked;

        delete _stakers[msg.sender][validator];
    }

    /**
    * @dev Creates validator 
    */
    function createValidator() external teamOROwner {
        Validator memory validator = Validator(block.timestamp, 0);
        validators.push(validator);
    }

    /**
    * @dev Returns amount of validators
    */
    function amountOfValidators() public view returns (uint256) {
        return validators.length;
    }

    /**
    * @dev Enables/disables staking
    */
    function setStakingState(bool onoff) external teamOROwner {
        stakingEnabled = onoff;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_apr","type":"uint256"}],"name":"addValidatorAPR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountOfValidators","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":"uint256","name":"","type":"uint256"}],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createValidator","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":"decreaseValidatorAPR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStakingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","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":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"validatorFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_apr","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"updateValidatorAPR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct BountyProtocol.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600c805460ff19908116600117909155601880549091169055600e60809081526d109bdd5b9d1e541c9bdd1bd8dbdb60921b60a052610100604052600360c08181526210941360ea1b60e0529062000058838262000565565b50600462000067828262000565565b505050620000846200007e620002ba60201b60201c565b620002be565b737a250d5630b4cf539739df2c5dacb4c659f2488d6000819052601b6020527f737a8aa320b777139cfebe450e173d90b49df21bdde0d83dcfdff4abee7622ee805460ff19166001908117909155600680546001600160a01b0319168317905560049060036c064f964e68233a76f520000000606462000105828562000647565b62000111919062000669565b60095560646200012382600262000647565b6200012f919062000669565b600a556103e86200014282600162000647565b6200014e919062000669565b600b55600e849055600f8390556010829055816200016d84866200068c565b6200017991906200068c565b600d55600554600880546001600160a01b0319166001600160a01b039092169182179055620001aa90600162000310565b620001b730600162000310565b620001c661dead600162000310565b6001601b6000620001df6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530808252601b9093529081208054841660019081179091557f6790d4910a095e0e04c8daa388834616a295bac3f59038957b6d0b93a2d2168480549094168117909355601580546001600160a01b0319908116841790915560168054909116831790556017805493840181559052604d7fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590920191909155620002af9082620003d7565b5050505050620006a7565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314806200033457506005546001600160a01b031633145b620003ac5760405162461bcd60e51b815260206004820152603560248201527f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660448201527f65722061646472657373206e6f72206f776e65722e000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6001600160a01b0382166200042f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620003a3565b80600260008282546200044391906200068c565b90915550506001600160a01b03821660009081526020819052604081208054839290620004729084906200068c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004ec57607f821691505b6020821081036200050d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004bc57600081815260208120601f850160051c810160208610156200053c5750805b601f850160051c820191505b818110156200055d5782815560010162000548565b505050505050565b81516001600160401b03811115620005815762000581620004c1565b6200059981620005928454620004d7565b8462000513565b602080601f831160018114620005d15760008415620005b85750858301515b600019600386901b1c1916600185901b1785556200055d565b600085815260208120601f198616915b828110156200060257888601518255948401946001909101908401620005e1565b5085821015620006215787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000664576200066462000631565b500290565b6000826200068757634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115620006a257620006a262000631565b500190565b6131da80620006b76000396000f3fe6080604052600436106102975760003560e01c8063715018a61161015a578063c0246668116100c1578063dd62ed3e1161007a578063dd62ed3e146107e0578063df778d2614610826578063f2d03be11461083b578063f2fde38b1461085b578063f7c618c11461087b578063f8b45b051461089b57600080fd5b8063c024666814610749578063c69bebe414610769578063c8c8ebe414610789578063cef851391461079f578063d125ca18146107b5578063d54ad2a1146107ca57600080fd5b80638da5cb5b116101135780638da5cb5b1461067057806395d89b411461068e578063a39b2153146106a3578063a457c2d7146106e9578063a9059cbb14610709578063b6abb15b1461072957600080fd5b8063715018a6146105b857806372f702f3146105cd578063751039fc146106055780637b0472f01461061a578063817b1cd21461063a5780638baa63b21461065057600080fd5b8063379607f5116101fe57806348d277c2116101b757806348d277c2146104ee5780634a62bb65146105035780634fbee1931461051d578063590654e9146105565780636ceb23a11461056b57806370a082311461059857600080fd5b8063379607f51461043957806339509351146104595780633b51e5cf146104795780633dd5b2da146104995780634093e7d5146104ae5780634294dd43146104ce57600080fd5b806323b872dd1161025057806323b872dd14610373578063245fc1ba14610393578063293230b8146103b35780632e17de78146103c8578063313ce567146103e857806335aa2e441461040457600080fd5b806306fdde03146102a3578063095ea7b3146102ce57806313114a9d146102fe57806318160ddd146103225780631cfff51b14610337578063224290851461035157600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86108b1565b6040516102c59190612bf5565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612c5f565b610943565b60405190151581526020016102c5565b34801561030a57600080fd5b50610314600d5481565b6040519081526020016102c5565b34801561032e57600080fd5b50600254610314565b34801561034357600080fd5b506018546102ee9060ff1681565b34801561035d57600080fd5b5061037161036c366004612c8b565b61095d565b005b34801561037f57600080fd5b506102ee61038e366004612cb7565b610a27565b34801561039f57600080fd5b506102ee6103ae366004612c5f565b610a4b565b3480156103bf57600080fd5b50610371610a79565b3480156103d457600080fd5b506103716103e3366004612cf8565b610d29565b3480156103f457600080fd5b50604051601281526020016102c5565b34801561041057600080fd5b5061042461041f366004612cf8565b610f10565b604080519283526020830191909152016102c5565b34801561044557600080fd5b50610371610454366004612cf8565b610f3e565b34801561046557600080fd5b506102ee610474366004612c5f565b611043565b34801561048557600080fd5b50610371610494366004612d21565b61107d565b3480156104a557600080fd5b506103716110cf565b3480156104ba57600080fd5b506103146104c9366004612c5f565b61110b565b3480156104da57600080fd5b506103716104e9366004612cf8565b61115a565b3480156104fa57600080fd5b5061037161121f565b34801561050f57600080fd5b50600c546102ee9060ff1681565b34801561052957600080fd5b506102ee610538366004612d3c565b6001600160a01b03166000908152601a602052604090205460ff1690565b34801561056257600080fd5b50602054610314565b34801561057757600080fd5b5061058b610586366004612d3c565b611272565b6040516102c59190612d94565b3480156105a457600080fd5b506103146105b3366004612d3c565b611351565b3480156105c457600080fd5b5061037161136c565b3480156105d957600080fd5b506015546105ed906001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561061157600080fd5b506103716113a2565b34801561062657600080fd5b50610371610635366004612dd6565b6113ed565b34801561064657600080fd5b5061031460145481565b34801561065c57600080fd5b506102ee61066b366004612cf8565b61157f565b34801561067c57600080fd5b506005546001600160a01b03166105ed565b34801561069a57600080fd5b506102b86116fc565b3480156106af57600080fd5b506103146106be366004612c5f565b6001600160a01b03919091166000908152601e60209081526040808320938352929052206002015490565b3480156106f557600080fd5b506102ee610704366004612c5f565b61170b565b34801561071557600080fd5b506102ee610724366004612c5f565b61179d565b34801561073557600080fd5b50610371610744366004612dd6565b6117ab565b34801561075557600080fd5b50610371610764366004612df8565b611881565b34801561077557600080fd5b50610371610784366004612d3c565b6118eb565b34801561079557600080fd5b5061031460095481565b3480156107ab57600080fd5b50610314600b5481565b3480156107c157600080fd5b5061037161194c565b3480156107d657600080fd5b5061031460195481565b3480156107ec57600080fd5b506103146107fb366004612e2d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561083257600080fd5b50610371611a02565b34801561084757600080fd5b50610314610856366004612cf8565b611a52565b34801561086757600080fd5b50610371610876366004612d3c565b611a73565b34801561088757600080fd5b506016546105ed906001600160a01b031681565b3480156108a757600080fd5b50610314600a5481565b6060600380546108c090612e66565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec90612e66565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600033610951818585611b0b565b60019150505b92915050565b6005546001600160a01b031633146109905760405162461bcd60e51b815260040161098790612ea0565b60405180910390fd5b600e839055600f8290556010819055806109aa8385612eeb565b6109b49190612eeb565b600d819055600a1015610a225760405162461bcd60e51b815260206004820152603060248201527f426f756e74792050726f746f636f6c20203a204d757374206b6565702066656560448201526f7320617420313025206f72206c65737360801b6064820152608401610987565b505050565b600033610a35858285611c2f565b610a40858585611cc1565b506001949350505050565b6001600160a01b039182166000818152601e6020908152604080832094835293905291909120549091161490565b6008546001600160a01b0316331480610a9c57506005546001600160a01b031633145b610ab85760405162461bcd60e51b815260040161098790612f03565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f9190612f58565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb59190612f58565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c269190612f58565b600780546001600160a01b0319166001600160a01b0392831690811782556000908152601b60209081526040808320805460ff199081166001908117909255945486168452601c9092529091208054909216179055600654610c9391309116610c8e82611351565b611b0b565b6006546001600160a01b031663f305d7194730610caf81611351565b600080610cc46005546001600160a01b031690565b426040518863ffffffff1660e01b8152600401610ce696959493929190612f75565b60606040518083038185885af1158015610d04573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a229190612fb0565b610d333382610a4b565b610d775760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b6044820152606401610987565b6000610d83338361110b565b60185490915060ff1615610e1957336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054839290610ddd908490612eeb565b9091555050336000818152601e60209081526040808320868452909152902060020154610e149190610e0f9084612351565b612364565b610e41565b336000818152601e60209081526040808320868452909152902060020154610e419190612364565b336000908152601e60209081526040808320858452825290912060020154815490919084908110610e7457610e74612fde565b90600052602060002090600202016001016000828254610e949190612ff4565b9091555050336000908152601e602090815260408083208584529091528120600201546014805491929091610eca908490612ff4565b9091555050336000908152601e6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b60208181548110610f2057600080fd5b60009182526020909120600290910201805460019091015490915082565b60185460ff16610f605760405162461bcd60e51b81526004016109879061300b565b610f6a3382610a4b565b610fae5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b6044820152606401610987565b6000610fba338361110b565b336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054929350839290919061100b908490612eeb565b9091555061101b90503382612364565b50336000908152601e6020908152604080832093835292905290812042600182015560030155565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109519082908690610c8e908790612eeb565b6008546001600160a01b03163314806110a057506005546001600160a01b031633145b6110bc5760405162461bcd60e51b815260040161098790612f03565b6018805460ff1916911515919091179055565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611108573d6000803e3d6000fd5b50565b6000806111188484612443565b336000908152601e602090815260408083208784529091529020600301549091508015611152576111498282612351565b92505050610957565b509392505050565b6005546001600160a01b031633146111845760405162461bcd60e51b815260040161098790612ea0565b806000036111ea5760405162461bcd60e51b815260206004820152602d60248201527f426f756e74792050726f746f636f6c203a2063616e206e6f742075706461746560448201526c2061707220746f207a65726f2160981b6064820152608401610987565b601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150155565b6005546001600160a01b031633146112495760405162461bcd60e51b815260040161098790612ea0565b601780548061125a5761125a613054565b60019003818190600052602060002001600090559055565b604080518082018252606080825260208083018290526001600160a01b0385166000908152601f8252849020845181549283028101840186529485018281529394939092849284918401828280156112e957602002820191906000526020600020905b8154815260200190600101908083116112d5575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561134157602002820191906000526020600020905b81548152602001906001019080831161132d575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146113965760405162461bcd60e51b815260040161098790612ea0565b6113a06000612571565b565b6008546001600160a01b03163314806113c557506005546001600160a01b031633145b6113e15760405162461bcd60e51b815260040161098790612f03565b600c805460ff19169055565b60185460ff1661140f5760405162461bcd60e51b81526004016109879061300b565b6114193382610a4b565b156114b357336000908152601e602090815260408083208484529091528120600201805484929061144b908490612eeb565b9091555061145b90503382612443565b336000908152601e6020908152604080832085845290915281206003018054909190611488908490612eeb565b9091555050336000908152601e6020908152604080832084845290915290204260019091015561151e565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601e8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b816020828154811061153257611532612fde565b906000526020600020906002020160010160008282546115529190612eeb565b92505081905550816014600082825461156b9190612eeb565b9091555061157b905033836125c3565b5050565b6008546000906001600160a01b03163314806115a557506005546001600160a01b031633145b6115c15760405162461bcd60e51b815260040161098790612f03565b620186a06115ce60025490565b6115d990600161306a565b6115e39190613089565b8210156116585760405162461bcd60e51b815260206004820152603860248201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460448201527f68616e20302e3030312520746f74616c20737570706c792e00000000000000006064820152608401610987565b6103e861166460025490565b61166f90600561306a565b6116799190613089565b8211156116ee5760405162461bcd60e51b815260206004820152603760248201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060448201527f7468616e20302e352520746f74616c20737570706c792e0000000000000000006064820152608401610987565b50600b81905560015b919050565b6060600480546108c090612e66565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156117905760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610987565b610a408286868403611b0b565b600033610951818585611cc1565b6005546001600160a01b031633146117d55760405162461bcd60e51b815260040161098790612ea0565b81601782815481106117e9576117e9612fde565b90600052602060002001540361185d5760405162461bcd60e51b815260206004820152603360248201527f426f756e74792050726f746f636f6c203a2063616e206e6f74207570646174656044820152722061707220746f2073616d652076616c75652160681b6064820152608401610987565b816017828154811061187157611871612fde565b6000918252602090912001555050565b6008546001600160a01b03163314806118a457506005546001600160a01b031633145b6118c05760405162461bcd60e51b815260040161098790612f03565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6008546001600160a01b031633148061190e57506005546001600160a01b031633145b61192a5760405162461bcd60e51b815260040161098790612f03565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633148061196f57506005546001600160a01b031633145b61198b5760405162461bcd60e51b815260040161098790612f03565b604080518082019091524281526000602080830182815281546001810183559190925291517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb600290930292830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90910155565b6008546001600160a01b0316331480611a2557506005546001600160a01b031633145b611a415760405162461bcd60e51b815260040161098790612f03565b6113a0611a4d30611351565b612711565b60178181548110611a6257600080fd5b600091825260209091200154905081565b6005546001600160a01b03163314611a9d5760405162461bcd60e51b815260040161098790612ea0565b6001600160a01b038116611b025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610987565b61110881612571565b6001600160a01b038316611b6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610987565b6001600160a01b038216611bce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610987565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611cbb5781811015611cae5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610987565b611cbb8484848403611b0b565b50505050565b6001600160a01b038316611ce75760405162461bcd60e51b8152600401610987906130ab565b6001600160a01b038216611d0d5760405162461bcd60e51b8152600401610987906130f0565b80600003611d2157610a228383600061286b565b600c5460ff16156120fc576005546001600160a01b03848116911614801590611d5857506005546001600160a01b03838116911614155b8015611d6f57506001600160a01b03821661dead14155b8015611d855750600754600160a01b900460ff16155b156120fc576005546001600160a01b03838116911614801590611db657506006546001600160a01b03838116911614155b8015611dd057506007546001600160a01b03838116911614155b15611e7e57326000908152601d60205260409020544311611e6b5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610987565b326000908152601d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff168015611ebf57506001600160a01b0382166000908152601b602052604090205460ff16155b15611faf57600954811115611f465760405162461bcd60e51b815260206004820152604160248201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060448201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746064820152601760f91b608482015260a401610987565b600a54611f5283611351565b611f5c9083612eeb565b1115611faa5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c6574206578636565646564006044820152606401610987565b6120fc565b6001600160a01b0382166000908152601c602052604090205460ff168015611ff057506001600160a01b0383166000908152601b602052604090205460ff16155b1561207857600954811115611faa5760405162461bcd60e51b815260206004820152604260248201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460448201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6064820152613a1760f11b608482015260a401610987565b6001600160a01b0382166000908152601b602052604090205460ff166120fc57600a546120a483611351565b6120ae9083612eeb565b11156120fc5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c6574206578636565646564006044820152606401610987565b600061210730611351565b600b54909150811080159081906121285750600754600160a01b900460ff16155b801561214d57506001600160a01b0385166000908152601c602052604090205460ff16155b801561217257506001600160a01b0385166000908152601a602052604090205460ff16155b801561219757506001600160a01b0384166000908152601a602052604090205460ff16155b156121c5576007805460ff60a01b1916600160a01b1790556121b76129bf565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601a602052604090205460ff600160a01b90920482161591168061221357506001600160a01b0385166000908152601a602052604090205460ff165b8061225b57506001600160a01b0386166000908152601c602052604090205460ff1615801561225b57506001600160a01b0385166000908152601c602052604090205460ff16155b15612264575060005b6000811561233d5761228c6064612286600d5488612b2f90919063ffffffff16565b90612b3b565b9050600d54600f548261229f919061306a565b6122a99190613089565b601260008282546122ba9190612eeb565b9091555050600d546010546122cf908361306a565b6122d99190613089565b601360008282546122ea9190612eeb565b9091555050600d54600e546122ff908361306a565b6123099190613089565b6011600082825461231a9190612eeb565b909155505080156123305761233087308361286b565b61233a8186612ff4565b94505b61234887878761286b565b50505050505050565b600061235d8284612eeb565b9392505050565b6001600160a01b0382166123ba5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610987565b80600260008282546123cc9190612eeb565b90915550506001600160a01b038216600090815260208190526040812080548392906123f9908490612eeb565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600061244f8383610a4b565b6124aa5760405162461bcd60e51b815260206004820152602660248201527f426f756e74792050726f746f636f6c203a2055736572206973206e6f7420737460448201526530b5b4b7339760d11b6064820152608401610987565b6001600160a01b0383166000908152601e60209081526040808320858452909152812060028101546001918201549092916124e59190612b3b565b905060006124f4426001612b3b565b905060006125028284612b47565b9050600061253b606461228660178a8154811061252157612521612fde565b906000526020600020015488612b2f90919063ffffffff16565b90506000612555603c61228681816018818861016d612b3b565b905060006125638285612b2f565b9a9950505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166126235760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610987565b6001600160a01b038216600090815260208190526040902054818110156126975760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610987565b6001600160a01b03831660009081526020819052604081208383039055600280548492906126c6908490612ff4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061274657612746612fde565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561279f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c39190612f58565b816001815181106127d6576127d6612fde565b6001600160a01b0392831660209182029290920101526006546127fc9130911684611b0b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612835908590600090869030904290600401613133565b600060405180830381600087803b15801561284f57600080fd5b505af1158015612863573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166128915760405162461bcd60e51b8152600401610987906130ab565b6001600160a01b0382166128b75760405162461bcd60e51b8152600401610987906130f0565b6001600160a01b0383166000908152602081905260409020548181101561292f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610987565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612966908490612eeb565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129b291815260200190565b60405180910390a3611cbb565b60006129ca30611351565b905060006013546011546012546129e19190612eeb565b6129eb9190612eeb565b90508115806129f8575080155b15612a01575050565b600b54821115612a1157600b5491505b600060028260125485612a24919061306a565b612a2e9190613089565b612a389190613089565b90506000612a468483612b47565b905047612a5282612711565b6000612a5e4783612b47565b90506000612a7b8661228660115485612b2f90919063ffffffff16565b90506000612a988761228660135486612b2f90919063ffffffff16565b9050600081612aa78486612ff4565b612ab19190612ff4565b6000601281905560118190556013556008549091506001600160a01b03166108fc612adc8585612351565b6040518115909202916000818181858888f19350505050158015612b04573d6000803e3d6000fd5b50600087118015612b155750600081115b15612b2457612b248782612b53565b505050505050505050565b600061235d828461306a565b600061235d8284613089565b600061235d8284612ff4565b600654612b6b9030906001600160a01b031684611b0b565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612bab9230928992600092839216904290600401612f75565b60606040518083038185885af1158015612bc9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bee9190612fb0565b5050505050565b600060208083528351808285015260005b81811015612c2257858101830151858201604001528201612c06565b81811115612c34576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461110857600080fd5b60008060408385031215612c7257600080fd5b8235612c7d81612c4a565b946020939093013593505050565b600080600060608486031215612ca057600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612ccc57600080fd5b8335612cd781612c4a565b92506020840135612ce781612c4a565b929592945050506040919091013590565b600060208284031215612d0a57600080fd5b5035919050565b803580151581146116f757600080fd5b600060208284031215612d3357600080fd5b61235d82612d11565b600060208284031215612d4e57600080fd5b813561235d81612c4a565b600081518084526020808501945080840160005b83811015612d8957815187529582019590820190600101612d6d565b509495945050505050565b602081526000825160406020840152612db06060840182612d59565b90506020840151601f19848303016040850152612dcd8282612d59565b95945050505050565b60008060408385031215612de957600080fd5b50508035926020909101359150565b60008060408385031215612e0b57600080fd5b8235612e1681612c4a565b9150612e2460208401612d11565b90509250929050565b60008060408385031215612e4057600080fd5b8235612e4b81612c4a565b91506020830135612e5b81612c4a565b809150509250929050565b600181811c90821680612e7a57607f821691505b602082108103612e9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612efe57612efe612ed5565b500190565b60208082526035908201527f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660408201527432b91030b2323932b9b9903737b91037bbb732b91760591b606082015260800190565b600060208284031215612f6a57600080fd5b815161235d81612c4a565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215612fc557600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b60008282101561300657613006612ed5565b500390565b60208082526029908201527f426f756e74792050726f746f636f6c203a205374616b696e67206973206e6f746040820152681032b730b13632b21760b91b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b600081600019048311821515161561308457613084612ed5565b500290565b6000826130a657634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156131835784516001600160a01b03168352938301939183019160010161315e565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212202a47924024cf992a86cb35cae7f1744e1dac0bbac03fd1746fe6613dcec2409f64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106102975760003560e01c8063715018a61161015a578063c0246668116100c1578063dd62ed3e1161007a578063dd62ed3e146107e0578063df778d2614610826578063f2d03be11461083b578063f2fde38b1461085b578063f7c618c11461087b578063f8b45b051461089b57600080fd5b8063c024666814610749578063c69bebe414610769578063c8c8ebe414610789578063cef851391461079f578063d125ca18146107b5578063d54ad2a1146107ca57600080fd5b80638da5cb5b116101135780638da5cb5b1461067057806395d89b411461068e578063a39b2153146106a3578063a457c2d7146106e9578063a9059cbb14610709578063b6abb15b1461072957600080fd5b8063715018a6146105b857806372f702f3146105cd578063751039fc146106055780637b0472f01461061a578063817b1cd21461063a5780638baa63b21461065057600080fd5b8063379607f5116101fe57806348d277c2116101b757806348d277c2146104ee5780634a62bb65146105035780634fbee1931461051d578063590654e9146105565780636ceb23a11461056b57806370a082311461059857600080fd5b8063379607f51461043957806339509351146104595780633b51e5cf146104795780633dd5b2da146104995780634093e7d5146104ae5780634294dd43146104ce57600080fd5b806323b872dd1161025057806323b872dd14610373578063245fc1ba14610393578063293230b8146103b35780632e17de78146103c8578063313ce567146103e857806335aa2e441461040457600080fd5b806306fdde03146102a3578063095ea7b3146102ce57806313114a9d146102fe57806318160ddd146103225780631cfff51b14610337578063224290851461035157600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86108b1565b6040516102c59190612bf5565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612c5f565b610943565b60405190151581526020016102c5565b34801561030a57600080fd5b50610314600d5481565b6040519081526020016102c5565b34801561032e57600080fd5b50600254610314565b34801561034357600080fd5b506018546102ee9060ff1681565b34801561035d57600080fd5b5061037161036c366004612c8b565b61095d565b005b34801561037f57600080fd5b506102ee61038e366004612cb7565b610a27565b34801561039f57600080fd5b506102ee6103ae366004612c5f565b610a4b565b3480156103bf57600080fd5b50610371610a79565b3480156103d457600080fd5b506103716103e3366004612cf8565b610d29565b3480156103f457600080fd5b50604051601281526020016102c5565b34801561041057600080fd5b5061042461041f366004612cf8565b610f10565b604080519283526020830191909152016102c5565b34801561044557600080fd5b50610371610454366004612cf8565b610f3e565b34801561046557600080fd5b506102ee610474366004612c5f565b611043565b34801561048557600080fd5b50610371610494366004612d21565b61107d565b3480156104a557600080fd5b506103716110cf565b3480156104ba57600080fd5b506103146104c9366004612c5f565b61110b565b3480156104da57600080fd5b506103716104e9366004612cf8565b61115a565b3480156104fa57600080fd5b5061037161121f565b34801561050f57600080fd5b50600c546102ee9060ff1681565b34801561052957600080fd5b506102ee610538366004612d3c565b6001600160a01b03166000908152601a602052604090205460ff1690565b34801561056257600080fd5b50602054610314565b34801561057757600080fd5b5061058b610586366004612d3c565b611272565b6040516102c59190612d94565b3480156105a457600080fd5b506103146105b3366004612d3c565b611351565b3480156105c457600080fd5b5061037161136c565b3480156105d957600080fd5b506015546105ed906001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561061157600080fd5b506103716113a2565b34801561062657600080fd5b50610371610635366004612dd6565b6113ed565b34801561064657600080fd5b5061031460145481565b34801561065c57600080fd5b506102ee61066b366004612cf8565b61157f565b34801561067c57600080fd5b506005546001600160a01b03166105ed565b34801561069a57600080fd5b506102b86116fc565b3480156106af57600080fd5b506103146106be366004612c5f565b6001600160a01b03919091166000908152601e60209081526040808320938352929052206002015490565b3480156106f557600080fd5b506102ee610704366004612c5f565b61170b565b34801561071557600080fd5b506102ee610724366004612c5f565b61179d565b34801561073557600080fd5b50610371610744366004612dd6565b6117ab565b34801561075557600080fd5b50610371610764366004612df8565b611881565b34801561077557600080fd5b50610371610784366004612d3c565b6118eb565b34801561079557600080fd5b5061031460095481565b3480156107ab57600080fd5b50610314600b5481565b3480156107c157600080fd5b5061037161194c565b3480156107d657600080fd5b5061031460195481565b3480156107ec57600080fd5b506103146107fb366004612e2d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561083257600080fd5b50610371611a02565b34801561084757600080fd5b50610314610856366004612cf8565b611a52565b34801561086757600080fd5b50610371610876366004612d3c565b611a73565b34801561088757600080fd5b506016546105ed906001600160a01b031681565b3480156108a757600080fd5b50610314600a5481565b6060600380546108c090612e66565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec90612e66565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600033610951818585611b0b565b60019150505b92915050565b6005546001600160a01b031633146109905760405162461bcd60e51b815260040161098790612ea0565b60405180910390fd5b600e839055600f8290556010819055806109aa8385612eeb565b6109b49190612eeb565b600d819055600a1015610a225760405162461bcd60e51b815260206004820152603060248201527f426f756e74792050726f746f636f6c20203a204d757374206b6565702066656560448201526f7320617420313025206f72206c65737360801b6064820152608401610987565b505050565b600033610a35858285611c2f565b610a40858585611cc1565b506001949350505050565b6001600160a01b039182166000818152601e6020908152604080832094835293905291909120549091161490565b6008546001600160a01b0316331480610a9c57506005546001600160a01b031633145b610ab85760405162461bcd60e51b815260040161098790612f03565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f9190612f58565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb59190612f58565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c269190612f58565b600780546001600160a01b0319166001600160a01b0392831690811782556000908152601b60209081526040808320805460ff199081166001908117909255945486168452601c9092529091208054909216179055600654610c9391309116610c8e82611351565b611b0b565b6006546001600160a01b031663f305d7194730610caf81611351565b600080610cc46005546001600160a01b031690565b426040518863ffffffff1660e01b8152600401610ce696959493929190612f75565b60606040518083038185885af1158015610d04573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a229190612fb0565b610d333382610a4b565b610d775760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b6044820152606401610987565b6000610d83338361110b565b60185490915060ff1615610e1957336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054839290610ddd908490612eeb565b9091555050336000818152601e60209081526040808320868452909152902060020154610e149190610e0f9084612351565b612364565b610e41565b336000818152601e60209081526040808320868452909152902060020154610e419190612364565b336000908152601e60209081526040808320858452825290912060020154815490919084908110610e7457610e74612fde565b90600052602060002090600202016001016000828254610e949190612ff4565b9091555050336000908152601e602090815260408083208584529091528120600201546014805491929091610eca908490612ff4565b9091555050336000908152601e6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b60208181548110610f2057600080fd5b60009182526020909120600290910201805460019091015490915082565b60185460ff16610f605760405162461bcd60e51b81526004016109879061300b565b610f6a3382610a4b565b610fae5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b6044820152606401610987565b6000610fba338361110b565b336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054929350839290919061100b908490612eeb565b9091555061101b90503382612364565b50336000908152601e6020908152604080832093835292905290812042600182015560030155565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109519082908690610c8e908790612eeb565b6008546001600160a01b03163314806110a057506005546001600160a01b031633145b6110bc5760405162461bcd60e51b815260040161098790612f03565b6018805460ff1916911515919091179055565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611108573d6000803e3d6000fd5b50565b6000806111188484612443565b336000908152601e602090815260408083208784529091529020600301549091508015611152576111498282612351565b92505050610957565b509392505050565b6005546001600160a01b031633146111845760405162461bcd60e51b815260040161098790612ea0565b806000036111ea5760405162461bcd60e51b815260206004820152602d60248201527f426f756e74792050726f746f636f6c203a2063616e206e6f742075706461746560448201526c2061707220746f207a65726f2160981b6064820152608401610987565b601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150155565b6005546001600160a01b031633146112495760405162461bcd60e51b815260040161098790612ea0565b601780548061125a5761125a613054565b60019003818190600052602060002001600090559055565b604080518082018252606080825260208083018290526001600160a01b0385166000908152601f8252849020845181549283028101840186529485018281529394939092849284918401828280156112e957602002820191906000526020600020905b8154815260200190600101908083116112d5575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561134157602002820191906000526020600020905b81548152602001906001019080831161132d575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146113965760405162461bcd60e51b815260040161098790612ea0565b6113a06000612571565b565b6008546001600160a01b03163314806113c557506005546001600160a01b031633145b6113e15760405162461bcd60e51b815260040161098790612f03565b600c805460ff19169055565b60185460ff1661140f5760405162461bcd60e51b81526004016109879061300b565b6114193382610a4b565b156114b357336000908152601e602090815260408083208484529091528120600201805484929061144b908490612eeb565b9091555061145b90503382612443565b336000908152601e6020908152604080832085845290915281206003018054909190611488908490612eeb565b9091555050336000908152601e6020908152604080832084845290915290204260019091015561151e565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601e8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b816020828154811061153257611532612fde565b906000526020600020906002020160010160008282546115529190612eeb565b92505081905550816014600082825461156b9190612eeb565b9091555061157b905033836125c3565b5050565b6008546000906001600160a01b03163314806115a557506005546001600160a01b031633145b6115c15760405162461bcd60e51b815260040161098790612f03565b620186a06115ce60025490565b6115d990600161306a565b6115e39190613089565b8210156116585760405162461bcd60e51b815260206004820152603860248201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460448201527f68616e20302e3030312520746f74616c20737570706c792e00000000000000006064820152608401610987565b6103e861166460025490565b61166f90600561306a565b6116799190613089565b8211156116ee5760405162461bcd60e51b815260206004820152603760248201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060448201527f7468616e20302e352520746f74616c20737570706c792e0000000000000000006064820152608401610987565b50600b81905560015b919050565b6060600480546108c090612e66565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156117905760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610987565b610a408286868403611b0b565b600033610951818585611cc1565b6005546001600160a01b031633146117d55760405162461bcd60e51b815260040161098790612ea0565b81601782815481106117e9576117e9612fde565b90600052602060002001540361185d5760405162461bcd60e51b815260206004820152603360248201527f426f756e74792050726f746f636f6c203a2063616e206e6f74207570646174656044820152722061707220746f2073616d652076616c75652160681b6064820152608401610987565b816017828154811061187157611871612fde565b6000918252602090912001555050565b6008546001600160a01b03163314806118a457506005546001600160a01b031633145b6118c05760405162461bcd60e51b815260040161098790612f03565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6008546001600160a01b031633148061190e57506005546001600160a01b031633145b61192a5760405162461bcd60e51b815260040161098790612f03565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633148061196f57506005546001600160a01b031633145b61198b5760405162461bcd60e51b815260040161098790612f03565b604080518082019091524281526000602080830182815281546001810183559190925291517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb600290930292830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90910155565b6008546001600160a01b0316331480611a2557506005546001600160a01b031633145b611a415760405162461bcd60e51b815260040161098790612f03565b6113a0611a4d30611351565b612711565b60178181548110611a6257600080fd5b600091825260209091200154905081565b6005546001600160a01b03163314611a9d5760405162461bcd60e51b815260040161098790612ea0565b6001600160a01b038116611b025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610987565b61110881612571565b6001600160a01b038316611b6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610987565b6001600160a01b038216611bce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610987565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611cbb5781811015611cae5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610987565b611cbb8484848403611b0b565b50505050565b6001600160a01b038316611ce75760405162461bcd60e51b8152600401610987906130ab565b6001600160a01b038216611d0d5760405162461bcd60e51b8152600401610987906130f0565b80600003611d2157610a228383600061286b565b600c5460ff16156120fc576005546001600160a01b03848116911614801590611d5857506005546001600160a01b03838116911614155b8015611d6f57506001600160a01b03821661dead14155b8015611d855750600754600160a01b900460ff16155b156120fc576005546001600160a01b03838116911614801590611db657506006546001600160a01b03838116911614155b8015611dd057506007546001600160a01b03838116911614155b15611e7e57326000908152601d60205260409020544311611e6b5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610987565b326000908152601d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff168015611ebf57506001600160a01b0382166000908152601b602052604090205460ff16155b15611faf57600954811115611f465760405162461bcd60e51b815260206004820152604160248201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060448201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746064820152601760f91b608482015260a401610987565b600a54611f5283611351565b611f5c9083612eeb565b1115611faa5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c6574206578636565646564006044820152606401610987565b6120fc565b6001600160a01b0382166000908152601c602052604090205460ff168015611ff057506001600160a01b0383166000908152601b602052604090205460ff16155b1561207857600954811115611faa5760405162461bcd60e51b815260206004820152604260248201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460448201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6064820152613a1760f11b608482015260a401610987565b6001600160a01b0382166000908152601b602052604090205460ff166120fc57600a546120a483611351565b6120ae9083612eeb565b11156120fc5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c6574206578636565646564006044820152606401610987565b600061210730611351565b600b54909150811080159081906121285750600754600160a01b900460ff16155b801561214d57506001600160a01b0385166000908152601c602052604090205460ff16155b801561217257506001600160a01b0385166000908152601a602052604090205460ff16155b801561219757506001600160a01b0384166000908152601a602052604090205460ff16155b156121c5576007805460ff60a01b1916600160a01b1790556121b76129bf565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601a602052604090205460ff600160a01b90920482161591168061221357506001600160a01b0385166000908152601a602052604090205460ff165b8061225b57506001600160a01b0386166000908152601c602052604090205460ff1615801561225b57506001600160a01b0385166000908152601c602052604090205460ff16155b15612264575060005b6000811561233d5761228c6064612286600d5488612b2f90919063ffffffff16565b90612b3b565b9050600d54600f548261229f919061306a565b6122a99190613089565b601260008282546122ba9190612eeb565b9091555050600d546010546122cf908361306a565b6122d99190613089565b601360008282546122ea9190612eeb565b9091555050600d54600e546122ff908361306a565b6123099190613089565b6011600082825461231a9190612eeb565b909155505080156123305761233087308361286b565b61233a8186612ff4565b94505b61234887878761286b565b50505050505050565b600061235d8284612eeb565b9392505050565b6001600160a01b0382166123ba5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610987565b80600260008282546123cc9190612eeb565b90915550506001600160a01b038216600090815260208190526040812080548392906123f9908490612eeb565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600061244f8383610a4b565b6124aa5760405162461bcd60e51b815260206004820152602660248201527f426f756e74792050726f746f636f6c203a2055736572206973206e6f7420737460448201526530b5b4b7339760d11b6064820152608401610987565b6001600160a01b0383166000908152601e60209081526040808320858452909152812060028101546001918201549092916124e59190612b3b565b905060006124f4426001612b3b565b905060006125028284612b47565b9050600061253b606461228660178a8154811061252157612521612fde565b906000526020600020015488612b2f90919063ffffffff16565b90506000612555603c61228681816018818861016d612b3b565b905060006125638285612b2f565b9a9950505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166126235760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610987565b6001600160a01b038216600090815260208190526040902054818110156126975760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610987565b6001600160a01b03831660009081526020819052604081208383039055600280548492906126c6908490612ff4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061274657612746612fde565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561279f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c39190612f58565b816001815181106127d6576127d6612fde565b6001600160a01b0392831660209182029290920101526006546127fc9130911684611b0b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612835908590600090869030904290600401613133565b600060405180830381600087803b15801561284f57600080fd5b505af1158015612863573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166128915760405162461bcd60e51b8152600401610987906130ab565b6001600160a01b0382166128b75760405162461bcd60e51b8152600401610987906130f0565b6001600160a01b0383166000908152602081905260409020548181101561292f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610987565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612966908490612eeb565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129b291815260200190565b60405180910390a3611cbb565b60006129ca30611351565b905060006013546011546012546129e19190612eeb565b6129eb9190612eeb565b90508115806129f8575080155b15612a01575050565b600b54821115612a1157600b5491505b600060028260125485612a24919061306a565b612a2e9190613089565b612a389190613089565b90506000612a468483612b47565b905047612a5282612711565b6000612a5e4783612b47565b90506000612a7b8661228660115485612b2f90919063ffffffff16565b90506000612a988761228660135486612b2f90919063ffffffff16565b9050600081612aa78486612ff4565b612ab19190612ff4565b6000601281905560118190556013556008549091506001600160a01b03166108fc612adc8585612351565b6040518115909202916000818181858888f19350505050158015612b04573d6000803e3d6000fd5b50600087118015612b155750600081115b15612b2457612b248782612b53565b505050505050505050565b600061235d828461306a565b600061235d8284613089565b600061235d8284612ff4565b600654612b6b9030906001600160a01b031684611b0b565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612bab9230928992600092839216904290600401612f75565b60606040518083038185885af1158015612bc9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bee9190612fb0565b5050505050565b600060208083528351808285015260005b81811015612c2257858101830151858201604001528201612c06565b81811115612c34576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461110857600080fd5b60008060408385031215612c7257600080fd5b8235612c7d81612c4a565b946020939093013593505050565b600080600060608486031215612ca057600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612ccc57600080fd5b8335612cd781612c4a565b92506020840135612ce781612c4a565b929592945050506040919091013590565b600060208284031215612d0a57600080fd5b5035919050565b803580151581146116f757600080fd5b600060208284031215612d3357600080fd5b61235d82612d11565b600060208284031215612d4e57600080fd5b813561235d81612c4a565b600081518084526020808501945080840160005b83811015612d8957815187529582019590820190600101612d6d565b509495945050505050565b602081526000825160406020840152612db06060840182612d59565b90506020840151601f19848303016040850152612dcd8282612d59565b95945050505050565b60008060408385031215612de957600080fd5b50508035926020909101359150565b60008060408385031215612e0b57600080fd5b8235612e1681612c4a565b9150612e2460208401612d11565b90509250929050565b60008060408385031215612e4057600080fd5b8235612e4b81612c4a565b91506020830135612e5b81612c4a565b809150509250929050565b600181811c90821680612e7a57607f821691505b602082108103612e9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612efe57612efe612ed5565b500190565b60208082526035908201527f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660408201527432b91030b2323932b9b9903737b91037bbb732b91760591b606082015260800190565b600060208284031215612f6a57600080fd5b815161235d81612c4a565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215612fc557600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b60008282101561300657613006612ed5565b500390565b60208082526029908201527f426f756e74792050726f746f636f6c203a205374616b696e67206973206e6f746040820152681032b730b13632b21760b91b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b600081600019048311821515161561308457613084612ed5565b500290565b6000826130a657634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156131835784516001600160a01b03168352938301939183019160010161315e565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212202a47924024cf992a86cb35cae7f1744e1dac0bbac03fd1746fe6613dcec2409f64736f6c634300080f0033

Deployed Bytecode Sourcemap

18157:17426:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2565:201;;;;;;;;;;-1:-1:-1;2565:201:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;2565:201:0;1072:187:1;18572:24:0;;;;;;;;;;;;;;;;;;;1410:25:1;;;1398:2;1383:18;18572:24:0;1264:177:1;1954:108:0;;;;;;;;;;-1:-1:-1;2042:12:0;;1954:108;;19008:34;;;;;;;;;;-1:-1:-1;19008:34:0;;;;;;;;23095:389;;;;;;;;;;-1:-1:-1;23095:389:0;;;;;:::i;:::-;;:::i;:::-;;2774:295;;;;;;;;;;-1:-1:-1;2774:295:0;;;;;:::i;:::-;;:::i;31044:163::-;;;;;;;;;;-1:-1:-1;31044:163:0;;;;;:::i;:::-;;:::i;22005:638::-;;;;;;;;;;;;;:::i;34218:777::-;;;;;;;;;;-1:-1:-1;34218:777:0;;;;;:::i;:::-;;:::i;1853:93::-;;;;;;;;;;-1:-1:-1;1853:93:0;;1936:2;2555:36:1;;2543:2;2528:18;1853:93:0;2413:184:1;20067:29:0;;;;;;;;;;-1:-1:-1;20067:29:0;;;;;:::i;:::-;;:::i;:::-;;;;2776:25:1;;;2832:2;2817:18;;2810:34;;;;2749:18;20067:29:0;2602:248:1;33612:523:0;;;;;;;;;;-1:-1:-1;33612:523:0;;;;;:::i;:::-;;:::i;3077:240::-;;;;;;;;;;-1:-1:-1;3077:240:0;;;;;:::i;:::-;;:::i;35444:99::-;;;;;;;;;;-1:-1:-1;35444:99:0;;;;;:::i;:::-;;:::i;30584:116::-;;;;;;;;;;;;;:::i;31710:352::-;;;;;;;;;;-1:-1:-1;31710:352:0;;;;;:::i;:::-;;:::i;23492:170::-;;;;;;;;;;-1:-1:-1;23492:170:0;;;;;:::i;:::-;;:::i;23670:79::-;;;;;;;;;;;;;:::i;18530:33::-;;;;;;;;;;-1:-1:-1;18530:33:0;;;;;;;;24841:127;;;;;;;;;;-1:-1:-1;24841:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;24932:28:0;24908:4;24932:28;;;:19;:28;;;;;;;;;24841:127;35279:103;;;;;;;;;;-1:-1:-1;35357:10:0;:17;35279:103;;31507:131;;;;;;;;;;-1:-1:-1;31507:131:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2070:127::-;;;;;;;;;;-1:-1:-1;2070:127:0;;;;;:::i;:::-;;:::i;14995:103::-;;;;;;;;;;;;;:::i;18911:27::-;;;;;;;;;;-1:-1:-1;18911:27:0;;;;-1:-1:-1;;;;;18911:27:0;;;;;;-1:-1:-1;;;;;4629:32:1;;;4611:51;;4599:2;4584:18;18911:27:0;4465:203:1;22725:86:0;;;;;;;;;;;;;:::i;32848:679::-;;;;;;;;;;-1:-1:-1;32848:679:0;;;;;:::i;:::-;;:::i;18878:26::-;;;;;;;;;;;;;;;;24343:404;;;;;;;;;;-1:-1:-1;24343:404:0;;;;;:::i;:::-;;:::i;14772:87::-;;;;;;;;;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;14772:87;;1741:104;;;;;;;;;;;;;:::i;31279:145::-;;;;;;;;;;-1:-1:-1;31279:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;31382:16:0;;;;31355:7;31382:16;;;:8;:16;;;;;;;;:27;;;;;;;:34;;;;31279:145;3325:438;;;;;;;;;;-1:-1:-1;3325:438:0;;;;;:::i;:::-;;:::i;2205:193::-;;;;;;;;;;-1:-1:-1;2205:193:0;;;;;:::i;:::-;;:::i;23757:210::-;;;;;;;;;;-1:-1:-1;23757:210:0;;;;;:::i;:::-;;:::i;22877:134::-;;;;;;;;;;-1:-1:-1;22877:134:0;;;;;:::i;:::-;;:::i;24056:114::-;;;;;;;;;;-1:-1:-1;24056:114:0;;;;;:::i;:::-;;:::i;18404:35::-;;;;;;;;;;;;;;;;18479:34;;;;;;;;;;;;;;;;35051:162;;;;;;;;;;;;;:::i;19049:27::-;;;;;;;;;;;;;;;;2406:151;;;;;;;;;;-1:-1:-1;2406:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;2522:18:0;;;2495:7;2522:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2406:151;30793:104;;;;;;;;;;;;;:::i;18978:21::-;;;;;;;;;;-1:-1:-1;18978:21:0;;;;;:::i;:::-;;:::i;15106:201::-;;;;;;;;;;-1:-1:-1;15106:201:0;;;;;:::i;:::-;;:::i;18945:26::-;;;;;;;;;;-1:-1:-1;18945:26:0;;;;-1:-1:-1;;;;;18945:26:0;;;18446:24;;;;;;;;;;;;;;;;1633:100;1687:13;1720:5;1713:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:100;:::o;2565:201::-;2648:4;175:10;2704:32;175:10;2720:7;2729:6;2704:8;:32::i;:::-;2754:4;2747:11;;;2565:201;;;;;:::o;23095:389::-;14845:6;;-1:-1:-1;;;;;14845:6:0;175:10;14907:23;14899:68;;;;-1:-1:-1;;;14899:68:0;;;;;;;:::i;:::-;;;;;;;;;23211:13:::1;:28:::0;;;23250:13:::1;:28:::0;;;23289:13:::1;:28:::0;;;23305:12;23342:29:::1;23266:12:::0;23227;23342:29:::1;:::i;:::-;:45;;;;:::i;:::-;23330:9;:57:::0;;;23421:2:::1;-1:-1:-1::0;23408:15:0::1;23400:76;;;::::0;-1:-1:-1;;;23400:76:0;;6852:2:1;23400:76:0::1;::::0;::::1;6834:21:1::0;6891:2;6871:18;;;6864:30;6930:34;6910:18;;;6903:62;-1:-1:-1;;;6981:18:1;;;6974:46;7037:19;;23400:76:0::1;6650:412:1::0;23400:76:0::1;23095:389:::0;;;:::o;2774:295::-;2905:4;175:10;2963:38;2979:4;175:10;2994:6;2963:15;:38::i;:::-;3012:27;3022:4;3028:2;3032:6;3012:9;:27::i;:::-;-1:-1:-1;3057:4:0;;2774:295;-1:-1:-1;;;;2774:295:0:o;31044:163::-;-1:-1:-1;;;;;31147:52:0;;;31123:4;31147:20;;;:8;:20;;;;;;;;:31;;;;;;;;;;:38;;;;:52;;31044:163::o;22005:638::-;20242:16;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;22095:15:::1;;;;;;;;;-1:-1:-1::0;;;;;22095:15:0::1;-1:-1:-1::0;;;;;22095:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22077:55:0::1;;22141:4;22148:15;;;;;;;;;-1:-1:-1::0;;;;;22148:15:0::1;-1:-1:-1::0;;;;;22148:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22077:94;::::0;-1:-1:-1;;;;;;22077:94:0::1;::::0;;;;;;-1:-1:-1;;;;;7975:15:1;;;22077:94:0::1;::::0;::::1;7957:34:1::0;8027:15;;8007:18;;;8000:43;7892:18;;22077:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22061:13;:110:::0;;-1:-1:-1;;;;;;22061:110:0::1;-1:-1:-1::0;;;;;22061:110:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;22182:55:0;;;:31:::1;:55;::::0;;;;;;;:62;;-1:-1:-1;;22182:62:0;;::::1;-1:-1:-1::0;22182:62:0;;::::1;::::0;;;22290:13;;;::::1;22255:50:::0;;:26:::1;:50:::0;;;;;;:57;;;;::::1;;::::0;;22357:15:::1;::::0;22325:75:::1;::::0;22342:4:::1;::::0;22357:15:::1;22375:24;22342:4:::0;22375:9:::1;:24::i;:::-;22325:8;:75::i;:::-;22411:15;::::0;-1:-1:-1;;;;;22411:15:0::1;:31;22450:21;22496:4;22516:24;22496:4:::0;22516:9:::1;:24::i;:::-;22555:1;22571::::0;22587:7:::1;14845:6:::0;;-1:-1:-1;;;;;14845:6:0;;14772:87;22587:7:::1;22609:15;22411:224;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34218:777::-:0;34282:32;34292:10;34304:9;34282;:32::i;:::-;34274:66;;;;-1:-1:-1;;;34274:66:0;;9179:2:1;34274:66:0;;;9161:21:1;9218:2;9198:18;;;9191:30;-1:-1:-1;;;9237:18:1;;;9230:51;9298:18;;34274:66:0;8977:345:1;34274:66:0;34353:14;34370:33;34381:10;34393:9;34370:10;:33::i;:::-;34420:14;;34353:50;;-1:-1:-1;34420:14:0;;34416:374;;;34465:10;34451:25;;;;:13;:25;;;;;;;:53;;;;;;;;;;;;;;34488:15;34451:53;;;;;;34519:33;;;:46;;;;;;;;;;;;;;;;34580:12;:22;;34558:6;;34451:25;34580:22;;34558:6;;34580:22;:::i;:::-;;;;-1:-1:-1;;34625:10:0;34637:20;;;;:8;:20;;;;;;;;:31;;;;;;;;:38;;;34619:69;;34625:10;34637:50;;34680:6;34637:42;:50::i;:::-;34619:5;:69::i;:::-;34416:374;;;34727:10;34739:20;;;;:8;:20;;;;;;;;:31;;;;;;;;:38;;;34721:57;;34727:10;34721:5;:57::i;:::-;34843:10;34834:20;;;;:8;:20;;;;;;;;:31;;;;;;;;:38;;;34802:21;;34834:38;;:20;34855:9;;34802:21;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:70;;;;;;;:::i;:::-;;;;-1:-1:-1;;34907:10:0;34898:20;;;;:8;:20;;;;;;;;:31;;;;;;;;:38;;;34883:11;:53;;34898:38;;34883:11;;:53;;34898:38;;34883:53;:::i;:::-;;;;-1:-1:-1;;34965:10:0;34956:20;;;;:8;:20;;;;;;;;:31;;;;;;;;;34949:38;;-1:-1:-1;;;;;;34949:38:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34218:777:0:o;20067:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20067:29:0;:::o;33612:523::-;20434:14;;;;20426:68;;;;-1:-1:-1;;;20426:68:0;;;;;;;:::i;:::-;33691:32:::1;33701:10;33713:9;33691;:32::i;:::-;33683:66;;;::::0;-1:-1:-1;;;33683:66:0;;9179:2:1;33683:66:0::1;::::0;::::1;9161:21:1::0;9218:2;9198:18;;;9191:30;-1:-1:-1;;;9237:18:1;;;9230:51;9298:18;;33683:66:0::1;8977:345:1::0;33683:66:0::1;33762:14;33779:33;33790:10;33802:9;33779:10;:33::i;:::-;33839:10;33825:25;::::0;;;:13:::1;:25;::::0;;;;;;:53;;::::1;::::0;;::::1;::::0;;;;;;;;33862:15:::1;33825:53:::0;::::1;::::0;;;;33889:33;;::::1;:46:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;33946:12:::1;:22:::0;;33762:50;;-1:-1:-1;33762:50:0;;33946:12;;33825:25;33946:22:::1;::::0;33762:50;;33946:22:::1;:::i;:::-;::::0;;;-1:-1:-1;33981:25:0::1;::::0;-1:-1:-1;33987:10:0::1;33999:6:::0;33981:5:::1;:25::i;:::-;-1:-1:-1::0;34028:10:0::1;34019:20;::::0;;;:8:::1;:20;::::0;;;;;;;:31;;;;;;;;;34059:15:::1;34019:37;::::0;::::1;:55:::0;34085:38:::1;;:42:::0;33612:523::o;3077:240::-;175:10;3165:4;3246:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3246:27:0;;;;;;;;;;3165:4;;175:10;3221:66;;175:10;;3246:27;;:40;;3276:10;;3246:40;:::i;35444:99::-;20242:16;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;35513:14:::1;:22:::0;;-1:-1:-1;;35513:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35444:99::o;30584:116::-;30643:16;;30635:57;;-1:-1:-1;;;;;30643:16:0;;;;30670:21;30635:57;;;;;30643:16;30635:57;30643:16;30635:57;30670:21;30643:16;30635:57;;;;;;;;;;;;;;;;;;;;;30584:116::o;31710:352::-;31786:7;31806:23;31832:30;31844:6;31852:9;31832:11;:30::i;:::-;31909:10;31873:24;31900:20;;;:8;:20;;;;;;;;:31;;;;;;;;:38;;;31806:56;;-1:-1:-1;31955:20:0;;31951:70;;31984:37;:15;32004:16;31984:19;:37::i;:::-;31977:44;;;;;;31951:70;-1:-1:-1;32039:15:0;31710:352;-1:-1:-1;;;31710:352:0:o;23492:170::-;14845:6;;-1:-1:-1;;;;;14845:6:0;175:10;14907:23;14899:68;;;;-1:-1:-1;;;14899:68:0;;;;;;;:::i;:::-;23570:4:::1;23578:1;23570:9:::0;23561:68:::1;;;::::0;-1:-1:-1;;;23561:68:0;;10201:2:1;23561:68:0::1;::::0;::::1;10183:21:1::0;10240:2;10220:18;;;10213:30;10279:34;10259:18;;;10252:62;-1:-1:-1;;;10330:18:1;;;10323:43;10383:19;;23561:68:0::1;9999:409:1::0;23561:68:0::1;23640:3;:14:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;23640:14:0;;;;;::::1;::::0;23492:170::o;23670:79::-;14845:6;;-1:-1:-1;;;;;14845:6:0;175:10;14907:23;14899:68;;;;-1:-1:-1;;;14899:68:0;;;;;;;:::i;:::-;23732:3:::1;:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23670:79::o:0;31507:131::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;31609:21:0;;-1:-1:-1;31609:21:0;;;:13;:21;;;;;31602:28;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31602:28:0;31609:21;;31602:28;;31609:21;;31602:28;;31609:21;31602:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31507:131;;;:::o;2070:127::-;-1:-1:-1;;;;;2171:18:0;2144:7;2171:18;;;;;;;;;;;;2070:127::o;14995:103::-;14845:6;;-1:-1:-1;;;;;14845:6:0;175:10;14907:23;14899:68;;;;-1:-1:-1;;;14899:68:0;;;;;;;:::i;:::-;15060:30:::1;15087:1;15060:18;:30::i;:::-;14995:103::o:0;22725:86::-;20242:16;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;22781:14:::1;:22:::0;;-1:-1:-1;;22781:22:0::1;::::0;;22725:86::o;32848:679::-;20434:14;;;;20426:68;;;;-1:-1:-1;;;20426:68:0;;;;;;;:::i;:::-;32993:32:::1;33003:10;33015:9;32993;:32::i;:::-;32989:397;;;33051:10;33042:20;::::0;;;:8:::1;:20;::::0;;;;;;;:31;;;;;;;;:38:::1;;:53:::0;;33084:11;;33042:20;:53:::1;::::0;33084:11;;33042:53:::1;:::i;:::-;::::0;;;-1:-1:-1;33152:34:0::1;::::0;-1:-1:-1;33164:10:0::1;33176:9:::0;33152:11:::1;:34::i;:::-;33119:10;33110:20;::::0;;;:8:::1;:20;::::0;;;;;;;:31;;;;;;;;:38:::1;;:76:::0;;:38;;:20;:76:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;33210:10:0::1;33201:20;::::0;;;:8:::1;:20;::::0;;;;;;;:31;;;;;;;;33241:15:::1;33201:37;::::0;;::::1;:55:::0;32989:397:::1;;;33323:51;::::0;;::::1;::::0;::::1;::::0;;33330:10:::1;33323:51:::0;;;33342:15:::1;33323:51;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;33323:51:0;;;;;;33289:20;;;:8:::1;:20:::0;;;;;:31;;;;;;;;;:85;;;;-1:-1:-1;;;;;;33289:85:0::1;-1:-1:-1::0;;;;;33289:85:0;;::::1;;::::0;;;-1:-1:-1;33289:85:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;32989:397:::1;33430:11;33398:10;33409:9;33398:21;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:43;;;;;;;:::i;:::-;;;;;;;;33467:11;33452;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;33489:30:0::1;::::0;-1:-1:-1;33495:10:0::1;33507:11:::0;33489:5:::1;:30::i;:::-;32848:679:::0;;:::o;24343:404::-;20242:16;;24430:4;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;24490:6:::1;24470:13;2042:12:::0;;;1954:108;24470:13:::1;:17;::::0;24486:1:::1;24470:17;:::i;:::-;:26;;;;:::i;:::-;24454:12;:42;;24446:111;;;::::0;-1:-1:-1;;;24446:111:0;;11142:2:1;24446:111:0::1;::::0;::::1;11124:21:1::0;11181:2;11161:18;;;11154:30;11220:34;11200:18;;;11193:62;11291:26;11271:18;;;11264:54;11335:19;;24446:111:0::1;10940:420:1::0;24446:111:0::1;24611:4;24591:13;2042:12:::0;;;1954:108;24591:13:::1;:17;::::0;24607:1:::1;24591:17;:::i;:::-;:24;;;;:::i;:::-;24575:12;:40;;24567:108;;;::::0;-1:-1:-1;;;24567:108:0;;11567:2:1;24567:108:0::1;::::0;::::1;11549:21:1::0;11606:2;11586:18;;;11579:30;11645:34;11625:18;;;11618:62;11716:25;11696:18;;;11689:53;11759:19;;24567:108:0::1;11365:419:1::0;24567:108:0::1;-1:-1:-1::0;24685:19:0::1;:34:::0;;;24736:4:::1;20370:1;24343:404:::0;;;:::o;1741:104::-;1797:13;1830:7;1823:14;;;;;:::i;3325:438::-;175:10;3418:4;3501:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3501:27:0;;;;;;;;;;3418:4;;175:10;3547:35;;;;3539:85;;;;-1:-1:-1;;;3539:85:0;;11991:2:1;3539:85:0;;;11973:21:1;12030:2;12010:18;;;12003:30;12069:34;12049:18;;;12042:62;-1:-1:-1;;;12120:18:1;;;12113:35;12165:19;;3539:85:0;11789:401:1;3539:85:0;3660:60;3669:5;3676:7;3704:15;3685:16;:34;3660:8;:60::i;2205:193::-;2284:4;175:10;2340:28;175:10;2357:2;2361:6;2340:9;:28::i;23757:210::-;14845:6;;-1:-1:-1;;;;;14845:6:0;175:10;14907:23;14899:68;;;;-1:-1:-1;;;14899:68:0;;;;;;;:::i;:::-;23870:4:::1;23855:3;23859:6;23855:11;;;;;;;;:::i;:::-;;;;;;;;;:19:::0;23846:84:::1;;;::::0;-1:-1:-1;;;23846:84:0;;12397:2:1;23846:84:0::1;::::0;::::1;12379:21:1::0;12436:2;12416:18;;;12409:30;12475:34;12455:18;;;12448:62;-1:-1:-1;;;12526:18:1;;;12519:49;12585:19;;23846:84:0::1;12195:415:1::0;23846:84:0::1;23955:4;23941:3;23945:6;23941:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:18:::0;-1:-1:-1;;23757:210:0:o;22877:134::-;20242:16;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22964:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;-1:-1:-1;;22964:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22877:134::o;24056:114::-;20242:16;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;24134:16:::1;:28:::0;;-1:-1:-1;;;;;;24134:28:0::1;-1:-1:-1::0;;;;;24134:28:0;;;::::1;::::0;;;::::1;::::0;;24056:114::o;35051:162::-;20242:16;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;35139:29:::1;::::0;;;;::::1;::::0;;;35149:15:::1;35139:29:::0;;-1:-1:-1;35139:29:0::1;::::0;;::::1;::::0;;;35179:26;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;35051:162::o;30793:104::-;20242:16;;-1:-1:-1;;;;;20242:16:0;175:10;20242:32;;:59;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;14845:6:0;175:10;20278:23;20242:59;20234:125;;;;-1:-1:-1;;;20234:125:0;;;;;;;:::i;:::-;30846:43:::1;30864:24;30882:4;30864:9;:24::i;:::-;30846:17;:43::i;18978:21::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18978:21:0;:::o;15106:201::-;14845:6;;-1:-1:-1;;;;;14845:6:0;175:10;14907:23;14899:68;;;;-1:-1:-1;;;14899:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15195:22:0;::::1;15187:73;;;::::0;-1:-1:-1;;;15187:73:0;;12817:2:1;15187:73:0::1;::::0;::::1;12799:21:1::0;12856:2;12836:18;;;12829:30;12895:34;12875:18;;;12868:62;-1:-1:-1;;;12946:18:1;;;12939:36;12992:19;;15187:73:0::1;12615:402:1::0;15187:73:0::1;15271:28;15290:8;15271:18;:28::i;5456:380::-:0;-1:-1:-1;;;;;5592:19:0;;5584:68;;;;-1:-1:-1;;;5584:68:0;;13224:2:1;5584:68:0;;;13206:21:1;13263:2;13243:18;;;13236:30;13302:34;13282:18;;;13275:62;-1:-1:-1;;;13353:18:1;;;13346:34;13397:19;;5584:68:0;13022:400:1;5584:68:0;-1:-1:-1;;;;;5671:21:0;;5663:68;;;;-1:-1:-1;;;5663:68:0;;13629:2:1;5663:68:0;;;13611:21:1;13668:2;13648:18;;;13641:30;13707:34;13687:18;;;13680:62;-1:-1:-1;;;13758:18:1;;;13751:32;13800:19;;5663:68:0;13427:398:1;5663:68:0;-1:-1:-1;;;;;5744:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5796:32;;1410:25:1;;;5796:32:0;;1383:18:1;5796:32:0;;;;;;;5456:380;;;:::o;5844:453::-;-1:-1:-1;;;;;2522:18:0;;;5979:24;2522:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;6046:37:0;;6042:248;;6128:6;6108:16;:26;;6100:68;;;;-1:-1:-1;;;6100:68:0;;14032:2:1;6100:68:0;;;14014:21:1;14071:2;14051:18;;;14044:30;14110:31;14090:18;;;14083:59;14159:18;;6100:68:0;13830:353:1;6100:68:0;6212:51;6221:5;6228:7;6256:6;6237:16;:25;6212:8;:51::i;:::-;5968:329;5844:453;;;:::o;24976:3205::-;-1:-1:-1;;;;;25108:18:0;;25100:68;;;;-1:-1:-1;;;25100:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25187:16:0;;25179:64;;;;-1:-1:-1;;;25179:64:0;;;;;;;:::i;:::-;25268:6;25278:1;25268:11;25264:93;;25296:28;25312:4;25318:2;25322:1;25296:15;:28::i;25264:93::-;25415:14;;;;25411:1440;;;14845:6;;-1:-1:-1;;;;;25468:15:0;;;14845:6;;25468:15;;;;:49;;-1:-1:-1;14845:6:0;;-1:-1:-1;;;;;25504:13:0;;;14845:6;;25504:13;;25468:49;:91;;;;-1:-1:-1;;;;;;25538:21:0;;25552:6;25538:21;;25468:91;:122;;;;-1:-1:-1;25581:9:0;;-1:-1:-1;;;25581:9:0;;;;25580:10;25468:122;25446:1394;;;14845:6;;-1:-1:-1;;;;;25629:13:0;;;14845:6;;25629:13;;;;:47;;-1:-1:-1;25660:15:0;;-1:-1:-1;;;;;25646:30:0;;;25660:15;;25646:30;;25629:47;:79;;;;-1:-1:-1;25694:13:0;;-1:-1:-1;;;;;25680:28:0;;;25694:13;;25680:28;;25629:79;25625:336;;;25765:9;25740:35;;;;:24;:35;;;;;;25778:12;-1:-1:-1;25732:136:0;;;;-1:-1:-1;;;25732:136:0;;15200:2:1;25732:136:0;;;15182:21:1;15239:2;15219:18;;;15212:30;15278:34;15258:18;;;15251:62;15349:34;15329:18;;;15322:62;-1:-1:-1;;;15400:19:1;;;15393:40;15450:19;;25732:136:0;14998:477:1;25732:136:0;25916:9;25891:35;;;;:24;:35;;;;;25929:12;25891:50;;25625:336;-1:-1:-1;;;;;26012:32:0;;;;;;:26;:32;;;;;;;;:72;;;;-1:-1:-1;;;;;;26049:35:0;;;;;;:31;:35;;;;;;;;26048:36;26012:72;26008:817;;;26127:20;;26117:6;:30;;26109:108;;;;-1:-1:-1;;;26109:108:0;;15682:2:1;26109:108:0;;;15664:21:1;15721:2;15701:18;;;15694:30;15760:34;15740:18;;;15733:62;15831:34;15811:18;;;15804:62;-1:-1:-1;;;15882:19:1;;;15875:32;15924:19;;26109:108:0;15480:469:1;26109:108:0;26274:9;;26257:13;26267:2;26257:9;:13::i;:::-;26248:22;;:6;:22;:::i;:::-;:35;;26240:79;;;;-1:-1:-1;;;26240:79:0;;16156:2:1;26240:79:0;;;16138:21:1;16195:2;16175:18;;;16168:30;16234:33;16214:18;;;16207:61;16285:18;;26240:79:0;15954:355:1;26240:79:0;26008:817;;;-1:-1:-1;;;;;26412:30:0;;;;;;:26;:30;;;;;;;;:72;;;;-1:-1:-1;;;;;;26447:37:0;;;;;;:31;:37;;;;;;;;26446:38;26412:72;26408:417;;;26527:20;;26517:6;:30;;26509:109;;;;-1:-1:-1;;;26509:109:0;;16516:2:1;26509:109:0;;;16498:21:1;16555:2;16535:18;;;16528:30;16594:34;16574:18;;;16567:62;16665:34;16645:18;;;16638:62;-1:-1:-1;;;16716:19:1;;;16709:33;16759:19;;26509:109:0;16314:470:1;26408:417:0;-1:-1:-1;;;;;26666:35:0;;;;;;:31;:35;;;;;;;;26661:164;;26760:9;;26743:13;26753:2;26743:9;:13::i;:::-;26734:22;;:6;:22;:::i;:::-;:35;;26726:79;;;;-1:-1:-1;;;26726:79:0;;16156:2:1;26726:79:0;;;16138:21:1;16195:2;16175:18;;;16168:30;16234:33;16214:18;;;16207:61;16285:18;;26726:79:0;15954:355:1;26726:79:0;26865:28;26896:24;26914:4;26896:9;:24::i;:::-;26970:19;;26865:55;;-1:-1:-1;26946:43:0;;;;;;;27018:34;;-1:-1:-1;27043:9:0;;-1:-1:-1;;;27043:9:0;;;;27042:10;27018:34;:84;;;;-1:-1:-1;;;;;;27070:32:0;;;;;;:26;:32;;;;;;;;27069:33;27018:84;:127;;;;-1:-1:-1;;;;;;27120:25:0;;;;;;:19;:25;;;;;;;;27119:26;27018:127;:168;;;;-1:-1:-1;;;;;;27163:23:0;;;;;;:19;:23;;;;;;;;27162:24;27018:168;27000:298;;;27213:9;:16;;-1:-1:-1;;;;27213:16:0;-1:-1:-1;;;27213:16:0;;;27244:10;:8;:10::i;:::-;27269:9;:17;;-1:-1:-1;;;;27269:17:0;;;27000:298;27326:9;;-1:-1:-1;;;;;27456:25:0;;27310:12;27456:25;;;:19;:25;;;;;;27326:9;-1:-1:-1;;;27326:9:0;;;;;27325:10;;27456:25;;:66;;-1:-1:-1;;;;;;27499:23:0;;;;;;:19;:23;;;;;;;;27456:66;:154;;;-1:-1:-1;;;;;;27542:32:0;;;;;;:26;:32;;;;;;;;27541:33;:68;;;;-1:-1:-1;;;;;;27579:30:0;;;;;;:26;:30;;;;;;;;27578:31;27541:68;27438:199;;;-1:-1:-1;27632:5:0;27438:199;27658:12;27689:7;27685:443;;;27720:30;27746:3;27720:21;27731:9;;27720:6;:10;;:21;;;;:::i;:::-;:25;;:30::i;:::-;27713:37;;27811:9;;27795:13;;27788:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27765:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;27881:9:0;;27865:13;;27858:20;;:4;:20;:::i;:::-;:32;;;;:::i;:::-;27835:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;27951:9:0;;27935:13;;27928:20;;:4;:20;:::i;:::-;:32;;;;:::i;:::-;27905:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;27993:8:0;;27989:91;;28022:42;28038:4;28052;28059;28022:15;:42::i;:::-;28102:14;28112:4;28102:14;;:::i;:::-;;;27685:443;28140:33;28156:4;28162:2;28166:6;28140:15;:33::i;:::-;25089:3092;;;;24976:3205;;;:::o;16886:98::-;16944:7;16971:5;16975:1;16971;:5;:::i;:::-;16964:12;16886:98;-1:-1:-1;;;16886:98:0:o;4450:399::-;-1:-1:-1;;;;;4534:21:0;;4526:65;;;;-1:-1:-1;;;4526:65:0;;16991:2:1;4526:65:0;;;16973:21:1;17030:2;17010:18;;;17003:30;17069:33;17049:18;;;17042:61;17120:18;;4526:65:0;16789:355:1;4526:65:0;4682:6;4666:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;4699:18:0;;:9;:18;;;;;;;;;;:28;;4721:6;;4699:9;:28;;4721:6;;4699:28;:::i;:::-;;;;-1:-1:-1;;4743:37:0;;1410:25:1;;;-1:-1:-1;;;;;4743:37:0;;;4760:1;;4743:37;;1398:2:1;1383:18;4743:37:0;;;;;;;32848:679;;:::o;32070:714::-;32148:7;32176:28;32186:6;32194:9;32176;:28::i;:::-;32168:79;;;;-1:-1:-1;;;32168:79:0;;17351:2:1;32168:79:0;;;17333:21:1;17390:2;17370:18;;;17363:30;17429:34;17409:18;;;17402:62;-1:-1:-1;;;17480:18:1;;;17473:36;17526:19;;32168:79:0;17149:402:1;32168:79:0;-1:-1:-1;;;;;31382:16:0;;32260:14;31382:16;;;:8;:16;;;;;;;;:27;;;;;;;;:34;;;;32387:9;32349:33;;;;31382:34;;32260:14;32349:48;;:33;:37;:48::i;:::-;32317:80;-1:-1:-1;32408:31:0;32442:30;:15;32462:9;32442:19;:30::i;:::-;32408:64;-1:-1:-1;32483:21:0;32507:50;32408:64;32535:21;32507:27;:50::i;:::-;32483:74;;32570:12;32585:35;32616:3;32585:26;32596:3;32600:9;32596:14;;;;;;;;:::i;:::-;;;;;;;;;32585:6;:10;;:26;;;;:::i;:35::-;32570:50;-1:-1:-1;32631:20:0;32654:37;32688:2;32654:29;32688:2;32654:29;32672:2;32654:29;32570:50;32663:3;32654:8;:13::i;:37::-;32631:60;-1:-1:-1;32702:14:0;32719:31;32631:60;32736:13;32719:16;:31::i;:::-;32702:48;32070:714;-1:-1:-1;;;;;;;;;;32070:714:0:o;15315:191::-;15408:6;;;-1:-1:-1;;;;;15425:17:0;;;-1:-1:-1;;;;;;15425:17:0;;;;;;;15458:40;;15408:6;;;15425:17;15408:6;;15458:40;;15389:16;;15458:40;15378:128;15315:191;:::o;4857:591::-;-1:-1:-1;;;;;4941:21:0;;4933:67;;;;-1:-1:-1;;;4933:67:0;;17758:2:1;4933:67:0;;;17740:21:1;17797:2;17777:18;;;17770:30;17836:34;17816:18;;;17809:62;-1:-1:-1;;;17887:18:1;;;17880:31;17928:19;;4933:67:0;17556:397:1;4933:67:0;-1:-1:-1;;;;;5100:18:0;;5075:22;5100:18;;;;;;;;;;;5137:24;;;;5129:71;;;;-1:-1:-1;;;5129:71:0;;18160:2:1;5129:71:0;;;18142:21:1;18199:2;18179:18;;;18172:30;18238:34;18218:18;;;18211:62;-1:-1:-1;;;18289:18:1;;;18282:32;18331:19;;5129:71:0;17958:398:1;5129:71:0;-1:-1:-1;;;;;5236:18:0;;:9;:18;;;;;;;;;;5257:23;;;5236:44;;5302:12;:22;;5274:6;;5236:9;5302:22;;5274:6;;5302:22;:::i;:::-;;;;-1:-1:-1;;5342:37:0;;1410:25:1;;;5368:1:0;;-1:-1:-1;;;;;5342:37:0;;;;;1398:2:1;1383:18;5342:37:0;;;;;;;23095:389;;;:::o;28189:477::-;28281:16;;;28295:1;28281:16;;;;;;;;28257:21;;28281:16;;;;;;;;;;-1:-1:-1;28281:16:0;28257:40;;28326:4;28308;28313:1;28308:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28308:23:0;;;:7;;;;;;;;;;:23;;;;28352:15;;:22;;;-1:-1:-1;;;28352:22:0;;;;:15;;;;;:20;;:22;;;;;28308:7;;28352:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28342:4;28347:1;28342:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28342:32:0;;;:7;;;;;;;;;:32;28419:15;;28387:62;;28404:4;;28419:15;28437:11;28387:8;:62::i;:::-;28462:15;;:196;;-1:-1:-1;;;28462:196:0;;-1:-1:-1;;;;;28462:15:0;;;;:66;;:196;;28543:11;;28462:15;;28585:4;;28612;;28632:15;;28462:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28246:420;28189:477;:::o;3771:671::-;-1:-1:-1;;;;;3902:18:0;;3894:68;;;;-1:-1:-1;;;3894:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3981:16:0;;3973:64;;;;-1:-1:-1;;;3973:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4123:15:0;;4101:19;4123:15;;;;;;;;;;;4157:21;;;;4149:72;;;;-1:-1:-1;;;4149:72:0;;19680:2:1;4149:72:0;;;19662:21:1;19719:2;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;-1:-1:-1;;;19809:18:1;;;19802:36;19855:19;;4149:72:0;19478:402:1;4149:72:0;-1:-1:-1;;;;;4257:15:0;;;:9;:15;;;;;;;;;;;4275:20;;;4257:38;;4317:13;;;;;;;;:23;;4289:6;;4257:9;4317:23;;4289:6;;4317:23;:::i;:::-;;;;;;;;4373:2;-1:-1:-1;;;;;4358:26:0;4367:4;-1:-1:-1;;;;;4358:26:0;;4377:6;4358:26;;;;1410:25:1;;1398:2;1383:18;;1264:177;4358:26:0;;;;;;;;4397:37;23095:389;29055:1441;29095:23;29121:24;29139:4;29121:9;:24::i;:::-;29095:50;;29156:25;29228:19;;29206;;29184;;:41;;;;:::i;:::-;:63;;;;:::i;:::-;29156:91;-1:-1:-1;29272:20:0;;;:46;;-1:-1:-1;29296:22:0;;29272:46;29268:59;;;29320:7;;29055:1441::o;29268:59::-;29359:19;;29341:15;:37;29337:80;;;29398:19;;29380:37;;29337:80;29499:23;29585:1;29565:17;29543:19;;29525:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;29499:87;-1:-1:-1;29597:26:0;29626:36;:15;29499:87;29626:19;:36::i;:::-;29597:65;-1:-1:-1;29711:21:0;29745:37;29597:65;29745:17;:37::i;:::-;29803:18;29824:44;:21;29850:17;29824:25;:44::i;:::-;29803:65;;29879:23;29905:58;29945:17;29905:35;29920:19;;29905:10;:14;;:35;;;;:::i;:58::-;29879:84;;29974:23;30000:58;30040:17;30000:35;30015:19;;30000:10;:14;;:35;;;;:::i;:58::-;29974:84;-1:-1:-1;30069:23:0;29974:84;30095:28;30108:15;30095:10;:28;:::i;:::-;:46;;;;:::i;:::-;30184:1;30162:19;:23;;;30196:19;:23;;;30230:19;:23;30274:16;;30069:72;;-1:-1:-1;;;;;;30274:16:0;30266:72;30301:36;:15;30321;30301:19;:36::i;:::-;30266:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30389:1;30371:15;:19;:42;;;;;30412:1;30394:15;:19;30371:42;30367:122;;;30430:47;30444:15;30461;30430:13;:47::i;:::-;29084:1412;;;;;;;;;29055:1441::o;17098:98::-;17156:7;17183:5;17187:1;17183;:5;:::i;17204:98::-;17262:7;17289:5;17293:1;17289;:5;:::i;16992:98::-;17050:7;17077:5;17081:1;17077;:5;:::i;28674:373::-;28789:15;;28757:62;;28774:4;;-1:-1:-1;;;;;28789:15:0;28807:11;28757:8;:62::i;:::-;28832:15;;28982:16;;28832:207;;-1:-1:-1;;;28832:207:0;;-1:-1:-1;;;;;28832:15:0;;;;:31;;28871:9;;28832:207;;28904:4;;28924:11;;28832:15;;;;28982:16;;29013:15;;28832:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28674:373;;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1446:316::-;1523:6;1531;1539;1592:2;1580:9;1571:7;1567:23;1563:32;1560:52;;;1608:1;1605;1598:12;1560:52;-1:-1:-1;;1631:23:1;;;1701:2;1686:18;;1673:32;;-1:-1:-1;1752:2:1;1737:18;;;1724:32;;1446:316;-1:-1:-1;1446:316:1:o;1767:456::-;1844:6;1852;1860;1913:2;1901:9;1892:7;1888:23;1884:32;1881:52;;;1929:1;1926;1919:12;1881:52;1968:9;1955:23;1987:31;2012:5;1987:31;:::i;:::-;2037:5;-1:-1:-1;2094:2:1;2079:18;;2066:32;2107:33;2066:32;2107:33;:::i;:::-;1767:456;;2159:7;;-1:-1:-1;;;2213:2:1;2198:18;;;;2185:32;;1767:456::o;2228:180::-;2287:6;2340:2;2328:9;2319:7;2315:23;2311:32;2308:52;;;2356:1;2353;2346:12;2308:52;-1:-1:-1;2379:23:1;;2228:180;-1:-1:-1;2228:180:1:o;2855:160::-;2920:20;;2976:13;;2969:21;2959:32;;2949:60;;3005:1;3002;2995:12;3020:180;3076:6;3129:2;3117:9;3108:7;3104:23;3100:32;3097:52;;;3145:1;3142;3135:12;3097:52;3168:26;3184:9;3168:26;:::i;3205:247::-;3264:6;3317:2;3305:9;3296:7;3292:23;3288:32;3285:52;;;3333:1;3330;3323:12;3285:52;3372:9;3359:23;3391:31;3416:5;3391:31;:::i;3457:435::-;3510:3;3548:5;3542:12;3575:6;3570:3;3563:19;3601:4;3630:2;3625:3;3621:12;3614:19;;3667:2;3660:5;3656:14;3688:1;3698:169;3712:6;3709:1;3706:13;3698:169;;;3773:13;;3761:26;;3807:12;;;;3842:15;;;;3734:1;3727:9;3698:169;;;-1:-1:-1;3883:3:1;;3457:435;-1:-1:-1;;;;;3457:435:1:o;3897:563::-;4086:2;4075:9;4068:21;4049:4;4124:6;4118:13;4167:4;4162:2;4151:9;4147:18;4140:32;4195:62;4253:2;4242:9;4238:18;4224:12;4195:62;:::i;:::-;4181:76;;4306:2;4298:6;4294:15;4288:22;4380:2;4376:7;4364:9;4356:6;4352:22;4348:36;4341:4;4330:9;4326:20;4319:66;4402:52;4447:6;4431:14;4402:52;:::i;:::-;4394:60;3897:563;-1:-1:-1;;;;;3897:563:1:o;4673:248::-;4741:6;4749;4802:2;4790:9;4781:7;4777:23;4773:32;4770:52;;;4818:1;4815;4808:12;4770:52;-1:-1:-1;;4841:23:1;;;4911:2;4896:18;;;4883:32;;-1:-1:-1;4673:248:1:o;4926:315::-;4991:6;4999;5052:2;5040:9;5031:7;5027:23;5023:32;5020:52;;;5068:1;5065;5058:12;5020:52;5107:9;5094:23;5126:31;5151:5;5126:31;:::i;:::-;5176:5;-1:-1:-1;5200:35:1;5231:2;5216:18;;5200:35;:::i;:::-;5190:45;;4926:315;;;;;:::o;5246:388::-;5314:6;5322;5375:2;5363:9;5354:7;5350:23;5346:32;5343:52;;;5391:1;5388;5381:12;5343:52;5430:9;5417:23;5449:31;5474:5;5449:31;:::i;:::-;5499:5;-1:-1:-1;5556:2:1;5541:18;;5528:32;5569:33;5528:32;5569:33;:::i;:::-;5621:7;5611:17;;;5246:388;;;;;:::o;5639:380::-;5718:1;5714:12;;;;5761;;;5782:61;;5836:4;5828:6;5824:17;5814:27;;5782:61;5889:2;5881:6;5878:14;5858:18;5855:38;5852:161;;5935:10;5930:3;5926:20;5923:1;5916:31;5970:4;5967:1;5960:15;5998:4;5995:1;5988:15;5852:161;;5639:380;;;:::o;6024:356::-;6226:2;6208:21;;;6245:18;;;6238:30;6304:34;6299:2;6284:18;;6277:62;6371:2;6356:18;;6024:356::o;6385:127::-;6446:10;6441:3;6437:20;6434:1;6427:31;6477:4;6474:1;6467:15;6501:4;6498:1;6491:15;6517:128;6557:3;6588:1;6584:6;6581:1;6578:13;6575:39;;;6594:18;;:::i;:::-;-1:-1:-1;6630:9:1;;6517:128::o;7067:417::-;7269:2;7251:21;;;7308:2;7288:18;;;7281:30;7347:34;7342:2;7327:18;;7320:62;-1:-1:-1;;;7413:2:1;7398:18;;7391:51;7474:3;7459:19;;7067:417::o;7489:251::-;7559:6;7612:2;7600:9;7591:7;7587:23;7583:32;7580:52;;;7628:1;7625;7618:12;7580:52;7660:9;7654:16;7679:31;7704:5;7679:31;:::i;8054:607::-;-1:-1:-1;;;;;8413:15:1;;;8395:34;;8460:2;8445:18;;8438:34;;;;8503:2;8488:18;;8481:34;;;;8546:2;8531:18;;8524:34;;;;8595:15;;;8589:3;8574:19;;8567:44;8375:3;8627:19;;8620:35;;;;8344:3;8329:19;;8054:607::o;8666:306::-;8754:6;8762;8770;8823:2;8811:9;8802:7;8798:23;8794:32;8791:52;;;8839:1;8836;8829:12;8791:52;8868:9;8862:16;8852:26;;8918:2;8907:9;8903:18;8897:25;8887:35;;8962:2;8951:9;8947:18;8941:25;8931:35;;8666:306;;;;;:::o;9327:127::-;9388:10;9383:3;9379:20;9376:1;9369:31;9419:4;9416:1;9409:15;9443:4;9440:1;9433:15;9459:125;9499:4;9527:1;9524;9521:8;9518:34;;;9532:18;;:::i;:::-;-1:-1:-1;9569:9:1;;9459:125::o;9589:405::-;9791:2;9773:21;;;9830:2;9810:18;;;9803:30;9869:34;9864:2;9849:18;;9842:62;-1:-1:-1;;;9935:2:1;9920:18;;9913:39;9984:3;9969:19;;9589:405::o;10413:127::-;10474:10;10469:3;10465:20;10462:1;10455:31;10505:4;10502:1;10495:15;10529:4;10526:1;10519:15;10545:168;10585:7;10651:1;10647;10643:6;10639:14;10636:1;10633:21;10628:1;10621:9;10614:17;10610:45;10607:71;;;10658:18;;:::i;:::-;-1:-1:-1;10698:9:1;;10545:168::o;10718:217::-;10758:1;10784;10774:132;;10828:10;10823:3;10819:20;10816:1;10809:31;10863:4;10860:1;10853:15;10891:4;10888:1;10881:15;10774:132;-1:-1:-1;10920:9:1;;10718:217::o;14188:401::-;14390:2;14372:21;;;14429:2;14409:18;;;14402:30;14468:34;14463:2;14448:18;;14441:62;-1:-1:-1;;;14534:2:1;14519:18;;14512:35;14579:3;14564:19;;14188:401::o;14594:399::-;14796:2;14778:21;;;14835:2;14815:18;;;14808:30;14874:34;14869:2;14854:18;;14847:62;-1:-1:-1;;;14940:2:1;14925:18;;14918:33;14983:3;14968:19;;14594:399::o;18493:980::-;18755:4;18803:3;18792:9;18788:19;18834:6;18823:9;18816:25;18860:2;18898:6;18893:2;18882:9;18878:18;18871:34;18941:3;18936:2;18925:9;18921:18;18914:31;18965:6;19000;18994:13;19031:6;19023;19016:22;19069:3;19058:9;19054:19;19047:26;;19108:2;19100:6;19096:15;19082:29;;19129:1;19139:195;19153:6;19150:1;19147:13;19139:195;;;19218:13;;-1:-1:-1;;;;;19214:39:1;19202:52;;19309:15;;;;19274:12;;;;19250:1;19168:9;19139:195;;;-1:-1:-1;;;;;;;19390:32:1;;;;19385:2;19370:18;;19363:60;-1:-1:-1;;;19454:3:1;19439:19;19432:35;19351:3;18493:980;-1:-1:-1;;;18493:980:1:o

Swarm Source

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