MATIC Price: $0.723824 (+0.58%)
Gas: 40 GWei
 

Overview

Max Total Supply

108,000,000,000 GGREEN

Holders

511,094

Market

Price

$0.00 @ 0.000000 MATIC

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
999 GGREEN

Value
$0.00
0x87475F1cfF169C51016D6C2Ec24B4Dd8c74fe4D9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
GrandpaGreen

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-01-28
*/

/*
  /$$$$$$                                     /$$                      /$$$$$$                                         
 /$$__  $$                                   | $$                     /$$__  $$                                        
| $$  \__/  /$$$$$$  /$$$$$$  /$$$$$$$   /$$$$$$$  /$$$$$$   /$$$$$$ | $$  \__/  /$$$$$$   /$$$$$$   /$$$$$$  /$$$$$$$ 
| $$ /$$$$ /$$__  $$|____  $$| $$__  $$ /$$__  $$ /$$__  $$ |____  $$| $$ /$$$$ /$$__  $$ /$$__  $$ /$$__  $$| $$__  $$
| $$|_  $$| $$  \__/ /$$$$$$$| $$  \ $$| $$  | $$| $$  \ $$  /$$$$$$$| $$|_  $$| $$  \__/| $$$$$$$$| $$$$$$$$| $$  \ $$
| $$  \ $$| $$      /$$__  $$| $$  | $$| $$  | $$| $$  | $$ /$$__  $$| $$  \ $$| $$      | $$_____/| $$_____/| $$  | $$
|  $$$$$$/| $$     |  $$$$$$$| $$  | $$|  $$$$$$$| $$$$$$$/|  $$$$$$$|  $$$$$$/| $$      |  $$$$$$$|  $$$$$$$| $$  | $$
 \______/ |__/      \_______/|__/  |__/ \_______/| $$____/  \_______/ \______/ |__/       \_______/ \_______/|__/  |__/
                                                 | $$                                                                  
                                                 | $$                                                                  
                                                 |__/ 
*/


// SPDX-License-Identifier: Unlicensed
 
pragma solidity ^0.8.4;
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }
 
    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
 //
abstract 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 virtual 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;
    }
}
 
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);
}
 //
contract ERC20 is Context, IERC20 {
    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;
    uint8 private _decimals;
 
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }
 
    function name() public view virtual returns (string memory) {
        return _name;
    }
 
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }
 
    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }
 
    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 _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }
 
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
 
 
interface IDividendPayingToken {
  function dividendOf(address _owner) external view returns(uint256);
 
  function withdrawDividend() external;
 
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );
 
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}
 
interface IDividendPayingTokenOptional {
  function withdrawableDividendOf(address _owner) external view returns(uint256);
 
  function withdrawnDividendOf(address _owner) external view returns(uint256);
 
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}
 
contract DividendPayingToken is ERC20, IDividendPayingToken, IDividendPayingTokenOptional {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;
 
  uint256 constant internal magnitude = 2**128;
 
  uint256 internal magnifiedDividendPerShare;
  uint256 internal lastAmount;
 
  address public dividendToken;
 
 
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  mapping(address => bool) _isAuth;
 
  uint256 public totalDividendsDistributed;
 
  modifier onlyAuth() {
    require(_isAuth[msg.sender], "Auth: caller is not the authorized");
    _;
  }
 
  constructor(string memory _name, string memory _symbol, address _token) ERC20(_name, _symbol) {
    dividendToken = _token;
    _isAuth[msg.sender] = true;
  }
 
  function setAuth(address account) external onlyAuth{
      _isAuth[account] = true;
  }
 
 //
  function distributeDividends(uint256 amount) public onlyAuth {
    require(totalSupply() > 0);
 
    if (amount > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (amount).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, amount);
 
      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }
 
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(payable(msg.sender));
  }
 
  function setDividendTokenAddress(address newToken) external virtual onlyAuth{
      dividendToken = newToken;
  }
 
  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);
      bool success = IERC20(dividendToken).transfer(user, _withdrawableDividend);
 
      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }
 
      return _withdrawableDividend;
    }
 
    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);
    }
  }
}
 
////////////////////////////////
///////// Interfaces ///////////
////////////////////////////////
 
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
 
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
 
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
 
    function createPair(address tokenA, address tokenB) external returns (address pair);
 
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}
 
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
 
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
 
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
 
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
 
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
 
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);
 
    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
 
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
 
    function initialize(address, address) external;
}
 
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
 
    function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); 
function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); 
function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); 
function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); 
function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); 
function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); 
function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); 
function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); 
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); 
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); 
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); 
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); 
 
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
 
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); 
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); 
 
 
function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; 
function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; 
function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; 
 
}
 
////////////////////////////////
////////// Libraries ///////////
////////////////////////////////
 
library IterableMapping {
    // Iterable mapping from address to uint;
    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();
    }
}
 
library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
 
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
 
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
 
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
 
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
 
    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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }
 
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
 
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }
 
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
 
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }
 
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}
 
library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {
    // Prevent overflow when multiplying INT256_MIN with -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1));
 
    int256 c = a * b;
    require((b == 0) || (c / b == a));
    return c;
  }
 
  function div(int256 a, int256 b) internal pure returns (int256) {
    // Prevent overflow when dividing INT256_MIN by -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    require(!(a == - 2**255 && b == -1) && (b > 0));
 
    return a / b;
  }
 
  function sub(int256 a, int256 b) internal pure returns (int256) {
    require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));
 
    return a - b;
  }
 
  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 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;
  }
}

////////////////////////////////
/////////// Tokens /////////////
////////////////////////////////
 
contract GrandpaGreen is ERC20, Ownable {
    using SafeMath for uint256;
 
    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;
 
    address public greenDividendToken;
    address public wmaticDividendToken;
    address public deadAddress = 0x000000000000000000000000000000000000dEaD;
 
    bool private swapping;
    bool public marketingEnabled = true;
    bool public swapAndLiquifyEnabled = true;
    bool public greenDividendEnabled = true;
    bool public wmaticDividendEnabled = true;
    // this lets owner add LP while trading is stopped. One time function
    bool public lockTilStart = true;
    bool public lockUsed = false;
 
    GREENDividendTracker public greenDividendTracker;
    WMATICDividendTracker public wmaticDividendTracker;
 
    address public marketingWallet;
    
    uint256 public maxWalletBalance = 2 * 10**9 * 10**18;
    uint256 public swapTokensAtAmount = 500 * 10**6 * 10**18;
 
    uint256 public liquidityFee = 2;
    uint256 public previousLiquidityFee;
    uint256 public greenDividendRewardsFee = 4;
    uint256 public previousGreenDividendRewardsFee;
    uint256 public wmaticDividendRewardsFee = 4;
    uint256 public previousWmaticDividendRewardsFee;
    uint256 public marketingFee = 2;
    uint256 public previousMarketingFee;
    uint256 public totalFees = greenDividendRewardsFee.add(marketingFee).add(wmaticDividendRewardsFee).add(liquidityFee);
 
 
    uint256 public sellFeeIncreaseFactor = 150;
 
    uint256 public gasForProcessing = 50000;
 
    address public presaleAddress;
 
    mapping (address => bool) private isExcludedFromFees;
 
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;
 
    event UpdategreenDividendTracker(address indexed newAddress, address indexed oldAddress);
    event UpdatewmaticDividendTracker(address indexed newAddress, address indexed oldAddress);
 
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
 
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event MarketingEnabledUpdated(bool enabled);
    event GreenDividendEnabledUpdated(bool enabled);
    event WmaticDividendEnabledUpdated(bool enabled);
    event LockTilStartUpdated(bool enabled);
 
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
 
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
 
    event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet);
 
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
 
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 maticReceived,
        uint256 tokensIntoLiqudity
    );
 
    event SendDividends(
    	uint256 amount
    );
 
    event ProcessedgreenDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );
 
    event ProcessedwmaticDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );
 
    constructor() ERC20("GrandpaGreen", "GGREEN") {
    	greenDividendTracker = new GREENDividendTracker();
    	wmaticDividendTracker = new WMATICDividendTracker();
 
    	marketingWallet = 0x1BbF2E04525bc8304a5CfcCBABB680d9944a4D79;
    	greenDividendToken = 0x8A4001fD666BE272605c56BB956d11A46200Db81;
        wmaticDividendToken = 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270;
 
    	//0xbdd4e5660839a088573191A9889A262c0Efc0983 Quickswap Mumbai Testnet
    	//0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff Quickswap Mainet V2
    	
    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
         // Create a quickswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
 
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
 
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);
 
        excludeFromDividend(address(greenDividendTracker));
        excludeFromDividend(address(wmaticDividendTracker));
        excludeFromDividend(address(this));
        excludeFromDividend(address(_uniswapV2Router));
        excludeFromDividend(deadAddress);
 
        // exclude from paying fees or having max transaction amount
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(deadAddress, true);
        excludeFromFees(owner(), true);
 
        setAuthOnDividends(owner());
 
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 108000000000 * (10**18));
    }
 
    receive() external payable {
 
  	}
 
  	function whitelistDxSale(address _presaleAddress, address _routerAddress) external onlyOwner {
  	    presaleAddress = _presaleAddress;
        greenDividendTracker.excludeFromDividends(_presaleAddress);
        wmaticDividendTracker.excludeFromDividends(_presaleAddress);
        excludeFromFees(_presaleAddress, true);
 
        greenDividendTracker.excludeFromDividends(_routerAddress);
        wmaticDividendTracker.excludeFromDividends(_routerAddress);
        excludeFromFees(_routerAddress, true);
  	}
 
  	function prepareForPartherOrExchangeListing(address _partnerOrExchangeAddress) external onlyOwner {
  	    greenDividendTracker.excludeFromDividends(_partnerOrExchangeAddress);
        wmaticDividendTracker.excludeFromDividends(_partnerOrExchangeAddress);
        excludeFromFees(_partnerOrExchangeAddress, true);
  	}
 
  	function setWalletBalance(uint256 _maxWalletBalance) external onlyOwner{
  	    maxWalletBalance = _maxWalletBalance;
  	}
 
  	function updateGreenDividendToken(address _newContract) external onlyOwner {
  	    greenDividendToken = _newContract;
  	    greenDividendTracker.setDividendTokenAddress(_newContract);
  	}
 
  	function updateWmaticDividendToken(address _newContract) external onlyOwner {
  	    wmaticDividendToken = _newContract;
  	    wmaticDividendTracker.setDividendTokenAddress(_newContract);
  	}
 
  	function updateMarketingWallet(address _newWallet) external onlyOwner {
  	    require(_newWallet != marketingWallet, "GrandpaGreen: The marketing wallet is already this address");
        excludeFromFees(_newWallet, true);
        emit MarketingWalletUpdated(marketingWallet, _newWallet);
  	    marketingWallet = _newWallet;
  	}
 
  	function setSwapTokensAtAmount(uint256 _swapAmount) external onlyOwner {
  	    swapTokensAtAmount = _swapAmount * (10**18);
  	}
 
  	function setSellTransactionMultiplier(uint256 _multiplier) external onlyOwner {
  	    sellFeeIncreaseFactor = _multiplier;
  	}
 
 
    function setAuthOnDividends(address account) public onlyOwner{
        wmaticDividendTracker.setAuth(account);
        greenDividendTracker.setAuth(account);
    }
    
    function setLockTilStartEnabled(bool _enabled) external onlyOwner {
        if (lockUsed == false){
            lockTilStart = _enabled;
            lockUsed = true;
        }
        else{
            lockTilStart = false;
        }
        emit LockTilStartUpdated(lockTilStart);
    }
 
 
    function setGreenDividendEnabled(bool _enabled) external onlyOwner {
        require(greenDividendEnabled != _enabled, "Can't set flag to same status");
        if (_enabled == false) {
            previousGreenDividendRewardsFee = greenDividendRewardsFee;
            greenDividendRewardsFee = 0;
            greenDividendEnabled = _enabled;
        } else {
            greenDividendRewardsFee = previousGreenDividendRewardsFee;
            totalFees = greenDividendRewardsFee.add(marketingFee).add(wmaticDividendRewardsFee).add(liquidityFee);
            greenDividendEnabled = _enabled;
        }
 
        emit GreenDividendEnabledUpdated(_enabled);
    }
 
    function setWmaticDividendEnabled(bool _enabled) external onlyOwner {
        require(wmaticDividendEnabled != _enabled, "Can't set flag to same status");
        if (_enabled == false) {
            previousWmaticDividendRewardsFee = wmaticDividendRewardsFee;
            wmaticDividendRewardsFee = 0;
            wmaticDividendEnabled = _enabled;
        } else {
            wmaticDividendRewardsFee = previousWmaticDividendRewardsFee;
            totalFees = wmaticDividendRewardsFee.add(marketingFee).add(greenDividendRewardsFee).add(liquidityFee);
            wmaticDividendEnabled = _enabled;
        }
 
        emit WmaticDividendEnabledUpdated(_enabled);
    }
 
    function setMarketingEnabled(bool _enabled) external onlyOwner {
        require(marketingEnabled != _enabled, "Can't set flag to same status");
        if (_enabled == false) {
            previousMarketingFee = marketingFee;
            marketingFee = 0;
            marketingEnabled = _enabled;
        } else {
            marketingFee = previousMarketingFee;
            totalFees = marketingFee.add(wmaticDividendRewardsFee).add(greenDividendRewardsFee).add(liquidityFee);
            marketingEnabled = _enabled;
        }
 
        emit MarketingEnabledUpdated(_enabled);
    }
 
    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        require(swapAndLiquifyEnabled != _enabled, "Can't set flag to same status");
        if (_enabled == false) {
            previousLiquidityFee = liquidityFee;
            liquidityFee = 0;
            swapAndLiquifyEnabled = _enabled;
        } else {
            liquidityFee = previousLiquidityFee;
            totalFees = wmaticDividendRewardsFee.add(marketingFee).add(greenDividendRewardsFee).add(liquidityFee);
            swapAndLiquifyEnabled = _enabled;
        }
 
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
 
 
    function updategreenDividendTracker(address newAddress) external onlyOwner {
        require(newAddress != address(greenDividendTracker), "GrandpaGreen: The dividend tracker already has that address");
 
        GREENDividendTracker newgreenDividendTracker = GREENDividendTracker(payable(newAddress));
 
        require(newgreenDividendTracker.owner() == address(this), "GrandpaGreen: The new dividend tracker must be owned by the GrandpaGreen token contract");
 
        newgreenDividendTracker.excludeFromDividends(address(newgreenDividendTracker));
        newgreenDividendTracker.excludeFromDividends(address(this));
        newgreenDividendTracker.excludeFromDividends(address(uniswapV2Router));
        newgreenDividendTracker.excludeFromDividends(address(deadAddress));
 
        emit UpdategreenDividendTracker(newAddress, address(greenDividendTracker));
 
        greenDividendTracker = newgreenDividendTracker;
    }
 
    function updatewmaticDividendTracker(address newAddress) external onlyOwner {
        require(newAddress != address(wmaticDividendTracker), "GrandpaGreen: The dividend tracker already has that address");
 
        WMATICDividendTracker newwmaticDividendTracker = WMATICDividendTracker(payable(newAddress));
 
        require(newwmaticDividendTracker.owner() == address(this), "GrandpaGreen: The new dividend tracker must be owned by the GrandpaGreen token contract");
 
        newwmaticDividendTracker.excludeFromDividends(address(newwmaticDividendTracker));
        newwmaticDividendTracker.excludeFromDividends(address(this));
        newwmaticDividendTracker.excludeFromDividends(address(uniswapV2Router));
        newwmaticDividendTracker.excludeFromDividends(address(deadAddress));
 
        emit UpdatewmaticDividendTracker(newAddress, address(wmaticDividendTracker));
 
        wmaticDividendTracker = newwmaticDividendTracker;
    }
 
    function updateGreenDividendRewardFee(uint8 newFee) external onlyOwner {
        greenDividendRewardsFee = newFee;
        totalFees = greenDividendRewardsFee.add(marketingFee).add(wmaticDividendRewardsFee).add(liquidityFee);
    }
 
    function updateWmaticDividendRewardFee(uint8 newFee) external onlyOwner {
        wmaticDividendRewardsFee = newFee;
        totalFees = wmaticDividendRewardsFee.add(greenDividendRewardsFee).add(marketingFee).add(liquidityFee);
    }
 
    function updateMarketingFee(uint8 newFee) external onlyOwner {
        marketingFee = newFee;
        totalFees = marketingFee.add(greenDividendRewardsFee).add(wmaticDividendRewardsFee).add(liquidityFee);
    }
 
    function updateLiquidityFee(uint8 newFee) external onlyOwner {
        liquidityFee = newFee;
        totalFees = marketingFee.add(greenDividendRewardsFee).add(wmaticDividendRewardsFee).add(liquidityFee);
    }
 
    function updateUniswapV2Router(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "GrandpaGreen: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }
 
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(isExcludedFromFees[account] != excluded, "GrandpaGreen: Account is already exluded from fees");
        isExcludedFromFees[account] = excluded;
 
        emit ExcludeFromFees(account, excluded);
    }
 
    function excludeFromDividend(address account) public onlyOwner {
        greenDividendTracker.excludeFromDividends(address(account));
        wmaticDividendTracker.excludeFromDividends(address(account));
    }
 
    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            isExcludedFromFees[accounts[i]] = excluded;
        }
 
        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }
 
    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "GrandpaGreen: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");
 
        _setAutomatedMarketMakerPair(pair, value);
    }
 
    function _setAutomatedMarketMakerPair(address pair, bool value) private onlyOwner {
        require(automatedMarketMakerPairs[pair] != value, "GrandpaGreen: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
 
        if(value) {
            greenDividendTracker.excludeFromDividends(pair);
            wmaticDividendTracker.excludeFromDividends(pair);
        }
 
        emit SetAutomatedMarketMakerPair(pair, value);
    }
 
    function updateGasForProcessing(uint256 newValue) external onlyOwner {
        require(newValue != gasForProcessing, "GrandpaGreen: Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
        emit GasForProcessingUpdated(newValue, gasForProcessing);
    }
 
    function updateMinimumBalanceForDividends(uint256 newMinimumBalance) external onlyOwner {
        greenDividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance);
        wmaticDividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance);
    }
 
    function updateClaimWait(uint256 claimWait) external onlyOwner {
        greenDividendTracker.updateClaimWait(claimWait);
        wmaticDividendTracker.updateClaimWait(claimWait);
    }
 
    function getGreenClaimWait() external view returns(uint256) {
        return greenDividendTracker.claimWait();
    }
 
    function getWmaticClaimWait() external view returns(uint256) {
        return wmaticDividendTracker.claimWait();
    }
 
    function getTotalGreenDividendsDistributed() external view returns (uint256) {
        return greenDividendTracker.totalDividendsDistributed();
    }
 
    function getTotalWmaticDividendsDistributed() external view returns (uint256) {
        return wmaticDividendTracker.totalDividendsDistributed();
    }
 
    function getIsExcludedFromFees(address account) public view returns(bool) {
        return isExcludedFromFees[account];
    }
 
    function withdrawableGreenDividendOf(address account) external view returns(uint256) {
    	return greenDividendTracker.withdrawableDividendOf(account);
  	}
 
  	function withdrawableWmaticDividendOf(address account) external view returns(uint256) {
    	return wmaticDividendTracker.withdrawableDividendOf(account);
  	}
 
	function greenDividendTokenBalanceOf(address account) external view returns (uint256) {
		return greenDividendTracker.balanceOf(account);
	}
 
	function wmaticDividendTokenBalanceOf(address account) external view returns (uint256) {
		return wmaticDividendTracker.balanceOf(account);
	}
 
    function getAccountGreenDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return greenDividendTracker.getAccount(account);
    }
 
    function getAccountWmaticDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return wmaticDividendTracker.getAccount(account);
    }
 
	function getAccountGreenDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return greenDividendTracker.getAccountAtIndex(index);
    }
 
    function getAccountWmaticDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return wmaticDividendTracker.getAccountAtIndex(index);
    }
 
	function processDividendTracker(uint256 gas) external onlyOwner {
		(uint256 GreenIterations, uint256 GreenClaims, uint256 GreenLastProcessedIndex) = greenDividendTracker.process(gas);
		emit ProcessedgreenDividendTracker(GreenIterations, GreenClaims, GreenLastProcessedIndex, false, gas, tx.origin);
 
		(uint256 wmaticIterations, uint256 wmaticClaims, uint256 wmaticLastProcessedIndex) = wmaticDividendTracker.process(gas);
		emit ProcessedwmaticDividendTracker(wmaticIterations, wmaticClaims, wmaticLastProcessedIndex, false, gas, tx.origin);
    }
 
    function claim() external {
		greenDividendTracker.processAccount(payable(msg.sender), false);
		wmaticDividendTracker.processAccount(payable(msg.sender), false);
    }
    function getLastGreenDividendProcessedIndex() external view returns(uint256) {
    	return greenDividendTracker.getLastProcessedIndex();
    }
 
    function getLastWmaticDividendProcessedIndex() external view returns(uint256) {
    	return wmaticDividendTracker.getLastProcessedIndex();
    }
 
    function getNumberOfGreenDividendTokenHolders() external view returns(uint256) {
        return greenDividendTracker.getNumberOfTokenHolders();
    }
 
    function getNumberOfWmaticDividendTokenHolders() external view returns(uint256) {
        return wmaticDividendTracker.getNumberOfTokenHolders();
    }
 
    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");
        require(lockTilStart != true || from == owner());
 
        bool excludedAccount = isExcludedFromFees[from] || isExcludedFromFees[to];
        
        if (to != address(0) && to != address(0xdead) && from != address(this) && to != address(this)) {
            if (from == uniswapV2Pair) {
                require(balanceOf(to).add(amount) <= maxWalletBalance, "Exceeds maximum wallet token amount.");
            }
        }
 
 
        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
 
        if (!swapping && canSwap && from != uniswapV2Pair) {
            swapping = true;
 
            if (marketingEnabled) {
                uint256 initialBalance = address(this).balance;
                uint256 swapTokens = contractTokenBalance.div(totalFees).mul(marketingFee);
                swapTokensForMATIC(swapTokens);
                uint256 marketingPortion = address(this).balance.sub(initialBalance);
                transferToWallet(payable(marketingWallet), marketingPortion);
                
            }
 
            if(swapAndLiquifyEnabled) {
                uint256 liqTokens = contractTokenBalance.div(totalFees).mul(liquidityFee);
                swapAndLiquify(liqTokens);
            }
 
            if (greenDividendEnabled) {
                uint256 GreenTokens = contractTokenBalance.div(totalFees).mul(greenDividendRewardsFee);
                swapAndSendGreenDividends(GreenTokens);
            }
 
            if (wmaticDividendEnabled) {
                uint256 wmaticTokens = contractTokenBalance.div(totalFees).mul(wmaticDividendRewardsFee);
                swapAndSendWmaticDividends(wmaticTokens);
            }
 
                swapping = false;
        }
 
        bool takeFee =  !swapping && !excludedAccount;
 
        if(takeFee) {
        	uint256 fees = amount.div(100).mul(totalFees);
 
            // if sell, multiply by 1.2
            if(automatedMarketMakerPairs[to]) {
                fees = fees.div(100).mul(sellFeeIncreaseFactor);
            }
 
        	amount = amount.sub(fees);
 
            super._transfer(from, address(this), fees);
        }
 
        super._transfer(from, to, amount);
 
        try greenDividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try wmaticDividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try greenDividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
        try wmaticDividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
 
        if(!swapping) {
	    	uint256 gas = gasForProcessing;
 
	    	try greenDividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
	    		emit ProcessedgreenDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
	    	}
	    	catch {
 
	    	}
 
	    	try wmaticDividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
	    		emit ProcessedwmaticDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
	    	}
	    	catch {
 
	    	}
        }
    }
 
 
    function swapAndLiquify(uint256 contractTokenBalance) private {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);
 
        uint256 initialBalance = address(this).balance;
 
        swapTokensForMATIC(half);
 
        uint256 newBalance = address(this).balance.sub(initialBalance);
 
        addLiquidity(otherHalf, newBalance);
 
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }
 
    function addLiquidity(uint256 tokenAmount, uint256 maticAmount) private {
 
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);
 
        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: maticAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            marketingWallet,
            block.timestamp
        );
    }
 
 
    function swapTokensForMATIC(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
 
        _approve(address(this), address(uniswapV2Router), tokenAmount);
 
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
 
    }
 
    function swapTokensForDividendToken(uint256 _tokenAmount, address _recipient, address _dividendAddress) private {
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        path[2] = _dividendAddress;
 
        _approve(address(this), address(uniswapV2Router), _tokenAmount);
 
        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            _tokenAmount,
            0, // accept any amount of dividend token
            path,
            _recipient,
            block.timestamp
        );
    }
 
    function swapAndSendGreenDividends(uint256 tokens) private {
        swapTokensForDividendToken(tokens, address(this), greenDividendToken);
        uint256 greenDividends = IERC20(greenDividendToken).balanceOf(address(this));
        transferDividends(greenDividendToken, address(greenDividendTracker), greenDividendTracker, greenDividends);
    }
 
    function swapAndSendWmaticDividends(uint256 tokens) private {
        swapTokensForDividendToken(tokens, address(this), wmaticDividendToken);
        uint256 wmaticDividends = IERC20(wmaticDividendToken).balanceOf(address(this));
        transferDividends(wmaticDividendToken, address(wmaticDividendTracker), wmaticDividendTracker, wmaticDividends);
    }
 
    function transferToWallet(address payable recipient, uint256 amount) private {
        uint256 mktng = amount;
        recipient.transfer(mktng);
    }
 
    function transferDividends(address dividendToken, address dividendTracker, DividendPayingToken dividendPayingTracker, uint256 amount) private {
        bool success = IERC20(dividendToken).transfer(dividendTracker, amount);
 
        if (success) {
            dividendPayingTracker.distributeDividends(amount);
            emit SendDividends(amount);
        }
    }
}
 
