ETH Price: $3,410.38 (-1.00%)
Gas: 2 Gwei

Token

Bacon Token (BACON)
 

Overview

Max Total Supply

1,000,000 BACON

Holders

153

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3.336954297821717474 BACON

Value
$0.00
0xaa300b9b0dcff435680df592eea89e68efc8473f
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:
BaconToken

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-25
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

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

	function getPair(address tokenA, address tokenB)
	external
	view
	returns (address pair);
}

interface IRouter {
	function factory() external pure returns (address);

	function WETH() external pure returns (address);

	function addLiquidityETH(
		address token,
		uint256 amountTokenDesired,
		uint256 amountTokenMin,
		uint256 amountETHMin,
		address to,
		uint256 deadline
	)
	external
	payable
	returns (
		uint256 amountToken,
		uint256 amountETH,
		uint256 liquidity
	);

	function swapExactETHForTokensSupportingFeeOnTransferTokens(
		uint256 amountOutMin,
		address[] calldata path,
		address to,
		uint256 deadline
	) external payable;

	function swapExactTokensForETHSupportingFeeOnTransferTokens(
		uint256 amountIn,
		uint256 amountOutMin,
		address[] calldata path,
		address to,
		uint256 deadline
	) external;

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IERC20 {
	function totalSupply() external view returns (uint256);
	function balanceOf(address account) external view returns (uint256);
	function transfer(address recipient, 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 sender,
		address recipient,
		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);
}

interface DividendPayingTokenInterface {
	function dividendOf(address _owner) external view returns(uint256);
	function distributeDividends() external payable;
	function withdrawDividend() external;
	event DividendsDistributed(
		address indexed from,
		uint256 weiAmount
	);
	event DividendWithdrawn(
		address indexed to,
		uint256 weiAmount
	);
}

interface DividendPayingTokenOptionalInterface {
	function withdrawableDividendOf(address _owner) external view returns(uint256);
	function withdrawnDividendOf(address _owner) external view returns(uint256);
	function accumulativeDividendOf(address _owner) external view returns(uint256);
}

library SafeMath {

	function add(uint256 a, uint256 b) internal pure returns (uint256) {
		uint256 c = a + b;
		require(c >= a, "SafeMath: addition overflow");

		return c;
	}

	function sub(uint256 a, uint256 b) internal pure returns (uint256) {
		return sub(a, b, "SafeMath: subtraction overflow");
	}

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

		return c;
	}

	function mul(uint256 a, uint256 b) internal pure returns (uint256) {
		// 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 0;
		}

		uint256 c = a * b;
		require(c / a == b, "SafeMath: multiplication overflow");

		return c;
	}

	function div(uint256 a, uint256 b) internal pure returns (uint256) {
		return div(a, b, "SafeMath: division by zero");
	}

	function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b > 0, errorMessage);
		uint256 c = a / b;
		// assert(a == b * c + a % b); // There is no case in which this doesn't hold

		return c;
	}

	function mod(uint256 a, uint256 b) internal pure returns (uint256) {
		return mod(a, b, "SafeMath: modulo by zero");
	}

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

library SafeMathInt {
	int256 private constant MIN_INT256 = int256(1) << 255;
	int256 private constant MAX_INT256 = ~(int256(1) << 255);

	function mul(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a * b;

		// Detect overflow when multiplying MIN_INT256 with -1
		require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
		require((b == 0) || (c / b == a));
		return c;
	}
	function div(int256 a, int256 b) internal pure returns (int256) {
		// Prevent overflow when dividing MIN_INT256 by -1
		require(b != -1 || a != MIN_INT256);

		// Solidity already throws when dividing by 0.
		return a / b;
	}
	function sub(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a - b;
		require((b >= 0 && c <= a) || (b < 0 && c > a));
		return c;
	}
	function add(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a + b;
		require((b >= 0 && c >= a) || (b < 0 && c < a));
		return c;
	}
	function abs(int256 a) internal pure returns (int256) {
		require(a != MIN_INT256);
		return a < 0 ? -a : a;
	}
	function toUint256Safe(int256 a) internal pure returns (uint256) {
		require(a >= 0);
		return uint256(a);
	}
}

library SafeMathUint {
	function toInt256Safe(uint256 a) internal pure returns (int256) {
		int256 b = int256(a);
		require(b >= 0);
		return b;
	}
}

library IterableMapping {
	struct Map {
		address[] keys;
		mapping(address => uint) values;
		mapping(address => uint) indexOf;
		mapping(address => bool) inserted;
	}

	function get(Map storage map, address key) public view returns (uint) {
		return map.values[key];
	}

	function getIndexOfKey(Map storage map, address key) public view returns (int) {
		if(!map.inserted[key]) {
			return -1;
		}
		return int(map.indexOf[key]);
	}

	function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
		return map.keys[index];
	}

	function size(Map storage map) public view returns (uint) {
		return map.keys.length;
	}

	function set(Map storage map, address key, uint val) public {
		if (map.inserted[key]) {
			map.values[key] = val;
		} else {
			map.inserted[key] = true;
			map.values[key] = val;
			map.indexOf[key] = map.keys.length;
			map.keys.push(key);
		}
	}

	function remove(Map storage map, address key) public {
		if (!map.inserted[key]) {
			return;
		}

		delete map.inserted[key];
		delete map.values[key];

		uint index = map.indexOf[key];
		uint lastIndex = map.keys.length - 1;
		address lastKey = map.keys[lastIndex];

		map.indexOf[lastKey] = index;
		delete map.indexOf[key];

		map.keys[index] = lastKey;
		map.keys.pop();
	}
}

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

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

contract Ownable is Context {
	address private _owner;

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

	constructor () {
		address msgSender = _msgSender();
		_owner = msgSender;
		emit OwnershipTransferred(address(0), msgSender);
	}

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
	using SafeMath for uint256;

	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 recipient, uint256 amount) public virtual override returns (bool) {
		_transfer(_msgSender(), recipient, 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) {
		_approve(_msgSender(), spender, amount);
		return true;
	}

	function transferFrom(
		address sender,
		address recipient,
		uint256 amount
	) public virtual override returns (bool) {
		_transfer(sender, recipient, amount);
		_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
		return true;
	}

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

	function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
		_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
		return true;
	}

	function _transfer(
		address sender,
		address recipient,
		uint256 amount
	) internal virtual {
		require(sender != address(0), "ERC20: transfer from the zero address");
		require(recipient != address(0), "ERC20: transfer to the zero address");
		_beforeTokenTransfer(sender, recipient, amount);
		_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
		_balances[recipient] = _balances[recipient].add(amount);
		emit Transfer(sender, recipient, 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 = _totalSupply.add(amount);
		_balances[account] = _balances[account].add(amount);
		emit Transfer(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);
		_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
		_totalSupply = _totalSupply.sub(amount);
		emit Transfer(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 _beforeTokenTransfer(
		address from,
		address to,
		uint256 amount
	) internal virtual {}
}

contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
	using SafeMath for uint256;
	using SafeMathUint for uint256;
	using SafeMathInt for int256;

	uint256 constant internal magnitude = 2**128;
	uint256 internal magnifiedDividendPerShare;
	uint256 public totalDividendsDistributed;
	address public rewardToken;
	IRouter public uniswapV2Router;

	mapping(address => int256) internal magnifiedDividendCorrections;
	mapping(address => uint256) internal withdrawnDividends;

	constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public override onlyOwner payable {
        require(totalSupply() > 0);
        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add((msg.value).mul(magnitude) / totalSupply());
            emit DividendsDistributed(msg.sender, msg.value);
            totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
        }
    }
    function withdrawDividend() public virtual override onlyOwner {
        _withdrawDividendOfUser(payable(msg.sender));
    }
    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            return swapETHForTokensAndWithdrawDividend(user, _withdrawableDividend);
        }
        return 0;
    }
    function swapETHForTokensAndWithdrawDividend(address holder, uint256 ethAmount) private returns(uint256) {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(rewardToken);

        try uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}(
        0, // accept any amount of tokens
        path,
        address(holder),
        block.timestamp
        ) {
            return ethAmount;
        } catch {
            withdrawnDividends[holder] = withdrawnDividends[holder].sub(ethAmount);
            return 0;
        }
    }
    function dividendOf(address _owner) public view override returns(uint256) {
         return withdrawableDividendOf(_owner);
    }
    function withdrawableDividendOf(address _owner) public view override returns(uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }
    function withdrawnDividendOf(address _owner) public view override returns(uint256) {
        return withdrawnDividends[_owner];
    }
    function accumulativeDividendOf(address _owner) public view override returns(uint256) {
        return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }
    function _transfer(address from, address to, uint256 value) internal virtual override {
        require(false);
        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }
    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }
    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }
    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);
        if(newBalance > currentBalance) {
             uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if(newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
    function _setRewardToken(address token) internal onlyOwner {
        rewardToken = token;
    }
    function _setUniswapRouter(address router) internal onlyOwner {
        uniswapV2Router = IRouter(router);
    }
}

contract BaconToken is ERC20, Ownable {
    IRouter public uniswapV2Router;
    address public immutable uniswapV2Pair;

    string private constant _name = "Bacon Token";
    string private constant _symbol = "BACON";
    uint8 private constant _decimals = 18;

    BACONDividendTracker public dividendTracker;

    bool public isTradingEnabled;

    // initialSupply
    uint256 constant initialSupply = 1000000 * (10**18);

    // max wallet is 2.0% of initialSupply
    uint256 public maxWalletAmount = initialSupply * 200 / 10000;
    // max buy and sell tx is 1.0 % of initialSupply
    uint256 public maxTxAmount = initialSupply * 100 / 10000;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap = initialSupply * 50 / 100000;
    uint256 public gasForProcessing = 300000;

    address public liquidityWallet;
    address public operationsWallet;
    address public buyBackWallet;
    address public treasuryWallet;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 blocksInPeriod;
        uint256 timeInPeriod;
        uint8 liquidityFeeOnBuy;
        uint8 liquidityFeeOnSell;
        uint8 operationsFeeOnBuy;
        uint8 operationsFeeOnSell;
        uint8 buyBackFeeOnBuy;
        uint8 buyBackFeeOnSell;
        uint8 treasuryFeeOnBuy;
        uint8 treasuryFeeOnSell;
        uint8 holdersFeeOnBuy;
        uint8 holdersFeeOnSell;
    }

    // Launch taxes
    bool private _isLaunched;
    uint256 private _launchStartTimestamp;
    uint256 private _launchBlockNumber;

    // Base taxes
    CustomTaxPeriod private _base = CustomTaxPeriod('base',0,0,2,2,3,3,3,3,3,3,4,4);

    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping (address => bool) private _isExcludedFromMaxWalletLimit;
    mapping (address => bool) private _isBlocked;
    mapping (address => bool) private _isAllowedToTradeWhenDisabled;
    mapping (address => bool) private _feeOnSelectedWalletTransfers;
    mapping (address => bool) public automatedMarketMakerPairs;

    uint8 private _liquidityFee;
    uint8 private _operationsFee;
    uint8 private _buyBackFee;
    uint8 private _treasuryFee;
    uint8 private _holdersFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
    event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
    event WalletChange(string indexed indentifier, address indexed newWallet, address indexed oldWallet);
    event FeeChange(string indexed identifier, uint8 liquidityFee, uint8 operationsFee, uint8 buyBackFee, uint8 treasuryFee, uint8 holdersFee);
    event CustomTaxPeriodChange(uint256 indexed newValue, uint256 indexed oldValue, string indexed taxType, bytes23 period);
    event BlockedAccountChange(address indexed holder, bool indexed status);
    event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
    event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendsSent(uint256 tokensSwapped);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived,uint256 tokensIntoLiqudity);
    event FeeOnSelectedWalletTransfersChange(address indexed account, bool newValue);
    event ClaimETHOverflow(uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );
    event FeesApplied(uint8 liquidityFee, uint8 operationsFee, uint8 buyBackFee, uint8 treasuryFee, uint8 holdersFee, uint256 totalFee);

    constructor() ERC20(_name, _symbol) {
        dividendTracker = new BACONDividendTracker();
        dividendTracker.setUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        dividendTracker.setRewardToken(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48));

        liquidityWallet = owner();
        operationsWallet = owner();
        buyBackWallet = owner();
        treasuryWallet = owner();

        IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // Mainnet
        address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(dividendTracker)] = true;

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        _isAllowedToTradeWhenDisabled[owner()] = true;

        _isExcludedFromMaxTransactionLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxTransactionLimit[address(this)] = true;

        _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
        _isExcludedFromMaxWalletLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[owner()] = true;

        _mint(owner(), initialSupply);
    }

    receive() external payable {}

    // Setters
    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
        if(_launchBlockNumber == 0) {
            _launchBlockNumber = block.number;
            _launchStartTimestamp = block.timestamp;
            _isLaunched = true;
        }
    }
    function deactivateTrading() external onlyOwner {
        isTradingEnabled = false;
    }
    function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner {
		_isAllowedToTradeWhenDisabled[account] = allowed;
		emit AllowedWhenTradingDisabledChange(account, allowed);
	}
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "BACON: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit AutomatedMarketMakerPairChange(pair, value);
    }
    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFee[account] != excluded, "BACON: Account is already the value of 'excluded'");
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }
    function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxTransactionLimit[account] != excluded, "BACON: Account is already the value of 'excluded'");
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }
    function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxWalletLimit[account] != excluded, "BACON: Account is already the value of 'excluded'");
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxWalletChange(account, excluded);
    }
    function blockAccount(address account) external onlyOwner {
        require(!_isBlocked[account], "BACON: Account is already blocked");
        if (_isLaunched) {
            require((block.timestamp - _launchStartTimestamp) < 172800, "BACON: Time to block accounts has expired");
        }
        _isBlocked[account] = true;
        emit BlockedAccountChange(account, true);
    }
    function unblockAccount(address account) external onlyOwner {
        require(_isBlocked[account], "BACON: Account is not blocked");
        _isBlocked[account] = false;
        emit BlockedAccountChange(account, false);
    }
    function setFeeOnSelectedWalletTransfers(address account, bool value) external onlyOwner {
		require(_feeOnSelectedWalletTransfers[account] != value, "BACON: The selected wallet is already set to the value ");
		_feeOnSelectedWalletTransfers[account] = value;
		emit FeeOnSelectedWalletTransfersChange(account, value);
	}
    function setWallets(address newLiquidityWallet, address newOperationsWallet, address newBuyBackWallet, address newTreasuryWallet) external onlyOwner {
        if(liquidityWallet != newLiquidityWallet) {
            require(newLiquidityWallet != address(0), "BACON: The liquidityWallet cannot be 0");
            emit WalletChange('liquidityWallet', newLiquidityWallet, liquidityWallet);
            liquidityWallet = newLiquidityWallet;
        }
        if(operationsWallet != newOperationsWallet) {
            require(newOperationsWallet != address(0), "BACON: The operationsWallet cannot be 0");
            emit WalletChange('operationsWallet', newOperationsWallet, operationsWallet);
            operationsWallet = newOperationsWallet;
        }
        if(buyBackWallet != newBuyBackWallet) {
            require(newBuyBackWallet != address(0), "BACON: The buyBackWallet cannot be 0");
            emit WalletChange('buyBackWallet', newBuyBackWallet, buyBackWallet);
            buyBackWallet = newBuyBackWallet;
        }
        if(treasuryWallet != newTreasuryWallet) {
            require(newTreasuryWallet != address(0), "BACON: The treasuryWallet cannot be 0");
            emit WalletChange('treasuryWallet', newTreasuryWallet, treasuryWallet);
            treasuryWallet = newTreasuryWallet;
        }
    }
    // Base fees
    function setBaseFeesOnBuy(uint8 _liquidityFeeOnBuy, uint8 _operationsFeeOnBuy, uint8 _buyBackFeeOnBuy, uint8 _treasuryFeeOnBuy, uint8 _holdersFeeOnBuy) external onlyOwner {
        _setCustomBuyTaxPeriod(_base, _liquidityFeeOnBuy, _operationsFeeOnBuy, _buyBackFeeOnBuy, _treasuryFeeOnBuy, _holdersFeeOnBuy);
        emit FeeChange('baseFees-Buy', _liquidityFeeOnBuy, _operationsFeeOnBuy, _buyBackFeeOnBuy, _treasuryFeeOnBuy, _holdersFeeOnBuy);
    }
    function setBaseFeesOnSell(uint8 _liquidityFeeOnSell,uint8 _operationsFeeOnSell , uint8 _buyBackFeeOnSell, uint8 _treasuryFeeOnSell, uint8 _holdersFeeOnSell) external onlyOwner {
        _setCustomSellTaxPeriod(_base, _liquidityFeeOnSell, _operationsFeeOnSell, _buyBackFeeOnSell, _treasuryFeeOnSell, _holdersFeeOnSell);
        emit FeeChange('baseFees-Sell', _liquidityFeeOnSell, _operationsFeeOnSell, _buyBackFeeOnSell, _treasuryFeeOnSell, _holdersFeeOnSell);
    }
    function setUniswapRouter(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "BACON: The router already has that address");
        emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
        uniswapV2Router = IRouter(newAddress);
        dividendTracker.setUniswapRouter(newAddress);
    }
    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxTxAmount, "BACON: Cannot update maxTxAmount to same value");
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }
    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxWalletAmount, "BACON: Cannot update maxWalletAmount to same value");
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }
    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(newValue != minimumTokensBeforeSwap, "BACON: Cannot update minimumTokensBeforeSwap to same value");
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }
    function setMinimumTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        dividendTracker.setTokenBalanceForDividends(newValue);
    }
    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }
    function claimETHOverflow() external onlyOwner {
        uint256 amount = address(this).balance;
        (bool success,) = address(owner()).call{value : amount}("");
        if (success){
            emit ClaimETHOverflow(amount);
        }
    }

    // Getters
    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }
    function withdrawableDividendOf(address account) public view returns(uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }
    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    function getBaseBuyFees() external view returns (uint8, uint8, uint8, uint8, uint8) {
        return (_base.liquidityFeeOnBuy, _base.operationsFeeOnBuy, _base.buyBackFeeOnBuy, _base.treasuryFeeOnBuy, _base.holdersFeeOnBuy);
    }
    function getBaseSellFees() external view returns (uint8, uint8, uint8, uint8, uint8) {
        return (_base.liquidityFeeOnSell, _base.operationsFeeOnSell, _base.buyBackFeeOnSell, _base.treasuryFeeOnSell, _base.holdersFeeOnSell);
    }

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

        bool isBuyFromLp = automatedMarketMakerPairs[from];
        bool isSelltoLp = automatedMarketMakerPairs[to];

        if(!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) {
            require(isTradingEnabled, "BACON: Trading is currently disabled.");
            require(!_isBlocked[to], "BACON: Account is blocked");
            require(!_isBlocked[from], "BACON: Account is blocked");
            if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) {
                require(amount <= maxTxAmount, "BACON: Buy amount exceeds the maxTxBuyAmount.");
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require((balanceOf(to) + amount) <= maxWalletAmount, "BACON: Expected wallet amount exceeds the maxWalletAmount.");
            }
        }

        _adjustTaxes(isBuyFromLp, isSelltoLp, from , to);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }

        if (takeFee && _totalFee > 0) {
            uint256 fee = amount * _totalFee / 100;
            amount = amount - fee;
            super._transfer(from, address(this), fee);
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!_swapping) {
            uint256 gas = gasForProcessing;
            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {}
        }
    }
    function _adjustTaxes(bool isBuyFromLp, bool isSelltoLp, address from, address to) private {
        _liquidityFee = 0;
        _operationsFee = 0;
        _buyBackFee = 0;
        _treasuryFee = 0;
        _holdersFee = 0;

        if (isBuyFromLp) {
            if (block.number - _launchBlockNumber <= 5) {
                _liquidityFee = 100;
            } else {
                _liquidityFee = _base.liquidityFeeOnBuy;
                _operationsFee = _base.operationsFeeOnBuy;
                _buyBackFee = _base.buyBackFeeOnBuy;
                _treasuryFee = _base.treasuryFeeOnBuy;
                _holdersFee = _base.holdersFeeOnBuy;
            }
        }
        if (isSelltoLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _operationsFee = _base.operationsFeeOnSell;
            _buyBackFee = _base.buyBackFeeOnSell;
            _treasuryFee = _base.treasuryFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        if (!isSelltoLp && !isBuyFromLp && (_feeOnSelectedWalletTransfers[from] || _feeOnSelectedWalletTransfers[to])) {
			_liquidityFee = _base.liquidityFeeOnSell;
            _operationsFee = _base.operationsFeeOnSell;
            _buyBackFee = _base.buyBackFeeOnSell;
            _treasuryFee = _base.treasuryFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
		}
        _totalFee = _liquidityFee + _operationsFee + _buyBackFee + _treasuryFee + _holdersFee;
        emit FeesApplied(_liquidityFee, _operationsFee, _buyBackFee, _treasuryFee, _holdersFee, _totalFee);
    }
    function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnSell,
        uint8 _operationsFeeOnSell,
        uint8 _buyBackFeeOnSell,
        uint8 _treasuryFeeOnSell,
        uint8 _holdersFeeOnSell
        ) private {
        if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
            emit CustomTaxPeriodChange(_liquidityFeeOnSell, map.liquidityFeeOnSell, 'liquidityFeeOnSell', map.periodName);
            map.liquidityFeeOnSell = _liquidityFeeOnSell;
        }
        if (map.operationsFeeOnSell != _operationsFeeOnSell) {
            emit CustomTaxPeriodChange(_operationsFeeOnSell, map.operationsFeeOnSell, 'operationsFeeOnSell', map.periodName);
            map.operationsFeeOnSell = _operationsFeeOnSell;
        }
        if (map.buyBackFeeOnSell != _buyBackFeeOnSell) {
            emit CustomTaxPeriodChange(_buyBackFeeOnSell, map.buyBackFeeOnSell, 'buyBackFeeOnSell', map.periodName);
            map.buyBackFeeOnSell = _buyBackFeeOnSell;
        }
        if (map.treasuryFeeOnSell != _treasuryFeeOnSell) {
            emit CustomTaxPeriodChange(_treasuryFeeOnSell, map.treasuryFeeOnSell, 'treasuryFeeOnSell', map.periodName);
            map.treasuryFeeOnSell = _treasuryFeeOnSell;
        }
        if (map.holdersFeeOnSell != _holdersFeeOnSell) {
            emit CustomTaxPeriodChange(_holdersFeeOnSell, map.holdersFeeOnSell, 'holdersFeeOnSell', map.periodName);
            map.holdersFeeOnSell = _holdersFeeOnSell;
        }
    }
    function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnBuy,
        uint8 _operationsFeeOnBuy,
        uint8 _buyBackFeeOnBuy,
        uint8 _treasuryFeeOnBuy,
        uint8 _holdersFeeOnBuy
        ) private {
        if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
            emit CustomTaxPeriodChange(_liquidityFeeOnBuy, map.liquidityFeeOnBuy, 'liquidityFeeOnBuy', map.periodName);
            map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
        }
        if (map.operationsFeeOnBuy != _operationsFeeOnBuy) {
            emit CustomTaxPeriodChange(_operationsFeeOnBuy, map.operationsFeeOnBuy, 'operationsFeeOnBuy', map.periodName);
            map.operationsFeeOnBuy = _operationsFeeOnBuy;
        }
        if (map.buyBackFeeOnBuy != _buyBackFeeOnBuy) {
            emit CustomTaxPeriodChange(_buyBackFeeOnBuy, map.buyBackFeeOnBuy, 'buyBackFeeOnBuy', map.periodName);
            map.buyBackFeeOnBuy = _buyBackFeeOnBuy;
        }
        if (map.treasuryFeeOnBuy != _treasuryFeeOnBuy) {
            emit CustomTaxPeriodChange(_treasuryFeeOnBuy, map.treasuryFeeOnBuy, 'treasuryFeeOnBuy', map.periodName);
            map.treasuryFeeOnBuy = _treasuryFeeOnBuy;
        }
        if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
            emit CustomTaxPeriodChange(_holdersFeeOnBuy, map.holdersFeeOnBuy, 'holdersFeeOnBuy', map.periodName);
            map.holdersFeeOnBuy = _holdersFeeOnBuy;
        }
    }
    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;
        uint8 _totalFeePrior = _totalFee;

        uint256 amountToLiquify = contractBalance * _liquidityFee / _totalFeePrior / 2;
        uint256 amountToSwap = contractBalance - amountToLiquify;

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFeePrior - (_liquidityFee / 2);
        uint256 amountETHLiquidity = ETHBalanceAfterSwap * _liquidityFee / totalETHFee / 2;
        uint256 amountETHOperations = ETHBalanceAfterSwap * _operationsFee / totalETHFee;
        uint256 amountETHBuyBack = ETHBalanceAfterSwap * _buyBackFee / totalETHFee;
        uint256 amountETHTreasury = ETHBalanceAfterSwap * _treasuryFee / totalETHFee;
        uint256 amountETHHolders = ETHBalanceAfterSwap - (amountETHLiquidity + amountETHOperations + amountETHBuyBack + amountETHTreasury);

        payable(operationsWallet).transfer(amountETHOperations);
        payable(buyBackWallet).transfer(amountETHBuyBack);
        payable(treasuryWallet).transfer(amountETHTreasury);

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity);
            emit SwapAndLiquify(amountToSwap, amountETHLiquidity, amountToLiquify);
        }

        (bool dividendSuccess,) = address(dividendTracker).call{value: amountETHHolders}("");
        if(dividendSuccess) {
            emit DividendsSent(amountETHHolders);
        }

        _totalFee = _totalFeePrior;
    }
    function _swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }
}

contract BACONDividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;

    uint256 public lastProcessedIndex;
    mapping (address => bool) public excludedFromDividends;
    mapping (address => uint256) public lastClaimTimes;
    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() DividendPayingToken("BACON_Dividend_Tracker", "BACON_Dividend_Tracker") {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 0 * (10**18);
    }
    function setRewardToken(address token) external onlyOwner {
        _setRewardToken(token);
    }
    function setUniswapRouter(address router) external onlyOwner {
        _setUniswapRouter(router);
    }
    function _transfer(address, address, uint256) internal override {
        require(false, "BACON_Dividend_Tracker: No transfers allowed");
    }
    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }
    function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        require(minimumTokenBalanceForDividends != newValue, "BACON_Dividend_Tracker: minimumTokenBalanceForDividends already the value of 'newValue'.");
        minimumTokenBalanceForDividends = newValue;
    }
    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }
    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if(lastClaimTime > block.timestamp)  {
            return false;
        }
        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }
    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if(excludedFromDividends[account]) {
            return;
        }
        if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        }
        else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }
        processAccount(account, true);
    }
    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
        if(numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 iterations = 0;
        uint256 claims = 0;

        while(gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;
            if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }
            address account = tokenHoldersMap.keys[_lastProcessedIndex];
            if(canAutoClaim(lastClaimTimes[account])) {
                if(processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;
            uint256 newGasLeft = gasleft();
            if(gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }
            gasLeft = newGasLeft;
        }
        lastProcessedIndex = _lastProcessedIndex;
        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);
        if(amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockedAccountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"DividendsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"treasuryFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"FeeOnSelectedWalletTransfersChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"treasuryFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateTrading","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":"dividendTracker","outputs":[{"internalType":"contract BACONDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","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":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_treasuryFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_treasuryFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeeOnSelectedWalletTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newOperationsWallet","type":"address"},{"internalType":"address","name":"newBuyBackWallet","type":"address"},{"internalType":"address","name":"newTreasuryWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526127106200001e69d3c21bcecceda100000060c862000b4b565b6200002a919062000b6d565b6008556127106200004769d3c21bcecceda1000000606462000b4b565b62000053919062000b6d565b600955620186a06200007169d3c21bcecceda1000000603262000b4b565b6200007d919062000b6d565b600b55620493e0600c55604080516101a081018252636261736560e01b81526000602082018190529181018290526002606082018190526080820152600360a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201526004610160820181905261018090910152601380546001600160c01b031916636261736560981b1790556014556015805469040403030303030302026001600160501b03199091161790553480156200013e57600080fd5b506040518060400160405280600b81526020016a2130b1b7b7102a37b5b2b760a91b815250604051806040016040528060058152602001642120a1a7a760d91b815250816003908162000192919062000c34565b506004620001a1828262000c34565b5050506000620001b66200084160201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604051620002129062000b27565b604051809103906000f0801580156200022f573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b03929092169182179055604051635f54c24f60e11b8152737a250d5630b4cf539739df2c5dacb4c659f2488d600482015263bea9849e90602401600060405180830381600087803b1580156200029a57600080fd5b505af1158015620002af573d6000803e3d6000fd5b5050600754604051638aee812760e01b815273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860048201526001600160a01b039091169250638aee81279150602401600060405180830381600087803b1580156200030d57600080fd5b505af115801562000322573d6000803e3d6000fd5b50505050620003366200084560201b60201c565b600d80546001600160a01b039283166001600160a01b031991821617909155600554600e8054831691909316908117909255600f80548216831790556010805490911690911790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620003d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fa919062000d00565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000448573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200046e919062000d00565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620004bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004e2919062000d00565b600680546001600160a01b0319166001600160a01b0385811691909117909155811660805290506200051681600162000854565b6001601660006200052f6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260169093528183208054851660019081179091556007805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b158015620005c557600080fd5b505af1158015620005da573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200062457600080fd5b505af115801562000639573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620006636005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620006a557600080fd5b505af1158015620006ba573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200070657600080fd5b505af11580156200071b573d6000803e3d6000fd5b505050506001601a6000620007356200084560201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560078054831682526017855283822080548716600190811790915530808452858420805489168317905588851684526018968790528584208054891683179055915484168352848320805488168217905560065490931682528382208054871684179055815291822080549094168117909355620007e96005546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905562000839620008286005546001600160a01b031690565b69d3c21bcecceda1000000620009bc565b505062000d46565b3390565b6005546001600160a01b031690565b6001600160a01b0382166000908152601c602052604090205481151560ff909116151503620008f05760405162461bcd60e51b815260206004820152603f60248201527f4241434f4e3a204175746f6d61746564206d61726b6574206d616b657220706160448201527f697220697320616c72656164792073657420746f20746861742076616c75650060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601c60205260409020805460ff19168215801591909117909155620009805760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200096657600080fd5b505af11580156200097b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a90600090a35050565b6001600160a01b03821662000a145760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620008e7565b62000a308160025462000abd60201b62001fa21790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a6391839062001fa262000abd821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000acc838562000d2b565b90508381101562000b205760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620008e7565b9392505050565b6121638062004b4783390190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000b685762000b6862000b35565b500290565b60008262000b8b57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000bbb57607f821691505b60208210810362000bdc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ab857600081815260208120601f850160051c8101602086101562000c0b5750805b601f850160051c820191505b8181101562000c2c5782815560010162000c17565b505050505050565b81516001600160401b0381111562000c505762000c5062000b90565b62000c688162000c61845462000ba6565b8462000be2565b602080601f83116001811462000ca0576000841562000c875750858301515b600019600386901b1c1916600185901b17855562000c2c565b600085815260208120601f198616915b8281101562000cd15788860151825594840194600190910190840162000cb0565b508582101562000cf05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000d1357600080fd5b81516001600160a01b038116811462000b2057600080fd5b6000821982111562000d415762000d4162000b35565b500190565b608051613de562000d62600039600061056d0152613de56000f3fe6080604052600436106103035760003560e01c8063781edb3c11610190578063aee50b1e116100dc578063d2d7ad8311610095578063dd62ed3e1161006f578063dd62ed3e14610945578063f2fde38b1461098b578063fd72e22a146109ab578063fe017535146109cb57600080fd5b8063d2d7ad83146108ef578063d322157614610905578063d46980161461092557600080fd5b8063aee50b1e146107ce578063b1ba39ea146107ee578063b62496f51461080e578063bea9849e1461083e578063c02466681461085e578063cd43e2281461087e57600080fd5b806395d89b4111610149578063a457c2d711610123578063a457c2d714610758578063a8b9d24014610778578063a9059cbb14610798578063aa4bde28146107b857600080fd5b806395d89b411461070d5780639c1b8af5146107225780639fad96831461073857600080fd5b8063781edb3c146106595780637c0a893d1461067957806383672f3e14610699578063880bcbc1146106b95780638c0b5e22146106d95780638da5cb5b146106ef57600080fd5b806331e79db01161024f5780634d78fdc61161020857806364b0f653116101e257806364b0f653146105e457806366164f6f146105f957806370a082311461060e578063715018a61461064457600080fd5b80634d78fdc61461058f5780634e71d92d146105af5780635ebf4db9146105c457600080fd5b806331e79db0146104c657806334cf1fea146104e657806339509351146104fb57806345a423291461051b5780634626402b1461053b57806349bd5a5e1461055b57600080fd5b80631cd348c0116102bc57806327a14fc21161029657806327a14fc2146104555780632c1f52161461047557806330bb4cff14610495578063313ce567146104aa57600080fd5b80631cd348c0146103f55780631e293c101461041557806323b872dd1461043557600080fd5b8063064a59d01461030f57806306fdde0314610345578063095ea7b3146103675780630bd05b69146103875780631694505e1461039e57806318160ddd146103d657600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5060075461033090600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561035157600080fd5b5061035a610a11565b60405161033c9190613744565b34801561037357600080fd5b506103306103823660046137ae565b610aa3565b34801561039357600080fd5b5061039c610ab9565b005b3480156103aa57600080fd5b506006546103be906001600160a01b031681565b6040516001600160a01b03909116815260200161033c565b3480156103e257600080fd5b506002545b60405190815260200161033c565b34801561040157600080fd5b50600f546103be906001600160a01b031681565b34801561042157600080fd5b5061039c6104303660046137da565b610b27565b34801561044157600080fd5b506103306104503660046137f3565b610bec565b34801561046157600080fd5b5061039c6104703660046137da565b610c55565b34801561048157600080fd5b506007546103be906001600160a01b031681565b3480156104a157600080fd5b506103e7610d1e565b3480156104b657600080fd5b506040516012815260200161033c565b3480156104d257600080fd5b5061039c6104e1366004613834565b610d91565b3480156104f257600080fd5b5061039c610e1e565b34801561050757600080fd5b506103306105163660046137ae565b610e57565b34801561052757600080fd5b5061039c61053636600461385f565b610e8d565b34801561054757600080fd5b506010546103be906001600160a01b031681565b34801561056757600080fd5b506103be7f000000000000000000000000000000000000000000000000000000000000000081565b34801561059b57600080fd5b5061039c6105aa366004613834565b610fad565b3480156105bb57600080fd5b5061039c61108c565b3480156105d057600080fd5b5061039c6105df3660046137da565b611104565b3480156105f057600080fd5b506103e761115f565b34801561060557600080fd5b5061039c6111a9565b34801561061a57600080fd5b506103e7610629366004613834565b6001600160a01b031660009081526020819052604090205490565b34801561065057600080fd5b5061039c611279565b34801561066557600080fd5b5061039c61067436600461385f565b6112ed565b34801561068557600080fd5b5061039c610694366004613834565b6113af565b3480156106a557600080fd5b5061039c6106b4366004613898565b611521565b3480156106c557600080fd5b5061039c6106d436600461385f565b6118d0565b3480156106e557600080fd5b506103e760095481565b3480156106fb57600080fd5b506005546001600160a01b03166103be565b34801561071957600080fd5b5061035a611992565b34801561072e57600080fd5b506103e7600c5481565b34801561074457600080fd5b5061039c61075336600461390a565b6119a1565b34801561076457600080fd5b506103306107733660046137ae565b611a58565b34801561078457600080fd5b506103e7610793366004613834565b611aa7565b3480156107a457600080fd5b506103306107b33660046137ae565b611b1c565b3480156107c457600080fd5b506103e760085481565b3480156107da57600080fd5b5061039c6107e93660046137da565b611b29565b3480156107fa57600080fd5b5061039c61080936600461390a565b611bfd565b34801561081a57600080fd5b50610330610829366004613834565b601c6020526000908152604090205460ff1681565b34801561084a57600080fd5b5061039c610859366004613834565b611c54565b34801561086a57600080fd5b5061039c61087936600461385f565b611d73565b34801561088a57600080fd5b5060155460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a00161033c565b3480156108fb57600080fd5b506103e7600b5481565b34801561091157600080fd5b5061039c61092036600461385f565b611e35565b34801561093157600080fd5b50600d546103be906001600160a01b031681565b34801561095157600080fd5b506103e761096036600461396f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561099757600080fd5b5061039c6109a6366004613834565b611eb7565b3480156109b757600080fd5b50600e546103be906001600160a01b031681565b3480156109d757600080fd5b5060155460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b909104166108bb565b606060038054610a209061399d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c9061399d565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b5050505050905090565b6000610ab0338484612008565b50600192915050565b6005546001600160a01b03163314610aec5760405162461bcd60e51b8152600401610ae3906139d7565b60405180910390fd5b6007805460ff60a01b1916600160a01b179055601254600003610b255743601255426011556010805460ff60a01b1916600160a01b1790555b565b6005546001600160a01b03163314610b515760405162461bcd60e51b8152600401610ae3906139d7565b6009548103610bb95760405162461bcd60e51b815260206004820152602e60248201527f4241434f4e3a2043616e6e6f7420757064617465206d61785478416d6f756e7460448201526d20746f2073616d652076616c756560901b6064820152608401610ae3565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610bf984848461212d565b610c4b8433610c4685604051806060016040528060288152602001613d43602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612800565b612008565b5060019392505050565b6005546001600160a01b03163314610c7f5760405162461bcd60e51b8152600401610ae3906139d7565b6008548103610ceb5760405162461bcd60e51b815260206004820152603260248201527f4241434f4e3a2043616e6e6f7420757064617465206d617857616c6c6574416d6044820152716f756e7420746f2073616d652076616c756560701b6064820152608401610ae3565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8c9190613a0c565b905090565b6005546001600160a01b03163314610dbb5760405162461bcd60e51b8152600401610ae3906139d7565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e0357600080fd5b505af1158015610e17573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610e485760405162461bcd60e51b8152600401610ae3906139d7565b6007805460ff60a01b19169055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ab0918590610c469086611fa2565b6005546001600160a01b03163314610eb75760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b0382166000908152601b602052604090205481151560ff909116151503610f4d5760405162461bcd60e51b815260206004820152603760248201527f4241434f4e3a205468652073656c65637465642077616c6c657420697320616c60448201527f72656164792073657420746f207468652076616c7565200000000000000000006064820152608401610ae3565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6005546001600160a01b03163314610fd75760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03811660009081526019602052604090205460ff1661103f5760405162461bcd60e51b815260206004820152601d60248201527f4241434f4e3a204163636f756e74206973206e6f7420626c6f636b65640000006044820152606401610ae3565b6001600160a01b038116600081815260196020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190613a25565b50565b6005546001600160a01b0316331461112e5760405162461bcd60e51b8152600401610ae3906139d7565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610de9565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610d68573d6000803e3d6000fd5b6005546001600160a01b031633146111d35760405162461bcd60e51b8152600401610ae3906139d7565b4760006111e86005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611232576040519150601f19603f3d011682016040523d82523d6000602084013e611237565b606091505b505090508015611275576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6005546001600160a01b031633146112a35760405162461bcd60e51b8152600401610ae3906139d7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146113175760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03821660009081526018602052604090205481151560ff9091161515036113575760405162461bcd60e51b8152600401610ae390613a42565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e9101610fa1565b6005546001600160a01b031633146113d95760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03811660009081526019602052604090205460ff161561144c5760405162461bcd60e51b815260206004820152602160248201527f4241434f4e3a204163636f756e7420697320616c726561647920626c6f636b656044820152601960fa1b6064820152608401610ae3565b601054600160a01b900460ff16156114cf576202a300601154426114709190613aa9565b106114cf5760405162461bcd60e51b815260206004820152602960248201527f4241434f4e3a2054696d6520746f20626c6f636b206163636f756e74732068616044820152681cc8195e1c1a5c995960ba1b6064820152608401610ae3565b6001600160a01b038116600081815260196020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6005546001600160a01b0316331461154b5760405162461bcd60e51b8152600401610ae3906139d7565b600d546001600160a01b0385811691161461162c576001600160a01b0384166115c55760405162461bcd60e51b815260206004820152602660248201527f4241434f4e3a20546865206c697175696469747957616c6c65742063616e6e6f60448201526507420626520360d41b6064820152608401610ae3565b600d546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691861690600f0160405190819003812090600080516020613d2383398151915290600090a4600d80546001600160a01b0319166001600160a01b0386161790555b600e546001600160a01b0384811691161461170f576001600160a01b0383166116a75760405162461bcd60e51b815260206004820152602760248201527f4241434f4e3a20546865206f7065726174696f6e7357616c6c65742063616e6e60448201526606f7420626520360cc1b6064820152608401610ae3565b600e546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b039182169185169060100160405190819003812090600080516020613d2383398151915290600090a4600e80546001600160a01b0319166001600160a01b0385161790555b600f546001600160a01b038381169116146117eb576001600160a01b0382166117865760405162461bcd60e51b8152602060048201526024808201527f4241434f4e3a20546865206275794261636b57616c6c65742063616e6e6f74206044820152630626520360e41b6064820152608401610ae3565b600f546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691841690600d0160405190819003812090600080516020613d2383398151915290600090a4600f80546001600160a01b0319166001600160a01b0384161790555b6010546001600160a01b038281169116146118ca576001600160a01b0381166118645760405162461bcd60e51b815260206004820152602560248201527f4241434f4e3a2054686520747265617375727957616c6c65742063616e6e6f74604482015264020626520360dc1b6064820152608401610ae3565b6010546040516d1d1c99585cdd5c9e55d85b1b195d60921b81526001600160a01b0391821691831690600e0160405190819003812090600080516020613d2383398151915290600090a4601080546001600160a01b0319166001600160a01b0383161790555b50505050565b6005546001600160a01b031633146118fa5760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03821660009081526017602052604090205481151560ff90911615150361193a5760405162461bcd60e51b8152600401610ae390613a42565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a409101610fa1565b606060048054610a209061399d565b6005546001600160a01b031633146119cb5760405162461bcd60e51b8152600401610ae3906139d7565b6119da6013868686868661283a565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610ab03384610c4685604051806060016040528060258152602001613d8b602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612800565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401602060405180830381865afa158015611af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b169190613a0c565b92915050565b6000610ab033848461212d565b6005546001600160a01b03163314611b535760405162461bcd60e51b8152600401610ae3906139d7565b600b548103611bca5760405162461bcd60e51b815260206004820152603a60248201527f4241434f4e3a2043616e6e6f7420757064617465206d696e696d756d546f6b6560448201527f6e734265666f72655377617020746f2073616d652076616c75650000000000006064820152608401610ae3565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6005546001600160a01b03163314611c275760405162461bcd60e51b8152600401610ae3906139d7565b611c3660138686868686612b24565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d016119f3565b6005546001600160a01b03163314611c7e5760405162461bcd60e51b8152600401610ae3906139d7565b6006546001600160a01b0390811690821603611cef5760405162461bcd60e51b815260206004820152602a60248201527f4241434f4e3a2054686520726f7574657220616c7265616479206861732074686044820152696174206164647265737360b01b6064820152608401610ae3565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610de9565b6005546001600160a01b03163314611d9d5760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03821660009081526016602052604090205481151560ff909116151503611ddd5760405162461bcd60e51b8152600401610ae390613a42565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101610fa1565b6005546001600160a01b03163314611e5f5760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101610fa1565b6005546001600160a01b03163314611ee15760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b038116611f465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae3565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080611faf8385613ac0565b9050838110156120015760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ae3565b9392505050565b6001600160a01b03831661206a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae3565b6001600160a01b0382166120cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ae3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166121535760405162461bcd60e51b8152600401610ae390613ad8565b6001600160a01b0382166121795760405162461bcd60e51b8152600401610ae390613b1d565b806000036121925761218d83836000612e2a565b505050565b6001600160a01b038084166000818152601c6020908152604080832054948716835280832054938352601a90915290205460ff9283169291821691161580156121f457506001600160a01b0384166000908152601a602052604090205460ff16155b1561249a57600754600160a01b900460ff166122605760405162461bcd60e51b815260206004820152602560248201527f4241434f4e3a2054726164696e672069732063757272656e746c792064697361604482015264313632b21760d91b6064820152608401610ae3565b6001600160a01b03841660009081526019602052604090205460ff16156122c55760405162461bcd60e51b8152602060048201526019602482015278109050d3d38e881058d8dbdd5b9d081a5cc8189b1bd8dad959603a1b6044820152606401610ae3565b6001600160a01b03851660009081526019602052604090205460ff161561232a5760405162461bcd60e51b8152602060048201526019602482015278109050d3d38e881058d8dbdd5b9d081a5cc8189b1bd8dad959603a1b6044820152606401610ae3565b6001600160a01b03841660009081526017602052604090205460ff1615801561236c57506001600160a01b03851660009081526017602052604090205460ff16155b156123d9576009548311156123d95760405162461bcd60e51b815260206004820152602d60248201527f4241434f4e3a2042757920616d6f756e74206578636565647320746865206d6160448201526c3c2a3c213abca0b6b7bab73a1760991b6064820152608401610ae3565b6001600160a01b03841660009081526018602052604090205460ff1661249a576008548361241c866001600160a01b031660009081526020819052604090205490565b6124269190613ac0565b111561249a5760405162461bcd60e51b815260206004820152603a60248201527f4241434f4e3a2045787065637465642077616c6c657420616d6f756e7420657860448201527f636565647320746865206d617857616c6c6574416d6f756e742e0000000000006064820152608401610ae3565b6124a682828787612f33565b600b543060009081526020819052604090205460075491111590600160a01b900460ff1680156124d35750805b80156124e25750600a5460ff16155b80156124f95750601d54600160281b900460ff1615155b801561251d57506001600160a01b0385166000908152601c602052604090205460ff165b1561254257600a805460ff1916600117905561253761321c565b600a805460ff191690555b600a5460009060ff161580156125615750600754600160a01b900460ff165b6001600160a01b03881660009081526016602052604090205490915060ff16806125a357506001600160a01b03861660009081526016602052604090205460ff165b156125ac575060005b8080156125c45750601d54600160281b900460ff1615155b1561260b57601d546000906064906125e690600160281b900460ff1688613b60565b6125f09190613b95565b90506125fc8187613aa9565b9550612609883083612e2a565b505b612616878787612e2a565b6007546001600160a01b031663e30443bc88612647816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561268d57600080fd5b505af192505050801561269e575060015b506007546001600160a01b031663e30443bc876126d0816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561271657600080fd5b505af1925050508015612727575060015b50600a5460ff166127f757600c546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af192505050801561279f575060408051601f3d908101601f1916820190925261279c91810190613ba9565b60015b156127f55760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156128245760405162461bcd60e51b8152600401610ae39190613744565b5060006128318486613aa9565b95945050505050565b600286015460ff8681169116146128bb57604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613d6b833981519152916128a19160481b90613bd7565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff85811662010000909204161461295057604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613d6b8339815191529161292f9160481b90613bd7565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b90920416146129e7576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b90920482169291871691600080516020613d6b833981519152916129c39160481b90613bd7565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b9092041614612a81576040516f74726561737572794665654f6e42757960801b815260100160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613d6b83398151915291612a5b9160481b90613bd7565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b9092041614612b1c576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613d6b83398151915291612af49160481b90613bd7565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff8681166101009092041614612bb557604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613d6b83398151915291612b969160481b90613bd7565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff85811663010000009092041614612c4f57604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613d6b83398151915291612c2c9160481b90613bd7565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612ce8576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613d6b83398151915291612cc39160481b90613bd7565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612d8457604051701d1c99585cdd5c9e51995953db94d95b1b607a1b815260110160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613d6b83398151915291612d5d9160481b90613bd7565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b9092041614612b1c576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613d6b83398151915291612df89160481b90613bd7565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b038316612e505760405162461bcd60e51b8152600401610ae390613ad8565b6001600160a01b038216612e765760405162461bcd60e51b8152600401610ae390613b1d565b612eb381604051806060016040528060268152602001613cfd602691396001600160a01b0386166000908152602081905260409020549190612800565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612ee29082611fa2565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612120565b601d805464ffffffffff191690558315612fe257600560125443612f579190613aa9565b11612f6e57601d805460ff19166064179055612fe2565b601554601d805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b821561305d57601554601d805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b82158015613069575083155b80156130af57506001600160a01b0382166000908152601b602052604090205460ff16806130af57506001600160a01b0381166000908152601b602052604090205460ff165b1561312957601554601d805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b601d5460ff600160201b82048116916301000000810482169162010000820481169161315d91610100820481169116613bee565b6131679190613bee565b6131719190613bee565b61317b9190613bee565b601d805460ff928316600160281b90810265ff0000000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401526301000000840485166060820152600160201b840485166080820152920490921660a082015290517f1b109f8899d065450937716d4e83873f097dfbd4fbd268c44dd7bc139d8889639181900360c00190a150505050565b30600090815260208190526040812054601d549091479160ff600160281b8204811692916002918491613250911687613b60565b61325a9190613b95565b6132649190613b95565b905060006132728286613aa9565b905061327d81613545565b60006132898547613aa9565b601d549091506000906132a19060029060ff16613c13565b6132ab9086613c35565b601d5460ff918216925060009160029184916132c8911686613b60565b6132d29190613b95565b6132dc9190613b95565b601d5490915060009083906132f990610100900460ff1686613b60565b6133039190613b95565b601d5490915060009084906133219062010000900460ff1687613b60565b61332b9190613b95565b601d54909150600090859061334a906301000000900460ff1688613b60565b6133549190613b95565b9050600081836133648688613ac0565b61336e9190613ac0565b6133789190613ac0565b6133829088613aa9565b600e546040519192506001600160a01b03169085156108fc029086906000818181858888f193505050501580156133bd573d6000803e3d6000fd5b50600f546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156133f8573d6000803e3d6000fd5b506010546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015613433573d6000803e3d6000fd5b508815613486576134448986613697565b60408051898152602081018790529081018a90527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6007546040516000916001600160a01b03169083908381818185875af1925050503d80600081146134d3576040519150601f19603f3d011682016040523d82523d6000602084013e6134d8565b606091505b505090508015613516576040518281527fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9699060200160405180910390a15b5050601d805460ff909a16600160281b0265ff000000000019909a169990991790985550505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061357a5761357a613c58565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156135d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f79190613c6e565b8160018151811061360a5761360a613c58565b6001600160a01b0392831660209182029290920101526006546136309130911684612008565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613669908590600090869030904290600401613c8b565b600060405180830381600087803b15801561368357600080fd5b505af1158015612b1c573d6000803e3d6000fd5b6006546136af9030906001600160a01b031684612008565b600654600d5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af115801561371f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e179190613ba9565b600060208083528351808285015260005b8181101561377157858101830151858201604001528201613755565b81811115613783576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461110157600080fd5b600080604083850312156137c157600080fd5b82356137cc81613799565b946020939093013593505050565b6000602082840312156137ec57600080fd5b5035919050565b60008060006060848603121561380857600080fd5b833561381381613799565b9250602084013561382381613799565b929592945050506040919091013590565b60006020828403121561384657600080fd5b813561200181613799565b801515811461110157600080fd5b6000806040838503121561387257600080fd5b823561387d81613799565b9150602083013561388d81613851565b809150509250929050565b600080600080608085870312156138ae57600080fd5b84356138b981613799565b935060208501356138c981613799565b925060408501356138d981613799565b915060608501356138e981613799565b939692955090935050565b803560ff8116811461390557600080fd5b919050565b600080600080600060a0868803121561392257600080fd5b61392b866138f4565b9450613939602087016138f4565b9350613947604087016138f4565b9250613955606087016138f4565b9150613963608087016138f4565b90509295509295909350565b6000806040838503121561398257600080fd5b823561398d81613799565b9150602083013561388d81613799565b600181811c908216806139b157607f821691505b6020821081036139d157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613a1e57600080fd5b5051919050565b600060208284031215613a3757600080fd5b815161200181613851565b60208082526031908201527f4241434f4e3a204163636f756e7420697320616c7265616479207468652076616040820152706c7565206f6620276578636c756465642760781b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015613abb57613abb613a93565b500390565b60008219821115613ad357613ad3613a93565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615613b7a57613b7a613a93565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613ba457613ba4613b7f565b500490565b600080600060608486031215613bbe57600080fd5b8351925060208401519150604084015190509250925092565b68ffffffffffffffffff1991909116815260200190565b600060ff821660ff84168060ff03821115613c0b57613c0b613a93565b019392505050565b600060ff831680613c2657613c26613b7f565b8060ff84160491505092915050565b600060ff821660ff841680821015613c4f57613c4f613a93565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613c8057600080fd5b815161200181613799565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613cdb5784516001600160a01b031683529383019391830191600101613cb6565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220abb0fb2a405f7b75e483b2cd1c2649f24c23377b84876700c913a38fcab95d5b64736f6c634300080f003360806040523480156200001157600080fd5b5060408051808201825260168082527f4241434f4e5f4469766964656e645f547261636b6572000000000000000000006020808401829052845180860190955291845290830152908181600362000069838262000197565b50600462000078828262000197565b50505060006200008d620000ee60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060135550600060145562000263565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011d57607f821691505b6020821081036200013e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019257600081815260208120601f850160051c810160208610156200016d5750805b601f850160051c820191505b818110156200018e5782815560010162000179565b5050505b505050565b81516001600160401b03811115620001b357620001b3620000f2565b620001cb81620001c4845462000108565b8462000144565b602080601f831160018114620002035760008415620001ea5750858301515b600019600386901b1c1916600185901b1785556200018e565b600085815260208120601f198616915b82811015620002345788860151825594840194600190910190840162000213565b5085821015620002535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611ef080620002736000396000f3fe6080604052600436106102135760003560e01c8063715018a611610118578063aafd847a116100a0578063dd62ed3e1161006f578063dd62ed3e14610610578063e30443bc14610656578063f2fde38b14610676578063f7c618c114610696578063ffb2c479146106b657600080fd5b8063aafd847a14610584578063bc4c4b37146105ba578063be10b614146105da578063bea9849e146105f057600080fd5b806391b89fba116100e757806391b89fba146104ef57806395d89b411461050f578063a457c2d714610524578063a8b9d24014610544578063a9059cbb1461056457600080fd5b8063715018a61461048657806385a6b3ae1461049b5780638aee8127146104b15780638da5cb5b146104d157600080fd5b806327ce01471161019b578063395093511161016a57806339509351146103d55780634e7b827f146103f55780636a474002146104255780636f2789ec1461043a57806370a082311461045057600080fd5b806327ce0147146103635780633009a60914610383578063313ce5671461039957806331e79db0146103b557600080fd5b8063163c7cef116101e2578063163c7cef146102a95780631694505e146102c957806318160ddd14610301578063226cfa3d1461031657806323b872dd1461034357600080fd5b806303c833021461022757806306fdde031461022f578063095ea7b31461025a57806309bbedde1461028a57600080fd5b36610222576102206106f1565b005b600080fd5b6102206106f1565b34801561023b57600080fd5b506102446107b7565b6040516102519190611aa7565b60405180910390f35b34801561026657600080fd5b5061027a610275366004611b11565b610849565b6040519015158152602001610251565b34801561029657600080fd5b50600c545b604051908152602001610251565b3480156102b557600080fd5b506102206102c4366004611b3d565b610860565b3480156102d557600080fd5b506009546102e9906001600160a01b031681565b6040516001600160a01b039091168152602001610251565b34801561030d57600080fd5b5060025461029b565b34801561032257600080fd5b5061029b610331366004611b56565b60126020526000908152604090205481565b34801561034f57600080fd5b5061027a61035e366004611b73565b61092c565b34801561036f57600080fd5b5061029b61037e366004611b56565b610995565b34801561038f57600080fd5b5061029b60105481565b3480156103a557600080fd5b5060405160128152602001610251565b3480156103c157600080fd5b506102206103d0366004611b56565b6109f1565b3480156103e157600080fd5b5061027a6103f0366004611b11565b610b18565b34801561040157600080fd5b5061027a610410366004611b56565b60116020526000908152604090205460ff1681565b34801561043157600080fd5b50610220610b4e565b34801561044657600080fd5b5061029b60135481565b34801561045c57600080fd5b5061029b61046b366004611b56565b6001600160a01b031660009081526020819052604090205490565b34801561049257600080fd5b50610220610b84565b3480156104a757600080fd5b5061029b60075481565b3480156104bd57600080fd5b506102206104cc366004611b56565b610bf8565b3480156104dd57600080fd5b506005546001600160a01b03166102e9565b3480156104fb57600080fd5b5061029b61050a366004611b56565b610c2b565b34801561051b57600080fd5b50610244610c36565b34801561053057600080fd5b5061027a61053f366004611b11565b610c45565b34801561055057600080fd5b5061029b61055f366004611b56565b610c94565b34801561057057600080fd5b5061027a61057f366004611b11565b610cc0565b34801561059057600080fd5b5061029b61059f366004611b56565b6001600160a01b03166000908152600b602052604090205490565b3480156105c657600080fd5b5061027a6105d5366004611bb4565b610ccd565b3480156105e657600080fd5b5061029b60145481565b3480156105fc57600080fd5b5061022061060b366004611b56565b610d7b565b34801561061c57600080fd5b5061029b61062b366004611bf2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561066257600080fd5b50610220610671366004611b11565b610dae565b34801561068257600080fd5b50610220610691366004611b56565b610f18565b3480156106a257600080fd5b506008546102e9906001600160a01b031681565b3480156106c257600080fd5b506106d66106d1366004611b3d565b611003565b60408051938452602084019290925290820152606001610251565b6005546001600160a01b031633146107245760405162461bcd60e51b815260040161071b90611c20565b60405180910390fd5b600061072f60025490565b1161073957600080fd5b34156107b55761076c61074b60025490565b61075934600160801b611120565b6107639190611c6b565b600654906111a9565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26007546107b190346111a9565b6007555b565b6060600380546107c690611c8d565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290611c8d565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b6000610856338484611208565b5060015b92915050565b6005546001600160a01b0316331461088a5760405162461bcd60e51b815260040161071b90611c20565b80601454036109275760405162461bcd60e51b815260206004820152605860248201527f4241434f4e5f4469766964656e645f547261636b65723a206d696e696d756d5460448201527f6f6b656e42616c616e6365466f724469766964656e647320616c72656164792060648201527f7468652076616c7565206f6620276e657756616c7565272e0000000000000000608482015260a40161071b565b601455565b600061093984848461132c565b61098b843361098685604051806060016040528060288152602001611e6e602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611389565b611208565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926109e7926109e2926109dc916109d79190611120565b6113c3565b906113d3565b611411565b61085a9190611c6b565b6005546001600160a01b03163314610a1b5760405162461bcd60e51b815260040161071b90611c20565b6001600160a01b03811660009081526011602052604090205460ff1615610a4157600080fd5b6001600160a01b0381166000908152601160205260408120805460ff19166001179055610a6f908290611424565b60405163131836e760e21b8152600c60048201526001600160a01b0382166024820152736f80dd565e84018c75c06b0ab086642638d9660790634c60db9c9060440160006040518083038186803b158015610ac957600080fd5b505af4158015610add573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161085691859061098690866111a9565b6005546001600160a01b03163314610b785760405162461bcd60e51b815260040161071b90611c20565b610b8133611489565b50565b6005546001600160a01b03163314610bae5760405162461bcd60e51b815260040161071b90611c20565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610c225760405162461bcd60e51b815260040161071b90611c20565b610b818161152a565b600061085a82610c94565b6060600480546107c690611c8d565b6000610856338461098685604051806060016040528060258152602001611e96602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611389565b6001600160a01b0381166000908152600b602052604081205461085a90610cba84610995565b90611576565b600061085633848461132c565b6005546000906001600160a01b03163314610cfa5760405162461bcd60e51b815260040161071b90611c20565b6000610d0584611489565b90508015610d71576001600160a01b038416600081815260126020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610d5f9085815260200190565b60405180910390a3600191505061085a565b5060009392505050565b6005546001600160a01b03163314610da55760405162461bcd60e51b815260040161071b90611c20565b610b81816115b8565b6005546001600160a01b03163314610dd85760405162461bcd60e51b815260040161071b90611c20565b6001600160a01b03821660009081526011602052604090205460ff16610f14576014548110610e8957610e0b8282611424565b604051632f0ad01760e21b8152600c60048201526001600160a01b038316602482015260448101829052736f80dd565e84018c75c06b0ab086642638d966079063bc2b405c9060640160006040518083038186803b158015610e6c57600080fd5b505af4158015610e80573d6000803e3d6000fd5b50505050610f07565b610e94826000611424565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152736f80dd565e84018c75c06b0ab086642638d9660790634c60db9c9060440160006040518083038186803b158015610eee57600080fd5b505af4158015610f02573d6000803e3d6000fd5b505050505b610f12826001610ccd565b505b5050565b6005546001600160a01b03163314610f425760405162461bcd60e51b815260040161071b90611c20565b6001600160a01b038116610fa75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071b565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600c546000908190819080820361102557505060105460009250829150611119565b6010546000805a90506000805b898410801561104057508582105b15611108578461104f81611cc7565b600c549096508610905061106257600094505b6000600c600001868154811061107a5761107a611ce0565b60009182526020808320909101546001600160a01b031680835260129091526040909120549091506110ab90611604565b156110ce576110bb816001610ccd565b156110ce57816110ca81611cc7565b9250505b826110d881611cc7565b93505060005a9050808511156110ff576110fc6110f58683611576565b87906111a9565b95505b93506110329050565b601085905590975095509193505050505b9193909250565b6000826000036111325750600061085a565b600061113e8385611cf6565b90508261114b8583611c6b565b146111a25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161071b565b9392505050565b6000806111b68385611d15565b9050838110156111a25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161071b565b6001600160a01b03831661126a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161071b565b6001600160a01b0382166112cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161071b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602c60248201527f4241434f4e5f4469766964656e645f547261636b65723a204e6f207472616e7360448201526b19995c9cc8185b1b1bddd95960a21b606482015260840161071b565b600081848411156113ad5760405162461bcd60e51b815260040161071b9190611aa7565b5060006113ba8486611d2d565b95945050505050565b6000818181121561085a57600080fd5b6000806113e08385611d44565b9050600083121580156113f35750838112155b80611408575060008312801561140857508381125b6111a257600080fd5b60008082121561142057600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156114635760006114518383611576565b905061145d848261162b565b50610f12565b80821015610f125760006114778284611576565b9050611483848261168f565b50505050565b60008061149583610c94565b90508015611521576001600160a01b0383166000908152600b60205260409020546114c090826111a9565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061150f9084815260200190565b60405180910390a26111a283826116d3565b50600092915050565b6005546001600160a01b031633146115545760405162461bcd60e51b815260040161071b90611c20565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006111a283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611389565b6005546001600160a01b031633146115e25760405162461bcd60e51b815260040161071b90611c20565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60004282111561161657506000919050565b6013546116234284611576565b101592915050565b611635828261186f565b61166f6116506109d78360065461112090919063ffffffff16565b6001600160a01b0384166000908152600a60205260409020549061195a565b6001600160a01b039092166000908152600a602052604090209190915550565b6116998282611997565b61166f6116b46109d78360065461112090919063ffffffff16565b6001600160a01b0384166000908152600a6020526040902054906113d3565b604080516002808252606082018352600092839291906020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117659190611d85565b8160008151811061177857611778611ce0565b6001600160a01b0392831660209182029290920101526008548251911690829060019081106117a9576117a9611ce0565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de959085906117ef9060009086908a904290600401611da2565b6000604051808303818588803b15801561180857600080fd5b505af19350505050801561181a575060015b611866576001600160a01b0384166000908152600b60205260409020546118419084611576565b6001600160a01b0385166000908152600b6020526040812091909155915061085a9050565b8291505061085a565b6001600160a01b0382166118c55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161071b565b6118d160008383610f12565b6002546118de90826111a9565b6002556001600160a01b03821660009081526020819052604090205461190490826111a9565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806119678385611e0c565b90506000831215801561197a5750838113155b80611408575060008312801561140857508381136111a257600080fd5b6001600160a01b0382166119f75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161071b565b611a0382600083610f12565b611a4081604051806060016040528060228152602001611e4c602291396001600160a01b0385166000908152602081905260409020549190611389565b6001600160a01b038316600090815260208190526040902055600254611a669082611576565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161194e565b600060208083528351808285015260005b81811015611ad457858101830151858201604001528201611ab8565b81811115611ae6576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610b8157600080fd5b60008060408385031215611b2457600080fd5b8235611b2f81611afc565b946020939093013593505050565b600060208284031215611b4f57600080fd5b5035919050565b600060208284031215611b6857600080fd5b81356111a281611afc565b600080600060608486031215611b8857600080fd5b8335611b9381611afc565b92506020840135611ba381611afc565b929592945050506040919091013590565b60008060408385031215611bc757600080fd5b8235611bd281611afc565b915060208301358015158114611be757600080fd5b809150509250929050565b60008060408385031215611c0557600080fd5b8235611c1081611afc565b91506020830135611be781611afc565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082611c8857634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680611ca157607f821691505b602082108103611cc157634e487b7160e01b600052602260045260246000fd5b50919050565b600060018201611cd957611cd9611c55565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615611d1057611d10611c55565b500290565b60008219821115611d2857611d28611c55565b500190565b600082821015611d3f57611d3f611c55565b500390565b600080821280156001600160ff1b0384900385131615611d6657611d66611c55565b600160ff1b8390038412811615611d7f57611d7f611c55565b50500190565b600060208284031215611d9757600080fd5b81516111a281611afc565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611dec5784516001600160a01b031683529383019391830191600101611dc7565b50506001600160a01b039690961660408501525050506060015292915050565b60008083128015600160ff1b850184121615611e2a57611e2a611c55565b6001600160ff1b0384018313811615611e4557611e45611c55565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b7f656c75e8f1215f564a09428912f1e4e216da1fb7967840922c9695cf2be1a64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106103035760003560e01c8063781edb3c11610190578063aee50b1e116100dc578063d2d7ad8311610095578063dd62ed3e1161006f578063dd62ed3e14610945578063f2fde38b1461098b578063fd72e22a146109ab578063fe017535146109cb57600080fd5b8063d2d7ad83146108ef578063d322157614610905578063d46980161461092557600080fd5b8063aee50b1e146107ce578063b1ba39ea146107ee578063b62496f51461080e578063bea9849e1461083e578063c02466681461085e578063cd43e2281461087e57600080fd5b806395d89b4111610149578063a457c2d711610123578063a457c2d714610758578063a8b9d24014610778578063a9059cbb14610798578063aa4bde28146107b857600080fd5b806395d89b411461070d5780639c1b8af5146107225780639fad96831461073857600080fd5b8063781edb3c146106595780637c0a893d1461067957806383672f3e14610699578063880bcbc1146106b95780638c0b5e22146106d95780638da5cb5b146106ef57600080fd5b806331e79db01161024f5780634d78fdc61161020857806364b0f653116101e257806364b0f653146105e457806366164f6f146105f957806370a082311461060e578063715018a61461064457600080fd5b80634d78fdc61461058f5780634e71d92d146105af5780635ebf4db9146105c457600080fd5b806331e79db0146104c657806334cf1fea146104e657806339509351146104fb57806345a423291461051b5780634626402b1461053b57806349bd5a5e1461055b57600080fd5b80631cd348c0116102bc57806327a14fc21161029657806327a14fc2146104555780632c1f52161461047557806330bb4cff14610495578063313ce567146104aa57600080fd5b80631cd348c0146103f55780631e293c101461041557806323b872dd1461043557600080fd5b8063064a59d01461030f57806306fdde0314610345578063095ea7b3146103675780630bd05b69146103875780631694505e1461039e57806318160ddd146103d657600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5060075461033090600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561035157600080fd5b5061035a610a11565b60405161033c9190613744565b34801561037357600080fd5b506103306103823660046137ae565b610aa3565b34801561039357600080fd5b5061039c610ab9565b005b3480156103aa57600080fd5b506006546103be906001600160a01b031681565b6040516001600160a01b03909116815260200161033c565b3480156103e257600080fd5b506002545b60405190815260200161033c565b34801561040157600080fd5b50600f546103be906001600160a01b031681565b34801561042157600080fd5b5061039c6104303660046137da565b610b27565b34801561044157600080fd5b506103306104503660046137f3565b610bec565b34801561046157600080fd5b5061039c6104703660046137da565b610c55565b34801561048157600080fd5b506007546103be906001600160a01b031681565b3480156104a157600080fd5b506103e7610d1e565b3480156104b657600080fd5b506040516012815260200161033c565b3480156104d257600080fd5b5061039c6104e1366004613834565b610d91565b3480156104f257600080fd5b5061039c610e1e565b34801561050757600080fd5b506103306105163660046137ae565b610e57565b34801561052757600080fd5b5061039c61053636600461385f565b610e8d565b34801561054757600080fd5b506010546103be906001600160a01b031681565b34801561056757600080fd5b506103be7f00000000000000000000000097463c4d0df3c41af63fb3d297a8b7f5d67e6e3881565b34801561059b57600080fd5b5061039c6105aa366004613834565b610fad565b3480156105bb57600080fd5b5061039c61108c565b3480156105d057600080fd5b5061039c6105df3660046137da565b611104565b3480156105f057600080fd5b506103e761115f565b34801561060557600080fd5b5061039c6111a9565b34801561061a57600080fd5b506103e7610629366004613834565b6001600160a01b031660009081526020819052604090205490565b34801561065057600080fd5b5061039c611279565b34801561066557600080fd5b5061039c61067436600461385f565b6112ed565b34801561068557600080fd5b5061039c610694366004613834565b6113af565b3480156106a557600080fd5b5061039c6106b4366004613898565b611521565b3480156106c557600080fd5b5061039c6106d436600461385f565b6118d0565b3480156106e557600080fd5b506103e760095481565b3480156106fb57600080fd5b506005546001600160a01b03166103be565b34801561071957600080fd5b5061035a611992565b34801561072e57600080fd5b506103e7600c5481565b34801561074457600080fd5b5061039c61075336600461390a565b6119a1565b34801561076457600080fd5b506103306107733660046137ae565b611a58565b34801561078457600080fd5b506103e7610793366004613834565b611aa7565b3480156107a457600080fd5b506103306107b33660046137ae565b611b1c565b3480156107c457600080fd5b506103e760085481565b3480156107da57600080fd5b5061039c6107e93660046137da565b611b29565b3480156107fa57600080fd5b5061039c61080936600461390a565b611bfd565b34801561081a57600080fd5b50610330610829366004613834565b601c6020526000908152604090205460ff1681565b34801561084a57600080fd5b5061039c610859366004613834565b611c54565b34801561086a57600080fd5b5061039c61087936600461385f565b611d73565b34801561088a57600080fd5b5060155460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a00161033c565b3480156108fb57600080fd5b506103e7600b5481565b34801561091157600080fd5b5061039c61092036600461385f565b611e35565b34801561093157600080fd5b50600d546103be906001600160a01b031681565b34801561095157600080fd5b506103e761096036600461396f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561099757600080fd5b5061039c6109a6366004613834565b611eb7565b3480156109b757600080fd5b50600e546103be906001600160a01b031681565b3480156109d757600080fd5b5060155460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b909104166108bb565b606060038054610a209061399d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c9061399d565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b5050505050905090565b6000610ab0338484612008565b50600192915050565b6005546001600160a01b03163314610aec5760405162461bcd60e51b8152600401610ae3906139d7565b60405180910390fd5b6007805460ff60a01b1916600160a01b179055601254600003610b255743601255426011556010805460ff60a01b1916600160a01b1790555b565b6005546001600160a01b03163314610b515760405162461bcd60e51b8152600401610ae3906139d7565b6009548103610bb95760405162461bcd60e51b815260206004820152602e60248201527f4241434f4e3a2043616e6e6f7420757064617465206d61785478416d6f756e7460448201526d20746f2073616d652076616c756560901b6064820152608401610ae3565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610bf984848461212d565b610c4b8433610c4685604051806060016040528060288152602001613d43602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612800565b612008565b5060019392505050565b6005546001600160a01b03163314610c7f5760405162461bcd60e51b8152600401610ae3906139d7565b6008548103610ceb5760405162461bcd60e51b815260206004820152603260248201527f4241434f4e3a2043616e6e6f7420757064617465206d617857616c6c6574416d6044820152716f756e7420746f2073616d652076616c756560701b6064820152608401610ae3565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8c9190613a0c565b905090565b6005546001600160a01b03163314610dbb5760405162461bcd60e51b8152600401610ae3906139d7565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e0357600080fd5b505af1158015610e17573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610e485760405162461bcd60e51b8152600401610ae3906139d7565b6007805460ff60a01b19169055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ab0918590610c469086611fa2565b6005546001600160a01b03163314610eb75760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b0382166000908152601b602052604090205481151560ff909116151503610f4d5760405162461bcd60e51b815260206004820152603760248201527f4241434f4e3a205468652073656c65637465642077616c6c657420697320616c60448201527f72656164792073657420746f207468652076616c7565200000000000000000006064820152608401610ae3565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6005546001600160a01b03163314610fd75760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03811660009081526019602052604090205460ff1661103f5760405162461bcd60e51b815260206004820152601d60248201527f4241434f4e3a204163636f756e74206973206e6f7420626c6f636b65640000006044820152606401610ae3565b6001600160a01b038116600081815260196020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190613a25565b50565b6005546001600160a01b0316331461112e5760405162461bcd60e51b8152600401610ae3906139d7565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610de9565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610d68573d6000803e3d6000fd5b6005546001600160a01b031633146111d35760405162461bcd60e51b8152600401610ae3906139d7565b4760006111e86005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611232576040519150601f19603f3d011682016040523d82523d6000602084013e611237565b606091505b505090508015611275576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6005546001600160a01b031633146112a35760405162461bcd60e51b8152600401610ae3906139d7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146113175760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03821660009081526018602052604090205481151560ff9091161515036113575760405162461bcd60e51b8152600401610ae390613a42565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e9101610fa1565b6005546001600160a01b031633146113d95760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03811660009081526019602052604090205460ff161561144c5760405162461bcd60e51b815260206004820152602160248201527f4241434f4e3a204163636f756e7420697320616c726561647920626c6f636b656044820152601960fa1b6064820152608401610ae3565b601054600160a01b900460ff16156114cf576202a300601154426114709190613aa9565b106114cf5760405162461bcd60e51b815260206004820152602960248201527f4241434f4e3a2054696d6520746f20626c6f636b206163636f756e74732068616044820152681cc8195e1c1a5c995960ba1b6064820152608401610ae3565b6001600160a01b038116600081815260196020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6005546001600160a01b0316331461154b5760405162461bcd60e51b8152600401610ae3906139d7565b600d546001600160a01b0385811691161461162c576001600160a01b0384166115c55760405162461bcd60e51b815260206004820152602660248201527f4241434f4e3a20546865206c697175696469747957616c6c65742063616e6e6f60448201526507420626520360d41b6064820152608401610ae3565b600d546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691861690600f0160405190819003812090600080516020613d2383398151915290600090a4600d80546001600160a01b0319166001600160a01b0386161790555b600e546001600160a01b0384811691161461170f576001600160a01b0383166116a75760405162461bcd60e51b815260206004820152602760248201527f4241434f4e3a20546865206f7065726174696f6e7357616c6c65742063616e6e60448201526606f7420626520360cc1b6064820152608401610ae3565b600e546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b039182169185169060100160405190819003812090600080516020613d2383398151915290600090a4600e80546001600160a01b0319166001600160a01b0385161790555b600f546001600160a01b038381169116146117eb576001600160a01b0382166117865760405162461bcd60e51b8152602060048201526024808201527f4241434f4e3a20546865206275794261636b57616c6c65742063616e6e6f74206044820152630626520360e41b6064820152608401610ae3565b600f546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691841690600d0160405190819003812090600080516020613d2383398151915290600090a4600f80546001600160a01b0319166001600160a01b0384161790555b6010546001600160a01b038281169116146118ca576001600160a01b0381166118645760405162461bcd60e51b815260206004820152602560248201527f4241434f4e3a2054686520747265617375727957616c6c65742063616e6e6f74604482015264020626520360dc1b6064820152608401610ae3565b6010546040516d1d1c99585cdd5c9e55d85b1b195d60921b81526001600160a01b0391821691831690600e0160405190819003812090600080516020613d2383398151915290600090a4601080546001600160a01b0319166001600160a01b0383161790555b50505050565b6005546001600160a01b031633146118fa5760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03821660009081526017602052604090205481151560ff90911615150361193a5760405162461bcd60e51b8152600401610ae390613a42565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a409101610fa1565b606060048054610a209061399d565b6005546001600160a01b031633146119cb5760405162461bcd60e51b8152600401610ae3906139d7565b6119da6013868686868661283a565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610ab03384610c4685604051806060016040528060258152602001613d8b602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612800565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401602060405180830381865afa158015611af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b169190613a0c565b92915050565b6000610ab033848461212d565b6005546001600160a01b03163314611b535760405162461bcd60e51b8152600401610ae3906139d7565b600b548103611bca5760405162461bcd60e51b815260206004820152603a60248201527f4241434f4e3a2043616e6e6f7420757064617465206d696e696d756d546f6b6560448201527f6e734265666f72655377617020746f2073616d652076616c75650000000000006064820152608401610ae3565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6005546001600160a01b03163314611c275760405162461bcd60e51b8152600401610ae3906139d7565b611c3660138686868686612b24565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d016119f3565b6005546001600160a01b03163314611c7e5760405162461bcd60e51b8152600401610ae3906139d7565b6006546001600160a01b0390811690821603611cef5760405162461bcd60e51b815260206004820152602a60248201527f4241434f4e3a2054686520726f7574657220616c7265616479206861732074686044820152696174206164647265737360b01b6064820152608401610ae3565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610de9565b6005546001600160a01b03163314611d9d5760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b03821660009081526016602052604090205481151560ff909116151503611ddd5760405162461bcd60e51b8152600401610ae390613a42565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101610fa1565b6005546001600160a01b03163314611e5f5760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101610fa1565b6005546001600160a01b03163314611ee15760405162461bcd60e51b8152600401610ae3906139d7565b6001600160a01b038116611f465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae3565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080611faf8385613ac0565b9050838110156120015760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ae3565b9392505050565b6001600160a01b03831661206a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ae3565b6001600160a01b0382166120cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ae3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166121535760405162461bcd60e51b8152600401610ae390613ad8565b6001600160a01b0382166121795760405162461bcd60e51b8152600401610ae390613b1d565b806000036121925761218d83836000612e2a565b505050565b6001600160a01b038084166000818152601c6020908152604080832054948716835280832054938352601a90915290205460ff9283169291821691161580156121f457506001600160a01b0384166000908152601a602052604090205460ff16155b1561249a57600754600160a01b900460ff166122605760405162461bcd60e51b815260206004820152602560248201527f4241434f4e3a2054726164696e672069732063757272656e746c792064697361604482015264313632b21760d91b6064820152608401610ae3565b6001600160a01b03841660009081526019602052604090205460ff16156122c55760405162461bcd60e51b8152602060048201526019602482015278109050d3d38e881058d8dbdd5b9d081a5cc8189b1bd8dad959603a1b6044820152606401610ae3565b6001600160a01b03851660009081526019602052604090205460ff161561232a5760405162461bcd60e51b8152602060048201526019602482015278109050d3d38e881058d8dbdd5b9d081a5cc8189b1bd8dad959603a1b6044820152606401610ae3565b6001600160a01b03841660009081526017602052604090205460ff1615801561236c57506001600160a01b03851660009081526017602052604090205460ff16155b156123d9576009548311156123d95760405162461bcd60e51b815260206004820152602d60248201527f4241434f4e3a2042757920616d6f756e74206578636565647320746865206d6160448201526c3c2a3c213abca0b6b7bab73a1760991b6064820152608401610ae3565b6001600160a01b03841660009081526018602052604090205460ff1661249a576008548361241c866001600160a01b031660009081526020819052604090205490565b6124269190613ac0565b111561249a5760405162461bcd60e51b815260206004820152603a60248201527f4241434f4e3a2045787065637465642077616c6c657420616d6f756e7420657860448201527f636565647320746865206d617857616c6c6574416d6f756e742e0000000000006064820152608401610ae3565b6124a682828787612f33565b600b543060009081526020819052604090205460075491111590600160a01b900460ff1680156124d35750805b80156124e25750600a5460ff16155b80156124f95750601d54600160281b900460ff1615155b801561251d57506001600160a01b0385166000908152601c602052604090205460ff165b1561254257600a805460ff1916600117905561253761321c565b600a805460ff191690555b600a5460009060ff161580156125615750600754600160a01b900460ff165b6001600160a01b03881660009081526016602052604090205490915060ff16806125a357506001600160a01b03861660009081526016602052604090205460ff165b156125ac575060005b8080156125c45750601d54600160281b900460ff1615155b1561260b57601d546000906064906125e690600160281b900460ff1688613b60565b6125f09190613b95565b90506125fc8187613aa9565b9550612609883083612e2a565b505b612616878787612e2a565b6007546001600160a01b031663e30443bc88612647816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561268d57600080fd5b505af192505050801561269e575060015b506007546001600160a01b031663e30443bc876126d0816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561271657600080fd5b505af1925050508015612727575060015b50600a5460ff166127f757600c546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af192505050801561279f575060408051601f3d908101601f1916820190925261279c91810190613ba9565b60015b156127f55760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156128245760405162461bcd60e51b8152600401610ae39190613744565b5060006128318486613aa9565b95945050505050565b600286015460ff8681169116146128bb57604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613d6b833981519152916128a19160481b90613bd7565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff85811662010000909204161461295057604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613d6b8339815191529161292f9160481b90613bd7565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b90920416146129e7576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b90920482169291871691600080516020613d6b833981519152916129c39160481b90613bd7565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b9092041614612a81576040516f74726561737572794665654f6e42757960801b815260100160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613d6b83398151915291612a5b9160481b90613bd7565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b9092041614612b1c576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613d6b83398151915291612af49160481b90613bd7565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff8681166101009092041614612bb557604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613d6b83398151915291612b969160481b90613bd7565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff85811663010000009092041614612c4f57604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613d6b83398151915291612c2c9160481b90613bd7565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612ce8576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613d6b83398151915291612cc39160481b90613bd7565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612d8457604051701d1c99585cdd5c9e51995953db94d95b1b607a1b815260110160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613d6b83398151915291612d5d9160481b90613bd7565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b9092041614612b1c576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613d6b83398151915291612df89160481b90613bd7565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b038316612e505760405162461bcd60e51b8152600401610ae390613ad8565b6001600160a01b038216612e765760405162461bcd60e51b8152600401610ae390613b1d565b612eb381604051806060016040528060268152602001613cfd602691396001600160a01b0386166000908152602081905260409020549190612800565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612ee29082611fa2565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612120565b601d805464ffffffffff191690558315612fe257600560125443612f579190613aa9565b11612f6e57601d805460ff19166064179055612fe2565b601554601d805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b821561305d57601554601d805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b82158015613069575083155b80156130af57506001600160a01b0382166000908152601b602052604090205460ff16806130af57506001600160a01b0381166000908152601b602052604090205460ff165b1561312957601554601d805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b601d5460ff600160201b82048116916301000000810482169162010000820481169161315d91610100820481169116613bee565b6131679190613bee565b6131719190613bee565b61317b9190613bee565b601d805460ff928316600160281b90810265ff0000000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401526301000000840485166060820152600160201b840485166080820152920490921660a082015290517f1b109f8899d065450937716d4e83873f097dfbd4fbd268c44dd7bc139d8889639181900360c00190a150505050565b30600090815260208190526040812054601d549091479160ff600160281b8204811692916002918491613250911687613b60565b61325a9190613b95565b6132649190613b95565b905060006132728286613aa9565b905061327d81613545565b60006132898547613aa9565b601d549091506000906132a19060029060ff16613c13565b6132ab9086613c35565b601d5460ff918216925060009160029184916132c8911686613b60565b6132d29190613b95565b6132dc9190613b95565b601d5490915060009083906132f990610100900460ff1686613b60565b6133039190613b95565b601d5490915060009084906133219062010000900460ff1687613b60565b61332b9190613b95565b601d54909150600090859061334a906301000000900460ff1688613b60565b6133549190613b95565b9050600081836133648688613ac0565b61336e9190613ac0565b6133789190613ac0565b6133829088613aa9565b600e546040519192506001600160a01b03169085156108fc029086906000818181858888f193505050501580156133bd573d6000803e3d6000fd5b50600f546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156133f8573d6000803e3d6000fd5b506010546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015613433573d6000803e3d6000fd5b508815613486576134448986613697565b60408051898152602081018790529081018a90527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b6007546040516000916001600160a01b03169083908381818185875af1925050503d80600081146134d3576040519150601f19603f3d011682016040523d82523d6000602084013e6134d8565b606091505b505090508015613516576040518281527fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9699060200160405180910390a15b5050601d805460ff909a16600160281b0265ff000000000019909a169990991790985550505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061357a5761357a613c58565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156135d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f79190613c6e565b8160018151811061360a5761360a613c58565b6001600160a01b0392831660209182029290920101526006546136309130911684612008565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613669908590600090869030904290600401613c8b565b600060405180830381600087803b15801561368357600080fd5b505af1158015612b1c573d6000803e3d6000fd5b6006546136af9030906001600160a01b031684612008565b600654600d5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af115801561371f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e179190613ba9565b600060208083528351808285015260005b8181101561377157858101830151858201604001528201613755565b81811115613783576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461110157600080fd5b600080604083850312156137c157600080fd5b82356137cc81613799565b946020939093013593505050565b6000602082840312156137ec57600080fd5b5035919050565b60008060006060848603121561380857600080fd5b833561381381613799565b9250602084013561382381613799565b929592945050506040919091013590565b60006020828403121561384657600080fd5b813561200181613799565b801515811461110157600080fd5b6000806040838503121561387257600080fd5b823561387d81613799565b9150602083013561388d81613851565b809150509250929050565b600080600080608085870312156138ae57600080fd5b84356138b981613799565b935060208501356138c981613799565b925060408501356138d981613799565b915060608501356138e981613799565b939692955090935050565b803560ff8116811461390557600080fd5b919050565b600080600080600060a0868803121561392257600080fd5b61392b866138f4565b9450613939602087016138f4565b9350613947604087016138f4565b9250613955606087016138f4565b9150613963608087016138f4565b90509295509295909350565b6000806040838503121561398257600080fd5b823561398d81613799565b9150602083013561388d81613799565b600181811c908216806139b157607f821691505b6020821081036139d157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613a1e57600080fd5b5051919050565b600060208284031215613a3757600080fd5b815161200181613851565b60208082526031908201527f4241434f4e3a204163636f756e7420697320616c7265616479207468652076616040820152706c7565206f6620276578636c756465642760781b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015613abb57613abb613a93565b500390565b60008219821115613ad357613ad3613a93565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615613b7a57613b7a613a93565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613ba457613ba4613b7f565b500490565b600080600060608486031215613bbe57600080fd5b8351925060208401519150604084015190509250925092565b68ffffffffffffffffff1991909116815260200190565b600060ff821660ff84168060ff03821115613c0b57613c0b613a93565b019392505050565b600060ff831680613c2657613c26613b7f565b8060ff84160491505092915050565b600060ff821660ff841680821015613c4f57613c4f613a93565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613c8057600080fd5b815161200181613799565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613cdb5784516001600160a01b031683529383019391830191600101613cb6565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220abb0fb2a405f7b75e483b2cd1c2649f24c23377b84876700c913a38fcab95d5b64736f6c634300080f0033

Libraries Used


Deployed Bytecode Sourcemap

16789:24051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17116:28;;;;;;;;;;-1:-1:-1;17116:28:0;;;;-1:-1:-1;;;17116:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;17116:28:0;;;;;;;;8575:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9399:154::-;;;;;;;;;;-1:-1:-1;9399:154:0;;;;;:::i;:::-;;:::i;22874:273::-;;;;;;;;;;;;;:::i;:::-;;16834:30;;;;;;;;;;-1:-1:-1;16834:30:0;;;;-1:-1:-1;;;;;16834:30:0;;;;;;-1:-1:-1;;;;;1442:32:1;;;1424:51;;1412:2;1397:18;16834:30:0;1264:217:1;8860:99:0;;;;;;;;;;-1:-1:-1;8942:12:0;;8860:99;;;1632:25:1;;;1620:2;1605:18;8860:99:0;1486:177:1;17693:28:0;;;;;;;;;;-1:-1:-1;17693:28:0;;;;-1:-1:-1;;;;;17693:28:0;;;28641:269;;;;;;;;;;-1:-1:-1;28641:269:0;;;;;:::i;:::-;;:::i;9558:313::-;;;;;;;;;;-1:-1:-1;9558:313:0;;;;;:::i;:::-;;:::i;28916:275::-;;;;;;;;;;-1:-1:-1;28916:275:0;;;;;:::i;:::-;;:::i;17064:43::-;;;;;;;;;;-1:-1:-1;17064:43:0;;;;-1:-1:-1;;;;;17064:43:0;;;30071:141;;;;;;;;;;;;;:::i;8771:84::-;;;;;;;;;;-1:-1:-1;8771:84:0;;8848:2;2909:36:1;;2897:2;2882:18;8771:84:0;2767:184:1;24176:130:0;;;;;;;;;;-1:-1:-1;24176:130:0;;;;;:::i;:::-;;:::i;23153:91::-;;;;;;;;;;;;;:::i;9876:203::-;;;;;;;;;;-1:-1:-1;9876:203:0;;;;;:::i;:::-;;:::i;25648:325::-;;;;;;;;;;-1:-1:-1;25648:325:0;;;;;:::i;:::-;;:::i;17728:29::-;;;;;;;;;;-1:-1:-1;17728:29:0;;;;-1:-1:-1;;;;;17728:29:0;;;16871:38;;;;;;;;;;;;;;;25412:230;;;;;;;;;;-1:-1:-1;25412:230:0;;;;;:::i;:::-;;:::i;29686:103::-;;;;;;;;;;;;;:::i;29527:153::-;;;;;;;;;;-1:-1:-1;29527:153:0;;;;;:::i;:::-;;:::i;30375:141::-;;;;;;;;;;;;;:::i;29795:252::-;;;;;;;;;;;;;:::i;8964:118::-;;;;;;;;;;-1:-1:-1;8964:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;9059:18:0;9038:7;9059:18;;;;;;;;;;;;8964:118;7809:133;;;;;;;;;;;;;:::i;24673:338::-;;;;;;;;;;-1:-1:-1;24673:338:0;;;;;:::i;:::-;;:::i;25017:389::-;;;;;;;;;;-1:-1:-1;25017:389:0;;;;;:::i;:::-;;:::i;25979:1343::-;;;;;;;;;;-1:-1:-1;25979:1343:0;;;;;:::i;:::-;;:::i;24312:355::-;;;;;;;;;;-1:-1:-1;24312:355:0;;;;;:::i;:::-;;:::i;17400:56::-;;;;;;;;;;;;;;;;7625:70;;;;;;;;;;-1:-1:-1;7684:6:0;;-1:-1:-1;;;;;7684:6:0;7625:70;;8671:95;;;;;;;;;;;;;:::i;17569:40::-;;;;;;;;;;;;;;;;27346:452;;;;;;;;;;-1:-1:-1;27346:452:0;;;;;:::i;:::-;;:::i;10084:254::-;;;;;;;;;;-1:-1:-1;10084:254:0;;;;;:::i;:::-;;:::i;30218:151::-;;;;;;;;;;-1:-1:-1;30218:151:0;;;;;:::i;:::-;;:::i;9087:160::-;;;;;;;;;;-1:-1:-1;9087:160:0;;;;;:::i;:::-;;:::i;17279:60::-;;;;;;;;;;;;;;;;29197:324;;;;;;;;;;-1:-1:-1;29197:324:0;;;;;:::i;:::-;;:::i;27804:470::-;;;;;;;;;;-1:-1:-1;27804:470:0;;;;;:::i;:::-;;:::i;18874:58::-;;;;;;;;;;-1:-1:-1;18874:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28280:355;;;;;;;;;;-1:-1:-1;28280:355:0;;;;;:::i;:::-;;:::i;23869:301::-;;;;;;;;;;-1:-1:-1;23869:301:0;;;;;:::i;:::-;;:::i;30522:231::-;;;;;;;;;;-1:-1:-1;30625:23:0;;;;;;;30650:24;;;;;;-1:-1:-1;;;30676:21:0;;;;;-1:-1:-1;;;30699:22:0;;;;;-1:-1:-1;;;30723:21:0;;;;30522:231;;;;5293:4:1;5281:17;;;5263:36;;5335:17;;;5330:2;5315:18;;5308:45;5389:17;;;5369:18;;;5362:45;;;;5443:17;;5438:2;5423:18;;5416:45;5498:17;;;5492:3;5477:19;;5470:46;5250:3;5235:19;30522:231:0;5024:498:1;17494:68:0;;;;;;;;;;;;;;;;23250:202;;;;;;;;;;-1:-1:-1;23250:202:0;;;;;:::i;:::-;;:::i;17618:30::-;;;;;;;;;;-1:-1:-1;17618:30:0;;;;-1:-1:-1;;;;;17618:30:0;;;9252:142;;;;;;;;;;-1:-1:-1;9252:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;9362:18:0;;;9341:7;9362:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9252:142;7947:223;;;;;;;;;;-1:-1:-1;7947:223:0;;;;;:::i;:::-;;:::i;17655:31::-;;;;;;;;;;-1:-1:-1;17655:31:0;;;;-1:-1:-1;;;;;17655:31:0;;;30759:237;;;;;;;;;;-1:-1:-1;30863:24:0;;;;;;;;;30889:25;;;;;;-1:-1:-1;;;30916:22:0;;;;;-1:-1:-1;;;30940:23:0;;;;;-1:-1:-1;;;30965:22:0;;;;30759:237;;8575:91;8629:13;8656:5;8649:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8575:91;:::o;9399:154::-;9482:4;9493:39;7091:10;9516:7;9525:6;9493:8;:39::i;:::-;-1:-1:-1;9544:4:0;9399:154;;;;:::o;22874:273::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;;;;;;;;;22931:16:::1;:23:::0;;-1:-1:-1;;;;22931:23:0::1;-1:-1:-1::0;;;22931:23:0::1;::::0;;22968:18:::1;::::0;22931:23;22968;22965:175:::1;;23029:12;23008:18;:33:::0;23080:15:::1;23056:21;:39:::0;23110:11:::1;:18:::0;;-1:-1:-1;;;;23110:18:0::1;-1:-1:-1::0;;;23110:18:0::1;::::0;;22965:175:::1;22874:273::o:0;28641:269::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;28742:11:::1;;28730:8;:23:::0;28722:82:::1;;;::::0;-1:-1:-1;;;28722:82:0;;6868:2:1;28722:82:0::1;::::0;::::1;6850:21:1::0;6907:2;6887:18;;;6880:30;6946:34;6926:18;;;6919:62;-1:-1:-1;;;6997:18:1;;;6990:44;7051:19;;28722:82:0::1;6666:410:1::0;28722:82:0::1;28857:11;::::0;28820:49:::1;::::0;28847:8;;28820:49:::1;::::0;;;::::1;28880:11;:22:::0;28641:269::o;9558:313::-;9677:4;9688:36;9698:6;9706:9;9717:6;9688:9;:36::i;:::-;9729:121;9738:6;7091:10;9760:89;9798:6;9760:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9760:19:0;;;;;;:11;:19;;;;;;;;7091:10;9760:33;;;;;;;;;;:37;:89::i;:::-;9729:8;:121::i;:::-;-1:-1:-1;9862:4:0;9558:313;;;;;:::o;28916:275::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;29012:15:::1;;29000:8;:27:::0;28992:90:::1;;;::::0;-1:-1:-1;;;28992:90:0;;7283:2:1;28992:90:0::1;::::0;::::1;7265:21:1::0;7322:2;7302:18;;;7295:30;7361:34;7341:18;;;7334:62;-1:-1:-1;;;7412:18:1;;;7405:48;7470:19;;28992:90:0::1;7081:414:1::0;28992:90:0::1;29130:15;::::0;29098:48:::1;::::0;29120:8;;29098:48:::1;::::0;;;::::1;29157:15;:26:::0;28916:275::o;30071:141::-;30161:15;;:43;;;-1:-1:-1;;;30161:43:0;;;;30134:7;;-1:-1:-1;;;;;30161:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30154:50;;30071:141;:::o;24176:130::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;24253:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;24253:45:0;;-1:-1:-1;;;;;1442:32:1;;;24253:45:0::1;::::0;::::1;1424:51:1::0;24253:15:0;;::::1;::::0;:36:::1;::::0;1397:18:1;;24253:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24176:130:::0;:::o;23153:91::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;23212:16:::1;:24:::0;;-1:-1:-1;;;;23212:24:0::1;::::0;;23153:91::o;9876:203::-;7091:10;9964:4;10007:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10007:34:0;;;;;;;;;;9964:4;;9975:83;;9998:7;;10007:50;;10046:10;10007:38;:50::i;25648:325::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25750:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:47;::::1;;:38;::::0;;::::1;:47;;::::0;25742:115:::1;;;::::0;-1:-1:-1;;;25742:115:0;;7891:2:1;25742:115:0::1;::::0;::::1;7873:21:1::0;7930:2;7910:18;;;7903:30;7969:34;7949:18;;;7942:62;8040:25;8020:18;;;8013:53;8083:19;;25742:115:0::1;7689:419:1::0;25742:115:0::1;-1:-1:-1::0;;;;;25862:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;25862:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25918:50;;154:41:1;;;25918:50:0::1;::::0;127:18:1;25918:50:0::1;;;;;;;;25648:325:::0;;:::o;25412:230::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25491:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;25483:61;;;::::0;-1:-1:-1;;;25483:61:0;;8315:2:1;25483:61:0::1;::::0;::::1;8297:21:1::0;8354:2;8334:18;;;8327:30;8393:31;8373:18;;;8366:59;8442:18;;25483:61:0::1;8113:353:1::0;25483:61:0::1;-1:-1:-1::0;;;;;25555:19:0;::::1;25577:5;25555:19:::0;;;:10:::1;:19;::::0;;;;;:27;;-1:-1:-1;;25555:27:0::1;::::0;;25598:36;25577:5;;25555:19;25598:36:::1;::::0;25577:5;;25598:36:::1;25412:230:::0;:::o;29686:103::-;29723:15;;:58;;-1:-1:-1;;;29723:58:0;;29762:10;29723:58;;;8655:51:1;29723:15:0;8722:18:1;;;8715:50;-1:-1:-1;;;;;29723:15:0;;;;:30;;8628:18:1;;29723:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29686:103::o;29527:153::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;29619:15:::1;::::0;:53:::1;::::0;-1:-1:-1;;;29619:53:0;;::::1;::::0;::::1;1632:25:1::0;;;-1:-1:-1;;;;;29619:15:0;;::::1;::::0;:43:::1;::::0;1605:18:1;;29619:53:0::1;1486:177:1::0;30375:141:0;30467:15;;:41;;;-1:-1:-1;;;30467:41:0;;;;30440:7;;-1:-1:-1;;;;;30467:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;29795:252;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;29870:21:::1;29853:14;29928:7;7684:6:::0;;-1:-1:-1;;;;;7684:6:0;;7625:70;29928:7:::1;-1:-1:-1::0;;;;;29920:21:0::1;29950:6;29920:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29902:59;;;29976:7;29972:68;;;30004:24;::::0;1632:25:1;;;30004:24:0::1;::::0;1620:2:1;1605:18;30004:24:0::1;;;;;;;29972:68;29842:205;;29795:252::o:0;7809:133::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;7894:6:::1;::::0;7873:40:::1;::::0;7910:1:::1;::::0;-1:-1:-1;;;;;7894:6:0::1;::::0;7873:40:::1;::::0;7910:1;;7873:40:::1;7918:6;:19:::0;;-1:-1:-1;;;;;;7918:19:0::1;::::0;;7809:133::o;24673:338::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24778:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;24770:112:::1;;;;-1:-1:-1::0;;;24770:112:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24893:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;24893:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;24958:45;;154:41:1;;;24958:45:0::1;::::0;127:18:1;24958:45:0::1;14:187:1::0;25017:389:0;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25095:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;25094:20;25086:66;;;::::0;-1:-1:-1;;;25086:66:0;;9856:2:1;25086:66:0::1;::::0;::::1;9838:21:1::0;9895:2;9875:18;;;9868:30;9934:34;9914:18;;;9907:62;-1:-1:-1;;;9985:18:1;;;9978:31;10026:19;;25086:66:0::1;9654:397:1::0;25086:66:0::1;25167:11;::::0;-1:-1:-1;;;25167:11:0;::::1;;;25163:148;;;25247:6;25222:21;;25204:15;:39;;;;:::i;:::-;25203:50;25195:104;;;::::0;-1:-1:-1;;;25195:104:0;;10520:2:1;25195:104:0::1;::::0;::::1;10502:21:1::0;10559:2;10539:18;;;10532:30;10598:34;10578:18;;;10571:62;-1:-1:-1;;;10649:18:1;;;10642:39;10698:19;;25195:104:0::1;10318:405:1::0;25195:104:0::1;-1:-1:-1::0;;;;;25321:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;:26;;-1:-1:-1;;25321:26:0::1;25343:4;25321:26:::0;;::::1;::::0;;;25363:35;;25343:4;;25321:19;25363:35:::1;::::0;::::1;25017:389:::0;:::o;25979:1343::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;26142:15:::1;::::0;-1:-1:-1;;;;;26142:37:0;;::::1;:15:::0;::::1;:37;26139:291;;-1:-1:-1::0;;;;;26204:32:0;::::1;26196:83;;;::::0;-1:-1:-1;;;26196:83:0;;10930:2:1;26196:83:0::1;::::0;::::1;10912:21:1::0;10969:2;10949:18;;;10942:30;11008:34;10988:18;;;10981:62;-1:-1:-1;;;11059:18:1;;;11052:36;11105:19;;26196:83:0::1;10728:402:1::0;26196:83:0::1;26351:15;::::0;26299:68:::1;::::0;-1:-1:-1;;;11337:30:1;;-1:-1:-1;;;;;26351:15:0;;::::1;::::0;26299:68;::::1;::::0;11392:2:1;11383:12;26299:68:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;26299:68:0;;;::::1;26382:15;:36:::0;;-1:-1:-1;;;;;;26382:36:0::1;-1:-1:-1::0;;;;;26382:36:0;::::1;;::::0;;26139:291:::1;26443:16;::::0;-1:-1:-1;;;;;26443:39:0;;::::1;:16:::0;::::1;:39;26440:300;;-1:-1:-1::0;;;;;26507:33:0;::::1;26499:85;;;::::0;-1:-1:-1;;;26499:85:0;;11608:2:1;26499:85:0::1;::::0;::::1;11590:21:1::0;11647:2;11627:18;;;11620:30;11686:34;11666:18;;;11659:62;-1:-1:-1;;;11737:18:1;;;11730:37;11784:19;;26499:85:0::1;11406:403:1::0;26499:85:0::1;26658:16;::::0;26604:71:::1;::::0;-1:-1:-1;;;12016:31:1;;-1:-1:-1;;;;;26658:16:0;;::::1;::::0;26604:71;::::1;::::0;12072:2:1;12063:12;26604:71:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;26604:71:0;;;::::1;26690:16;:38:::0;;-1:-1:-1;;;;;;26690:38:0::1;-1:-1:-1::0;;;;;26690:38:0;::::1;;::::0;;26440:300:::1;26753:13;::::0;-1:-1:-1;;;;;26753:33:0;;::::1;:13:::0;::::1;:33;26750:273;;-1:-1:-1::0;;;;;26811:30:0;::::1;26803:79;;;::::0;-1:-1:-1;;;26803:79:0;;12288:2:1;26803:79:0::1;::::0;::::1;12270:21:1::0;12327:2;12307:18;;;12300:30;12366:34;12346:18;;;12339:62;-1:-1:-1;;;12417:18:1;;;12410:34;12461:19;;26803:79:0::1;12086:400:1::0;26803:79:0::1;26950:13;::::0;26902:62:::1;::::0;-1:-1:-1;;;12693:28:1;;-1:-1:-1;;;;;26950:13:0;;::::1;::::0;26902:62;::::1;::::0;12746:2:1;12737:12;26902:62:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;26902:62:0;;;::::1;26979:13;:32:::0;;-1:-1:-1;;;;;;26979:32:0::1;-1:-1:-1::0;;;;;26979:32:0;::::1;;::::0;;26750:273:::1;27036:14;::::0;-1:-1:-1;;;;;27036:35:0;;::::1;:14:::0;::::1;:35;27033:282;;-1:-1:-1::0;;;;;27096:31:0;::::1;27088:81;;;::::0;-1:-1:-1;;;27088:81:0;;12962:2:1;27088:81:0::1;::::0;::::1;12944:21:1::0;13001:2;12981:18;;;12974:30;13040:34;13020:18;;;13013:62;-1:-1:-1;;;13091:18:1;;;13084:35;13136:19;;27088:81:0::1;12760:401:1::0;27088:81:0::1;27239:14;::::0;27189:65:::1;::::0;-1:-1:-1;;;13368:29:1;;-1:-1:-1;;;;;27239:14:0;;::::1;::::0;27189:65;::::1;::::0;13422:2:1;13413:12;27189:65:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;27189:65:0;;;::::1;27269:14;:34:::0;;-1:-1:-1;;;;;;27269:34:0::1;-1:-1:-1::0;;;;;27269:34:0;::::1;;::::0;;27033:282:::1;25979:1343:::0;;;;:::o;24312:355::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24422:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;24414:117:::1;;;;-1:-1:-1::0;;;24414:117:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24542:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;24542:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;24612:47;;154:41:1;;;24612:47:0::1;::::0;127:18:1;24612:47:0::1;14:187:1::0;8671:95:0;8727:13;8754:7;8747:14;;;;;:::i;27346:452::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;27528:125:::1;27551:5;27558:18;27578:19;27599:16;27617:17;27636:16;27528:22;:125::i;:::-;27669:121;::::0;-1:-1:-1;;;13638:27:1;;13690:2;13681:12;27669:121:0::1;;::::0;;;;;::::1;::::0;;5293:4:1;5281:17;;;5263:36;;5335:17;;;5330:2;5315:18;;5308:45;5389:17;;;5369:18;;;5362:45;5443:17;;;5438:2;5423:18;;5416:45;5498:17;;5492:3;5477:19;;5470:46;27669:121:0;;;;::::1;::::0;;;;;5250:3:1;27669:121:0;;::::1;27346:452:::0;;;;;:::o;10084:254::-;10177:4;10188:129;7091:10;10211:7;10220:96;10259:15;10220:96;;;;;;;;;;;;;;;;;7091:10;10220:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10220:34:0;;;;;;;;;;;;:38;:96::i;30218:151::-;30314:15;;:47;;-1:-1:-1;;;30314:47:0;;-1:-1:-1;;;;;1442:32:1;;;30314:47:0;;;1424:51:1;30287:7:0;;30314:15;;:38;;1397:18:1;;30314:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30307:54;30218:151;-1:-1:-1;;30218:151:0:o;9087:160::-;9173:4;9184:42;7091:10;9208:9;9219:6;9184:9;:42::i;29197:324::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;29301:23:::1;;29289:8;:35:::0;29281:106:::1;;;::::0;-1:-1:-1;;;29281:106:0;;13906:2:1;29281:106:0::1;::::0;::::1;13888:21:1::0;13945:2;13925:18;;;13918:30;13984:34;13964:18;;;13957:62;14055:28;14035:18;;;14028:56;14101:19;;29281:106:0::1;13704:422:1::0;29281:106:0::1;29444:23;::::0;29403:65:::1;::::0;29434:8;;29403:65:::1;::::0;;;::::1;29479:23;:34:::0;29197:324::o;27804:470::-;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;27992:131:::1;28016:5;28023:19;28044:20;28066:17;28085:18;28105:17;27992:23;:131::i;:::-;28139:127;::::0;-1:-1:-1;;;14333:28:1;;14386:2;14377:12;28139:127:0::1;14131:264:1::0;28280:355:0;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;28386:15:::1;::::0;-1:-1:-1;;;;;28386:15:0;;::::1;28364:38:::0;;::::1;::::0;28356:93:::1;;;::::0;-1:-1:-1;;;28356:93:0;;14602:2:1;28356:93:0::1;::::0;::::1;14584:21:1::0;14641:2;14621:18;;;14614:30;14680:34;14660:18;;;14653:62;-1:-1:-1;;;14731:18:1;;;14724:40;14781:19;;28356:93:0::1;14400:406:1::0;28356:93:0::1;28507:15;::::0;28465:59:::1;::::0;-1:-1:-1;;;;;28507:15:0;;::::1;::::0;28465:59;::::1;::::0;::::1;::::0;28507:15:::1;::::0;28465:59:::1;28535:15;:37:::0;;-1:-1:-1;;;;;;28535:37:0::1;-1:-1:-1::0;;;;;28535:37:0;;::::1;::::0;;::::1;::::0;;;28583:15:::1;::::0;:44:::1;::::0;-1:-1:-1;;;28583:44:0;;::::1;::::0;::::1;1424:51:1::0;;;;28583:15:0;;::::1;::::0;:32:::1;::::0;1397:18:1;;28583:44:0::1;1264:217:1::0;23869:301:0;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23964:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;23956:101:::1;;;;-1:-1:-1::0;;;23956:101:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24068:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;24068:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;24122:40;;154:41:1;;;24122:40:0::1;::::0;127:18:1;24122:40:0::1;14:187:1::0;23250:202:0;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23339:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;23339:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23397:50;;154:41:1;;;23397:50:0::1;::::0;127:18:1;23397:50:0::1;14:187:1::0;7947:223:0;7734:6;;-1:-1:-1;;;;;7734:6:0;7091:10;7734:22;7726:67;;;;-1:-1:-1;;;7726:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8030:22:0;::::1;8022:73;;;::::0;-1:-1:-1;;;8022:73:0;;15013:2:1;8022:73:0::1;::::0;::::1;14995:21:1::0;15052:2;15032:18;;;15025:30;15091:34;15071:18;;;15064:62;-1:-1:-1;;;15142:18:1;;;15135:36;15188:19;;8022:73:0::1;14811:402:1::0;8022:73:0::1;8126:6;::::0;8105:38:::1;::::0;-1:-1:-1;;;;;8105:38:0;;::::1;::::0;8126:6:::1;::::0;8105:38:::1;::::0;8126:6:::1;::::0;8105:38:::1;8148:6;:17:::0;;-1:-1:-1;;;;;;8148:17:0::1;-1:-1:-1::0;;;;;8148:17:0;;;::::1;::::0;;;::::1;::::0;;7947:223::o;2733:160::-;2791:7;;2817:5;2821:1;2817;:5;:::i;:::-;2805:17;;2840:1;2835;:6;;2827:46;;;;-1:-1:-1;;;2827:46:0;;15553:2:1;2827:46:0;;;15535:21:1;15592:2;15572:18;;;15565:30;15631:29;15611:18;;;15604:57;15678:18;;2827:46:0;15351:351:1;2827:46:0;2887:1;2733:160;-1:-1:-1;;;2733:160:0:o;11589:330::-;-1:-1:-1;;;;;11698:19:0;;11690:68;;;;-1:-1:-1;;;11690:68:0;;15909:2:1;11690:68:0;;;15891:21:1;15948:2;15928:18;;;15921:30;15987:34;15967:18;;;15960:62;-1:-1:-1;;;16038:18:1;;;16031:34;16082:19;;11690:68:0;15707:400:1;11690:68:0;-1:-1:-1;;;;;11771:21:0;;11763:68;;;;-1:-1:-1;;;11763:68:0;;16314:2:1;11763:68:0;;;16296:21:1;16353:2;16333:18;;;16326:30;16392:34;16372:18;;;16365:62;-1:-1:-1;;;16443:18:1;;;16436:32;16485:19;;11763:68:0;16112:398:1;11763:68:0;-1:-1:-1;;;;;11836:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11882:32;;1632:25:1;;;11882:32:0;;1605:18:1;11882:32:0;;;;;;;;11589:330;;;:::o;31017:2606::-;-1:-1:-1;;;;;31153:18:0;;31145:68;;;;-1:-1:-1;;;31145:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31232:16:0;;31224:64;;;;-1:-1:-1;;;31224:64:0;;;;;;;:::i;:::-;31304:6;31314:1;31304:11;31301:92;;31332:28;31348:4;31354:2;31358:1;31332:15;:28::i;:::-;31017:2606;;;:::o;31301:92::-;-1:-1:-1;;;;;31424:31:0;;;31405:16;31424:31;;;:25;:31;;;;;;;;;31484:29;;;;;;;;;31530:35;;;:29;:35;;;;;;31424:31;;;;;31484:29;;;;31530:35;31529:36;:74;;;;-1:-1:-1;;;;;;31570:33:0;;;;;;:29;:33;;;;;;;;31569:34;31529:74;31526:731;;;31628:16;;-1:-1:-1;;;31628:16:0;;;;31620:66;;;;-1:-1:-1;;;31620:66:0;;17527:2:1;31620:66:0;;;17509:21:1;17566:2;17546:18;;;17539:30;17605:34;17585:18;;;17578:62;-1:-1:-1;;;17656:18:1;;;17649:35;17701:19;;31620:66:0;17325:401:1;31620:66:0;-1:-1:-1;;;;;31710:14:0;;;;;;:10;:14;;;;;;;;31709:15;31701:53;;;;-1:-1:-1;;;31701:53:0;;17933:2:1;31701:53:0;;;17915:21:1;17972:2;17952:18;;;17945:30;-1:-1:-1;;;17991:18:1;;;17984:55;18056:18;;31701:53:0;17731:349:1;31701:53:0;-1:-1:-1;;;;;31778:16:0;;;;;;:10;:16;;;;;;;;31777:17;31769:55;;;;-1:-1:-1;;;31769:55:0;;17933:2:1;31769:55:0;;;17915:21:1;17972:2;17952:18;;;17945:30;-1:-1:-1;;;17991:18:1;;;17984:55;18056:18;;31769:55:0;17731:349:1;31769:55:0;-1:-1:-1;;;;;31844:38:0;;;;;;:34;:38;;;;;;;;31843:39;:84;;;;-1:-1:-1;;;;;;31887:40:0;;;;;;:34;:40;;;;;;;;31886:41;31843:84;31839:204;;;31966:11;;31956:6;:21;;31948:79;;;;-1:-1:-1;;;31948:79:0;;18287:2:1;31948:79:0;;;18269:21:1;18326:2;18306:18;;;18299:30;18365:34;18345:18;;;18338:62;-1:-1:-1;;;18416:18:1;;;18409:43;18469:19;;31948:79:0;18085:409:1;31948:79:0;-1:-1:-1;;;;;32062:33:0;;;;;;:29;:33;;;;;;;;32057:189;;32152:15;;32141:6;32125:13;32135:2;-1:-1:-1;;;;;9059:18:0;9038:7;9059:18;;;;;;;;;;;;8964:118;32125:13;:22;;;;:::i;:::-;32124:43;;32116:114;;;;-1:-1:-1;;;32116:114:0;;18701:2:1;32116:114:0;;;18683:21:1;18740:2;18720:18;;;18713:30;18779:34;18759:18;;;18752:62;18850:28;18830:18;;;18823:56;18896:19;;32116:114:0;18499:422:1;32116:114:0;32269:48;32282:11;32295:10;32307:4;32314:2;32269:12;:48::i;:::-;32371:23;;32361:4;32328:12;9059:18;;;;;;;;;;;32425:16;;-1:-1:-1;;32343:51:0;;-1:-1:-1;;;32425:16:0;;;;:40;;;;;32458:7;32425:40;:67;;;;-1:-1:-1;32483:9:0;;;;32482:10;32425:67;:97;;;;-1:-1:-1;32509:9:0;;-1:-1:-1;;;32509:9:0;;;;:13;;32425:97;:143;;;;-1:-1:-1;;;;;;32539:29:0;;;;;;:25;:29;;;;;;;;32425:143;32407:280;;;32595:9;:16;;-1:-1:-1;;32595:16:0;32607:4;32595:16;;;32626:17;:15;:17::i;:::-;32658:9;:17;;-1:-1:-1;;32658:17:0;;;32407:280;32715:9;;32699:12;;32715:9;;32714:10;:30;;;;-1:-1:-1;32728:16:0;;-1:-1:-1;;;32728:16:0;;;;32714:30;-1:-1:-1;;;;;32760:24:0;;;;;;:18;:24;;;;;;32699:45;;-1:-1:-1;32760:24:0;;;:50;;-1:-1:-1;;;;;;32788:22:0;;;;;;:18;:22;;;;;;;;32760:50;32757:96;;;-1:-1:-1;32836:5:0;32757:96;32869:7;:24;;;;-1:-1:-1;32880:9:0;;-1:-1:-1;;;32880:9:0;;;;:13;;32869:24;32865:187;;;32933:9;;32910:11;;32945:3;;32924:18;;-1:-1:-1;;;32933:9:0;;;;32924:6;:18;:::i;:::-;:24;;;;:::i;:::-;32910:38;-1:-1:-1;32972:12:0;32910:38;32972:6;:12;:::i;:::-;32963:21;;32999:41;33015:4;33029;33036:3;32999:15;:41::i;:::-;32895:157;32865:187;33064:33;33080:4;33086:2;33090:6;33064:15;:33::i;:::-;33114:15;;-1:-1:-1;;;;;33114:15:0;:26;33149:4;33156:15;33149:4;-1:-1:-1;;;;;9059:18:0;9038:7;9059:18;;;;;;;;;;;;8964:118;33156:15;33114:58;;-1:-1:-1;;;;;;33114:58:0;;;;;;;-1:-1:-1;;;;;19564:32:1;;;33114:58:0;;;19546:51:1;19613:18;;;19606:34;19519:18;;33114:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33110:74;33198:15;;-1:-1:-1;;;;;33198:15:0;:26;33233:2;33238:13;33233:2;-1:-1:-1;;;;;9059:18:0;9038:7;9059:18;;;;;;;;;;;;8964:118;33238:13;33198:54;;-1:-1:-1;;;;;;33198:54:0;;;;;;;-1:-1:-1;;;;;19564:32:1;;;33198:54:0;;;19546:51:1;19613:18;;;19606:34;19519:18;;33198:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33194:70;33280:9;;;;33276:340;;33320:16;;33355:15;;:28;;-1:-1:-1;;;;;;33355:28:0;;;;;1632:25:1;;;-1:-1:-1;;;;;33355:15:0;;;;:23;;1605:18:1;;33355:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;33355:28:0;;;;;;;;-1:-1:-1;;33355:28:0;;;;;;;;;;;;:::i;:::-;;;33351:254;;;33481:86;;;20193:25:1;;;20249:2;20234:18;;20227:34;;;20277:18;;;20270:34;;;20335:2;20320:18;;20313:34;;;33557:9:0;;33546:4;;33481:86;;20180:3:1;20165:19;33481:86:0;;;;;;;33384:199;;;33351:254;33291:325;33276:340;31134:2489;;;;31017:2606;;;:::o;3030:171::-;3116:7;3146:12;3138:6;;;;3130:29;;;;-1:-1:-1;;;3130:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3164:9:0;3176:5;3180:1;3176;:5;:::i;:::-;3164:17;3030:171;-1:-1:-1;;;;;3030:171:0:o;36744:1475::-;37009:21;;;;:43;;;;:21;;:43;37005:239;;37074:101;;-1:-1:-1;;;20560:32:1;;20617:2;20608:12;37074:101:0;;;;;;;;37116:21;;;;37160:14;;37074:101;;37116:21;;;;;37074:101;;;;-1:-1:-1;;;;;;;;;;;37074:101:0;;;37160:14;;;37074:101;:::i;:::-;;;;;;;;37190:21;;;:42;;-1:-1:-1;;37190:42:0;;;;;;;37005:239;37258:22;;;;:45;;;;:22;;;;;:45;37254:246;;37325:104;;-1:-1:-1;;;21047:33:1;;21105:2;21096:12;37325:104:0;;;;;;;;37368:22;;;;37414:14;;37325:104;;37368:22;;;;;;;;37325:104;;;;-1:-1:-1;;;;;;;;;;;37325:104:0;;;37414:14;;;37325:104;:::i;:::-;;;;;;;;37444:22;;;:44;;-1:-1:-1;;37444:44:0;;;;;;;;;37254:246;37514:19;;;;:39;;;;-1:-1:-1;;;37514:19:0;;;;:39;37510:225;;37575:95;;-1:-1:-1;;;21321:30:1;;21376:2;21367:12;37575:95:0;;;;;;;;37615:19;;;;37655:14;;37575:95;;37615:19;-1:-1:-1;;;37615:19:0;;;;;;37575:95;;;;-1:-1:-1;;;;;;;;;;;37575:95:0;;;37655:14;;;37575:95;:::i;:::-;;;;;;;;37685:19;;;:38;;-1:-1:-1;;37685:38:0;-1:-1:-1;;;37685:38:0;;;;;;;37510:225;37749:20;;;;:41;;;;-1:-1:-1;;;37749:20:0;;;;:41;37745:232;;37812:98;;-1:-1:-1;;;21592:31:1;;21648:2;21639:12;37812:98:0;;;;;;;;37853:20;;;;37895:14;;37812:98;;37853:20;-1:-1:-1;;;37853:20:0;;;;;;37812:98;;;;-1:-1:-1;;;;;;;;;;;37812:98:0;;;37895:14;;;37812:98;:::i;:::-;;;;;;;;37925:20;;;:40;;-1:-1:-1;;37925:40:0;-1:-1:-1;;;37925:40:0;;;;;;;37745:232;37991:19;;;;:39;;;;-1:-1:-1;;;37991:19:0;;;;:39;37987:225;;38052:95;;-1:-1:-1;;;21864:30:1;;21919:2;21910:12;38052:95:0;;;;;;;;38092:19;;;;38132:14;;38052:95;;38092:19;-1:-1:-1;;;38092:19:0;;;;;;38052:95;;;;-1:-1:-1;;;;;;;;;;;38052:95:0;;;38132:14;;;38052:95;:::i;:::-;;;;;;;;38162:19;;;:38;;-1:-1:-1;;38162:38:0;-1:-1:-1;;;38162:38:0;;;;;;;37987:225;36744:1475;;;;;;:::o;35222:1516::-;35493:22;;;;:45;;;;:22;;;;;:45;35489:246;;35560:104;;-1:-1:-1;;;22135:33:1;;22193:2;22184:12;35560:104:0;;;;;;;;35603:22;;;;35649:14;;35560:104;;35603:22;;;;;;;;35560:104;;;;-1:-1:-1;;;;;;;;;;;35560:104:0;;;35649:14;;;35560:104;:::i;:::-;;;;;;;;35679:22;;;:44;;-1:-1:-1;;35679:44:0;;;;;;;;;35489:246;35749:23;;;;:47;;;;:23;;;;;:47;35745:253;;35818:107;;-1:-1:-1;;;22409:34:1;;22468:2;22459:12;35818:107:0;;;;;;;;35862:23;;;;35910:14;;35818:107;;35862:23;;;;;;;;35818:107;;;;-1:-1:-1;;;;;;;;;;;35818:107:0;;;35910:14;;;35818:107;:::i;:::-;;;;;;;;35940:23;;;:46;;-1:-1:-1;;35940:46:0;;;;;;;;;35745:253;36012:20;;;;:41;;;;-1:-1:-1;;;36012:20:0;;;;:41;36008:232;;36075:98;;-1:-1:-1;;;22684:31:1;;22740:2;22731:12;36075:98:0;;;;;;;;36116:20;;;;36158:14;;36075:98;;36116:20;-1:-1:-1;;;36116:20:0;;;;;;36075:98;;;;-1:-1:-1;;;;;;;;;;;36075:98:0;;;36158:14;;;36075:98;:::i;:::-;;;;;;;;36188:20;;;:40;;-1:-1:-1;;36188:40:0;-1:-1:-1;;;36188:40:0;;;;;;;36008:232;36254:21;;;;:43;;;;-1:-1:-1;;;36254:21:0;;;;:43;36250:239;;36319:101;;-1:-1:-1;;;22956:32:1;;23013:2;23004:12;36319:101:0;;;;;;;;36361:21;;;;36405:14;;36319:101;;36361:21;-1:-1:-1;;;36361:21:0;;;;;;36319:101;;;;-1:-1:-1;;;;;;;;;;;36319:101:0;;;36405:14;;;36319:101;:::i;:::-;;;;;;;;36435:21;;;:42;;-1:-1:-1;;36435:42:0;-1:-1:-1;;;36435:42:0;;;;;;;36250:239;36503:20;;;;:41;;;;-1:-1:-1;;;36503:20:0;;;;:41;36499:232;;36566:98;;-1:-1:-1;;;23229:31:1;;23285:2;23276:12;36566:98:0;;;;;;;;36607:20;;;;36649:14;;36566:98;;36607:20;-1:-1:-1;;;36607:20:0;;;;;;36566:98;;;;-1:-1:-1;;;;;;;;;;;36566:98:0;;;36649:14;;;36566:98;:::i;:::-;;;;;;;;36679:20;;;:40;;;;;-1:-1:-1;;;36679:40:0;-1:-1:-1;;36679:40:0;;;;;;35222:1516;;;;;;:::o;10343:509::-;-1:-1:-1;;;;;10456:20:0;;10448:70;;;;-1:-1:-1;;;10448:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10531:23:0;;10523:71;;;;-1:-1:-1;;;10523:71:0;;;;;;;:::i;:::-;10671;10693:6;10671:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10671:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;10651:17:0;;;:9;:17;;;;;;;;;;;:91;;;;10770:20;;;;;;;:32;;10795:6;10770:24;:32::i;:::-;-1:-1:-1;;;;;10747:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10812:35;1632:25:1;;;10747:20:0;;10812:35;;;;;;1605:18:1;10812:35:0;1486:177:1;33629:1587:0;33731:13;:17;;-1:-1:-1;;33841:15:0;;;33869:445;;;;33942:1;33920:18;;33905:12;:33;;;;:::i;:::-;:38;33901:402;;33964:13;:19;;-1:-1:-1;;33964:19:0;33980:3;33964:19;;;33901:402;;;34040:23;;34024:13;:39;;34040:23;;;;-1:-1:-1;;34082:41:0;;;;;;;34040:23;34099:24;;;;;;34082:41;;;;;;;;-1:-1:-1;;34196:37:0;-1:-1:-1;;;34156:21:0;;;;;34142:35;;;;-1:-1:-1;;34196:37:0;;-1:-1:-1;;;34211:22:0;;;;34196:37;;;-1:-1:-1;;34252:35:0;-1:-1:-1;;;34266:21:0;;;;;;;34252:35;;;;;;;33901:402;34328:10;34324:295;;;34371:24;;34355:13;:40;;34371:24;;;;;;;;-1:-1:-1;;34410:42:0;;;;;;;34427:25;;;;;;34410:42;;;;;-1:-1:-1;;34518:38:0;-1:-1:-1;;;34481:22:0;;;;34467:36;;-1:-1:-1;;34518:38:0;;-1:-1:-1;;;34533:23:0;;;;34518:38;;;;;-1:-1:-1;;34571:36:0;-1:-1:-1;;;34585:22:0;;;;-1:-1:-1;;;34571:36:0;;;;;;;34324:295;34634:10;34633:11;:27;;;;;34649:11;34648:12;34633:27;:105;;;;-1:-1:-1;;;;;;34665:35:0;;;;;;:29;:35;;;;;;;;;:72;;-1:-1:-1;;;;;;34704:33:0;;;;;;:29;:33;;;;;;;;34665:72;34629:375;;;34762:24;;34746:13;:40;;34762:24;;;;;;;;-1:-1:-1;;34801:42:0;;;;;;;34818:25;;;;;;34801:42;;;;;-1:-1:-1;;34909:38:0;-1:-1:-1;;;34872:22:0;;;;34858:36;;-1:-1:-1;;34909:38:0;;-1:-1:-1;;;34924:23:0;;;;34909:38;;;;;-1:-1:-1;;34962:36:0;-1:-1:-1;;;34976:22:0;;;;-1:-1:-1;;;34962:36:0;;;;;;;34629:375;35088:11;;;-1:-1:-1;;;35088:11:0;;;;;35073:12;;;;;;35059:11;;;;;;35026:30;;35088:11;35042:14;;;;;35026:13;:30;:::i;:::-;:44;;;;:::i;:::-;:59;;;;:::i;:::-;:73;;;;:::i;:::-;35014:9;:85;;;;;;-1:-1:-1;;;35014:85:0;;;-1:-1:-1;;35014:85:0;;;;;;;;35115:93;;;35127:13;;;;;;;;;;23796:34:1;;35014:85:0;35142:14;;;;23861:2:1;23846:18;;23839:43;35158:11:0;;;;;23898:18:1;;;23891:43;35171:12:0;;;;;23965:2:1;23950:18;;23943:43;-1:-1:-1;;;35185:11:0;;;;24017:3:1;24002:19;;23995:44;35198:9:0;;;;;24070:3:1;24055:19;;24048:44;35115:93:0;;;;;;;23760:3:1;35115:93:0;;;33629:1587;;;;:::o;38225:1677::-;38315:4;38271:23;9059:18;;;;;;;;;;;38415:9;;9059:18;;38360:21;;38415:9;-1:-1:-1;;;38415:9:0;;;;;38271:23;38514:1;;38415:9;;38463:31;;38481:13;9059:18;38463:31;:::i;:::-;:48;;;;:::i;:::-;:52;;;;:::i;:::-;38437:78;-1:-1:-1;38526:20:0;38549:33;38437:78;38549:15;:33;:::i;:::-;38526:56;;38595:31;38613:12;38595:17;:31::i;:::-;38639:27;38669:41;38693:17;38669:21;:41;:::i;:::-;38761:13;;38639:71;;-1:-1:-1;38721:19:0;;38761:17;;38777:1;;38761:13;;:17;:::i;:::-;38743:36;;:14;:36;:::i;:::-;38841:13;;38721:58;;;;;-1:-1:-1;38790:26:0;;38871:1;;38721:58;;38819:35;;38841:13;38819:19;:35;:::i;:::-;:49;;;;:::i;:::-;:53;;;;:::i;:::-;38935:14;;38790:82;;-1:-1:-1;38883:27:0;;38952:11;;38913:36;;38935:14;;;;;38913:19;:36;:::i;:::-;:50;;;;:::i;:::-;39023:11;;38883:80;;-1:-1:-1;38974:24:0;;39037:11;;39001:33;;39023:11;;;;;39001:19;:33;:::i;:::-;:47;;;;:::i;:::-;39109:12;;38974:74;;-1:-1:-1;39059:25:0;;39124:11;;39087:34;;39109:12;;;;;39087:19;:34;:::i;:::-;:48;;;;:::i;:::-;39059:76;-1:-1:-1;39146:24:0;39059:76;39239:16;39196:40;39217:19;39196:18;:40;:::i;:::-;:59;;;;:::i;:::-;:79;;;;:::i;:::-;39173:103;;:19;:103;:::i;:::-;39297:16;;39289:55;;39146:130;;-1:-1:-1;;;;;;39297:16:0;;39289:55;;;;;39324:19;;39297:16;39289:55;39297:16;39289:55;39324:19;39297:16;39289:55;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39363:13:0;;39355:49;;-1:-1:-1;;;;;39363:13:0;;;;39355:49;;;;;39387:16;;39363:13;39355:49;39363:13;39355:49;39387:16;39363:13;39355:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39423:14:0;;39415:51;;-1:-1:-1;;;;;39423:14:0;;;;39415:51;;;;;39448:17;;39423:14;39415:51;39423:14;39415:51;39448:17;39423:14;39415:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39483:19:0;;39479:187;;39519:50;39533:15;39550:18;39519:13;:50::i;:::-;39589:65;;;24675:25:1;;;24731:2;24716:18;;24709:34;;;24759:18;;;24752:34;;;39589:65:0;;24663:2:1;24648:18;39589:65:0;;;;;;;39479:187;39712:15;;39704:58;;39679:20;;-1:-1:-1;;;;;39712:15:0;;39741:16;;39679:20;39704:58;39679:20;39704:58;39741:16;39712:15;39704:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39678:84;;;39776:15;39773:83;;;39813:31;;1632:25:1;;;39813:31:0;;1620:2:1;1605:18;39813:31:0;;;;;;;39773:83;-1:-1:-1;;39868:9:0;:26;;;;;;-1:-1:-1;;;39868:26:0;-1:-1:-1;;39868:26:0;;;;;;;;;;-1:-1:-1;;;;;;;;;;38225:1677:0:o;39908:500::-;39999:16;;;40013:1;39999:16;;;;;;;;39975:21;;39999:16;;;;;;;;;;-1:-1:-1;39999:16:0;39975:40;;40044:4;40026;40031:1;40026:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40026:23:0;;;:7;;;;;;;;;;:23;;;;40070:15;;:22;;;-1:-1:-1;;;40070:22:0;;;;:15;;;;;:20;;:22;;;;;40026:7;;40070:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40060:4;40065:1;40060:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40060:32:0;;;:7;;;;;;;;;:32;40135:15;;40103:62;;40120:4;;40135:15;40153:11;40103:8;:62::i;:::-;40176:15;;:224;;-1:-1:-1;;;40176:224:0;;-1:-1:-1;;;;;40176:15:0;;;;:66;;:224;;40257:11;;40176:15;;40327:4;;40354;;40374:15;;40176:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40414:423;40528:15;;40496:62;;40513:4;;-1:-1:-1;;;;;40528:15:0;40546:11;40496:8;:62::i;:::-;40569:15;;40773;;40569:260;;-1:-1:-1;;;40569:260:0;;40641:4;40569:260;;;26643:34:1;26693:18;;;26686:34;;;40569:15:0;26736:18:1;;;26729:34;;;26779:18;;;26772:34;-1:-1:-1;;;;;40773:15:0;;;26822:19:1;;;26815:44;40803:15:0;26875:19:1;;;26868:35;40569:15:0;;;:31;;40608:9;;26577:19:1;;40569:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:597:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;644:6;641:1;638:13;635:91;;;714:1;709:2;700:6;689:9;685:22;681:31;674:42;635:91;-1:-1:-1;787:2:1;766:15;-1:-1:-1;;762:29:1;747:45;;;;794:2;743:54;;206:597;-1:-1:-1;;;206:597:1:o;808:131::-;-1:-1:-1;;;;;883:31:1;;873:42;;863:70;;929:1;926;919:12;944:315;1012:6;1020;1073:2;1061:9;1052:7;1048:23;1044:32;1041:52;;;1089:1;1086;1079:12;1041:52;1128:9;1115:23;1147:31;1172:5;1147:31;:::i;:::-;1197:5;1249:2;1234:18;;;;1221:32;;-1:-1:-1;;;944:315:1:o;1876:180::-;1935:6;1988:2;1976:9;1967:7;1963:23;1959:32;1956:52;;;2004:1;2001;1994:12;1956:52;-1:-1:-1;2027:23:1;;1876:180;-1:-1:-1;1876:180:1:o;2061:456::-;2138:6;2146;2154;2207:2;2195:9;2186:7;2182:23;2178:32;2175:52;;;2223:1;2220;2213:12;2175:52;2262:9;2249:23;2281:31;2306:5;2281:31;:::i;:::-;2331:5;-1:-1:-1;2388:2:1;2373:18;;2360:32;2401:33;2360:32;2401:33;:::i;:::-;2061:456;;2453:7;;-1:-1:-1;;;2507:2:1;2492:18;;;;2479:32;;2061:456::o;2956:247::-;3015:6;3068:2;3056:9;3047:7;3043:23;3039:32;3036:52;;;3084:1;3081;3074:12;3036:52;3123:9;3110:23;3142:31;3167:5;3142:31;:::i;3208:118::-;3294:5;3287:13;3280:21;3273:5;3270:32;3260:60;;3316:1;3313;3306:12;3331:382;3396:6;3404;3457:2;3445:9;3436:7;3432:23;3428:32;3425:52;;;3473:1;3470;3463:12;3425:52;3512:9;3499:23;3531:31;3556:5;3531:31;:::i;:::-;3581:5;-1:-1:-1;3638:2:1;3623:18;;3610:32;3651:30;3610:32;3651:30;:::i;:::-;3700:7;3690:17;;;3331:382;;;;;:::o;3718:671::-;3804:6;3812;3820;3828;3881:3;3869:9;3860:7;3856:23;3852:33;3849:53;;;3898:1;3895;3888:12;3849:53;3937:9;3924:23;3956:31;3981:5;3956:31;:::i;:::-;4006:5;-1:-1:-1;4063:2:1;4048:18;;4035:32;4076:33;4035:32;4076:33;:::i;:::-;4128:7;-1:-1:-1;4187:2:1;4172:18;;4159:32;4200:33;4159:32;4200:33;:::i;:::-;4252:7;-1:-1:-1;4311:2:1;4296:18;;4283:32;4324:33;4283:32;4324:33;:::i;:::-;3718:671;;;;-1:-1:-1;3718:671:1;;-1:-1:-1;;3718:671:1:o;4394:156::-;4460:20;;4520:4;4509:16;;4499:27;;4489:55;;4540:1;4537;4530:12;4489:55;4394:156;;;:::o;4555:464::-;4640:6;4648;4656;4664;4672;4725:3;4713:9;4704:7;4700:23;4696:33;4693:53;;;4742:1;4739;4732:12;4693:53;4765:27;4782:9;4765:27;:::i;:::-;4755:37;;4811:36;4843:2;4832:9;4828:18;4811:36;:::i;:::-;4801:46;;4866:36;4898:2;4887:9;4883:18;4866:36;:::i;:::-;4856:46;;4921:36;4953:2;4942:9;4938:18;4921:36;:::i;:::-;4911:46;;4976:37;5008:3;4997:9;4993:19;4976:37;:::i;:::-;4966:47;;4555:464;;;;;;;;:::o;5527:388::-;5595:6;5603;5656:2;5644:9;5635:7;5631:23;5627:32;5624:52;;;5672:1;5669;5662:12;5624:52;5711:9;5698:23;5730:31;5755:5;5730:31;:::i;:::-;5780:5;-1:-1:-1;5837:2:1;5822:18;;5809:32;5850:33;5809:32;5850:33;:::i;5920:380::-;5999:1;5995:12;;;;6042;;;6063:61;;6117:4;6109:6;6105:17;6095:27;;6063:61;6170:2;6162:6;6159:14;6139:18;6136:38;6133:161;;6216:10;6211:3;6207:20;6204:1;6197:31;6251:4;6248:1;6241:15;6279:4;6276:1;6269:15;6133:161;;5920:380;;;:::o;6305:356::-;6507:2;6489:21;;;6526:18;;;6519:30;6585:34;6580:2;6565:18;;6558:62;6652:2;6637:18;;6305:356::o;7500:184::-;7570:6;7623:2;7611:9;7602:7;7598:23;7594:32;7591:52;;;7639:1;7636;7629:12;7591:52;-1:-1:-1;7662:16:1;;7500:184;-1:-1:-1;7500:184:1:o;8776:245::-;8843:6;8896:2;8884:9;8875:7;8871:23;8867:32;8864:52;;;8912:1;8909;8902:12;8864:52;8944:9;8938:16;8963:28;8985:5;8963:28;:::i;9236:413::-;9438:2;9420:21;;;9477:2;9457:18;;;9450:30;9516:34;9511:2;9496:18;;9489:62;-1:-1:-1;;;9582:2:1;9567:18;;9560:47;9639:3;9624:19;;9236:413::o;10056:127::-;10117:10;10112:3;10108:20;10105:1;10098:31;10148:4;10145:1;10138:15;10172:4;10169:1;10162:15;10188:125;10228:4;10256:1;10253;10250:8;10247:34;;;10261:18;;:::i;:::-;-1:-1:-1;10298:9:1;;10188:125::o;15218:128::-;15258:3;15289:1;15285:6;15282:1;15279:13;15276:39;;;15295:18;;:::i;:::-;-1:-1:-1;15331:9:1;;15218:128::o;16515:401::-;16717:2;16699:21;;;16756:2;16736:18;;;16729:30;16795:34;16790:2;16775:18;;16768:62;-1:-1:-1;;;16861:2:1;16846:18;;16839:35;16906:3;16891:19;;16515:401::o;16921:399::-;17123:2;17105:21;;;17162:2;17142:18;;;17135:30;17201:34;17196:2;17181:18;;17174:62;-1:-1:-1;;;17267:2:1;17252:18;;17245:33;17310:3;17295:19;;16921:399::o;18926:168::-;18966:7;19032:1;19028;19024:6;19020:14;19017:1;19014:21;19009:1;19002:9;18995:17;18991:45;18988:71;;;19039:18;;:::i;:::-;-1:-1:-1;19079:9:1;;18926:168::o;19099:127::-;19160:10;19155:3;19151:20;19148:1;19141:31;19191:4;19188:1;19181:15;19215:4;19212:1;19205:15;19231:120;19271:1;19297;19287:35;;19302:18;;:::i;:::-;-1:-1:-1;19336:9:1;;19231:120::o;19651:306::-;19739:6;19747;19755;19808:2;19796:9;19787:7;19783:23;19779:32;19776:52;;;19824:1;19821;19814:12;19776:52;19853:9;19847:16;19837:26;;19903:2;19892:9;19888:18;19882:25;19872:35;;19947:2;19936:9;19932:18;19926:25;19916:35;;19651:306;;;;;:::o;20631:209::-;-1:-1:-1;;20795:38:1;;;;20777:57;;20765:2;20750:18;;20631:209::o;23299:204::-;23337:3;23373:4;23370:1;23366:12;23405:4;23402:1;23398:12;23440:3;23434:4;23430:14;23425:3;23422:23;23419:49;;;23448:18;;:::i;:::-;23484:13;;23299:204;-1:-1:-1;;;23299:204:1:o;24103:165::-;24141:1;24175:4;24172:1;24168:12;24199:3;24189:37;;24206:18;;:::i;:::-;24258:3;24251:4;24248:1;24244:12;24240:22;24235:27;;;24103:165;;;;:::o;24273:195::-;24311:4;24348;24345:1;24341:12;24380:4;24377:1;24373:12;24405:3;24400;24397:12;24394:38;;;24412:18;;:::i;:::-;24449:13;;;24273:195;-1:-1:-1;;;24273:195:1:o;24929:127::-;24990:10;24985:3;24981:20;24978:1;24971:31;25021:4;25018:1;25011:15;25045:4;25042:1;25035:15;25061:251;25131:6;25184:2;25172:9;25163:7;25159:23;25155:32;25152:52;;;25200:1;25197;25190:12;25152:52;25232:9;25226:16;25251:31;25276:5;25251:31;:::i;25317:980::-;25579:4;25627:3;25616:9;25612:19;25658:6;25647:9;25640:25;25684:2;25722:6;25717:2;25706:9;25702:18;25695:34;25765:3;25760:2;25749:9;25745:18;25738:31;25789:6;25824;25818:13;25855:6;25847;25840:22;25893:3;25882:9;25878:19;25871:26;;25932:2;25924:6;25920:15;25906:29;;25953:1;25963:195;25977:6;25974:1;25971:13;25963:195;;;26042:13;;-1:-1:-1;;;;;26038:39:1;26026:52;;26133:15;;;;26098:12;;;;26074:1;25992:9;25963:195;;;-1:-1:-1;;;;;;;26214:32:1;;;;26209:2;26194:18;;26187:60;-1:-1:-1;;;26278:3:1;26263:19;26256:35;26175:3;25317:980;-1:-1:-1;;;25317:980:1:o

Swarm Source

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