contract GREENDividendTracker is DividendPayingToken, Ownable {
    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 ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
 
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
 
    constructor() DividendPayingToken("GrandpaGreen_Green_Dividend_Tracker", "GrandpaGreen_Green_Dividend_Tracker", 0x8A4001fD666BE272605c56BB956d11A46200Db81) {
    	claimWait = 1800;
        minimumTokenBalanceForDividends = 1000 * (10**18); //must hold 1000+ tokens
    }
 
    function _transfer(address, address, uint256) pure internal override {
        require(false, "GrandpaGreen_Green_Dividend_Tracker: No transfers allowed");
    }
 
    function withdrawDividend() pure public override {
        require(false, "GrandpaGreen_Green_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main GrandpaGreen contract.");
    }
 
    function setDividendTokenAddress(address newToken) external override onlyOwner {
      dividendToken = newToken;
    }
 
    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance");
        minimumTokenBalanceForDividends = _newMinimumBalance * (10**18);
    }
 
    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account]);
    	excludedFromDividends[account] = true;
 
    	_setBalance(account, 0);
    	tokenHoldersMap.remove(account);
 
    	emit ExcludeFromDividends(account);
    }
 
    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1800 && newClaimWait <= 86400, "GrandpaGreen_Green_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "GrandpaGreen_Green_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }
 
    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }
 
    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }
 
 
    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;
 
        index = tokenHoldersMap.getIndexOfKey(account);
 
        iterationsUntilProcessed = -1;
 
        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;
 
 
                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }
 
 
        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);
 
        lastClaimTime = lastClaimTimes[account];
 
        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;
 
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }
 
    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }
 
        address account = tokenHoldersMap.getKeyAtIndex(index);
 
        return getAccount(account);
    }
 
    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 WMATICDividendTracker is DividendPayingToken, Ownable {
    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 ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
 
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
 
    constructor() DividendPayingToken("GrandpaGreen_Wmatic_Dividend_Tracker", "GrandpaGreen_Wmatic_Dividend_Tracker", 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270) {
    	claimWait = 1800;
        minimumTokenBalanceForDividends = 100000 * (10**18); //must hold 100000+ tokens
    }
 
    function _transfer(address, address, uint256) pure internal override {
        require(false, "GrandpaGreen_Wmatic_Dividend_Tracker: No transfers allowed");
    }
 
    function withdrawDividend() pure public override {
        require(false, "GrandpaGreen_Wmatic_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main GrandpaGreen contract.");
    }
 
    function setDividendTokenAddress(address newToken) external override onlyOwner {
      dividendToken = newToken;
    }
 
    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance");
        minimumTokenBalanceForDividends = _newMinimumBalance * (10**18);
    }
 
    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account]);
    	excludedFromDividends[account] = true;
 
    	_setBalance(account, 0);
    	tokenHoldersMap.remove(account);
 
    	emit ExcludeFromDividends(account);
    }
 
    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1800 && newClaimWait <= 86400, "GrandpaGreen_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "GrandpaGreen_Wmatic_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }
 
    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }
 
    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }
 
 
    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;
 
        index = tokenHoldersMap.getIndexOfKey(account);
 
        iterationsUntilProcessed = -1;
 
        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;
 
 
                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }
 
 
        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);
 
        lastClaimTime = lastClaimTimes[account];
 
        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;
 
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }
 
    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }
 
        address account = tokenHoldersMap.getKeyAtIndex(index);
 
        return getAccount(account);
    }
 
    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":"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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"GreenDividendEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"LockTilStartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"MarketingEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","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":"ProcessedgreenDividendTracker","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":"ProcessedwmaticDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maticReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdategreenDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdatewmaticDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"WmaticDividendEnabledUpdated","type":"event"},{"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":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividend","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":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountGreenDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountGreenDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountWmaticDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountWmaticDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGreenClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getIsExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastGreenDividendProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastWmaticDividendProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfGreenDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfWmaticDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalGreenDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalWmaticDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWmaticClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"greenDividendEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"greenDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"greenDividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"greenDividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"greenDividendTracker","outputs":[{"internalType":"contract GREENDividendTracker","name":"","type":"address"}],"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":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTilStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_partnerOrExchangeAddress","type":"address"}],"name":"prepareForPartherOrExchangeListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousGreenDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousWmaticDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setAuthOnDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setGreenDividendEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLockTilStartEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setMarketingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_multiplier","type":"uint256"}],"name":"setSellTransactionMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletBalance","type":"uint256"}],"name":"setWalletBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setWmaticDividendEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateGreenDividendRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContract","type":"address"}],"name":"updateGreenDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumBalance","type":"uint256"}],"name":"updateMinimumBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"updateWmaticDividendRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContract","type":"address"}],"name":"updateWmaticDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updategreenDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updatewmaticDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"whitelistDxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableGreenDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableWmaticDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wmaticDividendEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wmaticDividendRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wmaticDividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"wmaticDividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wmaticDividendTracker","outputs":[{"internalType":"contract WMATICDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526009805479010101010100000000000000000000000000000000000000dead7fffffffffff000000000000ff00000000000000000000000000000000000000009091161790556b06765c793fa10079d0000000600d556b019d971e4fe8401e74000000600e556002600f8190556004601181905560138190556015829055620000b69190620000a29081818462000584602090811b620034cb17901c565b6200058460201b620034cb1790919060201c565b601755609660185561c350601955348015620000d157600080fd5b50604080518082018252600c81526b23b930b7323830a3b932b2b760a11b60208083019182528351808501909452600684526523a3a922a2a760d11b908401528151919291620001249160039162000c4a565b5080516200013a90600490602084019062000c4a565b50506005805460ff19166012179055506000620001543390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604051620001b89062000cd9565b604051809103906000f080158015620001d5573d6000803e3d6000fd5b50600a80546001600160a01b0319166001600160a01b0392909216919091179055604051620002049062000ce7565b604051809103906000f08015801562000221573d6000803e3d6000fd5b50600b80546001600160a01b03929092166001600160a01b0319928316179055600c80548216731bbf2e04525bc8304a5cfccbabb680d9944a4d79179055600780548216738a4001fd666be272605c56bb956d11a46200db8117905560088054909116730d500b1d8e8ef31e21c99d1db9a6444d3adf12701790556040805163c45a015560e01b8152905173a5e0829caced8ffdd4de3c43696c57f7d7a678ff91600091839163c45a0155916004828101926020929190829003018186803b158015620002ed57600080fd5b505afa15801562000302573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000328919062000d0c565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200037157600080fd5b505afa15801562000386573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ac919062000d0c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620003f557600080fd5b505af11580156200040a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000430919062000d0c565b600680546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b03191660805290506200046c816001620005f2565b600a5462000483906001600160a01b031662000816565b600b546200049a906001600160a01b031662000816565b620004a53062000816565b620004b08262000816565b600954620004c7906001600160a01b031662000816565b600c54620004e0906001600160a01b031660016200092d565b620004ed3060016200092d565b60095462000506906001600160a01b031660016200092d565b6200052a6200052260055461010090046001600160a01b031690565b60016200092d565b6200054c6200054660055461010090046001600160a01b031690565b62000a69565b6200057c6200056860055461010090046001600160a01b031690565b6c015cf781936bf619b1e000000062000b4e565b505062000d97565b60008062000593838562000d35565b905083811015620005eb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6005546001600160a01b03610100909104163314620006435760405162461bcd60e51b815260206004820181905260248201526000805160206200a6d78339815191526044820152606401620005e2565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415620006e95760405162461bcd60e51b815260206004820152604660248201527f4772616e647061477265656e3a204175746f6d61746564206d61726b6574206d60448201527f616b6572207061697220697320616c72656164792073657420746f20746861746064820152652076616c756560d01b608482015260a401620005e2565b6001600160a01b0382166000908152601c60205260409020805460ff19168215801591909117909155620007da57600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200075f57600080fd5b505af115801562000774573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620007c057600080fd5b505af1158015620007d5573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620008675760405162461bcd60e51b815260206004820181905260248201526000805160206200a6d78339815191526044820152606401620005e2565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015620008af57600080fd5b505af1158015620008c4573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db091506024015b600060405180830381600087803b1580156200091157600080fd5b505af115801562000926573d6000803e3d6000fd5b5050505050565b6005546001600160a01b036101009091041633146200097e5760405162461bcd60e51b815260206004820181905260248201526000805160206200a6d78339815191526044820152606401620005e2565b6001600160a01b0382166000908152601b602052604090205460ff161515811515141562000a0a5760405162461bcd60e51b815260206004820152603260248201527f4772616e647061477265656e3a204163636f756e7420697320616c72656164796044820152712065786c756465642066726f6d206665657360701b6064820152608401620005e2565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0361010090910416331462000aba5760405162461bcd60e51b815260206004820181905260248201526000805160206200a6d78339815191526044820152606401620005e2565b600b54604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c190602401600060405180830381600087803b15801562000b0257600080fd5b505af115801562000b17573d6000803e3d6000fd5b5050600a54604051632b2e05c160e01b81526001600160a01b0385811660048301529091169250632b2e05c19150602401620008f6565b6001600160a01b03821662000ba65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005e2565b62000bc2816002546200058460201b620034cb1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000bf5918390620034cb62000584821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000c589062000d5a565b90600052602060002090601f01602090048101928262000c7c576000855562000cc7565b82601f1062000c9757805160ff191683800117855562000cc7565b8280016001018555821562000cc7579182015b8281111562000cc757825182559160200191906001019062000caa565b5062000cd592915062000cf5565b5090565b6124038062005eb183390190565b61242380620082b483390190565b5b8082111562000cd5576000815560010162000cf6565b60006020828403121562000d1e578081fd5b81516001600160a01b0381168114620005eb578182fd5b6000821982111562000d5557634e487b7160e01b81526011600452602481fd5b500190565b600181811c9082168062000d6f57607f821691505b6020821081141562000d9157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c6150e662000dcb600039600081816108f60152818161275e01528181613770015261384701526150e66000f3fe6080604052600436106104e45760003560e01c8063700bb19111610281578063a87a1edb1161015a578063c49b9a80116100cc578063e2f4560511610085578063e2f4560514610f65578063e84d44f814610f7b578063e98030c714610f9c578063f2fde38b14610fbc578063fb7f634a14610fdc578063fc5bedbe14610ffc57600080fd5b8063c49b9a8014610e8a578063c6de960514610eaa578063c8fae29614610eca578063d46d9ba114610edf578063d830652114610eff578063dd62ed3e14610f1f57600080fd5b8063b62496f51161011e578063b62496f514610dcf578063baa1126014610dff578063bbde77c114610e14578063c024666814610e2a578063c1f067aa14610e4a578063c492f04614610e6a57600080fd5b8063a87a1edb14610d2f578063a9059cbb14610d4f578063aacebbe314610d6f578063afa4f3b214610d8f578063b13f725d14610daf57600080fd5b80638da5cb5b116101f357806398118cb4116101b757806398118cb414610c825780639a7a23d614610c985780639acb591114610cb85780639c1b8af514610cd9578063a3e36fd114610cef578063a457c2d714610d0f57600080fd5b80638da5cb5b14610bf55780638e448b6214610c1857806395d89b4114610c3857806397a0d5f514610c4d57806397b0a85b14610c6d57600080fd5b80637e2dde98116102455780637e2dde9814610b35578063871c128d14610b555780638820198f14610b755780638864aa4014610b955780638c3ecd6014610bb55780638ce55e9814610bd557600080fd5b8063700bb19114610a8757806370a0823114610aa7578063715018a614610ac757806375f0a87414610adc5780637b16cea014610afc57600080fd5b80633003386e116103be5780634afb66941161033057806355a77f5f116102e957806355a77f5f146109e45780635a233a4914610a045780635fd65fea14610a2557806365b8dbc014610a3b5780636b67c4df14610a5b5780636fb66ff914610a7157600080fd5b80634afb6694146109395780634b307c501461094e5780634e71d92d1461096f5780634e83ff6f146109845780634fd0dc24146109a45780635346fa9b146109c457600080fd5b806336dc5c2a1161038257806336dc5c2a1461086e57806339509351146108845780633b364da8146108a457806340659b0d146108c457806349bd5a5e146108e45780634a74bb021461091857600080fd5b80633003386e146107d6578063313ce567146107eb578063331f9fa81461080d57806333d015861461082e5780633695ae6c1461084e57600080fd5b806318160ddd11610457578063234616701161041b578063234616701461073557806323b872dd1461074b578063245618b41461076b578063263b5fcb1461078057806327c8f835146107a05780632fdc1cf1146107c057600080fd5b806318160ddd14610670578063182db05e1461068557806318830e0b146106ea5780631b9c64b51461070a57806322bd3f7f1461071f57600080fd5b8063122fe685116104a9578063122fe685146105a25780631260d5ab146105da578063127b9ffb146105fa57806313114a9d1461061a5780631519f1f0146106305780631694505e1461065057600080fd5b806292cbbb146104f057806302f37afd1461051857806306fdde031461052e578063095ea7b3146105505780631129e65b1461058057600080fd5b366104eb57005b600080fd5b3480156104fc57600080fd5b5061050561101c565b6040519081526020015b60405180910390f35b34801561052457600080fd5b5061050560125481565b34801561053a57600080fd5b5061054361109e565b60405161050f9190614ca9565b34801561055c57600080fd5b5061057061056b366004614aee565b611130565b604051901515815260200161050f565b34801561058c57600080fd5b506105a061059b3660046149a8565b611147565b005b3480156105ae57600080fd5b50601a546105c2906001600160a01b031681565b6040516001600160a01b03909116815260200161050f565b3480156105e657600080fd5b506105a06105f53660046149a8565b61124c565b34801561060657600080fd5b506008546105c2906001600160a01b031681565b34801561062657600080fd5b5061050560175481565b34801561063c57600080fd5b506105a061064b366004614c2f565b6112f6565b34801561065c57600080fd5b506006546105c2906001600160a01b031681565b34801561067c57600080fd5b50600254610505565b34801561069157600080fd5b506106a56106a0366004614bd2565b61135f565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161050f565b3480156106f657600080fd5b506105a0610705366004614b9a565b611409565b34801561071657600080fd5b506105056114ca565b34801561072b57600080fd5b5061050560185481565b34801561074157600080fd5b5061050560115481565b34801561075757600080fd5b50610570610766366004614a18565b61150f565b34801561077757600080fd5b50610505611578565b34801561078c57600080fd5b506105a061079b366004614b9a565b6115bd565b3480156107ac57600080fd5b506009546105c2906001600160a01b031681565b3480156107cc57600080fd5b5061050560105481565b3480156107e257600080fd5b506105056116b9565b3480156107f757600080fd5b5060055460405160ff909116815260200161050f565b34801561081957600080fd5b5060095461057090600160c01b900460ff1681565b34801561083a57600080fd5b506105a06108493660046149a8565b6116fe565b34801561085a57600080fd5b506106a56108693660046149a8565b6117bf565b34801561087a57600080fd5b5061050560135481565b34801561089057600080fd5b5061057061089f366004614aee565b611801565b3480156108b057600080fd5b506105a06108bf366004614bd2565b611837565b3480156108d057600080fd5b506105a06108df3660046149a8565b6118f6565b3480156108f057600080fd5b506105c27f000000000000000000000000000000000000000000000000000000000000000081565b34801561092457600080fd5b5060095461057090600160b01b900460ff1681565b34801561094557600080fd5b50610505611bca565b34801561095a57600080fd5b5060095461057090600160c81b900460ff1681565b34801561097b57600080fd5b506105a0611c0f565b34801561099057600080fd5b506105a061099f3660046149e0565b611d18565b3480156109b057600080fd5b506105a06109bf366004614bd2565b611ef5565b3480156109d057600080fd5b506105a06109df366004614c2f565b611f2a565b3480156109f057600080fd5b506105a06109ff3660046149a8565b611f7d565b348015610a1057600080fd5b5060095461057090600160d01b900460ff1681565b348015610a3157600080fd5b5061050560165481565b348015610a4757600080fd5b506105a0610a563660046149a8565b611ff6565b348015610a6757600080fd5b5061050560155481565b348015610a7d57600080fd5b5061050560145481565b348015610a9357600080fd5b506105a0610aa2366004614bd2565b6120fb565b348015610ab357600080fd5b50610505610ac23660046149a8565b6122ea565b348015610ad357600080fd5b506105a0612305565b348015610ae857600080fd5b50600c546105c2906001600160a01b031681565b348015610b0857600080fd5b50610570610b173660046149a8565b6001600160a01b03166000908152601b602052604090205460ff1690565b348015610b4157600080fd5b50610505610b503660046149a8565b612385565b348015610b6157600080fd5b506105a0610b70366004614bd2565b612404565b348015610b8157600080fd5b50600b546105c2906001600160a01b031681565b348015610ba157600080fd5b50610505610bb03660046149a8565b6124e1565b348015610bc157600080fd5b50610505610bd03660046149a8565b612514565b348015610be157600080fd5b506105a0610bf0366004614b9a565b612547565b348015610c0157600080fd5b5060055461010090046001600160a01b03166105c2565b348015610c2457600080fd5b506105a0610c33366004614c2f565b612643565b348015610c4457600080fd5b50610543612696565b348015610c5957600080fd5b506106a5610c683660046149a8565b6126a5565b348015610c7957600080fd5b506105056126e7565b348015610c8e57600080fd5b50610505600f5481565b348015610ca457600080fd5b506105a0610cb3366004614a58565b61272c565b348015610cc457600080fd5b5060095461057090600160b81b900460ff1681565b348015610ce557600080fd5b5061050560195481565b348015610cfb57600080fd5b506105a0610d0a366004614b9a565b61282a565b348015610d1b57600080fd5b50610570610d2a366004614aee565b612926565b348015610d3b57600080fd5b506106a5610d4a366004614bd2565b612975565b348015610d5b57600080fd5b50610570610d6a366004614aee565b6129b7565b348015610d7b57600080fd5b506105a0610d8a3660046149a8565b6129c4565b348015610d9b57600080fd5b506105a0610daa366004614bd2565b612adf565b348015610dbb57600080fd5b506105a0610dca3660046149a8565b612b27565b348015610ddb57600080fd5b50610570610dea3660046149a8565b601c6020526000908152604090205460ff1681565b348015610e0b57600080fd5b50610505612be8565b348015610e2057600080fd5b50610505600d5481565b348015610e3657600080fd5b506105a0610e45366004614a58565b612c2d565b348015610e5657600080fd5b50610505610e653660046149a8565b612d46565b348015610e7657600080fd5b506105a0610e85366004614b19565b612d79565b348015610e9657600080fd5b506105a0610ea5366004614b9a565b612e69565b348015610eb657600080fd5b50600a546105c2906001600160a01b031681565b348015610ed657600080fd5b50610505612f6f565b348015610eeb57600080fd5b506105a0610efa366004614c2f565b612fb4565b348015610f0b57600080fd5b506007546105c2906001600160a01b031681565b348015610f2b57600080fd5b50610505610f3a3660046149e0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f7157600080fd5b50610505600e5481565b348015610f8757600080fd5b5060095461057090600160a81b900460ff1681565b348015610fa857600080fd5b506105a0610fb7366004614bd2565b613007565b348015610fc857600080fd5b506105a0610fd73660046149a8565b6130c6565b348015610fe857600080fd5b506105a0610ff7366004614bd2565b6131c2565b34801561100857600080fd5b506105a06110173660046149a8565b6131f7565b600a54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561106157600080fd5b505afa158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190614bea565b905090565b6060600380546110ad90614fae565b80601f01602080910402602001604051908101604052809291908181526020018280546110d990614fae565b80156111265780601f106110fb57610100808354040283529160200191611126565b820191906000526020600020905b81548152906001019060200180831161110957829003601f168201915b5050505050905090565b600061113d338484613531565b5060015b92915050565b6005546001600160a01b036101009091041633146111805760405162461bcd60e51b815260040161117790614dd3565b60405180910390fd5b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156111c757600080fd5b505af11580156111db573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b15801561122657600080fd5b505af115801561123a573d6000803e3d6000fd5b50505050611249816001612c2d565b50565b6005546001600160a01b0361010090910416331461127c5760405162461bcd60e51b815260040161117790614dd3565b600880546001600160a01b0319166001600160a01b03838116918217909255600b54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024015b600060405180830381600087803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b5050505050565b6005546001600160a01b036101009091041633146113265760405162461bcd60e51b815260040161117790614dd3565b8060ff16600f81905550611359600f546113536013546113536011546015546134cb90919063ffffffff16565b906134cb565b60175550565b600b54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024015b6101006040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ee9190614a85565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b036101009091041633146114395760405162461bcd60e51b815260040161117790614dd3565b600954600160d01b900460ff16611476576009805460ff60d01b19831515600160c81b021661ffff60c81b1990911617600160d01b179055611484565b6009805460ff60c81b191690555b600954604051600160c81b90910460ff16151581527f2b27db57e94e474754b17ad26b358efda13cbcf4a9bbbc7ec92de2926a941f34906020015b60405180910390a150565b600b546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561106157600080fd5b600061151c848484613656565b61156e843361156985604051806060016040528060288152602001615064602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613de9565b613531565b5060019392505050565b600a546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b036101009091041633146115ed5760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160a81b909104161515811515141561161e5760405162461bcd60e51b815260040161117790614d9c565b8061164a5760158054601655600090556009805460ff60a81b1916600160a81b83151502179055611687565b6016546015819055600f5460115460135461166c9361135392918391906134cb565b6017556009805460ff60a81b1916600160a81b831515021790555b60405181151581527f6ba6c1012539169f5a820a29533d8c8b797a1c7a5634edbd3124a80de0e75cba906020016114bf565b600a54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b0361010090910416331461172e5760405162461bcd60e51b815260040161117790614dd3565b600b54604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c190602401600060405180830381600087803b15801561177557600080fd5b505af1158015611789573d6000803e3d6000fd5b5050600a54604051632b2e05c160e01b81526001600160a01b0385811660048301529091169250632b2e05c191506024016112c1565b600a5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161139d565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161113d91859061156990866134cb565b6005546001600160a01b036101009091041633146118675760405162461bcd60e51b815260040161117790614dd3565b600a54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401600060405180830381600087803b1580156118ad57600080fd5b505af11580156118c1573d6000803e3d6000fd5b5050600b54604051630dcb2e8960e01b8152600481018590526001600160a01b039091169250630dcb2e8991506024016112c1565b6005546001600160a01b036101009091041633146119265760405162461bcd60e51b815260040161117790614dd3565b600a546001600160a01b03828116911614156119545760405162461bcd60e51b815260040161117790614d3f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d491906149c4565b6001600160a01b0316146119fa5760405162461bcd60e51b815260040161117790614e4d565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611a3c57600080fd5b505af1158015611a50573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611a9557600080fd5b505af1158015611aa9573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b5357600080fd5b505af1158015611b67573d6000803e3d6000fd5b5050600a546040516001600160a01b03918216935090851691507fe6719d41ee67c0e4e13d31de4e8a8dee3f56c70d36b9df1530bc4e91d651889690600090a3600a80546001600160a01b0319166001600160a01b039290921691909117905550565b600b54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561106157600080fd5b600a5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015611c5b57600080fd5b505af1158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190614bb6565b50600b5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015611ce057600080fd5b505af1158015611cf4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112499190614bb6565b6005546001600160a01b03610100909104163314611d485760405162461bcd60e51b815260040161117790614dd3565b601a80546001600160a01b0319166001600160a01b03848116918217909255600a5460405163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015611da657600080fd5b505af1158015611dba573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015611e0557600080fd5b505af1158015611e19573d6000803e3d6000fd5b50505050611e28826001612c2d565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611e6f57600080fd5b505af1158015611e83573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b50505050611ef1816001612c2d565b5050565b6005546001600160a01b03610100909104163314611f255760405162461bcd60e51b815260040161117790614dd3565b600d55565b6005546001600160a01b03610100909104163314611f5a5760405162461bcd60e51b815260040161117790614dd3565b60ff81166011819055600f546013546015546113599361135392918391906134cb565b6005546001600160a01b03610100909104163314611fad5760405162461bcd60e51b815260040161117790614dd3565b600780546001600160a01b0319166001600160a01b03838116918217909255600a54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024016112c1565b6005546001600160a01b036101009091041633146120265760405162461bcd60e51b815260040161117790614dd3565b6006546001600160a01b038281169116141561209e5760405162461bcd60e51b815260206004820152603160248201527f4772616e647061477265656e3a2054686520726f7574657220616c7265616479604482015270206861732074686174206164647265737360781b6064820152608401611177565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0361010090910416331461212b5760405162461bcd60e51b815260040161117790614dd3565b600a546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561217957600080fd5b505af115801561218d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b19190614c02565b604080518481526020810184905290810182905260608101889052929550909350915032906000907f7bfcac50b273f0f54552a3c0d28d8c0139b22cda470a361247c3c2ac4c5164c39060800160405180910390a3600b546040516001624d3b8760e01b0319815260048101869052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228c9190614c02565b6040805184815260208101849052908101829052606081018b9052929550909350915032906000907f3ad76675ae9db4f582125cafa528199f97d2a09e00fcf57203f4b13df521619b9060800160405180910390a350505050505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b036101009091041633146123355760405162461bcd60e51b815260040161117790614dd3565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b1580156123cc57600080fd5b505afa1580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111419190614bea565b6005546001600160a01b036101009091041633146124345760405162461bcd60e51b815260040161117790614dd3565b6019548114156124ac5760405162461bcd60e51b815260206004820152603a60248201527f4772616e647061477265656e3a2043616e6e6f7420757064617465206761734660448201527f6f7250726f63657373696e6720746f2073616d652076616c75650000000000006064820152608401611177565b6019819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b600a546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024016123b4565b600a546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016123b4565b6005546001600160a01b036101009091041633146125775760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160b81b90910416151581151514156125a85760405162461bcd60e51b815260040161117790614d9c565b806125d45760118054601255600090556009805460ff60b81b1916600160b81b83151502179055612611565b6012546011819055600f546013546015546125f69361135392918391906134cb565b6017556009805460ff60b81b1916600160b81b831515021790555b60405181151581527f4a13d31b32d629aaa5405215428b3d0c2468a56b2f57e445adae2a5c55e54edb906020016114bf565b6005546001600160a01b036101009091041633146126735760405162461bcd60e51b815260040161117790614dd3565b60ff81166013819055600f546015546011546113599361135392918391906134cb565b6060600480546110ad90614fae565b600b5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161139d565b600a5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b0361010090910416331461275c5760405162461bcd60e51b815260040161117790614dd3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156128205760405162461bcd60e51b815260206004820152605360248201527f4772616e647061477265656e3a205468652050616e63616b655377617020706160448201527f69722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d616064820152727465644d61726b65744d616b6572506169727360681b608482015260a401611177565b611ef18282613e20565b6005546001600160a01b0361010090910416331461285a5760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160c01b909104161515811515141561288b5760405162461bcd60e51b815260040161117790614d9c565b806128b75760138054601455600090556009805460ff60c01b1916600160c01b831515021790556128f4565b6014546013819055600f546011546015546128d99361135392918391906134cb565b6017556009805460ff60c01b1916600160c01b831515021790555b60405181151581527fd2a0115b7422901ccb9f890046ea58825a06f8aff6a6c58d3260af631472dafb906020016114bf565b600061113d33846115698560405180606001604052806025815260200161508c602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613de9565b600a54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161139d565b600061113d338484613656565b6005546001600160a01b036101009091041633146129f45760405162461bcd60e51b815260040161117790614dd3565b600c546001600160a01b0382811691161415612a785760405162461bcd60e51b815260206004820152603a60248201527f4772616e647061477265656e3a20546865206d61726b6574696e672077616c6c60448201527f657420697320616c7265616479207468697320616464726573730000000000006064820152608401611177565b612a83816001612c2d565b600c546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314612b0f5760405162461bcd60e51b815260040161117790614dd3565b612b2181670de0b6b3a7640000614f78565b600e5550565b6005546001600160a01b03610100909104163314612b575760405162461bcd60e51b815260040161117790614dd3565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015612b9e57600080fd5b505af1158015612bb2573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db091506024016112c1565b600b54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b03610100909104163314612c5d5760405162461bcd60e51b815260040161117790614dd3565b6001600160a01b0382166000908152601b602052604090205460ff1615158115151415612ce75760405162461bcd60e51b815260206004820152603260248201527f4772616e647061477265656e3a204163636f756e7420697320616c72656164796044820152712065786c756465642066726f6d206665657360701b6064820152608401611177565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b600b546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016123b4565b6005546001600160a01b03610100909104163314612da95760405162461bcd60e51b815260040161117790614dd3565b60005b82811015612e285781601b6000868685818110612dd957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612dee91906149a8565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612e2081614fe9565b915050612dac565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612e5c93929190614c50565b60405180910390a1505050565b6005546001600160a01b03610100909104163314612e995760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160b01b9091041615158115151415612eca5760405162461bcd60e51b815260040161117790614d9c565b80612ef657600f8054601055600090556009805460ff60b01b1916600160b01b83151502179055612f3d565b601054600f81905550612f22600f546113536011546113536015546013546134cb90919063ffffffff16565b6017556009805460ff60b01b1916600160b01b831515021790555b60405181151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906020016114bf565b600b5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b03610100909104163314612fe45760405162461bcd60e51b815260040161117790614dd3565b60ff81166015819055600f546013546011546113599361135392918391906134cb565b6005546001600160a01b036101009091041633146130375760405162461bcd60e51b815260040161117790614dd3565b600a5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401600060405180830381600087803b15801561307d57600080fd5b505af1158015613091573d6000803e3d6000fd5b5050600b5460405163e98030c760e01b8152600481018590526001600160a01b03909116925063e98030c791506024016112c1565b6005546001600160a01b036101009091041633146130f65760405162461bcd60e51b815260040161117790614dd3565b6001600160a01b03811661315b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611177565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b036101009091041633146131f25760405162461bcd60e51b815260040161117790614dd3565b601855565b6005546001600160a01b036101009091041633146132275760405162461bcd60e51b815260040161117790614dd3565b600b546001600160a01b03828116911614156132555760405162461bcd60e51b815260040161117790614d3f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561329d57600080fd5b505afa1580156132b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d591906149c4565b6001600160a01b0316146132fb5760405162461bcd60e51b815260040161117790614e4d565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561333d57600080fd5b505af1158015613351573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561339657600080fd5b505af11580156133aa573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b1580156133f557600080fd5b505af1158015613409573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561345457600080fd5b505af1158015613468573d6000803e3d6000fd5b5050600b546040516001600160a01b03918216935090851691507f4f098bf81677d6930d991b96cd5494c72a796adf9f63de360eb31d60a5931e1190600090a3600b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000806134d88385614f40565b90508381101561352a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611177565b9392505050565b6001600160a01b0383166135935760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611177565b6001600160a01b0382166135f45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611177565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661367c5760405162461bcd60e51b815260040161117790614e08565b6001600160a01b0382166136a25760405162461bcd60e51b815260040161117790614cfc565b600954600160c81b900460ff16151560011415806136d257506005546001600160a01b0384811661010090920416145b6136db57600080fd5b6001600160a01b0383166000908152601b602052604081205460ff168061371a57506001600160a01b0383166000908152601b602052604090205460ff165b90506001600160a01b0383161580159061373f57506001600160a01b03831661dead14155b801561375457506001600160a01b0384163014155b801561376957506001600160a01b0383163014155b15613812577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316141561381257600d546137b883611353866122ea565b11156138125760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611177565b600061381d306122ea565b600e5460095491925082101590600160a01b900460ff1615801561383e5750805b801561387c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b156139c3576009805460ff60a01b1916600160a01b1790819055600160a81b900460ff161561390157600047905060006138cd6015546138c76017548761401c90919063ffffffff16565b90614077565b90506138d8816140f6565b60006138e4478461427b565b600c549091506138fd906001600160a01b0316826142d7565b5050505b600954600160b01b900460ff161561393d576000613930600f546138c76017548661401c90919063ffffffff16565b905061393b81614315565b505b600954600160b81b900460ff161561397957600061396c6011546138c76017548661401c90919063ffffffff16565b90506139778161439d565b505b600954600160c01b900460ff16156139b55760006139a86013546138c76017548661401c90919063ffffffff16565b90506139b381614453565b505b6009805460ff60a01b191690555b600954600090600160a01b900460ff161580156139de575083155b90508015613a4d576017546000906139fb906138c788606461401c565b6001600160a01b0388166000908152601c602052604090205490915060ff1615613a3457601854613a31906138c783606461401c565b90505b613a3e868261427b565b9550613a4b883083614509565b505b613a58878787614509565b600a546001600160a01b031663e30443bc88613a73816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ab957600080fd5b505af1925050508015613aca575060015b50600b546001600160a01b031663e30443bc88613ae6816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b2c57600080fd5b505af1925050508015613b3d575060015b50600a546001600160a01b031663e30443bc87613b59816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b9f57600080fd5b505af1925050508015613bb0575060015b50600b546001600160a01b031663e30443bc87613bcc816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613c1257600080fd5b505af1925050508015613c23575060015b50600954600160a01b900460ff16613de057601954600a546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015613c8157600080fd5b505af1925050508015613cb1575060408051601f3d908101601f19168201909252613cae91810190614c02565b60015b613cba57613d0b565b60408051848152602081018490529081018290526060810185905232906001907f7bfcac50b273f0f54552a3c0d28d8c0139b22cda470a361247c3c2ac4c5164c39060800160405180910390a35050505b600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015613d5457600080fd5b505af1925050508015613d84575060408051601f3d908101601f19168201909252613d8191810190614c02565b60015b613d8d57613dde565b60408051848152602081018490529081018290526060810185905232906001907f3ad76675ae9db4f582125cafa528199f97d2a09e00fcf57203f4b13df521619b9060800160405180910390a35050505b505b50505050505050565b60008184841115613e0d5760405162461bcd60e51b81526004016111779190614ca9565b50613e188385614f97565b949350505050565b6005546001600160a01b03610100909104163314613e505760405162461bcd60e51b815260040161117790614dd3565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415613ef45760405162461bcd60e51b815260206004820152604660248201527f4772616e647061477265656e3a204175746f6d61746564206d61726b6574206d60448201527f616b6572207061697220697320616c72656164792073657420746f20746861746064820152652076616c756560d01b608482015260a401611177565b6001600160a01b0382166000908152601c60205260409020805460ff19168215801591909117909155613fe057600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613f6857600080fd5b505af1158015613f7c573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015613fc757600080fd5b505af1158015613fdb573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600080821161406d5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401611177565b61352a8284614f58565b60008261408657506000611141565b60006140928385614f78565b90508261409f8583614f58565b1461352a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611177565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061413957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561418d57600080fd5b505afa1580156141a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c591906149c4565b816001815181106141e657634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260065461420c9130911684613531565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790614245908590600090869030904290600401614ed0565b600060405180830381600087803b15801561425f57600080fd5b505af1158015614273573d6000803e3d6000fd5b505050505050565b6000828211156142cd5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401611177565b61352a8284614f97565b60405181906001600160a01b0384169082156108fc029083906000818181858888f1935050505015801561430f573d6000803e3d6000fd5b50505050565b600061432282600261401c565b90506000614330838361427b565b90504761433c836140f6565b6000614348478361427b565b90506143548382614612565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561906060015b60405180910390a15050505050565b6007546143b690829030906001600160a01b03166146ce565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156143fa57600080fd5b505afa15801561440e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144329190614bea565b600754600a54919250611ef1916001600160a01b039182169116808461488f565b60085461446c90829030906001600160a01b03166146ce565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156144b057600080fd5b505afa1580156144c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e89190614bea565b600854600b54919250611ef1916001600160a01b039182169116808461488f565b6001600160a01b03831661452f5760405162461bcd60e51b815260040161117790614e08565b6001600160a01b0382166145555760405162461bcd60e51b815260040161117790614cfc565b6145928160405180606001604052806026815260200161503e602691396001600160a01b0386166000908152602081905260409020549190613de9565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546145c190826134cb565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613649565b60065461462a9030906001600160a01b031684613531565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561469557600080fd5b505af11580156146a9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112ef9190614c02565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061471357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561476757600080fd5b505afa15801561477b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061479f91906149c4565b816001815181106147c057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160028151811061480257634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546148289130911686613531565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590614861908790600090869089904290600401614ed0565b600060405180830381600087803b15801561487b57600080fd5b505af1158015613dde573d6000803e3d6000fd5b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb90604401602060405180830381600087803b1580156148dd57600080fd5b505af11580156148f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149159190614bb6565b905080156112ef57604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b15801561495f57600080fd5b505af1158015614973573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161438e91815260200190565b6000602082840312156149b9578081fd5b813561352a8161501a565b6000602082840312156149d5578081fd5b815161352a8161501a565b600080604083850312156149f2578081fd5b82356149fd8161501a565b91506020830135614a0d8161501a565b809150509250929050565b600080600060608486031215614a2c578081fd5b8335614a378161501a565b92506020840135614a478161501a565b929592945050506040919091013590565b60008060408385031215614a6a578182fd5b8235614a758161501a565b91506020830135614a0d8161502f565b600080600080600080600080610100898b031215614aa1578384fd5b8851614aac8161501a565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215614b00578182fd5b8235614b0b8161501a565b946020939093013593505050565b600080600060408486031215614b2d578283fd5b833567ffffffffffffffff80821115614b44578485fd5b818601915086601f830112614b57578485fd5b813581811115614b65578586fd5b8760208260051b8501011115614b79578586fd5b60209283019550935050840135614b8f8161502f565b809150509250925092565b600060208284031215614bab578081fd5b813561352a8161502f565b600060208284031215614bc7578081fd5b815161352a8161502f565b600060208284031215614be3578081fd5b5035919050565b600060208284031215614bfb578081fd5b5051919050565b600080600060608486031215614c16578283fd5b8351925060208401519150604084015190509250925092565b600060208284031215614c40578081fd5b813560ff8116811461352a578182fd5b6040808252810183905260008460608301825b86811015614c93578235614c768161501a565b6001600160a01b0316825260209283019290910190600101614c63565b5080925050508215156020830152949350505050565b6000602080835283518082850152825b81811015614cd557858101830151858201604001528201614cb9565b81811115614ce65783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f4772616e647061477265656e3a20546865206469766964656e6420747261636b60408201527f657220616c726561647920686173207468617420616464726573730000000000606082015260800190565b6020808252601d908201527f43616e27742073657420666c616720746f2073616d6520737461747573000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526057908201527f4772616e647061477265656e3a20546865206e6577206469766964656e64207460408201527f7261636b6572206d757374206265206f776e656420627920746865204772616e60608201527f647061477265656e20746f6b656e20636f6e7472616374000000000000000000608082015260a00190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015614f1f5784516001600160a01b031683529383019391830191600101614efa565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614f5357614f53615004565b500190565b600082614f7357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614f9257614f92615004565b500290565b600082821015614fa957614fa9615004565b500390565b600181811c90821680614fc257607f821691505b60208210811415614fe357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614ffd57614ffd615004565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461124957600080fd5b801515811461124957600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220990108d43474d2d3e4b57d7bebe599035891b793bc5bdb01e52295c69f81817664736f6c6343000804003360806040523480156200001157600080fd5b50604051806060016040528060238152602001620023e060239139604051806060016040528060238152602001620023e060239139738a4001fd666be272605c56bb956d11a46200db8182828160039080519060200190620000759291906200014c565b5080516200008b9060049060208401906200014c565b505060058054601260ff1991821617909155600880546001600160a01b0319166001600160a01b03949094169390931790925550336000908152600b6020526040812080549092166001179091559150620000e590503390565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610708601555683635c9adc5dea000006016556200022f565b8280546200015a90620001f2565b90600052602060002090601f0160209004810192826200017e5760008555620001c9565b82601f106200019957805160ff1916838001178555620001c9565b82800160010185558215620001c9579182015b82811115620001c9578251825591602001919060010190620001ac565b50620001d7929150620001db565b5090565b5b80821115620001d75760008155600101620001dc565b600181811c908216806200020757607f821691505b602082108114156200022957634e487b7160e01b600052602260045260246000fd5b50919050565b6121a1806200023f6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806370a082311161013b578063aafd847a116100b8578063e7841ec01161007c578063e7841ec01461055c578063e98030c714610564578063f2fde38b14610577578063fbcbc0f11461058a578063ffb2c4791461059d57600080fd5b8063aafd847a146104cb578063bc4c4b37146104f4578063be10b61414610507578063dd62ed3e14610510578063e30443bc1461054957600080fd5b806391b89fba116100ff57806391b89fba1461047757806395d89b411461048a578063a457c2d714610492578063a8b9d240146104a5578063a9059cbb146104b857600080fd5b806370a0823114610419578063715018a6146104425780637e3e7fd21461044a57806385a6b3ae1461045d5780638da5cb5b1461046657600080fd5b80632b2e05c1116101c9578063395093511161018d578063395093511461037a5780634e7b827f1461038d5780635183d6fd146103b05780636a474002146104085780636f2789ec1461041057600080fd5b80632b2e05c1146103235780633009a60914610336578063313ce5671461033f57806331e79db0146103545780633243c7911461036757600080fd5b80631582358e116102105780631582358e146102aa57806318160ddd146102d5578063226cfa3d146102dd57806323b872dd146102fd57806327ce01471461031057600080fd5b806306fdde0314610242578063095ea7b31461026057806309bbedde146102835780630dcb2e8914610295575b600080fd5b61024a6105cb565b6040516102579190611e95565b60405180910390f35b61027361026e366004611db1565b61065d565b6040519015158152602001610257565b600e545b604051908152602001610257565b6102a86102a3366004611e7d565b610674565b005b6008546102bd906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b600254610287565b6102876102eb366004611d41565b60146020526000908152604090205481565b61027361030b366004611e09565b61074a565b61028761031e366004611d41565b6107b3565b6102a8610331366004611d41565b61080f565b61028760125481565b60055460405160ff9091168152602001610257565b6102a8610362366004611d41565b610862565b6102a8610375366004611e7d565b610989565b610273610388366004611db1565b610a4c565b61027361039b366004611d41565b60136020526000908152604090205460ff1681565b6103c36103be366004611e7d565b610a82565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610257565b6102a8610bf4565b61028760155481565b610287610427366004611d41565b6001600160a01b031660009081526020819052604090205490565b6102a8610c9c565b6102a8610458366004611d41565b610d10565b610287600c5481565b600d546001600160a01b03166102bd565b610287610485366004611d41565b610d5c565b61024a610d67565b6102736104a0366004611db1565b610d76565b6102876104b3366004611d41565b610dc5565b6102736104c6366004611db1565b610df1565b6102876104d9366004611d41565b6001600160a01b03166000908152600a602052604090205490565b610273610502366004611d79565b610dfe565b61028760165481565b61028761051e366004611ddc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102a8610557366004611db1565b610eac565b601254610287565b6102a8610572366004611e7d565b61101a565b6102a8610585366004611d41565b61118b565b6103c3610598366004611d41565b611276565b6105b06105ab366004611e7d565b6113ee565b60408051938452602084019290925290820152606001610257565b6060600380546105da9061204d565b80601f01602080910402602001604051908101604052809291908181526020018280546106069061204d565b80156106535780601f1061062857610100808354040283529160200191610653565b820191906000526020600020905b81548152906001019060200180831161063657829003601f168201915b5050505050905090565b600061066a338484611517565b5060015b92915050565b600d546001600160a01b031633146106a75760405162461bcd60e51b815260040161069e90611ee8565b60405180910390fd5b6016548114156107325760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a40161069e565b61074481670de0b6b3a7640000611fd8565b60165550565b600061075784848461163b565b6107a984336107a48560405180606001604052806028815260200161211f602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611697565b611517565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b9261080592610800926107fa916107f591906116ce565b611754565b90611764565b6117a2565b61066e9190611fb8565b336000908152600b602052604090205460ff1661083e5760405162461bcd60e51b815260040161069e90611f1d565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b600d546001600160a01b0316331461088c5760405162461bcd60e51b815260040161069e90611ee8565b6001600160a01b03811660009081526013602052604090205460ff16156108b257600080fd5b6001600160a01b0381166000908152601360205260408120805460ff191660011790556108e09082906117b5565b60405163131836e760e21b8152600e60048201526001600160a01b03821660248201527376572d37bf50b756e7cb93d7ef5796a79a1b0ef990634c60db9c9060440160006040518083038186803b15801561093a57600080fd5b505af415801561094e573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b336000908152600b602052604090205460ff166109b85760405162461bcd60e51b815260040161069e90611f1d565b60006109c360025490565b116109cd57600080fd5b8015610a4957610a006109df60025490565b6109ed83600160801b6116ce565b6109f79190611fb8565b60065490611814565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c54610a459082611814565b600c555b50565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161066a9185906107a49086611814565b600080600080600080600080600e7376572d37bf50b756e7cb93d7ef5796a79a1b0ef963deb3d89690916040518263ffffffff1660e01b8152600401610aca91815260200190565b60206040518083038186803b158015610ae257600080fd5b505af4158015610af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a9190611e65565b8910610b3f575060009650600019955085945086935083925082915081905080610be9565b6040516368d54f3f60e11b8152600e6004820152602481018a90526000907376572d37bf50b756e7cb93d7ef5796a79a1b0ef99063d1aa9e7e9060440160206040518083038186803b158015610b9457600080fd5b505af4158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190611d5d565b9050610bd781611276565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152607b60248201526000805160206120ff83398151915260448201527f6b65723a2077697468647261774469766964656e642064697361626c65642e2060648201527f557365207468652027636c61696d272066756e6374696f6e206f6e207468652060848201527f6d61696e204772616e647061477265656e20636f6e74726163742e000000000060a482015260c40161069e565b600d546001600160a01b03163314610cc65760405162461bcd60e51b815260040161069e90611ee8565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b600d546001600160a01b03163314610d3a5760405162461bcd60e51b815260040161069e90611ee8565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600061066e82610dc5565b6060600480546105da9061204d565b600061066a33846107a485604051806060016040528060258152602001612147602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611697565b6001600160a01b0381166000908152600a602052604081205461066e90610deb846107b3565b90611873565b600061066a33848461163b565b600d546000906001600160a01b03163314610e2b5760405162461bcd60e51b815260040161069e90611ee8565b6000610e36846118cf565b90508015610ea2576001600160a01b038416600081815260146020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610e909085815260200190565b60405180910390a3600191505061066e565b5060009392505050565b600d546001600160a01b03163314610ed65760405162461bcd60e51b815260040161069e90611ee8565b6001600160a01b03821660009081526013602052604090205460ff1615610efb575050565b6016548110610f8c57610f0e82826117b5565b604051632f0ad01760e21b8152600e60048201526001600160a01b0383166024820152604481018290527376572d37bf50b756e7cb93d7ef5796a79a1b0ef99063bc2b405c9060640160006040518083038186803b158015610f6f57600080fd5b505af4158015610f83573d6000803e3d6000fd5b5050505061100a565b610f978260006117b5565b60405163131836e760e21b8152600e60048201526001600160a01b03831660248201527376572d37bf50b756e7cb93d7ef5796a79a1b0ef990634c60db9c9060440160006040518083038186803b158015610ff157600080fd5b505af4158015611005573d6000803e3d6000fd5b505050505b611015826001610dfe565b505050565b600d546001600160a01b031633146110445760405162461bcd60e51b815260040161069e90611ee8565b61070881101580156110595750620151808111155b6110df5760405162461bcd60e51b815260206004820152605860248201526000805160206120ff83398151915260448201527f6b65723a20636c61696d57616974206d7573742062652075706461746564207460648201527f6f206265747765656e203120616e6420323420686f7572730000000000000000608482015260a40161069e565b6015548114156111585760405162461bcd60e51b815260206004820152604a60248201526000805160206120ff83398151915260448201527f6b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2060648201526973616d652076616c756560b01b608482015260a40161069e565b60155460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601555565b600d546001600160a01b031633146111b55760405162461bcd60e51b815260040161069e90611ee8565b6001600160a01b03811661121a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069e565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600e60048201526001600160a01b038216602482015281906000908190819081908190819081907376572d37bf50b756e7cb93d7ef5796a79a1b0ef9906317e142d19060440160206040518083038186803b1580156112e157600080fd5b505af41580156112f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113199190611e65565b965060001995506000871261137b5760125487111561134757601254611340908890611a43565b955061137b565b601254600e546000911061135c57600061136b565b601254600e5461136b91611873565b90506113778882611764565b9650505b61138488610dc5565b945061138f886107b3565b6001600160a01b0389166000908152601460205260409020549094509250826113b95760006113c7565b6015546113c7908490611814565b91504282116113d75760006113e1565b6113e18242611873565b9050919395975091939597565b600e54600090819081908061140e57505060125460009250829150611510565b6012546000805a90506000805b898410801561142957508582105b156114ff578461143881612088565b600e549096508610905061144b57600094505b6000600e600001868154811061147157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031680835260149091526040909120549091506114a290611a8f565b156114c5576114b2816001610dfe565b156114c557816114c181612088565b9250505b826114cf81612088565b93505060005a9050808511156114f6576114f36114ec8683611873565b8790611814565b95505b935061141b9050565b601285905590975095509193505050505b9193909250565b6001600160a01b0383166115795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161069e565b6001600160a01b0382166115da5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161069e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603960248201526000805160206120ff83398151915260448201527f6b65723a204e6f207472616e736665727320616c6c6f77656400000000000000606482015260840161069e565b600081848411156116bb5760405162461bcd60e51b815260040161069e9190611e95565b506116c68385612036565b949350505050565b6000826116dd5750600061066e565b60006116e98385611fd8565b9050826116f68583611fb8565b1461174d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161069e565b9392505050565b6000818181121561066e57600080fd5b6000806117718385611f5f565b9050600083121580156117845750838112155b80611799575060008312801561179957508381125b61174d57600080fd5b6000808212156117b157600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156117f45760006117e28383611873565b90506117ee8482611ab6565b50505050565b808210156110155760006118088284611873565b90506117ee8482611b1a565b6000806118218385611fa0565b90508381101561174d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161069e565b6000828211156118c55760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015260640161069e565b61174d8284612036565b6000806118db83610dc5565b90508015611a3a576001600160a01b0383166000908152600a60205260409020546119069082611814565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906119559084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb90604401602060405180830381600087803b1580156119ac57600080fd5b505af11580156119c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e49190611e49565b905080611a33576001600160a01b0384166000908152600a6020526040902054611a0e9083611873565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611a5e575082611a5b8382611ff7565b13155b80611a7c5750600082128015611a7c575082611a7a8382611ff7565b135b611a8557600080fd5b61174d8284611ff7565b600042821115611aa157506000919050565b601554611aae4284611873565b101592915050565b611ac08282611b5e565b611afa611adb6107f5836006546116ce90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611a43565b6001600160a01b0390921660009081526009602052604090209190915550565b611b248282611c3d565b611afa611b3f6107f5836006546116ce90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611764565b6001600160a01b038216611bb45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161069e565b600254611bc19082611814565b6002556001600160a01b038216600090815260208190526040902054611be79082611814565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611c9d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161069e565b611cda816040518060600160405280602281526020016120dd602291396001600160a01b0385166000908152602081905260409020549190611697565b6001600160a01b038316600090815260208190526040902055600254611d009082611873565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c31565b600060208284031215611d52578081fd5b813561174d816120b9565b600060208284031215611d6e578081fd5b815161174d816120b9565b60008060408385031215611d8b578081fd5b8235611d96816120b9565b91506020830135611da6816120ce565b809150509250929050565b60008060408385031215611dc3578182fd5b8235611dce816120b9565b946020939093013593505050565b60008060408385031215611dee578182fd5b8235611df9816120b9565b91506020830135611da6816120b9565b600080600060608486031215611e1d578081fd5b8335611e28816120b9565b92506020840135611e38816120b9565b929592945050506040919091013590565b600060208284031215611e5a578081fd5b815161174d816120ce565b600060208284031215611e76578081fd5b5051919050565b600060208284031215611e8e578081fd5b5035919050565b6000602080835283518082850152825b81811015611ec157858101830151858201604001528201611ea5565b81811115611ed25783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f417574683a2063616c6c6572206973206e6f742074686520617574686f72697a604082015261195960f21b606082015260800190565b600080821280156001600160ff1b0384900385131615611f8157611f816120a3565b600160ff1b8390038412811615611f9a57611f9a6120a3565b50500190565b60008219821115611fb357611fb36120a3565b500190565b600082611fd357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611ff257611ff26120a3565b500290565b60008083128015600160ff1b850184121615612015576120156120a3565b6001600160ff1b0384018313811615612030576120306120a3565b50500390565b600082821015612048576120486120a3565b500390565b600181811c9082168061206157607f821691505b6020821081141561208257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561209c5761209c6120a3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610a4957600080fd5b8015158114610a4957600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654772616e647061477265656e5f477265656e5f4469766964656e645f5472616345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122000a41775b1be1486422625649827658b5a2b040fd79227fa400e32eea7049dd964736f6c634300080400334772616e647061477265656e5f477265656e5f4469766964656e645f547261636b657260806040523480156200001157600080fd5b50604051806060016040528060248152602001620023ff60249139604051806060016040528060248152602001620023ff60249139730d500b1d8e8ef31e21c99d1db9a6444d3adf127082828160039080519060200190620000759291906200014d565b5080516200008b9060049060208401906200014d565b505060058054601260ff1991821617909155600880546001600160a01b0319166001600160a01b03949094169390931790925550336000908152600b6020526040812080549092166001179091559150620000e590503390565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061070860155569152d02c7e14af680000060165562000230565b8280546200015b90620001f3565b90600052602060002090601f0160209004810192826200017f5760008555620001ca565b82601f106200019a57805160ff1916838001178555620001ca565b82800160010185558215620001ca579182015b82811115620001ca578251825591602001919060010190620001ad565b50620001d8929150620001dc565b5090565b5b80821115620001d85760008155600101620001dd565b600181811c908216806200020857607f821691505b602082108114156200022a57634e487b7160e01b600052602260045260246000fd5b50919050565b6121bf80620002406000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806370a082311161013b578063aafd847a116100b8578063e7841ec01161007c578063e7841ec01461055c578063e98030c714610564578063f2fde38b14610577578063fbcbc0f11461058a578063ffb2c4791461059d57600080fd5b8063aafd847a146104cb578063bc4c4b37146104f4578063be10b61414610507578063dd62ed3e14610510578063e30443bc1461054957600080fd5b806391b89fba116100ff57806391b89fba1461047757806395d89b411461048a578063a457c2d714610492578063a8b9d240146104a5578063a9059cbb146104b857600080fd5b806370a0823114610419578063715018a6146104425780637e3e7fd21461044a57806385a6b3ae1461045d5780638da5cb5b1461046657600080fd5b80632b2e05c1116101c9578063395093511161018d578063395093511461037a5780634e7b827f1461038d5780635183d6fd146103b05780636a474002146104085780636f2789ec1461041057600080fd5b80632b2e05c1146103235780633009a60914610336578063313ce5671461033f57806331e79db0146103545780633243c7911461036757600080fd5b80631582358e116102105780631582358e146102aa57806318160ddd146102d5578063226cfa3d146102dd57806323b872dd146102fd57806327ce01471461031057600080fd5b806306fdde0314610242578063095ea7b31461026057806309bbedde146102835780630dcb2e8914610295575b600080fd5b61024a6105cb565b6040516102579190611ed3565b60405180910390f35b61027361026e366004611def565b61065d565b6040519015158152602001610257565b600e545b604051908152602001610257565b6102a86102a3366004611ebb565b610674565b005b6008546102bd906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b600254610287565b6102876102eb366004611d7f565b60146020526000908152604090205481565b61027361030b366004611e47565b61074a565b61028761031e366004611d7f565b6107b3565b6102a8610331366004611d7f565b61080f565b61028760125481565b60055460405160ff9091168152602001610257565b6102a8610362366004611d7f565b610862565b6102a8610375366004611ebb565b610989565b610273610388366004611def565b610a4c565b61027361039b366004611d7f565b60136020526000908152604090205460ff1681565b6103c36103be366004611ebb565b610a82565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610257565b6102a8610bf4565b61028760155481565b610287610427366004611d7f565b6001600160a01b031660009081526020819052604090205490565b6102a8610cae565b6102a8610458366004611d7f565b610d22565b610287600c5481565b600d546001600160a01b03166102bd565b610287610485366004611d7f565b610d6e565b61024a610d79565b6102736104a0366004611def565b610d88565b6102876104b3366004611d7f565b610dd7565b6102736104c6366004611def565b610e03565b6102876104d9366004611d7f565b6001600160a01b03166000908152600a602052604090205490565b610273610502366004611db7565b610e10565b61028760165481565b61028761051e366004611e1a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102a8610557366004611def565b610ebe565b601254610287565b6102a8610572366004611ebb565b61102c565b6102a8610585366004611d7f565b6111b7565b6103c3610598366004611d7f565b6112a2565b6105b06105ab366004611ebb565b61141a565b60408051938452602084019290925290820152606001610257565b6060600380546105da9061208b565b80601f01602080910402602001604051908101604052809291908181526020018280546106069061208b565b80156106535780601f1061062857610100808354040283529160200191610653565b820191906000526020600020905b81548152906001019060200180831161063657829003601f168201915b5050505050905090565b600061066a338484611543565b5060015b92915050565b600d546001600160a01b031633146106a75760405162461bcd60e51b815260040161069e90611f26565b60405180910390fd5b6016548114156107325760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a40161069e565b61074481670de0b6b3a7640000612016565b60165550565b6000610757848484611667565b6107a984336107a48560405180606001604052806028815260200161213d602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906116d5565b611543565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b9261080592610800926107fa916107f5919061170c565b611792565b906117a2565b6117e0565b61066e9190611ff6565b336000908152600b602052604090205460ff1661083e5760405162461bcd60e51b815260040161069e90611f5b565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b600d546001600160a01b0316331461088c5760405162461bcd60e51b815260040161069e90611f26565b6001600160a01b03811660009081526013602052604090205460ff16156108b257600080fd5b6001600160a01b0381166000908152601360205260408120805460ff191660011790556108e09082906117f3565b60405163131836e760e21b8152600e60048201526001600160a01b03821660248201527376572d37bf50b756e7cb93d7ef5796a79a1b0ef990634c60db9c9060440160006040518083038186803b15801561093a57600080fd5b505af415801561094e573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b336000908152600b602052604090205460ff166109b85760405162461bcd60e51b815260040161069e90611f5b565b60006109c360025490565b116109cd57600080fd5b8015610a4957610a006109df60025490565b6109ed83600160801b61170c565b6109f79190611ff6565b60065490611852565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c54610a459082611852565b600c555b50565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161066a9185906107a49086611852565b600080600080600080600080600e7376572d37bf50b756e7cb93d7ef5796a79a1b0ef963deb3d89690916040518263ffffffff1660e01b8152600401610aca91815260200190565b60206040518083038186803b158015610ae257600080fd5b505af4158015610af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a9190611ea3565b8910610b3f575060009650600019955085945086935083925082915081905080610be9565b6040516368d54f3f60e11b8152600e6004820152602481018a90526000907376572d37bf50b756e7cb93d7ef5796a79a1b0ef99063d1aa9e7e9060440160206040518083038186803b158015610b9457600080fd5b505af4158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190611d9b565b9050610bd7816112a2565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152607c60248201527f4772616e647061477265656e5f576d617469635f4469766964656e645f54726160448201527f636b65723a2077697468647261774469766964656e642064697361626c65642e60648201527f20557365207468652027636c61696d272066756e6374696f6e206f6e2074686560848201527f206d61696e204772616e647061477265656e20636f6e74726163742e0000000060a482015260c40161069e565b600d546001600160a01b03163314610cd85760405162461bcd60e51b815260040161069e90611f26565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b600d546001600160a01b03163314610d4c5760405162461bcd60e51b815260040161069e90611f26565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600061066e82610dd7565b6060600480546105da9061208b565b600061066a33846107a485604051806060016040528060258152602001612165602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906116d5565b6001600160a01b0381166000908152600a602052604081205461066e90610dfd846107b3565b906118b1565b600061066a338484611667565b600d546000906001600160a01b03163314610e3d5760405162461bcd60e51b815260040161069e90611f26565b6000610e488461190d565b90508015610eb4576001600160a01b038416600081815260146020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610ea29085815260200190565b60405180910390a3600191505061066e565b5060009392505050565b600d546001600160a01b03163314610ee85760405162461bcd60e51b815260040161069e90611f26565b6001600160a01b03821660009081526013602052604090205460ff1615610f0d575050565b6016548110610f9e57610f2082826117f3565b604051632f0ad01760e21b8152600e60048201526001600160a01b0383166024820152604481018290527376572d37bf50b756e7cb93d7ef5796a79a1b0ef99063bc2b405c9060640160006040518083038186803b158015610f8157600080fd5b505af4158015610f95573d6000803e3d6000fd5b5050505061101c565b610fa98260006117f3565b60405163131836e760e21b8152600e60048201526001600160a01b03831660248201527376572d37bf50b756e7cb93d7ef5796a79a1b0ef990634c60db9c9060440160006040518083038186803b15801561100357600080fd5b505af4158015611017573d6000803e3d6000fd5b505050505b611027826001610e10565b505050565b600d546001600160a01b031633146110565760405162461bcd60e51b815260040161069e90611f26565b610708811015801561106b5750620151808111155b6110f85760405162461bcd60e51b815260206004820152605260248201527f4772616e647061477265656e5f4469766964656e645f547261636b65723a206360448201527f6c61696d57616974206d757374206265207570646174656420746f206265747760648201527165656e203120616e6420323420686f75727360701b608482015260a40161069e565b6015548114156111845760405162461bcd60e51b815260206004820152604b60248201527f4772616e647061477265656e5f576d617469635f4469766964656e645f54726160448201527f636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f60648201526a2073616d652076616c756560a81b608482015260a40161069e565b60155460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601555565b600d546001600160a01b031633146111e15760405162461bcd60e51b815260040161069e90611f26565b6001600160a01b0381166112465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069e565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600e60048201526001600160a01b038216602482015281906000908190819081908190819081907376572d37bf50b756e7cb93d7ef5796a79a1b0ef9906317e142d19060440160206040518083038186803b15801561130d57600080fd5b505af4158015611321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113459190611ea3565b96506000199550600087126113a7576012548711156113735760125461136c908890611a81565b95506113a7565b601254600e5460009110611388576000611397565b601254600e54611397916118b1565b90506113a388826117a2565b9650505b6113b088610dd7565b94506113bb886107b3565b6001600160a01b0389166000908152601460205260409020549094509250826113e55760006113f3565b6015546113f3908490611852565b915042821161140357600061140d565b61140d82426118b1565b9050919395975091939597565b600e54600090819081908061143a5750506012546000925082915061153c565b6012546000805a90506000805b898410801561145557508582105b1561152b5784611464816120c6565b600e549096508610905061147757600094505b6000600e600001868154811061149d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031680835260149091526040909120549091506114ce90611acd565b156114f1576114de816001610e10565b156114f157816114ed816120c6565b9250505b826114fb816120c6565b93505060005a9050808511156115225761151f61151886836118b1565b8790611852565b95505b93506114479050565b601285905590975095509193505050505b9193909250565b6001600160a01b0383166115a55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161069e565b6001600160a01b0382166116065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161069e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603a60248201527f4772616e647061477265656e5f576d617469635f4469766964656e645f54726160448201527f636b65723a204e6f207472616e736665727320616c6c6f776564000000000000606482015260840161069e565b600081848411156116f95760405162461bcd60e51b815260040161069e9190611ed3565b506117048385612074565b949350505050565b60008261171b5750600061066e565b60006117278385612016565b9050826117348583611ff6565b1461178b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161069e565b9392505050565b6000818181121561066e57600080fd5b6000806117af8385611f9d565b9050600083121580156117c25750838112155b806117d757506000831280156117d757508381125b61178b57600080fd5b6000808212156117ef57600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561183257600061182083836118b1565b905061182c8482611af4565b50505050565b8082101561102757600061184682846118b1565b905061182c8482611b58565b60008061185f8385611fde565b90508381101561178b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161069e565b6000828211156119035760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015260640161069e565b61178b8284612074565b60008061191983610dd7565b90508015611a78576001600160a01b0383166000908152600a60205260409020546119449082611852565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906119939084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb90604401602060405180830381600087803b1580156119ea57600080fd5b505af11580156119fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a229190611e87565b905080611a71576001600160a01b0384166000908152600a6020526040902054611a4c90836118b1565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611a9c575082611a998382612035565b13155b80611aba5750600082128015611aba575082611ab88382612035565b135b611ac357600080fd5b61178b8284612035565b600042821115611adf57506000919050565b601554611aec42846118b1565b101592915050565b611afe8282611b9c565b611b38611b196107f58360065461170c90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611a81565b6001600160a01b0390921660009081526009602052604090209190915550565b611b628282611c7b565b611b38611b7d6107f58360065461170c90919063ffffffff16565b6001600160a01b038416600090815260096020526040902054906117a2565b6001600160a01b038216611bf25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161069e565b600254611bff9082611852565b6002556001600160a01b038216600090815260208190526040902054611c259082611852565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611cdb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161069e565b611d188160405180606001604052806022815260200161211b602291396001600160a01b03851660009081526020819052604090205491906116d5565b6001600160a01b038316600090815260208190526040902055600254611d3e90826118b1565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c6f565b600060208284031215611d90578081fd5b813561178b816120f7565b600060208284031215611dac578081fd5b815161178b816120f7565b60008060408385031215611dc9578081fd5b8235611dd4816120f7565b91506020830135611de48161210c565b809150509250929050565b60008060408385031215611e01578182fd5b8235611e0c816120f7565b946020939093013593505050565b60008060408385031215611e2c578182fd5b8235611e37816120f7565b91506020830135611de4816120f7565b600080600060608486031215611e5b578081fd5b8335611e66816120f7565b92506020840135611e76816120f7565b929592945050506040919091013590565b600060208284031215611e98578081fd5b815161178b8161210c565b600060208284031215611eb4578081fd5b5051919050565b600060208284031215611ecc578081fd5b5035919050565b6000602080835283518082850152825b81811015611eff57858101830151858201604001528201611ee3565b81811115611f105783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f417574683a2063616c6c6572206973206e6f742074686520617574686f72697a604082015261195960f21b606082015260800190565b600080821280156001600160ff1b0384900385131615611fbf57611fbf6120e1565b600160ff1b8390038412811615611fd857611fd86120e1565b50500190565b60008219821115611ff157611ff16120e1565b500190565b60008261201157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612030576120306120e1565b500290565b60008083128015600160ff1b850184121615612053576120536120e1565b6001600160ff1b038401831381161561206e5761206e6120e1565b50500390565b600082821015612086576120866120e1565b500390565b600181811c9082168061209f57607f821691505b602082108114156120c057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120da576120da6120e1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610a4957600080fd5b8015158114610a4957600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122023a9c84553659ed0d2dbe13e20d9aea48bd1f6a6fdbb36e371489df7a31a8d0d64736f6c634300080400334772616e647061477265656e5f576d617469635f4469766964656e645f547261636b65724f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106104e45760003560e01c8063700bb19111610281578063a87a1edb1161015a578063c49b9a80116100cc578063e2f4560511610085578063e2f4560514610f65578063e84d44f814610f7b578063e98030c714610f9c578063f2fde38b14610fbc578063fb7f634a14610fdc578063fc5bedbe14610ffc57600080fd5b8063c49b9a8014610e8a578063c6de960514610eaa578063c8fae29614610eca578063d46d9ba114610edf578063d830652114610eff578063dd62ed3e14610f1f57600080fd5b8063b62496f51161011e578063b62496f514610dcf578063baa1126014610dff578063bbde77c114610e14578063c024666814610e2a578063c1f067aa14610e4a578063c492f04614610e6a57600080fd5b8063a87a1edb14610d2f578063a9059cbb14610d4f578063aacebbe314610d6f578063afa4f3b214610d8f578063b13f725d14610daf57600080fd5b80638da5cb5b116101f357806398118cb4116101b757806398118cb414610c825780639a7a23d614610c985780639acb591114610cb85780639c1b8af514610cd9578063a3e36fd114610cef578063a457c2d714610d0f57600080fd5b80638da5cb5b14610bf55780638e448b6214610c1857806395d89b4114610c3857806397a0d5f514610c4d57806397b0a85b14610c6d57600080fd5b80637e2dde98116102455780637e2dde9814610b35578063871c128d14610b555780638820198f14610b755780638864aa4014610b955780638c3ecd6014610bb55780638ce55e9814610bd557600080fd5b8063700bb19114610a8757806370a0823114610aa7578063715018a614610ac757806375f0a87414610adc5780637b16cea014610afc57600080fd5b80633003386e116103be5780634afb66941161033057806355a77f5f116102e957806355a77f5f146109e45780635a233a4914610a045780635fd65fea14610a2557806365b8dbc014610a3b5780636b67c4df14610a5b5780636fb66ff914610a7157600080fd5b80634afb6694146109395780634b307c501461094e5780634e71d92d1461096f5780634e83ff6f146109845780634fd0dc24146109a45780635346fa9b146109c457600080fd5b806336dc5c2a1161038257806336dc5c2a1461086e57806339509351146108845780633b364da8146108a457806340659b0d146108c457806349bd5a5e146108e45780634a74bb021461091857600080fd5b80633003386e146107d6578063313ce567146107eb578063331f9fa81461080d57806333d015861461082e5780633695ae6c1461084e57600080fd5b806318160ddd11610457578063234616701161041b578063234616701461073557806323b872dd1461074b578063245618b41461076b578063263b5fcb1461078057806327c8f835146107a05780632fdc1cf1146107c057600080fd5b806318160ddd14610670578063182db05e1461068557806318830e0b146106ea5780631b9c64b51461070a57806322bd3f7f1461071f57600080fd5b8063122fe685116104a9578063122fe685146105a25780631260d5ab146105da578063127b9ffb146105fa57806313114a9d1461061a5780631519f1f0146106305780631694505e1461065057600080fd5b806292cbbb146104f057806302f37afd1461051857806306fdde031461052e578063095ea7b3146105505780631129e65b1461058057600080fd5b366104eb57005b600080fd5b3480156104fc57600080fd5b5061050561101c565b6040519081526020015b60405180910390f35b34801561052457600080fd5b5061050560125481565b34801561053a57600080fd5b5061054361109e565b60405161050f9190614ca9565b34801561055c57600080fd5b5061057061056b366004614aee565b611130565b604051901515815260200161050f565b34801561058c57600080fd5b506105a061059b3660046149a8565b611147565b005b3480156105ae57600080fd5b50601a546105c2906001600160a01b031681565b6040516001600160a01b03909116815260200161050f565b3480156105e657600080fd5b506105a06105f53660046149a8565b61124c565b34801561060657600080fd5b506008546105c2906001600160a01b031681565b34801561062657600080fd5b5061050560175481565b34801561063c57600080fd5b506105a061064b366004614c2f565b6112f6565b34801561065c57600080fd5b506006546105c2906001600160a01b031681565b34801561067c57600080fd5b50600254610505565b34801561069157600080fd5b506106a56106a0366004614bd2565b61135f565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161050f565b3480156106f657600080fd5b506105a0610705366004614b9a565b611409565b34801561071657600080fd5b506105056114ca565b34801561072b57600080fd5b5061050560185481565b34801561074157600080fd5b5061050560115481565b34801561075757600080fd5b50610570610766366004614a18565b61150f565b34801561077757600080fd5b50610505611578565b34801561078c57600080fd5b506105a061079b366004614b9a565b6115bd565b3480156107ac57600080fd5b506009546105c2906001600160a01b031681565b3480156107cc57600080fd5b5061050560105481565b3480156107e257600080fd5b506105056116b9565b3480156107f757600080fd5b5060055460405160ff909116815260200161050f565b34801561081957600080fd5b5060095461057090600160c01b900460ff1681565b34801561083a57600080fd5b506105a06108493660046149a8565b6116fe565b34801561085a57600080fd5b506106a56108693660046149a8565b6117bf565b34801561087a57600080fd5b5061050560135481565b34801561089057600080fd5b5061057061089f366004614aee565b611801565b3480156108b057600080fd5b506105a06108bf366004614bd2565b611837565b3480156108d057600080fd5b506105a06108df3660046149a8565b6118f6565b3480156108f057600080fd5b506105c27f000000000000000000000000ba6b1f92a322af7d81f80e48c1485ab3cf5c340181565b34801561092457600080fd5b5060095461057090600160b01b900460ff1681565b34801561094557600080fd5b50610505611bca565b34801561095a57600080fd5b5060095461057090600160c81b900460ff1681565b34801561097b57600080fd5b506105a0611c0f565b34801561099057600080fd5b506105a061099f3660046149e0565b611d18565b3480156109b057600080fd5b506105a06109bf366004614bd2565b611ef5565b3480156109d057600080fd5b506105a06109df366004614c2f565b611f2a565b3480156109f057600080fd5b506105a06109ff3660046149a8565b611f7d565b348015610a1057600080fd5b5060095461057090600160d01b900460ff1681565b348015610a3157600080fd5b5061050560165481565b348015610a4757600080fd5b506105a0610a563660046149a8565b611ff6565b348015610a6757600080fd5b5061050560155481565b348015610a7d57600080fd5b5061050560145481565b348015610a9357600080fd5b506105a0610aa2366004614bd2565b6120fb565b348015610ab357600080fd5b50610505610ac23660046149a8565b6122ea565b348015610ad357600080fd5b506105a0612305565b348015610ae857600080fd5b50600c546105c2906001600160a01b031681565b348015610b0857600080fd5b50610570610b173660046149a8565b6001600160a01b03166000908152601b602052604090205460ff1690565b348015610b4157600080fd5b50610505610b503660046149a8565b612385565b348015610b6157600080fd5b506105a0610b70366004614bd2565b612404565b348015610b8157600080fd5b50600b546105c2906001600160a01b031681565b348015610ba157600080fd5b50610505610bb03660046149a8565b6124e1565b348015610bc157600080fd5b50610505610bd03660046149a8565b612514565b348015610be157600080fd5b506105a0610bf0366004614b9a565b612547565b348015610c0157600080fd5b5060055461010090046001600160a01b03166105c2565b348015610c2457600080fd5b506105a0610c33366004614c2f565b612643565b348015610c4457600080fd5b50610543612696565b348015610c5957600080fd5b506106a5610c683660046149a8565b6126a5565b348015610c7957600080fd5b506105056126e7565b348015610c8e57600080fd5b50610505600f5481565b348015610ca457600080fd5b506105a0610cb3366004614a58565b61272c565b348015610cc457600080fd5b5060095461057090600160b81b900460ff1681565b348015610ce557600080fd5b5061050560195481565b348015610cfb57600080fd5b506105a0610d0a366004614b9a565b61282a565b348015610d1b57600080fd5b50610570610d2a366004614aee565b612926565b348015610d3b57600080fd5b506106a5610d4a366004614bd2565b612975565b348015610d5b57600080fd5b50610570610d6a366004614aee565b6129b7565b348015610d7b57600080fd5b506105a0610d8a3660046149a8565b6129c4565b348015610d9b57600080fd5b506105a0610daa366004614bd2565b612adf565b348015610dbb57600080fd5b506105a0610dca3660046149a8565b612b27565b348015610ddb57600080fd5b50610570610dea3660046149a8565b601c6020526000908152604090205460ff1681565b348015610e0b57600080fd5b50610505612be8565b348015610e2057600080fd5b50610505600d5481565b348015610e3657600080fd5b506105a0610e45366004614a58565b612c2d565b348015610e5657600080fd5b50610505610e653660046149a8565b612d46565b348015610e7657600080fd5b506105a0610e85366004614b19565b612d79565b348015610e9657600080fd5b506105a0610ea5366004614b9a565b612e69565b348015610eb657600080fd5b50600a546105c2906001600160a01b031681565b348015610ed657600080fd5b50610505612f6f565b348015610eeb57600080fd5b506105a0610efa366004614c2f565b612fb4565b348015610f0b57600080fd5b506007546105c2906001600160a01b031681565b348015610f2b57600080fd5b50610505610f3a3660046149e0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f7157600080fd5b50610505600e5481565b348015610f8757600080fd5b5060095461057090600160a81b900460ff1681565b348015610fa857600080fd5b506105a0610fb7366004614bd2565b613007565b348015610fc857600080fd5b506105a0610fd73660046149a8565b6130c6565b348015610fe857600080fd5b506105a0610ff7366004614bd2565b6131c2565b34801561100857600080fd5b506105a06110173660046149a8565b6131f7565b600a54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561106157600080fd5b505afa158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190614bea565b905090565b6060600380546110ad90614fae565b80601f01602080910402602001604051908101604052809291908181526020018280546110d990614fae565b80156111265780601f106110fb57610100808354040283529160200191611126565b820191906000526020600020905b81548152906001019060200180831161110957829003601f168201915b5050505050905090565b600061113d338484613531565b5060015b92915050565b6005546001600160a01b036101009091041633146111805760405162461bcd60e51b815260040161117790614dd3565b60405180910390fd5b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156111c757600080fd5b505af11580156111db573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b15801561122657600080fd5b505af115801561123a573d6000803e3d6000fd5b50505050611249816001612c2d565b50565b6005546001600160a01b0361010090910416331461127c5760405162461bcd60e51b815260040161117790614dd3565b600880546001600160a01b0319166001600160a01b03838116918217909255600b54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024015b600060405180830381600087803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b5050505050565b6005546001600160a01b036101009091041633146113265760405162461bcd60e51b815260040161117790614dd3565b8060ff16600f81905550611359600f546113536013546113536011546015546134cb90919063ffffffff16565b906134cb565b60175550565b600b54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024015b6101006040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ee9190614a85565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b036101009091041633146114395760405162461bcd60e51b815260040161117790614dd3565b600954600160d01b900460ff16611476576009805460ff60d01b19831515600160c81b021661ffff60c81b1990911617600160d01b179055611484565b6009805460ff60c81b191690555b600954604051600160c81b90910460ff16151581527f2b27db57e94e474754b17ad26b358efda13cbcf4a9bbbc7ec92de2926a941f34906020015b60405180910390a150565b600b546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561106157600080fd5b600061151c848484613656565b61156e843361156985604051806060016040528060288152602001615064602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613de9565b613531565b5060019392505050565b600a546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b036101009091041633146115ed5760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160a81b909104161515811515141561161e5760405162461bcd60e51b815260040161117790614d9c565b8061164a5760158054601655600090556009805460ff60a81b1916600160a81b83151502179055611687565b6016546015819055600f5460115460135461166c9361135392918391906134cb565b6017556009805460ff60a81b1916600160a81b831515021790555b60405181151581527f6ba6c1012539169f5a820a29533d8c8b797a1c7a5634edbd3124a80de0e75cba906020016114bf565b600a54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b0361010090910416331461172e5760405162461bcd60e51b815260040161117790614dd3565b600b54604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c190602401600060405180830381600087803b15801561177557600080fd5b505af1158015611789573d6000803e3d6000fd5b5050600a54604051632b2e05c160e01b81526001600160a01b0385811660048301529091169250632b2e05c191506024016112c1565b600a5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161139d565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161113d91859061156990866134cb565b6005546001600160a01b036101009091041633146118675760405162461bcd60e51b815260040161117790614dd3565b600a54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401600060405180830381600087803b1580156118ad57600080fd5b505af11580156118c1573d6000803e3d6000fd5b5050600b54604051630dcb2e8960e01b8152600481018590526001600160a01b039091169250630dcb2e8991506024016112c1565b6005546001600160a01b036101009091041633146119265760405162461bcd60e51b815260040161117790614dd3565b600a546001600160a01b03828116911614156119545760405162461bcd60e51b815260040161117790614d3f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d491906149c4565b6001600160a01b0316146119fa5760405162461bcd60e51b815260040161117790614e4d565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611a3c57600080fd5b505af1158015611a50573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611a9557600080fd5b505af1158015611aa9573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611b5357600080fd5b505af1158015611b67573d6000803e3d6000fd5b5050600a546040516001600160a01b03918216935090851691507fe6719d41ee67c0e4e13d31de4e8a8dee3f56c70d36b9df1530bc4e91d651889690600090a3600a80546001600160a01b0319166001600160a01b039290921691909117905550565b600b54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561106157600080fd5b600a5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015611c5b57600080fd5b505af1158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190614bb6565b50600b5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015611ce057600080fd5b505af1158015611cf4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112499190614bb6565b6005546001600160a01b03610100909104163314611d485760405162461bcd60e51b815260040161117790614dd3565b601a80546001600160a01b0319166001600160a01b03848116918217909255600a5460405163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015611da657600080fd5b505af1158015611dba573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015611e0557600080fd5b505af1158015611e19573d6000803e3d6000fd5b50505050611e28826001612c2d565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611e6f57600080fd5b505af1158015611e83573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b50505050611ef1816001612c2d565b5050565b6005546001600160a01b03610100909104163314611f255760405162461bcd60e51b815260040161117790614dd3565b600d55565b6005546001600160a01b03610100909104163314611f5a5760405162461bcd60e51b815260040161117790614dd3565b60ff81166011819055600f546013546015546113599361135392918391906134cb565b6005546001600160a01b03610100909104163314611fad5760405162461bcd60e51b815260040161117790614dd3565b600780546001600160a01b0319166001600160a01b03838116918217909255600a54604051633f1f3fe960e11b8152600481019290925290911690637e3e7fd2906024016112c1565b6005546001600160a01b036101009091041633146120265760405162461bcd60e51b815260040161117790614dd3565b6006546001600160a01b038281169116141561209e5760405162461bcd60e51b815260206004820152603160248201527f4772616e647061477265656e3a2054686520726f7574657220616c7265616479604482015270206861732074686174206164647265737360781b6064820152608401611177565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0361010090910416331461212b5760405162461bcd60e51b815260040161117790614dd3565b600a546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561217957600080fd5b505af115801561218d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b19190614c02565b604080518481526020810184905290810182905260608101889052929550909350915032906000907f7bfcac50b273f0f54552a3c0d28d8c0139b22cda470a361247c3c2ac4c5164c39060800160405180910390a3600b546040516001624d3b8760e01b0319815260048101869052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228c9190614c02565b6040805184815260208101849052908101829052606081018b9052929550909350915032906000907f3ad76675ae9db4f582125cafa528199f97d2a09e00fcf57203f4b13df521619b9060800160405180910390a350505050505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b036101009091041633146123355760405162461bcd60e51b815260040161117790614dd3565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b1580156123cc57600080fd5b505afa1580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111419190614bea565b6005546001600160a01b036101009091041633146124345760405162461bcd60e51b815260040161117790614dd3565b6019548114156124ac5760405162461bcd60e51b815260206004820152603a60248201527f4772616e647061477265656e3a2043616e6e6f7420757064617465206761734660448201527f6f7250726f63657373696e6720746f2073616d652076616c75650000000000006064820152608401611177565b6019819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b600a546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024016123b4565b600a546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016123b4565b6005546001600160a01b036101009091041633146125775760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160b81b90910416151581151514156125a85760405162461bcd60e51b815260040161117790614d9c565b806125d45760118054601255600090556009805460ff60b81b1916600160b81b83151502179055612611565b6012546011819055600f546013546015546125f69361135392918391906134cb565b6017556009805460ff60b81b1916600160b81b831515021790555b60405181151581527f4a13d31b32d629aaa5405215428b3d0c2468a56b2f57e445adae2a5c55e54edb906020016114bf565b6005546001600160a01b036101009091041633146126735760405162461bcd60e51b815260040161117790614dd3565b60ff81166013819055600f546015546011546113599361135392918391906134cb565b6060600480546110ad90614fae565b600b5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f19060240161139d565b600a5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b0361010090910416331461275c5760405162461bcd60e51b815260040161117790614dd3565b7f000000000000000000000000ba6b1f92a322af7d81f80e48c1485ab3cf5c34016001600160a01b0316826001600160a01b031614156128205760405162461bcd60e51b815260206004820152605360248201527f4772616e647061477265656e3a205468652050616e63616b655377617020706160448201527f69722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d616064820152727465644d61726b65744d616b6572506169727360681b608482015260a401611177565b611ef18282613e20565b6005546001600160a01b0361010090910416331461285a5760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160c01b909104161515811515141561288b5760405162461bcd60e51b815260040161117790614d9c565b806128b75760138054601455600090556009805460ff60c01b1916600160c01b831515021790556128f4565b6014546013819055600f546011546015546128d99361135392918391906134cb565b6017556009805460ff60c01b1916600160c01b831515021790555b60405181151581527fd2a0115b7422901ccb9f890046ea58825a06f8aff6a6c58d3260af631472dafb906020016114bf565b600061113d33846115698560405180606001604052806025815260200161508c602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613de9565b600a54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161139d565b600061113d338484613656565b6005546001600160a01b036101009091041633146129f45760405162461bcd60e51b815260040161117790614dd3565b600c546001600160a01b0382811691161415612a785760405162461bcd60e51b815260206004820152603a60248201527f4772616e647061477265656e3a20546865206d61726b6574696e672077616c6c60448201527f657420697320616c7265616479207468697320616464726573730000000000006064820152608401611177565b612a83816001612c2d565b600c546040516001600160a01b038084169216907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03610100909104163314612b0f5760405162461bcd60e51b815260040161117790614dd3565b612b2181670de0b6b3a7640000614f78565b600e5550565b6005546001600160a01b03610100909104163314612b575760405162461bcd60e51b815260040161117790614dd3565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015612b9e57600080fd5b505af1158015612bb2573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db091506024016112c1565b600b54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b03610100909104163314612c5d5760405162461bcd60e51b815260040161117790614dd3565b6001600160a01b0382166000908152601b602052604090205460ff1615158115151415612ce75760405162461bcd60e51b815260206004820152603260248201527f4772616e647061477265656e3a204163636f756e7420697320616c72656164796044820152712065786c756465642066726f6d206665657360701b6064820152608401611177565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b600b546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016123b4565b6005546001600160a01b03610100909104163314612da95760405162461bcd60e51b815260040161117790614dd3565b60005b82811015612e285781601b6000868685818110612dd957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612dee91906149a8565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612e2081614fe9565b915050612dac565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612e5c93929190614c50565b60405180910390a1505050565b6005546001600160a01b03610100909104163314612e995760405162461bcd60e51b815260040161117790614dd3565b60095460ff600160b01b9091041615158115151415612eca5760405162461bcd60e51b815260040161117790614d9c565b80612ef657600f8054601055600090556009805460ff60b01b1916600160b01b83151502179055612f3d565b601054600f81905550612f22600f546113536011546113536015546013546134cb90919063ffffffff16565b6017556009805460ff60b01b1916600160b01b831515021790555b60405181151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906020016114bf565b600b5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b15801561106157600080fd5b6005546001600160a01b03610100909104163314612fe45760405162461bcd60e51b815260040161117790614dd3565b60ff81166015819055600f546013546011546113599361135392918391906134cb565b6005546001600160a01b036101009091041633146130375760405162461bcd60e51b815260040161117790614dd3565b600a5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401600060405180830381600087803b15801561307d57600080fd5b505af1158015613091573d6000803e3d6000fd5b5050600b5460405163e98030c760e01b8152600481018590526001600160a01b03909116925063e98030c791506024016112c1565b6005546001600160a01b036101009091041633146130f65760405162461bcd60e51b815260040161117790614dd3565b6001600160a01b03811661315b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611177565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b036101009091041633146131f25760405162461bcd60e51b815260040161117790614dd3565b601855565b6005546001600160a01b036101009091041633146132275760405162461bcd60e51b815260040161117790614dd3565b600b546001600160a01b03828116911614156132555760405162461bcd60e51b815260040161117790614d3f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561329d57600080fd5b505afa1580156132b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d591906149c4565b6001600160a01b0316146132fb5760405162461bcd60e51b815260040161117790614e4d565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561333d57600080fd5b505af1158015613351573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561339657600080fd5b505af11580156133aa573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b1580156133f557600080fd5b505af1158015613409573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561345457600080fd5b505af1158015613468573d6000803e3d6000fd5b5050600b546040516001600160a01b03918216935090851691507f4f098bf81677d6930d991b96cd5494c72a796adf9f63de360eb31d60a5931e1190600090a3600b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000806134d88385614f40565b90508381101561352a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611177565b9392505050565b6001600160a01b0383166135935760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611177565b6001600160a01b0382166135f45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611177565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661367c5760405162461bcd60e51b815260040161117790614e08565b6001600160a01b0382166136a25760405162461bcd60e51b815260040161117790614cfc565b600954600160c81b900460ff16151560011415806136d257506005546001600160a01b0384811661010090920416145b6136db57600080fd5b6001600160a01b0383166000908152601b602052604081205460ff168061371a57506001600160a01b0383166000908152601b602052604090205460ff165b90506001600160a01b0383161580159061373f57506001600160a01b03831661dead14155b801561375457506001600160a01b0384163014155b801561376957506001600160a01b0383163014155b15613812577f000000000000000000000000ba6b1f92a322af7d81f80e48c1485ab3cf5c34016001600160a01b0316846001600160a01b0316141561381257600d546137b883611353866122ea565b11156138125760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611177565b600061381d306122ea565b600e5460095491925082101590600160a01b900460ff1615801561383e5750805b801561387c57507f000000000000000000000000ba6b1f92a322af7d81f80e48c1485ab3cf5c34016001600160a01b0316866001600160a01b031614155b156139c3576009805460ff60a01b1916600160a01b1790819055600160a81b900460ff161561390157600047905060006138cd6015546138c76017548761401c90919063ffffffff16565b90614077565b90506138d8816140f6565b60006138e4478461427b565b600c549091506138fd906001600160a01b0316826142d7565b5050505b600954600160b01b900460ff161561393d576000613930600f546138c76017548661401c90919063ffffffff16565b905061393b81614315565b505b600954600160b81b900460ff161561397957600061396c6011546138c76017548661401c90919063ffffffff16565b90506139778161439d565b505b600954600160c01b900460ff16156139b55760006139a86013546138c76017548661401c90919063ffffffff16565b90506139b381614453565b505b6009805460ff60a01b191690555b600954600090600160a01b900460ff161580156139de575083155b90508015613a4d576017546000906139fb906138c788606461401c565b6001600160a01b0388166000908152601c602052604090205490915060ff1615613a3457601854613a31906138c783606461401c565b90505b613a3e868261427b565b9550613a4b883083614509565b505b613a58878787614509565b600a546001600160a01b031663e30443bc88613a73816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ab957600080fd5b505af1925050508015613aca575060015b50600b546001600160a01b031663e30443bc88613ae6816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b2c57600080fd5b505af1925050508015613b3d575060015b50600a546001600160a01b031663e30443bc87613b59816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b9f57600080fd5b505af1925050508015613bb0575060015b50600b546001600160a01b031663e30443bc87613bcc816122ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613c1257600080fd5b505af1925050508015613c23575060015b50600954600160a01b900460ff16613de057601954600a546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015613c8157600080fd5b505af1925050508015613cb1575060408051601f3d908101601f19168201909252613cae91810190614c02565b60015b613cba57613d0b565b60408051848152602081018490529081018290526060810185905232906001907f7bfcac50b273f0f54552a3c0d28d8c0139b22cda470a361247c3c2ac4c5164c39060800160405180910390a35050505b600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015613d5457600080fd5b505af1925050508015613d84575060408051601f3d908101601f19168201909252613d8191810190614c02565b60015b613d8d57613dde565b60408051848152602081018490529081018290526060810185905232906001907f3ad76675ae9db4f582125cafa528199f97d2a09e00fcf57203f4b13df521619b9060800160405180910390a35050505b505b50505050505050565b60008184841115613e0d5760405162461bcd60e51b81526004016111779190614ca9565b50613e188385614f97565b949350505050565b6005546001600160a01b03610100909104163314613e505760405162461bcd60e51b815260040161117790614dd3565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415613ef45760405162461bcd60e51b815260206004820152604660248201527f4772616e647061477265656e3a204175746f6d61746564206d61726b6574206d60448201527f616b6572207061697220697320616c72656164792073657420746f20746861746064820152652076616c756560d01b608482015260a401611177565b6001600160a01b0382166000908152601c60205260409020805460ff19168215801591909117909155613fe057600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613f6857600080fd5b505af1158015613f7c573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015613fc757600080fd5b505af1158015613fdb573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600080821161406d5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401611177565b61352a8284614f58565b60008261408657506000611141565b60006140928385614f78565b90508261409f8583614f58565b1461352a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611177565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061413957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561418d57600080fd5b505afa1580156141a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c591906149c4565b816001815181106141e657634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260065461420c9130911684613531565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790614245908590600090869030904290600401614ed0565b600060405180830381600087803b15801561425f57600080fd5b505af1158015614273573d6000803e3d6000fd5b505050505050565b6000828211156142cd5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401611177565b61352a8284614f97565b60405181906001600160a01b0384169082156108fc029083906000818181858888f1935050505015801561430f573d6000803e3d6000fd5b50505050565b600061432282600261401c565b90506000614330838361427b565b90504761433c836140f6565b6000614348478361427b565b90506143548382614612565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561906060015b60405180910390a15050505050565b6007546143b690829030906001600160a01b03166146ce565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156143fa57600080fd5b505afa15801561440e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144329190614bea565b600754600a54919250611ef1916001600160a01b039182169116808461488f565b60085461446c90829030906001600160a01b03166146ce565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156144b057600080fd5b505afa1580156144c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e89190614bea565b600854600b54919250611ef1916001600160a01b039182169116808461488f565b6001600160a01b03831661452f5760405162461bcd60e51b815260040161117790614e08565b6001600160a01b0382166145555760405162461bcd60e51b815260040161117790614cfc565b6145928160405180606001604052806026815260200161503e602691396001600160a01b0386166000908152602081905260409020549190613de9565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546145c190826134cb565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613649565b60065461462a9030906001600160a01b031684613531565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b15801561469557600080fd5b505af11580156146a9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112ef9190614c02565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061471357634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561476757600080fd5b505afa15801561477b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061479f91906149c4565b816001815181106147c057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050818160028151811061480257634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546148289130911686613531565b600654604051635c11d79560e01b81526001600160a01b0390911690635c11d79590614861908790600090869089904290600401614ed0565b600060405180830381600087803b15801561487b57600080fd5b505af1158015613dde573d6000803e3d6000fd5b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb90604401602060405180830381600087803b1580156148dd57600080fd5b505af11580156148f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149159190614bb6565b905080156112ef57604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b15801561495f57600080fd5b505af1158015614973573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161438e91815260200190565b6000602082840312156149b9578081fd5b813561352a8161501a565b6000602082840312156149d5578081fd5b815161352a8161501a565b600080604083850312156149f2578081fd5b82356149fd8161501a565b91506020830135614a0d8161501a565b809150509250929050565b600080600060608486031215614a2c578081fd5b8335614a378161501a565b92506020840135614a478161501a565b929592945050506040919091013590565b60008060408385031215614a6a578182fd5b8235614a758161501a565b91506020830135614a0d8161502f565b600080600080600080600080610100898b031215614aa1578384fd5b8851614aac8161501a565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215614b00578182fd5b8235614b0b8161501a565b946020939093013593505050565b600080600060408486031215614b2d578283fd5b833567ffffffffffffffff80821115614b44578485fd5b818601915086601f830112614b57578485fd5b813581811115614b65578586fd5b8760208260051b8501011115614b79578586fd5b60209283019550935050840135614b8f8161502f565b809150509250925092565b600060208284031215614bab578081fd5b813561352a8161502f565b600060208284031215614bc7578081fd5b815161352a8161502f565b600060208284031215614be3578081fd5b5035919050565b600060208284031215614bfb578081fd5b5051919050565b600080600060608486031215614c16578283fd5b8351925060208401519150604084015190509250925092565b600060208284031215614c40578081fd5b813560ff8116811461352a578182fd5b6040808252810183905260008460608301825b86811015614c93578235614c768161501a565b6001600160a01b0316825260209283019290910190600101614c63565b5080925050508215156020830152949350505050565b6000602080835283518082850152825b81811015614cd557858101830151858201604001528201614cb9565b81811115614ce65783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f4772616e647061477265656e3a20546865206469766964656e6420747261636b60408201527f657220616c726561647920686173207468617420616464726573730000000000606082015260800190565b6020808252601d908201527f43616e27742073657420666c616720746f2073616d6520737461747573000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526057908201527f4772616e647061477265656e3a20546865206e6577206469766964656e64207460408201527f7261636b6572206d757374206265206f776e656420627920746865204772616e60608201527f647061477265656e20746f6b656e20636f6e7472616374000000000000000000608082015260a00190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015614f1f5784516001600160a01b031683529383019391830191600101614efa565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614f5357614f53615004565b500190565b600082614f7357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614f9257614f92615004565b500290565b600082821015614fa957614fa9615004565b500390565b600181811c90821680614fc257607f821691505b60208210811415614fe357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614ffd57614ffd615004565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461124957600080fd5b801515811461124957600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220990108d43474d2d3e4b57d7bebe599035891b793bc5bdb01e52295c69f81817664736f6c63430008040033

Library Used


Deployed Bytecode Sourcemap

25583:27270:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45402:151;;;;;;;;;;;;;:::i;:::-;;;18239:25:1;;;18227:2;18212:18;45402:151:0;;;;;;;;26697:46;;;;;;;;;;;;;;;;3905:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4806:169::-;;;;;;;;;;-1:-1:-1;4806:169:0;;;;;:::i;:::-;;:::i;:::-;;;8541:14:1;;8534:22;8516:41;;8504:2;8489:18;4806:169:0;8471:92:1;31465:322:0;;;;;;;;;;-1:-1:-1;31465:322:0;;;;;:::i;:::-;;:::i;:::-;;27164:29;;;;;;;;;;-1:-1:-1;27164:29:0;;;;-1:-1:-1;;;;;27164:29:0;;;;;;-1:-1:-1;;;;;5333:32:1;;;5315:51;;5303:2;5288:18;27164:29:0;5270:102:1;32128:196:0;;;;;;;;;;-1:-1:-1;32128:196:0;;;;;:::i;:::-;;:::i;25802:34::-;;;;;;;;;;-1:-1:-1;25802:34:0;;;;-1:-1:-1;;;;;25802:34:0;;;26934:116;;;;;;;;;;;;;;;;38684:213;;;;;;;;;;-1:-1:-1;38684:213:0;;;;;:::i;:::-;;:::i;25666:41::-;;;;;;;;;;-1:-1:-1;25666:41:0;;;;-1:-1:-1;;;;;25666:41:0;;;4209:108;;;;;;;;;;-1:-1:-1;4297:12:0;;4209:108;;44008:337;;;;;;;;;;-1:-1:-1;44008:337:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6334:32:1;;;6316:51;;6398:2;6383:18;;6376:34;;;;6426:18;;;6419:34;;;;6484:2;6469:18;;6462:34;;;;6527:3;6512:19;;6505:35;6354:3;6556:19;;6549:35;6615:3;6600:19;;6593:35;6659:3;6644:19;;6637:35;6303:3;6288:19;44008:337:0;6270:408:1;33135:296:0;;;;;;;;;;-1:-1:-1;33135:296:0;;;;;:::i;:::-;;:::i;45247:146::-;;;;;;;;;;;;;:::i;27063:42::-;;;;;;;;;;;;;;;;26648;;;;;;;;;;;;;;;;4984:321;;;;;;;;;;-1:-1:-1;4984:321:0;;;;;:::i;:::-;;:::i;45094:144::-;;;;;;;;;;;;;:::i;34817:598::-;;;;;;;;;;-1:-1:-1;34817:598:0;;;;;:::i;:::-;;:::i;25843:71::-;;;;;;;;;;-1:-1:-1;25843:71:0;;;;-1:-1:-1;;;;;25843:71:0;;;26606:35;;;;;;;;;;;;;;;;41898:151;;;;;;;;;;;;;:::i;4109:91::-;;;;;;;;;;-1:-1:-1;4183:9:0;;4109:91;;4183:9;;;;20125:36:1;;20113:2;20098:18;4109:91:0;20080:87:1;26087:40:0;;;;;;;;;;-1:-1:-1;26087:40:0;;;;-1:-1:-1;;;26087:40:0;;;;;;32957:166;;;;;;;;;;-1:-1:-1;32957:166:0;;;;;:::i;:::-;;:::i;42991:328::-;;;;;;;;;;-1:-1:-1;42991:328:0;;;;;:::i;:::-;;:::i;26750:43::-;;;;;;;;;;;;;;;;5314:218;;;;;;;;;;-1:-1:-1;5314:218:0;;;;;:::i;:::-;;:::i;41163:273::-;;;;;;;;;;-1:-1:-1;41163:273:0;;;;;:::i;:::-;;:::i;36059:941::-;;;;;;;;;;-1:-1:-1;36059:941:0;;;;;:::i;:::-;;:::i;25714:38::-;;;;;;;;;;;;;;;25994:40;;;;;;;;;;-1:-1:-1;25994:40:0;;;;-1:-1:-1;;;25994:40:0;;;;;;42058:153;;;;;;;;;;;;;:::i;26209:31::-;;;;;;;;;;-1:-1:-1;26209:31:0;;;;-1:-1:-1;;;26209:31:0;;;;;;44917:171;;;;;;;;;;;;;:::i;30939:518::-;;;;;;;;;;-1:-1:-1;30939:518:0;;;;;:::i;:::-;;:::i;31795:124::-;;;;;;;;;;-1:-1:-1;31795:124:0;;;;;:::i;:::-;;:::i;37974:234::-;;;;;;;;;;-1:-1:-1;37974:234:0;;;;;:::i;:::-;;:::i;31927:193::-;;;;;;;;;;-1:-1:-1;31927:193:0;;;;;:::i;:::-;;:::i;26247:28::-;;;;;;;;;;-1:-1:-1;26247:28:0;;;;-1:-1:-1;;;26247:28:0;;;;;;26892:35;;;;;;;;;;;;;;;;38906:323;;;;;;;;;;-1:-1:-1;38906:323:0;;;;;:::i;:::-;;:::i;26854:31::-;;;;;;;;;;;;;;;;26800:47;;;;;;;;;;;;;;;;44351:557;;;;;;;;;;-1:-1:-1;44351:557:0;;;;;:::i;:::-;;:::i;4326:127::-;;;;;;;;;;-1:-1:-1;4326:127:0;;;;;:::i;:::-;;:::i;2305:148::-;;;;;;;;;;;;;:::i;26400:30::-;;;;;;;;;;-1:-1:-1;26400:30:0;;;;-1:-1:-1;;;;;26400:30:0;;;42220:127;;;;;;;;;;-1:-1:-1;42220:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;42312:27:0;42288:4;42312:27;;;:18;:27;;;;;;;;;42220:127;42838:144;;;;;;;;;;-1:-1:-1;42838:144:0;;;;;:::i;:::-;;:::i;40862:292::-;;;;;;;;;;-1:-1:-1;40862:292:0;;;;;:::i;:::-;;:::i;26340:50::-;;;;;;;;;;-1:-1:-1;26340:50:0;;;;-1:-1:-1;;;;;26340:50:0;;;42690:142;;;;;;;;;;-1:-1:-1;42690:142:0;;;;;:::i;:::-;;:::i;42356:159::-;;;;;;;;;;-1:-1:-1;42356:159:0;;;;;:::i;:::-;;:::i;33443:673::-;;;;;;;;;;-1:-1:-1;33443:673:0;;;;;:::i;:::-;;:::i;2080:87::-;;;;;;;;;;-1:-1:-1;2153:6:0;;;;;-1:-1:-1;;;;;2153:6:0;2080:87;;38217:236;;;;;;;;;;-1:-1:-1;38217:236:0;;;;;:::i;:::-;;:::i;4005:95::-;;;;;;;;;;;;;:::i;43328:330::-;;;;;;;;;;-1:-1:-1;43328:330:0;;;;;:::i;:::-;;:::i;41642:118::-;;;;;;;;;;;;;:::i;26568:31::-;;;;;;;;;;;;;;;;40080:271;;;;;;;;;;-1:-1:-1;40080:271:0;;;;;:::i;:::-;;:::i;26041:39::-;;;;;;;;;;-1:-1:-1;26041:39:0;;;;-1:-1:-1;;;26041:39:0;;;;;;27115;;;;;;;;;;;;;;;;34125:683;;;;;;;;;;-1:-1:-1;34125:683:0;;;;;:::i;:::-;;:::i;5541:269::-;;;;;;;;;;-1:-1:-1;5541:269:0;;;;;:::i;:::-;;:::i;43664:335::-;;;;;;;;;;-1:-1:-1;43664:335:0;;;;;:::i;:::-;;:::i;4462:175::-;;;;;;;;;;-1:-1:-1;4462:175:0;;;;;:::i;:::-;;:::i;32332:336::-;;;;;;;;;;-1:-1:-1;32332:336:0;;;;;:::i;:::-;;:::i;32676:131::-;;;;;;;;;;-1:-1:-1;32676:131:0;;;;;:::i;:::-;;:::i;39544:212::-;;;;;;;;;;-1:-1:-1;39544:212:0;;;;;:::i;:::-;;:::i;27414:58::-;;;;;;;;;;-1:-1:-1;27414:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45562:153;;;;;;;;;;;;;:::i;26443:52::-;;;;;;;;;;;;;;;;39238:297;;;;;;;;;;-1:-1:-1;39238:297:0;;;;;:::i;:::-;;:::i;42523:161::-;;;;;;;;;;-1:-1:-1;42523:161:0;;;;;:::i;:::-;;:::i;39765:306::-;;;;;;;;;;-1:-1:-1;39765:306:0;;;;;:::i;:::-;;:::i;35424:623::-;;;;;;;;;;-1:-1:-1;35424:623:0;;;;;:::i;:::-;;:::i;26285:48::-;;;;;;;;;;-1:-1:-1;26285:48:0;;;;-1:-1:-1;;;;;26285:48:0;;;41769:120;;;;;;;;;;;;;:::i;38462:213::-;;;;;;;;;;-1:-1:-1;38462:213:0;;;;;:::i;:::-;;:::i;25762:33::-;;;;;;;;;;-1:-1:-1;25762:33:0;;;;-1:-1:-1;;;;;25762:33:0;;;4646:151;;;;;;;;;;-1:-1:-1;4646:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;4762:18:0;;;4735:7;4762:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4646:151;26502:56;;;;;;;;;;;;;;;;25952:35;;;;;;;;;;-1:-1:-1;25952:35:0;;;;-1:-1:-1;;;25952:35:0;;;;;;41445:188;;;;;;;;;;-1:-1:-1;41445:188:0;;;;;:::i;:::-;;:::i;2462:244::-;;;;;;;;;;-1:-1:-1;2462:244:0;;;;;:::i;:::-;;:::i;32815:130::-;;;;;;;;;;-1:-1:-1;32815:130:0;;;;;:::i;:::-;;:::i;37009:956::-;;;;;;;;;;-1:-1:-1;37009:956:0;;;;;:::i;:::-;;:::i;45402:151::-;45499:20;;:46;;;-1:-1:-1;;;45499:46:0;;;;45472:7;;-1:-1:-1;;;;;45499:20:0;;:44;;:46;;;;;;;;;;;;;;:20;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45492:53;;45402:151;:::o;3905:91::-;3950:13;3983:5;3976:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3905:91;:::o;4806:169::-;4889:4;4906:39;1478:10;4929:7;4938:6;4906:8;:39::i;:::-;-1:-1:-1;4963:4:0;4806:169;;;;;:::o;31465:322::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;;;;;;;;;31573:20:::1;::::0;:68:::1;::::0;-1:-1:-1;;;31573:68:0;;-1:-1:-1;;;;;5333:32:1;;;31573:68:0::1;::::0;::::1;5315:51:1::0;31573:20:0;;::::1;::::0;:41:::1;::::0;5288:18:1;;31573:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31652:21:0::1;::::0;:69:::1;::::0;-1:-1:-1;;;31652:69:0;;-1:-1:-1;;;;;5333:32:1;;;31652:69:0::1;::::0;::::1;5315:51:1::0;31652:21:0;;::::1;::::0;-1:-1:-1;31652:42:0::1;::::0;-1:-1:-1;5288:18:1;;31652:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31732:48;31748:25;31775:4;31732:15;:48::i;:::-;31465:322:::0;:::o;32128:196::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;32214:19:::1;:34:::0;;-1:-1:-1;;;;;;32214:34:0::1;-1:-1:-1::0;;;;;32214:34:0;;::::1;::::0;;::::1;::::0;;;32258:21:::1;::::0;:59:::1;::::0;-1:-1:-1;;;32258:59:0;;::::1;::::0;::::1;5315:51:1::0;;;;32258:21:0;;::::1;::::0;:45:::1;::::0;5288:18:1;;32258:59:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32128:196:::0;:::o;38684:213::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;38771:6:::1;38756:21;;:12;:21;;;;38800:89;38876:12;;38800:71;38846:24;;38800:41;38817:23;;38800:12;;:16;;:41;;;;:::i;:::-;:45:::0;::::1;:71::i;:89::-;38788:9;:101:::0;-1:-1:-1;38684:213:0:o;44008:337::-;44291:21;;:46;;-1:-1:-1;;;44291:46:0;;;;;18239:25:1;;;44115:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44291:21:0;;;;:39;;18212:18:1;;44291:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44284:53;;;;;;;;;;;;;;;;44008:337;;;;;;;;;:::o;33135:296::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;33216:8:::1;::::0;-1:-1:-1;;;33216:8:0;::::1;;;33212:163;;33249:12;:23:::0;;-1:-1:-1;;;;33249:23:0;::::1;;-1:-1:-1::0;;;33249:23:0::1;33287:15:::0;-1:-1:-1;;;;33287:15:0;;;;-1:-1:-1;;;33287:15:0::1;::::0;;33212:163:::1;;;33343:12;:20:::0;;-1:-1:-1;;;;33343:20:0::1;::::0;;33212:163:::1;33410:12;::::0;33390:33:::1;::::0;-1:-1:-1;;;33410:12:0;;::::1;;;8541:14:1::0;8534:22;8516:41;;33390:33:0::1;::::0;8504:2:1;8489:18;33390:33:0::1;;;;;;;;33135:296:::0;:::o;45247:146::-;45340:21;;:45;;;-1:-1:-1;;;45340:45:0;;;;45316:7;;-1:-1:-1;;;;;45340:21:0;;:43;;:45;;;;;;;;;;;;;;:21;:45;;;;;;;;;;4984:321;5090:4;5107:36;5117:6;5125:9;5136:6;5107:9;:36::i;:::-;5154:121;5163:6;1478:10;5185:89;5223:6;5185:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5185:19:0;;;;;;:11;:19;;;;;;;;1478:10;5185:33;;;;;;;;;;:37;:89::i;:::-;5154:8;:121::i;:::-;-1:-1:-1;5293:4:0;4984:321;;;;;:::o;45094:144::-;45186:20;;:44;;;-1:-1:-1;;;45186:44:0;;;;45162:7;;-1:-1:-1;;;;;45186:20:0;;:42;;:44;;;;;;;;;;;;;;:20;:44;;;;;;;;;;34817:598;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;34899:16:::1;::::0;::::1;-1:-1:-1::0;;;34899:16:0;;::::1;;:28;;::::0;::::1;;;;34891:70;;;;-1:-1:-1::0;;;34891:70:0::1;;;;;;;:::i;:::-;34976:17:::0;34972:384:::1;;35033:12;::::0;;35010:20:::1;:35:::0;-1:-1:-1;35060:16:0;;35091::::1;:27:::0;;-1:-1:-1;;;;35091:27:0::1;-1:-1:-1::0;;;35091:27:0;::::1;;;;::::0;;34972:384:::1;;;35166:20;::::0;35151:12:::1;:35:::0;;;35289:12:::1;::::0;35260:23:::1;::::0;35230:24:::1;::::0;35213:89:::1;::::0;:71:::1;::::0;35260:23;35213:71;;35166:20;35213:16:::1;:42::i;:89::-;35201:9;:101:::0;35317:16:::1;:27:::0;;-1:-1:-1;;;;35317:27:0::1;-1:-1:-1::0;;;35317:27:0;::::1;;;;::::0;;34972:384:::1;35374:33;::::0;8541:14:1;;8534:22;8516:41;;35374:33:0::1;::::0;8504:2:1;8489:18;35374:33:0::1;8471:92:1::0;41898:151:0;41993:20;;:48;;;-1:-1:-1;;;41993:48:0;;;;41966:7;;-1:-1:-1;;;;;41993:20:0;;:46;;:48;;;;;;;;;;;;;;:20;:48;;;;;;;;;;32957:166;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;33029:21:::1;::::0;:38:::1;::::0;-1:-1:-1;;;33029:38:0;;-1:-1:-1;;;;;5333:32:1;;;33029:38:0::1;::::0;::::1;5315:51:1::0;33029:21:0;;::::1;::::0;:29:::1;::::0;5288:18:1;;33029:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33078:20:0::1;::::0;:37:::1;::::0;-1:-1:-1;;;33078:37:0;;-1:-1:-1;;;;;5333:32:1;;;33078:37:0::1;::::0;::::1;5315:51:1::0;33078:20:0;;::::1;::::0;-1:-1:-1;33078:28:0::1;::::0;-1:-1:-1;5288:18:1;;33078:37:0::1;5270:102:1::0;42991:328:0;43271:20;;:40;;-1:-1:-1;;;43271:40:0;;-1:-1:-1;;;;;5333:32:1;;;43271:40:0;;;5315:51:1;43092:7:0;;;;;;;;;;;;;;;;43271:20;;;:31;;5288:18:1;;43271:40:0;5270:102:1;5314:218:0;1478:10;5402:4;5451:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5451:34:0;;;;;;;;;;5402:4;;5419:83;;5442:7;;5451:50;;5490:10;5451:38;:50::i;41163:273::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;41262:20:::1;::::0;:77:::1;::::0;-1:-1:-1;;;41262:77:0;;::::1;::::0;::::1;18239:25:1::0;;;-1:-1:-1;;;;;41262:20:0;;::::1;::::0;:58:::1;::::0;18212:18:1;;41262:77:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41350:21:0::1;::::0;:78:::1;::::0;-1:-1:-1;;;41350:78:0;;::::1;::::0;::::1;18239:25:1::0;;;-1:-1:-1;;;;;41350:21:0;;::::1;::::0;-1:-1:-1;41350:59:0::1;::::0;-1:-1:-1;18212:18:1;;41350:78:0::1;18194:76:1::0;36059:941:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;36175:20:::1;::::0;-1:-1:-1;;;;;36153:43:0;;::::1;36175:20:::0;::::1;36153:43;;36145:115;;;;-1:-1:-1::0;;;36145:115:0::1;;;;;;;:::i;:::-;36274:44;36350:10;36274:88;;36427:4;-1:-1:-1::0;;;;;36384:48:0::1;:23;-1:-1:-1::0;;;;;36384:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36384:48:0::1;;36376:148;;;;-1:-1:-1::0;;;36376:148:0::1;;;;;;;:::i;:::-;36538:78;::::0;-1:-1:-1;;;36538:78:0;;-1:-1:-1;;;;;36538:44:0;::::1;:78;::::0;::::1;5315:51:1::0;;;36538:44:0;::::1;::::0;5288:18:1;;36538:78:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36627:59:0::1;::::0;-1:-1:-1;;;36627:59:0;;36680:4:::1;36627:59;::::0;::::1;5315:51:1::0;-1:-1:-1;;;;;36627:44:0;::::1;::::0;-1:-1:-1;36627:44:0::1;::::0;-1:-1:-1;5288:18:1;;36627:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36750:15:0::1;::::0;36697:70:::1;::::0;-1:-1:-1;;;36697:70:0;;-1:-1:-1;;;;;36750:15:0;;::::1;36697:70;::::0;::::1;5315:51:1::0;36697:44:0;;::::1;::::0;-1:-1:-1;36697:44:0::1;::::0;-1:-1:-1;5288:18:1;;36697:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36831:11:0::1;::::0;36778:66:::1;::::0;-1:-1:-1;;;36778:66:0;;-1:-1:-1;;;;;36831:11:0;;::::1;36778:66;::::0;::::1;5315:51:1::0;36778:44:0;;::::1;::::0;-1:-1:-1;36778:44:0::1;::::0;-1:-1:-1;5288:18:1;;36778:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36910:20:0::1;::::0;36863:69:::1;::::0;-1:-1:-1;;;;;36910:20:0;;::::1;::::0;-1:-1:-1;36863:69:0;;::::1;::::0;-1:-1:-1;36863:69:0::1;::::0;36910:20:::1;::::0;36863:69:::1;36946:20;:46:::0;;-1:-1:-1;;;;;;36946:46:0::1;-1:-1:-1::0;;;;;36946:46:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;36059:941:0:o;42058:153::-;42154:21;;:49;;;-1:-1:-1;;;42154:49:0;;;;42127:7;;-1:-1:-1;;;;;42154:21:0;;:47;;:49;;;;;;;;;;;;;;:21;:49;;;;;;;;;;44917:171;44948:20;;:63;;-1:-1:-1;;;44948:63:0;;44992:10;44948:63;;;5561:51:1;44948:20:0;5628:18:1;;;5621:50;-1:-1:-1;;;;;44948:20:0;;;;:35;;5534:18:1;;44948:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;45016:21:0;;:64;;-1:-1:-1;;;45016:64:0;;45061:10;45016:64;;;5561:51:1;45016:21:0;5628:18:1;;;5621:50;-1:-1:-1;;;;;45016:21:0;;;;:36;;5534:18:1;;45016:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30939:518::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;31042:14:::1;:32:::0;;-1:-1:-1;;;;;;31042:32:0::1;-1:-1:-1::0;;;;;31042:32:0;;::::1;::::0;;::::1;::::0;;;31085:20:::1;::::0;:58:::1;::::0;-1:-1:-1;;;31085:58:0;;::::1;::::0;::::1;5315:51:1::0;;;;31085:20:0;;::::1;::::0;:41:::1;::::0;5288:18:1;;31085:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31154:21:0::1;::::0;:59:::1;::::0;-1:-1:-1;;;31154:59:0;;-1:-1:-1;;;;;5333:32:1;;;31154:59:0::1;::::0;::::1;5315:51:1::0;31154:21:0;;::::1;::::0;-1:-1:-1;31154:42:0::1;::::0;-1:-1:-1;5288:18:1;;31154:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31224:38;31240:15;31257:4;31224:15;:38::i;:::-;31276:20;::::0;:57:::1;::::0;-1:-1:-1;;;31276:57:0;;-1:-1:-1;;;;;5333:32:1;;;31276:57:0::1;::::0;::::1;5315:51:1::0;31276:20:0;;::::1;::::0;:41:::1;::::0;5288:18:1;;31276:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31344:21:0::1;::::0;:58:::1;::::0;-1:-1:-1;;;31344:58:0;;-1:-1:-1;;;;;5333:32:1;;;31344:58:0::1;::::0;::::1;5315:51:1::0;31344:21:0;;::::1;::::0;-1:-1:-1;31344:42:0::1;::::0;-1:-1:-1;5288:18:1;;31344:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31413:37;31429:14;31445:4;31413:15;:37::i;:::-;30939:518:::0;;:::o;31795:124::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;31876:16:::1;:36:::0;31795:124::o;37974:234::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;38056:32:::1;::::0;::::1;:23;:32:::0;;;38187:12:::1;::::0;38157:24:::1;::::0;38139:12:::1;::::0;38111:89:::1;::::0;:71:::1;::::0;38157:24;38111:71;;38056:32;38111:27:::1;:41::i;31927:193::-:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;32012:18:::1;:33:::0;;-1:-1:-1;;;;;;32012:33:0::1;-1:-1:-1::0;;;;;32012:33:0;;::::1;::::0;;::::1;::::0;;;32055:20:::1;::::0;:58:::1;::::0;-1:-1:-1;;;32055:58:0;;::::1;::::0;::::1;5315:51:1::0;;;;32055:20:0;;::::1;::::0;:44:::1;::::0;5288:18:1;;32055:58:0::1;5270:102:1::0;38906:323:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;39017:15:::1;::::0;-1:-1:-1;;;;;38995:38:0;;::::1;39017:15:::0;::::1;38995:38;;38987:100;;;::::0;-1:-1:-1;;;38987:100:0;;11302:2:1;38987:100:0::1;::::0;::::1;11284:21:1::0;11341:2;11321:18;;;11314:30;11380:34;11360:18;;;11353:62;-1:-1:-1;;;11431:18:1;;;11424:47;11488:19;;38987:100:0::1;11274:239:1::0;38987:100:0::1;39145:15;::::0;39103:59:::1;::::0;-1:-1:-1;;;;;39145:15:0;;::::1;::::0;39103:59;::::1;::::0;::::1;::::0;39145:15:::1;::::0;39103:59:::1;39173:15;:48:::0;;-1:-1:-1;;;;;;39173:48:0::1;-1:-1:-1::0;;;;;39173:48:0;;;::::1;::::0;;;::::1;::::0;;38906:323::o;44351:557::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;44502:20:::1;::::0;:33:::1;::::0;-1:-1:-1;;;;;;44502:33:0;;::::1;::::0;::::1;18239:25:1::0;;;44421:23:0::1;::::0;;;;;-1:-1:-1;;;;;44502:20:0::1;::::0;:28:::1;::::0;18212:18:1;;44502:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44545:107;::::0;;19818:25:1;;;19874:2;19859:18;;19852:34;;;19902:18;;;19895:34;;;19960:2;19945:18;;19938:34;;;44420:115:0;;-1:-1:-1;44420:115:0;;-1:-1:-1;44420:115:0;-1:-1:-1;44642:9:0::1;::::0;44630:5:::1;::::0;44545:107:::1;::::0;19805:3:1;19790:19;44545:107:0::1;;;;;;;44745:21;::::0;:34:::1;::::0;-1:-1:-1;;;;;;44745:34:0;;::::1;::::0;::::1;18239:25:1::0;;;44661:24:0::1;::::0;;;;;-1:-1:-1;;;;;44745:21:0::1;::::0;:29:::1;::::0;18212:18:1;;44745:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44789:111;::::0;;19818:25:1;;;19874:2;19859:18;;19852:34;;;19902:18;;;19895:34;;;19960:2;19945:18;;19938:34;;;44660:119:0;;-1:-1:-1;44660:119:0;;-1:-1:-1;44660:119:0;-1:-1:-1;44890:9:0::1;::::0;44878:5:::1;::::0;44789:111:::1;::::0;19805:3:1;19790:19;44789:111:0::1;;;;;;;2287:1;;;;;;44351:557:::0;:::o;4326:127::-;-1:-1:-1;;;;;4427:18:0;4400:7;4427:18;;;;;;;;;;;;4326:127::o;2305:148::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;2396:6:::1;::::0;2375:40:::1;::::0;2412:1:::1;::::0;2396:6:::1;::::0;::::1;-1:-1:-1::0;;;;;2396:6:0::1;::::0;2375:40:::1;::::0;2412:1;;2375:40:::1;2426:6;:19:::0;;-1:-1:-1;;;;;;2426:19:0::1;::::0;;2305:148::o;42838:144::-;42937:21;;:40;;-1:-1:-1;;;42937:40:0;;-1:-1:-1;;;;;5333:32:1;;;42937:40:0;;;5315:51:1;42916:7:0;;42937:21;;:31;;5288:18:1;;42937:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40862:292::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;40962:16:::1;;40950:8;:28;;40942:99;;;::::0;-1:-1:-1;;;40942:99:0;;17868:2:1;40942:99:0::1;::::0;::::1;17850:21:1::0;17907:2;17887:18;;;17880:30;17946:34;17926:18;;;17919:62;18017:28;17997:18;;;17990:56;18063:19;;40942:99:0::1;17840:248:1::0;40942:99:0::1;41052:16;:27:::0;;;41095:51:::1;::::0;41071:8;;;;41095:51:::1;::::0;;;::::1;40862:292:::0;:::o;42690:142::-;42788:20;;:39;;-1:-1:-1;;;42788:39:0;;-1:-1:-1;;;;;5333:32:1;;;42788:39:0;;;5315:51:1;42767:7:0;;42788:20;;:30;;5288:18:1;;42788:39:0;5270:102:1;42356:159:0;42456:20;;:52;;-1:-1:-1;;;42456:52:0;;-1:-1:-1;;;;;5333:32:1;;;42456:52:0;;;5315:51:1;42432:7:0;;42456:20;;:43;;5288:18:1;;42456:52:0;5270:102:1;33443:673:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;33529:20:::1;::::0;::::1;-1:-1:-1::0;;;33529:20:0;;::::1;;:32;;::::0;::::1;;;;33521:74;;;;-1:-1:-1::0;;;33521:74:0::1;;;;;;;:::i;:::-;33610:17:::0;33606:447:::1;;33678:23;::::0;;33644:31:::1;:57:::0;-1:-1:-1;33716:27:0;;33758:20:::1;:31:::0;;-1:-1:-1;;;;33758:31:0::1;-1:-1:-1::0;;;33758:31:0;::::1;;;;::::0;;33606:447:::1;;;33848:31;::::0;33822:23:::1;:57:::0;;;33982:12:::1;::::0;33952:24:::1;::::0;33934:12:::1;::::0;33906:89:::1;::::0;:71:::1;::::0;33952:24;33906:71;;33848:31;33906:27:::1;:41::i;:89::-;33894:9;:101:::0;34010:20:::1;:31:::0;;-1:-1:-1;;;;34010:31:0::1;-1:-1:-1::0;;;34010:31:0;::::1;;;;::::0;;33606:447:::1;34071:37;::::0;8541:14:1;;8534:22;8516:41;;34071:37:0::1;::::0;8504:2:1;8489:18;34071:37:0::1;8471:92:1::0;38217:236:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;38300:33:::1;::::0;::::1;:24;:33:::0;;;38432:12:::1;::::0;38414::::1;::::0;38385:23:::1;::::0;38356:89:::1;::::0;:71:::1;::::0;38414:12;38356:71;;38300:33;38356:28:::1;:53::i;4005:95::-:0;4052:13;4085:7;4078:14;;;;;:::i;43328:330::-;43609:21;;:41;;-1:-1:-1;;;43609:41:0;;-1:-1:-1;;;;;5333:32:1;;;43609:41:0;;;5315:51:1;43430:7:0;;;;;;;;;;;;;;;;43609:21;;;:32;;5288:18:1;;43609:41:0;5270:102:1;41642:118:0;41720:20;;:32;;;-1:-1:-1;;;41720:32:0;;;;41693:7;;-1:-1:-1;;;;;41720:20:0;;:30;;:32;;;;;;;;;;;;;;:20;:32;;;;;;;;;;40080:271;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;40187:13:::1;-1:-1:-1::0;;;;;40179:21:0::1;:4;-1:-1:-1::0;;;;;40179:21:0::1;;;40171:117;;;::::0;-1:-1:-1;;;40171:117:0;;15996:2:1;40171:117:0::1;::::0;::::1;15978:21:1::0;16035:2;16015:18;;;16008:30;16074:34;16054:18;;;16047:62;16145:34;16125:18;;;16118:62;-1:-1:-1;;;16196:19:1;;;16189:50;16256:19;;40171:117:0::1;15968:313:1::0;40171:117:0::1;40302:41;40331:4;40337:5;40302:28;:41::i;34125:683::-:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;34212:21:::1;::::0;::::1;-1:-1:-1::0;;;34212:21:0;;::::1;;:33;;::::0;::::1;;;;34204:75;;;;-1:-1:-1::0;;;34204:75:0::1;;;;;;;:::i;:::-;34294:17:::0;34290:454:::1;;34363:24;::::0;;34328:32:::1;:59:::0;-1:-1:-1;34402:28:0;;34445:21:::1;:32:::0;;-1:-1:-1;;;;34445:32:0::1;-1:-1:-1::0;;;34445:32:0;::::1;;;;::::0;;34290:454:::1;;;34537:32;::::0;34510:24:::1;:59:::0;;;34672:12:::1;::::0;34643:23:::1;::::0;34625:12:::1;::::0;34596:89:::1;::::0;:71:::1;::::0;34643:23;34596:71;;34537:32;34596:28:::1;:42::i;:89::-;34584:9;:101:::0;34700:21:::1;:32:::0;;-1:-1:-1;;;;34700:32:0::1;-1:-1:-1::0;;;34700:32:0;::::1;;;;::::0;;34290:454:::1;34762:38;::::0;8541:14:1;;8534:22;8516:41;;34762:38:0::1;::::0;8504:2:1;8489:18;34762:38:0::1;8471:92:1::0;5541:269:0;5634:4;5651:129;1478:10;5674:7;5683:96;5722:15;5683:96;;;;;;;;;;;;;;;;;1478:10;5683:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5683:34:0;;;;;;;;;;;;:38;:96::i;43664:335::-;43946:20;;:45;;-1:-1:-1;;;43946:45:0;;;;;18239:25:1;;;43770:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43946:20:0;;;;:38;;18212:18:1;;43946:45:0;18194:76:1;4462:175:0;4548:4;4565:42;1478:10;4589:9;4600:6;4565:9;:42::i;32332:336::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;32434:15:::1;::::0;-1:-1:-1;;;;;32420:29:0;;::::1;32434:15:::0;::::1;32420:29;;32412:100;;;::::0;-1:-1:-1;;;32412:100:0;;12076:2:1;32412:100:0::1;::::0;::::1;12058:21:1::0;12115:2;12095:18;;;12088:30;12154:34;12134:18;;;12127:62;12225:28;12205:18;;;12198:56;12271:19;;32412:100:0::1;12048:248:1::0;32412:100:0::1;32523:33;32539:10;32551:4;32523:15;:33::i;:::-;32595:15;::::0;32572:51:::1;::::0;-1:-1:-1;;;;;32572:51:0;;::::1;::::0;32595:15:::1;::::0;32572:51:::1;::::0;32595:15:::1;::::0;32572:51:::1;32633:15;:28:::0;;-1:-1:-1;;;;;;32633:28:0::1;-1:-1:-1::0;;;;;32633:28:0;;;::::1;::::0;;;::::1;::::0;;32332:336::o;32676:131::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;32778:22:::1;:11:::0;32793:6:::1;32778:22;:::i;:::-;32757:18;:43:::0;-1:-1:-1;32676:131:0:o;39544:212::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;39618:20:::1;::::0;:59:::1;::::0;-1:-1:-1;;;39618:59:0;;-1:-1:-1;;;;;5333:32:1;;;39618:59:0::1;::::0;::::1;5315:51:1::0;39618:20:0;;::::1;::::0;:41:::1;::::0;5288:18:1;;39618:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;39688:21:0::1;::::0;:60:::1;::::0;-1:-1:-1;;;39688:60:0;;-1:-1:-1;;;;;5333:32:1;;;39688:60:0::1;::::0;::::1;5315:51:1::0;39688:21:0;;::::1;::::0;-1:-1:-1;39688:42:0::1;::::0;-1:-1:-1;5288:18:1;;39688:60:0::1;5270:102:1::0;45562:153:0;45660:21;;:47;;;-1:-1:-1;;;45660:47:0;;;;45633:7;;-1:-1:-1;;;;;45660:21:0;;:45;;:47;;;;;;;;;;;;;;:21;:47;;;;;;;;;;39238:297;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39331:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:39;;::::0;::::1;;;;39323:102;;;::::0;-1:-1:-1;;;39323:102:0;;14810:2:1;39323:102:0::1;::::0;::::1;14792:21:1::0;14849:2;14829:18;;;14822:30;14888:34;14868:18;;;14861:62;-1:-1:-1;;;14939:18:1;;;14932:48;14997:19;;39323:102:0::1;14782:240:1::0;39323:102:0::1;-1:-1:-1::0;;;;;39436:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;39436:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39493:34;;8516:41:1;;;39493:34:0::1;::::0;8489:18:1;39493:34:0::1;;;;;;;39238:297:::0;;:::o;42523:161::-;42624:21;;:53;;-1:-1:-1;;;42624:53:0;;-1:-1:-1;;;;;5333:32:1;;;42624:53:0;;;5315:51:1;42600:7:0;;42624:21;;:44;;5288:18:1;;42624:53:0;5270:102:1;39765:306:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;39884:9:::1;39880:114;39899:19:::0;;::::1;39880:114;;;39974:8;39940:18;:31;39959:8;;39968:1;39959:11;;;;;-1:-1:-1::0;;;39959:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39940:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39940:31:0;:42;;-1:-1:-1;;39940:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39920:3;::::1;::::0;::::1;:::i;:::-;;;;39880:114;;;;40012:51;40044:8;;40054;40012:51;;;;;;;;:::i;:::-;;;;;;;;39765:306:::0;;;:::o;35424:623::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;35511:21:::1;::::0;::::1;-1:-1:-1::0;;;35511:21:0;;::::1;;:33;;::::0;::::1;;;;35503:75;;;;-1:-1:-1::0;;;35503:75:0::1;;;;;;;:::i;:::-;35593:17:::0;35589:394:::1;;35650:12;::::0;;35627:20:::1;:35:::0;-1:-1:-1;35677:16:0;;35708:21:::1;:32:::0;;-1:-1:-1;;;;35708:32:0::1;-1:-1:-1::0;;;35708:32:0;::::1;;;;::::0;;35589:394:::1;;;35788:20;;35773:12;:35;;;;35835:89;35911:12;;35835:71;35882:23;;35835:42;35864:12;;35835:24;;:28;;:42;;;;:::i;:89::-;35823:9;:101:::0;35939:21:::1;:32:::0;;-1:-1:-1;;;;35939:32:0::1;-1:-1:-1::0;;;35939:32:0;::::1;;;;::::0;;35589:394:::1;36001:38;::::0;8541:14:1;;8534:22;8516:41;;36001:38:0::1;::::0;8504:2:1;8489:18;36001:38:0::1;8471:92:1::0;41769:120:0;41848:21;;:33;;;-1:-1:-1;;;41848:33:0;;;;41821:7;;-1:-1:-1;;;;;41848:21:0;;:31;;:33;;;;;;;;;;;;;;:21;:33;;;;;;;;;;38462:213;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;38534:21:::1;::::0;::::1;:12;:21:::0;;;38654:12:::1;::::0;38624:24:::1;::::0;38595:23:::1;::::0;38578:89:::1;::::0;:71:::1;::::0;38624:24;38578:71;;38534:21;38578:16:::1;:41::i;41445:188::-:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;41519:20:::1;::::0;:47:::1;::::0;-1:-1:-1;;;41519:47:0;;::::1;::::0;::::1;18239:25:1::0;;;-1:-1:-1;;;;;41519:20:0;;::::1;::::0;:36:::1;::::0;18212:18:1;;41519:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41577:21:0::1;::::0;:48:::1;::::0;-1:-1:-1;;;41577:48:0;;::::1;::::0;::::1;18239:25:1::0;;;-1:-1:-1;;;;;41577:21:0;;::::1;::::0;-1:-1:-1;41577:37:0::1;::::0;-1:-1:-1;18212:18:1;;41577:48:0::1;18194:76:1::0;2462:244:0;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2551:22:0;::::1;2543:73;;;::::0;-1:-1:-1;;;2543:73:0;;10492:2:1;2543:73:0::1;::::0;::::1;10474:21:1::0;10531:2;10511:18;;;10504:30;10570:34;10550:18;;;10543:62;-1:-1:-1;;;10621:18:1;;;10614:36;10667:19;;2543:73:0::1;10464:228:1::0;2543:73:0::1;2653:6;::::0;2632:38:::1;::::0;-1:-1:-1;;;;;2632:38:0;;::::1;::::0;2653:6:::1;::::0;::::1;;::::0;2632:38:::1;::::0;;;::::1;2681:6;:17:::0;;-1:-1:-1;;;;;2681:17:0;;::::1;;;-1:-1:-1::0;;;;;;2681:17:0;;::::1;::::0;;;::::1;::::0;;2462:244::o;32815:130::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;32903:21:::1;:35:::0;32815:130::o;37009:956::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;37126:21:::1;::::0;-1:-1:-1;;;;;37104:44:0;;::::1;37126:21:::0;::::1;37104:44;;37096:116;;;;-1:-1:-1::0;;;37096:116:0::1;;;;;;;:::i;:::-;37226:46;37305:10;37226:91;;37383:4;-1:-1:-1::0;;;;;37339:49:0::1;:24;-1:-1:-1::0;;;;;37339:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37339:49:0::1;;37331:149;;;;-1:-1:-1::0;;;37331:149:0::1;;;;;;;:::i;:::-;37494:80;::::0;-1:-1:-1;;;37494:80:0;;-1:-1:-1;;;;;37494:45:0;::::1;:80;::::0;::::1;5315:51:1::0;;;37494:45:0;::::1;::::0;5288:18:1;;37494:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37585:60:0::1;::::0;-1:-1:-1;;;37585:60:0;;37639:4:::1;37585:60;::::0;::::1;5315:51:1::0;-1:-1:-1;;;;;37585:45:0;::::1;::::0;-1:-1:-1;37585:45:0::1;::::0;-1:-1:-1;5288:18:1;;37585:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37710:15:0::1;::::0;37656:71:::1;::::0;-1:-1:-1;;;37656:71:0;;-1:-1:-1;;;;;37710:15:0;;::::1;37656:71;::::0;::::1;5315:51:1::0;37656:45:0;;::::1;::::0;-1:-1:-1;37656:45:0::1;::::0;-1:-1:-1;5288:18:1;;37656:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37792:11:0::1;::::0;37738:67:::1;::::0;-1:-1:-1;;;37738:67:0;;-1:-1:-1;;;;;37792:11:0;;::::1;37738:67;::::0;::::1;5315:51:1::0;37738:45:0;;::::1;::::0;-1:-1:-1;37738:45:0::1;::::0;-1:-1:-1;5288:18:1;;37738:67:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37872:21:0::1;::::0;37824:71:::1;::::0;-1:-1:-1;;;;;37872:21:0;;::::1;::::0;-1:-1:-1;37824:71:0;;::::1;::::0;-1:-1:-1;37824:71:0::1;::::0;37872:21:::1;::::0;37824:71:::1;37909:21;:48:::0;;-1:-1:-1;;;;;;37909:48:0::1;-1:-1:-1::0;;;;;37909:48:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;37009:956:0:o;22767:179::-;22825:7;;22857:5;22861:1;22857;:5;:::i;:::-;22845:17;;22886:1;22881;:6;;22873:46;;;;-1:-1:-1;;;22873:46:0;;11720:2:1;22873:46:0;;;11702:21:1;11759:2;11739:18;;;11732:30;11798:29;11778:18;;;11771:57;11845:18;;22873:46:0;11692:177:1;22873:46:0;22937:1;22767:179;-1:-1:-1;;;22767:179:0:o;7187:347::-;-1:-1:-1;;;;;7289:19:0;;7281:68;;;;-1:-1:-1;;;7281:68:0;;16984:2:1;7281:68:0;;;16966:21:1;17023:2;17003:18;;;16996:30;17062:34;17042:18;;;17035:62;-1:-1:-1;;;17113:18:1;;;17106:34;17157:19;;7281:68:0;16956:226:1;7281:68:0;-1:-1:-1;;;;;7368:21:0;;7360:68;;;;-1:-1:-1;;;7360:68:0;;10899:2:1;7360:68:0;;;10881:21:1;10938:2;10918:18;;;10911:30;10977:34;10957:18;;;10950:62;-1:-1:-1;;;11028:18:1;;;11021:32;11070:19;;7360:68:0;10871:224:1;7360:68:0;-1:-1:-1;;;;;7442:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7494:32;;18239:25:1;;;7494:32:0;;18212:18:1;7494:32:0;;;;;;;;7187:347;;;:::o;45724:3527::-;-1:-1:-1;;;;;45856:18:0;;45848:68;;;;-1:-1:-1;;;45848:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45935:16:0;;45927:64;;;;-1:-1:-1;;;45927:64:0;;;;;;;:::i;:::-;46010:12;;-1:-1:-1;;;46010:12:0;;;;:20;;46026:4;46010:20;;;:39;;-1:-1:-1;2153:6:0;;-1:-1:-1;;;;;46034:15:0;;;2153:6;;;;;46034:15;46010:39;46002:48;;;;;;-1:-1:-1;;;;;46087:24:0;;46064:20;46087:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;46115:22:0;;;;;;:18;:22;;;;;;;;46087:50;46064:73;-1:-1:-1;;;;;;46162:16:0;;;;;;:41;;-1:-1:-1;;;;;;46182:21:0;;46196:6;46182:21;;46162:41;:66;;;;-1:-1:-1;;;;;;46207:21:0;;46223:4;46207:21;;46162:66;:89;;;;-1:-1:-1;;;;;;46232:19:0;;46246:4;46232:19;;46162:89;46158:277;;;46280:13;-1:-1:-1;;;;;46272:21:0;:4;-1:-1:-1;;;;;46272:21:0;;46268:156;;;46351:16;;46322:25;46340:6;46322:13;46332:2;46322:9;:13::i;:25::-;:45;;46314:94;;;;-1:-1:-1;;;46314:94:0;;13217:2:1;46314:94:0;;;13199:21:1;13256:2;13236:18;;;13229:30;13295:34;13275:18;;;13268:62;-1:-1:-1;;;13346:18:1;;;13339:34;13390:19;;46314:94:0;13189:226:1;46314:94:0;46451:28;46482:24;46500:4;46482:9;:24::i;:::-;46556:18;;46593:8;;46451:55;;-1:-1:-1;46532:42:0;;;;-1:-1:-1;;;46593:8:0;;;;46592:9;:20;;;;;46605:7;46592:20;:45;;;;;46624:13;-1:-1:-1;;;;;46616:21:0;:4;-1:-1:-1;;;;;46616:21:0;;;46592:45;46588:1219;;;46654:8;:15;;-1:-1:-1;;;;46654:15:0;-1:-1:-1;;;46654:15:0;;;;;-1:-1:-1;;;46691:16:0;;46654:15;46691:16;46687:429;;;46728:22;46753:21;46728:46;;46793:18;46814:53;46854:12;;46814:35;46839:9;;46814:20;:24;;:35;;;;:::i;:::-;:39;;:53::i;:::-;46793:74;;46886:30;46905:10;46886:18;:30::i;:::-;46935:24;46962:41;:21;46988:14;46962:25;:41::i;:::-;47047:15;;46935:68;;-1:-1:-1;47022:60:0;;-1:-1:-1;;;;;47047:15:0;46935:68;47022:16;:60::i;:::-;46687:429;;;;47136:21;;-1:-1:-1;;;47136:21:0;;;;47133:178;;;47178:17;47198:53;47238:12;;47198:35;47223:9;;47198:20;:24;;:35;;;;:::i;:53::-;47178:73;;47270:25;47285:9;47270:14;:25::i;:::-;47133:178;;47332:20;;-1:-1:-1;;;47332:20:0;;;;47328:204;;;47373:19;47395:64;47435:23;;47395:35;47420:9;;47395:20;:24;;:35;;;;:::i;:64::-;47373:86;;47478:38;47504:11;47478:25;:38::i;:::-;47328:204;;47553:21;;-1:-1:-1;;;47553:21:0;;;;47549:209;;;47595:20;47618:65;47658:24;;47618:35;47643:9;;47618:20;:24;;:35;;;;:::i;:65::-;47595:88;;47702:40;47729:12;47702:26;:40::i;:::-;47549:209;;47779:8;:16;;-1:-1:-1;;;;47779:16:0;;;46588:1219;47837:8;;47820:12;;-1:-1:-1;;;47837:8:0;;;;47836:9;:29;;;;;47850:15;47849:16;47836:29;47820:45;;47882:7;47879:355;;;47938:9;;47903:12;;47918:30;;:15;:6;47929:3;47918:10;:15::i;:30::-;-1:-1:-1;;;;;48010:29:0;;;;;;:25;:29;;;;;;47903:45;;-1:-1:-1;48010:29:0;;48007:116;;;48085:21;;48067:40;;:13;:4;48076:3;48067:8;:13::i;:40::-;48060:47;;48007:116;48146:16;:6;48157:4;48146:10;:16::i;:::-;48137:25;;48180:42;48196:4;48210;48217;48180:15;:42::i;:::-;47879:355;;48247:33;48263:4;48269:2;48273:6;48247:15;:33::i;:::-;48298:20;;-1:-1:-1;;;;;48298:20:0;:31;48338:4;48345:15;48338:4;48345:9;:15::i;:::-;48298:63;;-1:-1:-1;;;;;;48298:63:0;;;;;;;-1:-1:-1;;;;;5890:32:1;;;48298:63:0;;;5872:51:1;5939:18;;;5932:34;5845:18;;48298:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48294:79;48387:21;;-1:-1:-1;;;;;48387:21:0;:32;48428:4;48435:15;48428:4;48435:9;:15::i;:::-;48387:64;;-1:-1:-1;;;;;;48387:64:0;;;;;;;-1:-1:-1;;;;;5890:32:1;;;48387:64:0;;;5872:51:1;5939:18;;;5932:34;5845:18;;48387:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48383:80;48477:20;;-1:-1:-1;;;;;48477:20:0;:31;48517:2;48522:13;48517:2;48522:9;:13::i;:::-;48477:59;;-1:-1:-1;;;;;;48477:59:0;;;;;;;-1:-1:-1;;;;;5890:32:1;;;48477:59:0;;;5872:51:1;5939:18;;;5932:34;5845:18;;48477:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48473:75;48562:21;;-1:-1:-1;;;;;48562:21:0;:32;48603:2;48608:13;48603:2;48608:9;:13::i;:::-;48562:60;;-1:-1:-1;;;;;;48562:60:0;;;;;;;-1:-1:-1;;;;;5890:32:1;;;48562:60:0;;;5872:51:1;5939:18;;;5932:34;5845:18;;48562:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48558:76;48651:8;;-1:-1:-1;;;48651:8:0;;;;48647:597;;48684:16;;48716:20;;:33;;-1:-1:-1;;;;;;48716:33:0;;;;;18239:25:1;;;-1:-1:-1;;;;;48716:20:0;;;;:28;;18212:18:1;;48716:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48716:33:0;;;;;;;;-1:-1:-1;;48716:33:0;;;;;;;;;;;;:::i;:::-;;;48712:254;;;;;48838:91;;;19818:25:1;;;19874:2;19859:18;;19852:34;;;19902:18;;;19895:34;;;19960:2;19945:18;;19938:34;;;48919:9:0;;48908:4;;48838:91;;19805:3:1;19790:19;48838:91:0;;;;;;;48750:189;;;48712:254;48981:21;;:34;;-1:-1:-1;;;;;;48981:34:0;;;;;18239:25:1;;;-1:-1:-1;;;;;48981:21:0;;;;:29;;18212:18:1;;48981:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48981:34:0;;;;;;;;-1:-1:-1;;48981:34:0;;;;;;;;;;;;:::i;:::-;;;48977:256;;;;;49104:92;;;19818:25:1;;;19874:2;19859:18;;19852:34;;;19902:18;;;19895:34;;;19960:2;19945:18;;19938:34;;;49186:9:0;;49175:4;;49104:92;;19805:3:1;19790:19;49104:92:0;;;;;;;49016:190;;;48977:256;48647:597;;45724:3527;;;;;;;:::o;23673:166::-;23759:7;23795:12;23787:6;;;;23779:29;;;;-1:-1:-1;;;23779:29:0;;;;;;;;:::i;:::-;-1:-1:-1;23826:5:0;23830:1;23826;:5;:::i;:::-;23819:12;23673:166;-1:-1:-1;;;;23673:166:0:o;40360:493::-;2153:6;;-1:-1:-1;;;;;2153:6:0;;;;;1478:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40461:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;;::::1;;:40;;::::0;::::1;;;;40453:123;;;::::0;-1:-1:-1;;;40453:123:0;;17389:2:1;40453:123:0::1;::::0;::::1;17371:21:1::0;17428:2;17408:18;;;17401:30;17467:34;17447:18;;;17440:62;17538:34;17518:18;;;17511:62;-1:-1:-1;;;17589:19:1;;;17582:37;17636:19;;40453:123:0::1;17361:300:1::0;40453:123:0::1;-1:-1:-1::0;;;;;40587:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;40587:39:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;40640:147:::1;;40665:20;::::0;:47:::1;::::0;-1:-1:-1;;;40665:47:0;;-1:-1:-1;;;;;5333:32:1;;;40665:47:0::1;::::0;::::1;5315:51:1::0;40665:20:0;;::::1;::::0;:41:::1;::::0;5288:18:1;;40665:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40727:21:0::1;::::0;:48:::1;::::0;-1:-1:-1;;;40727:48:0;;-1:-1:-1;;;;;5333:32:1;;;40727:48:0::1;::::0;::::1;5315:51:1::0;40727:21:0;;::::1;::::0;-1:-1:-1;40727:42:0::1;::::0;-1:-1:-1;5288:18:1;;40727:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40640:147;40805:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;40805:40:0;::::1;::::0;::::1;::::0;;;::::1;40360:493:::0;;:::o;23351:153::-;23409:7;23441:1;23437;:5;23429:44;;;;-1:-1:-1;;;23429:44:0;;12862:2:1;23429:44:0;;;12844:21:1;12901:2;12881:18;;;12874:30;12940:28;12920:18;;;12913:56;12986:18;;23429:44:0;12834:176:1;23429:44:0;23491:5;23495:1;23491;:5;:::i;23122:220::-;23180:7;23204:6;23200:20;;-1:-1:-1;23219:1:0;23212:8;;23200:20;23231:9;23243:5;23247:1;23243;:5;:::i;:::-;23231:17;-1:-1:-1;23276:1:0;23267:5;23271:1;23231:17;23267:5;:::i;:::-;:10;23259:56;;;;-1:-1:-1;;;23259:56:0;;14408:2:1;23259:56:0;;;14390:21:1;14447:2;14427:18;;;14420:30;14486:34;14466:18;;;14459:62;-1:-1:-1;;;14537:18:1;;;14530:31;14578:19;;23259:56:0;14380:223:1;50333:596:0;50485:16;;;50499:1;50485:16;;;;;;;;50461:21;;50485:16;;;;;;;;;;-1:-1:-1;50485:16:0;50461:40;;50530:4;50512;50517:1;50512:7;;;;;;-1:-1:-1;;;50512:7:0;;;;;;;;;-1:-1:-1;;;;;50512:23:0;;;:7;;;;;;;;;;:23;;;;50556:15;;:22;;;-1:-1:-1;;;50556:22:0;;;;:15;;;;;:20;;:22;;;;;50512:7;;50556:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50546:4;50551:1;50546:7;;;;;;-1:-1:-1;;;50546:7:0;;;;;;;;;-1:-1:-1;;;;;50546:32:0;;;:7;;;;;;;;;:32;50624:15;;50592:62;;50609:4;;50624:15;50642:11;50592:8;:62::i;:::-;50694:15;;:224;;-1:-1:-1;;;50694:224:0;;-1:-1:-1;;;;;50694:15:0;;;;:66;;:224;;50775:11;;50694:15;;50845:4;;50872;;50892:15;;50694:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50333:596;;:::o;22955:158::-;23013:7;23046:1;23041;:6;;23033:49;;;;-1:-1:-1;;;23033:49:0;;12503:2:1;23033:49:0;;;12485:21:1;12542:2;12522:18;;;12515:30;12581:32;12561:18;;;12554:60;12631:18;;23033:49:0;12475:180:1;23033:49:0;23100:5;23104:1;23100;:5;:::i;52313:154::-;52434:25;;52417:6;;-1:-1:-1;;;;;52434:18:0;;;:25;;;;;52417:6;;52401:13;52434:25;52401:13;52434:25;52417:6;52434:18;:25;;;;;;;;;;;;;;;;;;;;;52313:154;;;:::o;49263:520::-;49387:12;49402:27;:20;49427:1;49402:24;:27::i;:::-;49387:42;-1:-1:-1;49440:17:0;49460:30;:20;49387:42;49460:24;:30::i;:::-;49440:50;-1:-1:-1;49529:21:0;49564:24;49583:4;49564:18;:24::i;:::-;49602:18;49623:41;:21;49649:14;49623:25;:41::i;:::-;49602:62;;49678:35;49691:9;49702:10;49678:12;:35::i;:::-;49732:43;;;19465:25:1;;;19521:2;19506:18;;19499:34;;;19549:18;;;19542:34;;;49732:43:0;;19453:2:1;19438:18;49732:43:0;;;;;;;;49263:520;;;;;:::o;51585:351::-;51705:18;;51655:69;;51682:6;;51698:4;;-1:-1:-1;;;;;51705:18:0;51655:26;:69::i;:::-;51767:18;;51760:51;;-1:-1:-1;;;51760:51:0;;51805:4;51760:51;;;5315::1;51735:22:0;;-1:-1:-1;;;;;51767:18:0;;51760:36;;5288:18:1;;51760:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51840:18;;51868:20;;51735:76;;-1:-1:-1;51822:106:0;;-1:-1:-1;;;;;51840:18:0;;;;51868:20;;51735:76;51822:17;:106::i;51945:359::-;52066:19;;52016:70;;52043:6;;52059:4;;-1:-1:-1;;;;;52066:19:0;52016:26;:70::i;:::-;52130:19;;52123:52;;-1:-1:-1;;;52123:52:0;;52169:4;52123:52;;;5315:51:1;52097:23:0;;-1:-1:-1;;;;;52130:19:0;;52123:37;;5288:18:1;;52123:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52204:19;;52233:21;;52097:78;;-1:-1:-1;52186:110:0;;-1:-1:-1;;;;;52204:19:0;;;;52233:21;;52097:78;52186:17;:110::i;5819:541::-;-1:-1:-1;;;;;5925:20:0;;5917:70;;;;-1:-1:-1;;;5917:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6006:23:0;;5998:71;;;;-1:-1:-1;;;5998:71:0;;;;;;;:::i;:::-;6164;6186:6;6164:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6164:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;6144:17:0;;;:9;:17;;;;;;;;;;;:91;;;;6269:20;;;;;;;:32;;6294:6;6269:24;:32::i;:::-;-1:-1:-1;;;;;6246:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;6317:35;18239:25:1;;;6246:20:0;;6317:35;;;;;;18212:18:1;6317:35:0;18194:76:1;49792:529:0;49977:15;;49945:62;;49962:4;;-1:-1:-1;;;;;49977:15:0;49995:11;49945:8;:62::i;:::-;50051:15;;50257;;50051:262;;-1:-1:-1;;;50051:262:0;;50125:4;50051:262;;;7303:34:1;7353:18;;;7346:34;;;50051:15:0;7396:18:1;;;7389:34;;;7439:18;;;7432:34;-1:-1:-1;;;;;50257:15:0;;;7482:19:1;;;7475:44;50287:15:0;7535:19:1;;;7528:35;50051:15:0;;;:31;;50090:11;;7237:19:1;;50051:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50938:638::-;51085:16;;;51099:1;51085:16;;;;;;;;;51061:21;;51085:16;;;;;;;;;;-1:-1:-1;51085:16:0;51061:40;;51130:4;51112;51117:1;51112:7;;;;;;-1:-1:-1;;;51112:7:0;;;;;;;;;-1:-1:-1;;;;;51112:23:0;;;:7;;;;;;;;;;:23;;;;51156:15;;:22;;;-1:-1:-1;;;51156:22:0;;;;:15;;;;;:20;;:22;;;;;51112:7;;51156:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51146:4;51151:1;51146:7;;;;;;-1:-1:-1;;;51146:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;51146:32:0;;;-1:-1:-1;;;;;51146:32:0;;;;;51199:16;51189:4;51194:1;51189:7;;;;;;-1:-1:-1;;;51189:7:0;;;;;;;;;-1:-1:-1;;;;;51189:26:0;;;:7;;;;;;;;;:26;51261:15;;51229:63;;51246:4;;51261:15;51279:12;51229:8;:63::i;:::-;51332:15;;:236;;-1:-1:-1;;;51332:236:0;;-1:-1:-1;;;;;51332:15:0;;;;:69;;:236;;51416:12;;51332:15;;51498:4;;51517:10;;51542:15;;51332:236;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52476:374;52644:55;;-1:-1:-1;;;52644:55:0;;-1:-1:-1;;;;;5890:32:1;;;52644:55:0;;;5872:51:1;5939:18;;;5932:34;;;52629:12:0;;52644:30;;;;;;5845:18:1;;52644:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52629:70;;52717:7;52713:130;;;52741:49;;-1:-1:-1;;;52741:49:0;;;;;18239:25:1;;;-1:-1:-1;;;;;52741:41:0;;;;;18212:18:1;;52741:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52810:21;52824:6;52810:21;;;;18239:25:1;;18227:2;18212:18;;18194:76;14:257;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:398::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;-1:-1:-1;862:2:1;847:18;;834:32;875:33;834:32;875:33;:::i;:::-;927:7;917:17;;;629:311;;;;;:::o;945:466::-;1022:6;1030;1038;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;1112:6;1104;1097:22;1059:2;1156:9;1143:23;1175:31;1200:5;1175:31;:::i;:::-;1225:5;-1:-1:-1;1282:2:1;1267:18;;1254:32;1295:33;1254:32;1295:33;:::i;:::-;1049:362;;1347:7;;-1:-1:-1;;;1401:2:1;1386:18;;;;1373:32;;1049:362::o;1416:392::-;1481:6;1489;1542:2;1530:9;1521:7;1517:23;1513:32;1510:2;;;1563:6;1555;1548:22;1510:2;1607:9;1594:23;1626:31;1651:5;1626:31;:::i;:::-;1676:5;-1:-1:-1;1733:2:1;1718:18;;1705:32;1746:30;1705:32;1746:30;:::i;1813:691::-;1944:6;1952;1960;1968;1976;1984;1992;2000;2053:3;2041:9;2032:7;2028:23;2024:33;2021:2;;;2075:6;2067;2060:22;2021:2;2112:9;2106:16;2131:31;2156:5;2131:31;:::i;:::-;2181:5;2171:15;;;2226:2;2215:9;2211:18;2205:25;2195:35;;2270:2;2259:9;2255:18;2249:25;2239:35;;2314:2;2303:9;2299:18;2293:25;2283:35;;2358:3;2347:9;2343:19;2337:26;2327:36;;2403:3;2392:9;2388:19;2382:26;2372:36;;2448:3;2437:9;2433:19;2427:26;2417:36;;2493:3;2482:9;2478:19;2472:26;2462:36;;2011:493;;;;;;;;;;;:::o;2509:325::-;2577:6;2585;2638:2;2626:9;2617:7;2613:23;2609:32;2606:2;;;2659:6;2651;2644:22;2606:2;2703:9;2690:23;2722:31;2747:5;2722:31;:::i;:::-;2772:5;2824:2;2809:18;;;;2796:32;;-1:-1:-1;;;2596:238:1:o;2839:800::-;2931:6;2939;2947;3000:2;2988:9;2979:7;2975:23;2971:32;2968:2;;;3021:6;3013;3006:22;2968:2;3066:9;3053:23;3095:18;3136:2;3128:6;3125:14;3122:2;;;3157:6;3149;3142:22;3122:2;3200:6;3189:9;3185:22;3175:32;;3245:7;3238:4;3234:2;3230:13;3226:27;3216:2;;3272:6;3264;3257:22;3216:2;3317;3304:16;3343:2;3335:6;3332:14;3329:2;;;3364:6;3356;3349:22;3329:2;3424:7;3417:4;3407:6;3404:1;3400:14;3396:2;3392:23;3388:34;3385:47;3382:2;;;3450:6;3442;3435:22;3382:2;3486:4;3478:13;;;;-1:-1:-1;3510:6:1;-1:-1:-1;;3551:20:1;;3538:34;3581:28;3538:34;3581:28;:::i;:::-;3628:5;3618:15;;;2958:681;;;;;:::o;3644:251::-;3700:6;3753:2;3741:9;3732:7;3728:23;3724:32;3721:2;;;3774:6;3766;3759:22;3721:2;3818:9;3805:23;3837:28;3859:5;3837:28;:::i;3900:255::-;3967:6;4020:2;4008:9;3999:7;3995:23;3991:32;3988:2;;;4041:6;4033;4026:22;3988:2;4078:9;4072:16;4097:28;4119:5;4097:28;:::i;4160:190::-;4219:6;4272:2;4260:9;4251:7;4247:23;4243:32;4240:2;;;4293:6;4285;4278:22;4240:2;-1:-1:-1;4321:23:1;;4230:120;-1:-1:-1;4230:120:1:o;4355:194::-;4425:6;4478:2;4466:9;4457:7;4453:23;4449:32;4446:2;;;4499:6;4491;4484:22;4446:2;-1:-1:-1;4527:16:1;;4436:113;-1:-1:-1;4436:113:1:o;4554:316::-;4642:6;4650;4658;4711:2;4699:9;4690:7;4686:23;4682:32;4679:2;;;4732:6;4724;4717:22;4679:2;4766:9;4760:16;4750:26;;4816:2;4805:9;4801:18;4795:25;4785:35;;4860:2;4849:9;4845:18;4839:25;4829:35;;4669:201;;;;;:::o;4875:289::-;4932:6;4985:2;4973:9;4964:7;4960:23;4956:32;4953:2;;;5006:6;4998;4991:22;4953:2;5050:9;5037:23;5100:4;5093:5;5089:16;5082:5;5079:27;5069:2;;5125:6;5117;5110:22;7574:797;7796:2;7808:21;;;7781:18;;7864:22;;;7748:4;7943:6;7917:2;7902:18;;7748:4;7980:304;7994:6;7991:1;7988:13;7980:304;;;8069:6;8056:20;8089:31;8114:5;8089:31;:::i;:::-;-1:-1:-1;;;;;8145:31:1;8133:44;;8200:4;8259:15;;;;8224:12;;;;8173:1;8009:9;7980:304;;;7984:3;8301;8293:11;;;;8356:6;8349:14;8342:22;8335:4;8324:9;8320:20;8313:52;7757:614;;;;;;:::o;9278:603::-;9390:4;9419:2;9448;9437:9;9430:21;9480:6;9474:13;9523:6;9518:2;9507:9;9503:18;9496:34;9548:4;9561:140;9575:6;9572:1;9569:13;9561:140;;;9670:14;;;9666:23;;9660:30;9636:17;;;9655:2;9632:26;9625:66;9590:10;;9561:140;;;9719:6;9716:1;9713:13;9710:2;;;9789:4;9784:2;9775:6;9764:9;9760:22;9756:31;9749:45;9710:2;-1:-1:-1;9865:2:1;9844:15;-1:-1:-1;;9840:29:1;9825:45;;;;9872:2;9821:54;;9399:482;-1:-1:-1;;;9399:482:1:o;9886:399::-;10088:2;10070:21;;;10127:2;10107:18;;;10100:30;10166:34;10161:2;10146:18;;10139:62;-1:-1:-1;;;10232:2:1;10217:18;;10210:33;10275:3;10260:19;;10060:225::o;13420:423::-;13622:2;13604:21;;;13661:2;13641:18;;;13634:30;13700:34;13695:2;13680:18;;13673:62;13771:29;13766:2;13751:18;;13744:57;13833:3;13818:19;;13594:249::o;13848:353::-;14050:2;14032:21;;;14089:2;14069:18;;;14062:30;14128:31;14123:2;14108:18;;14101:59;14192:2;14177:18;;14022:179::o;15027:356::-;15229:2;15211:21;;;15248:18;;;15241:30;15307:34;15302:2;15287:18;;15280:62;15374:2;15359:18;;15201:182::o;15388:401::-;15590:2;15572:21;;;15629:2;15609:18;;;15602:30;15668:34;15663:2;15648:18;;15641:62;-1:-1:-1;;;15734:2:1;15719:18;;15712:35;15779:3;15764:19;;15562:227::o;16286:491::-;16488:2;16470:21;;;16527:2;16507:18;;;16500:30;16566:34;16561:2;16546:18;;16539:62;16637:34;16632:2;16617:18;;16610:62;16709:25;16703:3;16688:19;;16681:54;16767:3;16752:19;;16460:317::o;18275:983::-;18537:4;18585:3;18574:9;18570:19;18616:6;18605:9;18598:25;18642:2;18680:6;18675:2;18664:9;18660:18;18653:34;18723:3;18718:2;18707:9;18703:18;18696:31;18747:6;18782;18776:13;18813:6;18805;18798:22;18851:3;18840:9;18836:19;18829:26;;18890:2;18882:6;18878:15;18864:29;;18911:4;18924:195;18938:6;18935:1;18932:13;18924:195;;;19003:13;;-1:-1:-1;;;;;18999:39:1;18987:52;;19094:15;;;;19059:12;;;;19035:1;18953:9;18924:195;;;-1:-1:-1;;;;;;;19175:32:1;;;;19170:2;19155:18;;19148:60;-1:-1:-1;;;19239:3:1;19224:19;19217:35;19136:3;18546:712;-1:-1:-1;;;18546:712:1:o;20172:128::-;20212:3;20243:1;20239:6;20236:1;20233:13;20230:2;;;20249:18;;:::i;:::-;-1:-1:-1;20285:9:1;;20220:80::o;20305:217::-;20345:1;20371;20361:2;;-1:-1:-1;;;20396:31:1;;20450:4;20447:1;20440:15;20478:4;20403:1;20468:15;20361:2;-1:-1:-1;20507:9:1;;20351:171::o;20527:168::-;20567:7;20633:1;20629;20625:6;20621:14;20618:1;20615:21;20610:1;20603:9;20596:17;20592:45;20589:2;;;20640:18;;:::i;:::-;-1:-1:-1;20680:9:1;;20579:116::o;20700:125::-;20740:4;20768:1;20765;20762:8;20759:2;;;20773:18;;:::i;:::-;-1:-1:-1;20810:9:1;;20749:76::o;20830:380::-;20909:1;20905:12;;;;20952;;;20973:2;;21027:4;21019:6;21015:17;21005:27;;20973:2;21080;21072:6;21069:14;21049:18;21046:38;21043:2;;;21126:10;21121:3;21117:20;21114:1;21107:31;21161:4;21158:1;21151:15;21189:4;21186:1;21179:15;21043:2;;20885:325;;;:::o;21215:135::-;21254:3;-1:-1:-1;;21275:17:1;;21272:2;;;21295:18;;:::i;:::-;-1:-1:-1;21342:1:1;21331:13;;21262:88::o;21355:127::-;21416:10;21411:3;21407:20;21404:1;21397:31;21447:4;21444:1;21437:15;21471:4;21468:1;21461:15;21487:131;-1:-1:-1;;;;;21562:31:1;;21552:42;;21542:2;;21608:1;21605;21598:12;21623:118;21709:5;21702:13;21695:21;21688:5;21685:32;21675:2;;21731:1;21728;21721:12

Swarm Source

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