ETH Price: $3,318.35 (+0.32%)
Gas: 12 Gwei

Token

SHIBUILDER (SHIBUILDER)
 

Overview

Max Total Supply

21,000,000 SHIBUILDER

Holders

43

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
246,940.03125 SHIBUILDER

Value
$0.00
0x2fb6c69acc78c08058f8c5d663eecb3c98d002f6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SHIBUILDER

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-04
*/

/**
 SHIBUILDER | SHIBA INU Passive Income Generator 

Don't miss the newest passive income generator on the market

HOW IT WORKS

- 100% Buy and Sell Tax right back to holders, as SHIB.  

- 100% Airdropped to your wallet 

- No claims.

Hold 50,000 tokens to qualify for SHIB auto airdrops.

https://t.me/Shibuilder
https://shibuilder.carrd.co
https://medium.com/@Shibuilder
https://twitter.com/Shibuilder


*/


pragma solidity ^0.8.12;
// SPDX-License-Identifier: Unlicensed
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);
}


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

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

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

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? - a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

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

library SafeMath {

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

abstract contract Context {
    //function _msgSender() internal view virtual returns (address payable) {
    function _msgSender() internal view virtual returns (address) {
        return 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;
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
         assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success,) = recipient.call{value : amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 factory() external pure returns (address);

    function WETH() external pure returns (address);

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


contract SHIBUILDER is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private botWallets;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromRewards;
    string private _name = "SHIBUILDER";
    string private _symbol = "SHIBUILDER";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 21000000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public ethPriceToSwap = 200000000000000000; //.2 ETH
    uint256 public _maxWalletAmount = 420100 * 10 ** _decimals;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;
    uint256 public gasForProcessing = 50000;
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor);
    event SendDividends(uint256 EthAmount);

    struct TaxFees {
        uint256 buyFee;
        uint256 sellFee;
    }

    bool private doTakeFees;
    bool private isSellTxn;
    TaxFees public taxFees;
    DividendTracker public dividendTracker;

    constructor () {
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromRewards[owner()] = true;
        _isExcludedFromRewards[deadWallet] = true;
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedFromRewards[uniswapV2Pair] = true;
        taxFees = TaxFees(5, 98);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].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 setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() {
        _maxWalletAmount = maxWalletAmount * 10 ** 9;
    }

    function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner {
        addRemoveFee(addresses, isExcludeFromFee);
    }

    function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner {
        addRemoveRewards(addresses, isExcluded);
    }

    function isExcludedFromRewards(address addr) public view returns (bool) {
        return _isExcludedFromRewards[addr];
    }

    function addRemoveRewards(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromRewards[addr] = flag;
        }
    }

    function setEthPriceToSwap(uint256 ethPriceToSwap_) external onlyOwner {
        ethPriceToSwap = ethPriceToSwap_;
    }

    function addRemoveFee(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromFee[addr] = flag;
        }
    }

    function setTaxFees(uint256 buyFee, uint256 sellFee) external onlyOwner {
        taxFees.buyFee = buyFee;
        taxFees.sellFee = sellFee;
    }

    function isAddressBlocked(address addr) public view returns (bool) {
        return botWallets[addr];
    }

    function blockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, true);
    }

    function unblockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, false);
    }

    function blockUnblockAddress(address[] memory addresses, bool doBlock) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            if (doBlock) {
                botWallets[addr] = true;
            } else {
                delete botWallets[addr];
            }
        }
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    receive() external payable {}

    function getTokenAmountByEthPrice() public view returns (uint256)  {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        return uniswapV2Router.getAmountsOut(ethPriceToSwap, path)[1];
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

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

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

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool isSell = false;
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        uint256 holderBalance = balanceOf(to).add(amount);
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if (from != owner() && to != owner() && to != deadWallet) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");
        }
        if (from == uniswapV2Pair) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        if (from != uniswapV2Pair && to == uniswapV2Pair) {//if sell
            //only tax if tokens are going back to Uniswap
            isSell = true;
            sellTaxTokens();
        }
        if (from != uniswapV2Pair && to != uniswapV2Pair) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        _tokenTransfer(from, to, amount, takeFees, isSell, true);
    }

    function sellTaxTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            uint256 tokenAmount = getTokenAmountByEthPrice();
            if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                distributeShares(tokenAmount);
            }
        }
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
    }

    function distributeShares(uint256 balanceToShareTokens) private lockTheSwap {
        swapTokensForEth(balanceToShareTokens);
        uint256 ethBalance = address(this).balance;
        sendEthDividends(ethBalance);
    }

    function claimTokens() external {
        sellTaxTokens();
    }

    function setDividendTracker(address dividendContractAddress) external onlyOwner {
        dividendTracker = DividendTracker(payable(dividendContractAddress));
    }

    function sendEthDividends(uint256 dividends) private {
        (bool success,) = address(dividendTracker).call{value : dividends}("");
        if (success) {
            emit SendDividends(dividends);
        }
    }

    function removeEthFromContract() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

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

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell, bool doUpdateDividends) private {
        uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0;
        if (takeFees && isSell) {
            taxAmount = amount.mul(taxFees.sellFee).div(100);
        }
        uint256 transferAmount = amount.sub(taxAmount);
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(sender, recipient, amount);

        if (doUpdateDividends) {
            try dividendTracker.setTokenBalance(sender) {} catch{}
            try dividendTracker.setTokenBalance(recipient) {} catch{}
            try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin);
            }catch {}
        }
    }
}

contract IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    Map private map;

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

    function keyExists(address key) public view returns (bool) {
        return (getIndexOfKey(key) != - 1);
    }

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

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

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

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

contract DividendTracker is IERC20, Context, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    uint256 constant internal magnitude = 2 ** 128;
    uint256 internal magnifiedDividendPerShare;
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;
    mapping(address => uint256) internal claimedDividends;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name = "SHIBUILDER TRACKER";
    string private _symbol = "SHIBUILDER_T";
    uint8 private _decimals = 9;
    uint256 public totalDividendsDistributed;
    IterableMapping private tokenHoldersMap = new IterableMapping();
    uint256 public minimumTokenBalanceForDividends = 50000 * 10 ** _decimals;
    SHIBUILDER private Shibuilder;

    event updateBalance(address addr, uint256 amount);
    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);

    uint256 public lastProcessedIndex;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait = 3600;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
    IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public ShibAddress = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; 
    IERC20 public ShibToken = IERC20(ShibAddress);
    constructor() {
    }

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

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

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

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

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

    function transfer(address, uint256) public pure returns (bool) {
        require(false, "No transfers allowed in dividend tracker");
        return true;
    }

    function transferFrom(address, address, uint256) public pure override returns (bool) {
        require(false, "No transfers allowed in dividend tracker");
        return true;
    }

    function allowance(address owner, address spender) public view 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 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 _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function setTokenBalance(address account) public {
        uint256 balance = Shibuilder.balanceOf(account);
        if (!Shibuilder.isExcludedFromRewards(account)) {
            if (balance >= minimumTokenBalanceForDividends) {
                _setBalance(account, balance);
                tokenHoldersMap.set(account, balance);
            }
            else {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        } else {
            if (balanceOf(account) > 0) {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        }
        processAccount(payable(account), true);
    }

    function updateTokenBalances(address[] memory accounts) external {
        uint256 index = 0;
        while (index < accounts.length) {
            setTokenBalance(accounts[index]);
            index += 1;
        }
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub((magnifiedDividendPerShare.mul(amount)).toInt256Safe());
    }

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe());
    }

    receive() external payable {
        distributeDividends();
    }

    function setERC20Contract(address contractAddr) external onlyOwner {
        Shibuilder = SHIBUILDER(payable(contractAddr));
    }

    function excludeFromDividends(address account) external onlyOwner {
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }

    function distributeDividends() public payable {
        require(totalSupply() > 0);
        uint256 initialBalance = ShibToken.balanceOf(address(this));
        swapEthForShib(msg.value);
        uint256 newBalance = ShibToken.balanceOf(address(this)).sub(initialBalance);
        if (newBalance > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (newBalance).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, newBalance);
            totalDividendsDistributed = totalDividendsDistributed.add(newBalance);
        }
    }

    function swapEthForShib(uint256 ethAmount) public {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = ShibAddress;

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}(
            0, // accept any amount of Ethereum
            path,
            address(this),
            block.timestamp
        );
    }


    function withdrawDividend() public virtual {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            ShibToken.transfer(user, _withdrawableDividend);
            return _withdrawableDividend;
        }
        return 0;
    }
    
    function dividendOf(address _owner) public view returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view returns (uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner) public view returns (uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view returns (uint256) {
        return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

    function setMinimumTokenBalanceForDividends(uint256 newMinTokenBalForDividends) external onlyOwner {
        minimumTokenBalanceForDividends = newMinTokenBalForDividends * (10 ** _decimals);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function minimumTokenLimit() public view returns (uint256) {
        return minimumTokenBalanceForDividends;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.size();
    }

    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.size() > lastProcessedIndex ?
                tokenHoldersMap.size().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 canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }
        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);
        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.size();

        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.size()) {
                _lastProcessedIndex = 0;
            }
            address account = tokenHoldersMap.getKeyAtIndex(_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 processAccountByDeployer(address payable account, bool automatic) external onlyOwner {
        processAccount(account, automatic);
    }

    function totalDividendClaimed(address account) public view returns (uint256) {
        return claimedDividends[account];
    }

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

    function mintDividends(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner {
        for (uint index = 0; index < newholders.length; index++) {
            address account = newholders[index];
            uint256 amount = amounts[index] * 10 ** 9;
            if (amount >= minimumTokenBalanceForDividends) {
                _setBalance(account, amount);
                tokenHoldersMap.set(account, amount);
            }
        }
    }

    //This should never be used, but available in case of unforseen issues
    function sendEthBack() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

    //This should never be used, but available in case of unforseen issues
    function sendShibBack() external onlyOwner {
        uint256 ShibBalance = ShibToken.balanceOf(address(this));
        ShibToken.transfer(owner(), ShibBalance);
    }

}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","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":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPriceToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeIncludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAmountByEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEthFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dividendContractAddress","type":"address"}],"name":"setDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPriceToSwap_","type":"uint256"}],"name":"setEthPriceToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAddresses","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":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600180546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560028054909116905560c0604052600a60808190526929a424a12aa4a62222a960b11b60a09081526200005f9160089190620003e8565b5060408051808201909152600a8082526929a424a12aa4a62222a960b11b60209092019182526200009391600991620003e8565b50600a805460ff191660099081178255620000ae91620005a3565b620000be906301406f40620005bb565b600b55600c805461ff0019166101001790556702c68af0bb140000600d55600a8054620000f29160ff9190911690620005a3565b620001019062066904620005bb565b600e55600f80546001600160a01b03191661dead17905561c3506010553480156200012b57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b543360009081526003602090815260408083209390935581546001600160a01b039081168352600682528383208054600160ff199182168117909255845483168552600784528585208054821683179055600f548316855293859020805490941681179093559154835163c45a015560e01b8152935192169263c45a015592600480830193928290030181865afa1580156200020f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002359190620005dd565b6001600160a01b031663c9c6539630600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000298573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002be9190620005dd565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200030c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003329190620005dd565b600280546001600160a01b0319166001600160a01b03929092169182179055600090815260076020908152604091829020805460ff1916600117905581518083019092526005808352606292909101829052601255601355620003923390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b54604051620003da91815260200190565b60405180910390a362000645565b828054620003f69062000608565b90600052602060002090601f0160209004810192826200041a576000855562000465565b82601f106200043557805160ff191683800117855562000465565b8280016001018555821562000465579182015b828111156200046557825182559160200191906001019062000448565b506200047392915062000477565b5090565b5b8082111562000473576000815560010162000478565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620004e5578160001904821115620004c957620004c96200048e565b80851615620004d757918102915b93841c9390800290620004a9565b509250929050565b600082620004fe575060016200059d565b816200050d575060006200059d565b8160018114620005265760028114620005315762000551565b60019150506200059d565b60ff8411156200054557620005456200048e565b50506001821b6200059d565b5060208310610133831016604e8410600b841016171562000576575081810a6200059d565b620005828383620004a4565b80600019048211156200059957620005996200048e565b0290505b92915050565b6000620005b460ff841683620004ed565b9392505050565b6000816000190483118215151615620005d857620005d86200048e565b500290565b600060208284031215620005f057600080fd5b81516001600160a01b0381168114620005b457600080fd5b600181811c908216806200061d57607f821691505b602082108114156200063f57634e487b7160e01b600052602260045260246000fd5b50919050565b61235580620006556000396000f3fe6080604052600436106102345760003560e01c806370a082311161012e57806398acb5d8116100ab578063b2abbbc41161006f578063b2abbbc4146106b6578063c49b9a80146106d6578063dd62ed3e146106f6578063e7dad4f91461073c578063f2fde38b1461077557600080fd5b806398acb5d8146106205780639b0e2e86146106405780639c1b8af514610660578063a457c2d714610676578063a9059cbb1461069657600080fd5b806385d4787b116100f257806385d4787b14610598578063871c128d146105b85780638da5cb5b146105d857806395d89b41146105f6578063979957061461060b57600080fd5b806370a08231146104ed578063715018a61461052357806371cd56af1461053857806381230a831461055857806385141a771461057857600080fd5b80632c1f5216116101bc57806349bd5a5e1161018057806349bd5a5e146104495780634a74bb02146104695780635342acb41461048857806354a5df1f146104c15780636c0a24eb146104d757600080fd5b80632c1f5216146103b2578063313ce567146103d257806339509351146103f4578063441d801f1461041457806348c54b9d1461043457600080fd5b80631694505e116102035780631694505e1461030457806318160ddd1461033c57806323b872dd1461035b57806327a14fc21461037b578063280d38211461039d57600080fd5b806306fdde0314610240578063095ea7b31461026b5780630ddc09761461029b5780630e832273146102cb57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b50610255610795565b6040516102629190611cce565b60405180910390f35b34801561027757600080fd5b5061028b610286366004611d38565b610827565b6040519015158152602001610262565b3480156102a757600080fd5b506012546013546102b6919082565b60408051928352602083019190915201610262565b3480156102d757600080fd5b5061028b6102e6366004611d64565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561031057600080fd5b50600154610324906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561034857600080fd5b50600b545b604051908152602001610262565b34801561036757600080fd5b5061028b610376366004611d81565b61083e565b34801561038757600080fd5b5061039b610396366004611dc2565b6108a7565b005b3480156103a957600080fd5b5061039b6108ee565b3480156103be57600080fd5b50601454610324906001600160a01b031681565b3480156103de57600080fd5b50600a5460405160ff9091168152602001610262565b34801561040057600080fd5b5061028b61040f366004611d38565b610967565b34801561042057600080fd5b5061039b61042f366004611df0565b61099d565b34801561044057600080fd5b5061039b6109d7565b34801561045557600080fd5b50600254610324906001600160a01b031681565b34801561047557600080fd5b50600c5461028b90610100900460ff1681565b34801561049457600080fd5b5061028b6104a3366004611d64565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104cd57600080fd5b5061034d600d5481565b3480156104e357600080fd5b5061034d600e5481565b3480156104f957600080fd5b5061034d610508366004611d64565b6001600160a01b031660009081526003602052604090205490565b34801561052f57600080fd5b5061039b6109e1565b34801561054457600080fd5b5061039b610553366004611df0565b610a55565b34801561056457600080fd5b5061039b610573366004611e74565b610a8a565b34801561058457600080fd5b50600f54610324906001600160a01b031681565b3480156105a457600080fd5b5061039b6105b3366004611f01565b610abf565b3480156105c457600080fd5b5061039b6105d3366004611dc2565b610af7565b3480156105e457600080fd5b506000546001600160a01b0316610324565b34801561060257600080fd5b50610255610b8d565b34801561061757600080fd5b5061034d610b9c565b34801561062c57600080fd5b5061039b61063b366004611d64565b610d1d565b34801561064c57600080fd5b5061039b61065b366004611f01565b610d69565b34801561066c57600080fd5b5061034d60105481565b34801561068257600080fd5b5061028b610691366004611d38565b610d9e565b3480156106a257600080fd5b5061028b6106b1366004611d38565b610ded565b3480156106c257600080fd5b5061039b6106d1366004611dc2565b610dfa565b3480156106e257600080fd5b5061039b6106f1366004611fa0565b610e29565b34801561070257600080fd5b5061034d610711366004611fbb565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561074857600080fd5b5061028b610757366004611d64565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561078157600080fd5b5061039b610790366004611d64565b610ea7565b6060600880546107a490611ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546107d090611ff4565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050905090565b6000610834338484610f91565b5060015b92915050565b600061084b8484846110b5565b61089d8433610898856040518060600160405280602881526020016122d3602891396001600160a01b038a1660009081526004602090815260408083203384529091529020549190611468565b610f91565b5060019392505050565b6000546001600160a01b031633146108da5760405162461bcd60e51b81526004016108d19061202f565b60405180910390fd5b6108e881633b9aca0061207a565b600e5550565b6000546001600160a01b031633146109185760405162461bcd60e51b81526004016108d19061202f565b4761092b6000546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610963573d6000803e3d6000fd5b5050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083491859061089890866114a2565b6000546001600160a01b031633146109c75760405162461bcd60e51b81526004016108d19061202f565b6109d2838383611508565b505050565b6109df611578565b565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016108d19061202f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610a7f5760405162461bcd60e51b81526004016108d19061202f565b6109d28383836115ce565b6000546001600160a01b03163314610ab45760405162461bcd60e51b81526004016108d19061202f565b601291909155601355565b6000546001600160a01b03163314610ae95760405162461bcd60e51b81526004016108d19061202f565b610af4816001611638565b50565b6000546001600160a01b03163314610b215760405162461bcd60e51b81526004016108d19061202f565b601054811415610b885760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b60648201526084016108d1565b601055565b6060600980546107a490611ff4565b604080516002808252606082018352600092839291906020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2e9190612099565b81600081518110610c4157610c416120b6565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610c7557610c756120b6565b6001600160a01b039283166020918202929092010152600154600d5460405163d06ca61f60e01b8152919092169163d06ca61f91610cb891908590600401612110565b600060405180830381865afa158015610cd5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cfd9190810190612131565b600181518110610d0f57610d0f6120b6565b602002602001015191505090565b6000546001600160a01b03163314610d475760405162461bcd60e51b81526004016108d19061202f565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d935760405162461bcd60e51b81526004016108d19061202f565b610af4816000611638565b60006108343384610898856040518060600160405280602581526020016122fb602591393360009081526004602090815260408083206001600160a01b038d1684529091529020549190611468565b60006108343384846110b5565b6000546001600160a01b03163314610e245760405162461bcd60e51b81526004016108d19061202f565b600d55565b6000546001600160a01b03163314610e535760405162461bcd60e51b81526004016108d19061202f565b600c80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610e9c90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610ed15760405162461bcd60e51b81526004016108d19061202f565b6001600160a01b038116610f365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d1565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610ff35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108d1565b6001600160a01b0382166110545760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108d1565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166111195760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108d1565b6001600160a01b03821661117b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108d1565b600081116111dd5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108d1565b6001600160a01b038316600090815260066020526040812054819060ff1615801561122157506001600160a01b03841660009081526006602052604090205460ff16155b801561123b57506000546001600160a01b03868116911614155b801561125557506000546001600160a01b03858116911614155b905060006112828461127c876001600160a01b031660009081526003602052604090205490565b906114a2565b90506112966000546001600160a01b031690565b6001600160a01b0316866001600160a01b0316141580156112c557506000546001600160a01b03868116911614155b80156112df5750600f546001600160a01b03868116911614155b1561138a576001600160a01b03861660009081526005602052604090205460ff1615801561132657506001600160a01b03851660009081526005602052604090205460ff16155b61138a5760405162461bcd60e51b815260206004820152602f60248201527f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060448201526e7472616e7366657220746f6b656e7360881b60648201526084016108d1565b6002546001600160a01b03878116911614156113c257600e548111156113c25760405162461bcd60e51b81526004016108d1906121b7565b6002546001600160a01b038781169116148015906113ed57506002546001600160a01b038681169116145b156113fe57600192506113fe611578565b6002546001600160a01b0387811691161480159061142a57506002546001600160a01b03868116911614155b1561145157600e548111156114515760405162461bcd60e51b81526004016108d1906121b7565b611460868686858760016116c4565b505050505050565b6000818484111561148c5760405162461bcd60e51b81526004016108d19190611cce565b50600061149984866121fc565b95945050505050565b6000806114af8385612213565b9050838110156115015760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108d1565b9392505050565b60005b82811015611572576000848483818110611527576115276120b6565b905060200201602081019061153c9190611d64565b6001600160a01b03166000908152600660205260409020805460ff1916841515179055508061156a8161222b565b91505061150b565b50505050565b306000908152600360205260409020548015610af4576000611598610b9c565b90508082101580156115ad5750600c5460ff16155b80156115c05750600c54610100900460ff165b15610963576109638161198a565b60005b828110156115725760008484838181106115ed576115ed6120b6565b90506020020160208101906116029190611d64565b6001600160a01b03166000908152600760205260409020805460ff191684151517905550806116308161222b565b9150506115d1565b60005b82518110156109d2576000838281518110611658576116586120b6565b602002602001015190508215611690576001600160a01b0381166000908152600560205260409020805460ff191660011790556116b1565b6001600160a01b0381166000908152600560205260409020805460ff191690555b50806116bc8161222b565b91505061163b565b6000836116d25760006116ed565b6012546116ed906064906116e79088906119b8565b90611a37565b90508380156116f95750825b1561171657601354611713906064906116e79088906119b8565b90505b60006117228683611a79565b6001600160a01b0389166000908152600360205260409020549091506117489087611a79565b6001600160a01b03808a16600090815260036020526040808220939093559089168152205461177790826114a2565b6001600160a01b0388166000908152600360205260408082209290925530815220546117a390836114a2565b3060009081526003602090815260409182902092909255518781526001600160a01b0389811692908b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3821561198057601454604051633974d3b160e01b81526001600160a01b038a8116600483015290911690633974d3b190602401600060405180830381600087803b15801561184657600080fd5b505af1925050508015611857575060015b50601454604051633974d3b160e01b81526001600160a01b03898116600483015290911690633974d3b190602401600060405180830381600087803b15801561189f57600080fd5b505af19250505080156118b0575060015b506014546010546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916118e99160040190815260200190565b6060604051808303816000875af1925050508015611924575060408051601f3d908101601f1916820190925261192191810190612246565b60015b61192d57611980565b601054604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b5050505050505050565b600c805460ff191660011790556119a081611abb565b476119aa81611c0d565b5050600c805460ff19169055565b6000826119c757506000610838565b60006119d3838561207a565b9050826119e08583612274565b146115015760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108d1565b600061150183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ca0565b600061150183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611468565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611af057611af06120b6565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6d9190612099565b81600181518110611b8057611b806120b6565b6001600160a01b039283166020918202929092010152600154611ba69130911684610f91565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac94790611bdf908590600090869030904290600401612296565b600060405180830381600087803b158015611bf957600080fd5b505af1158015611460573d6000803e3d6000fd5b6014546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611c5a576040519150601f19603f3d011682016040523d82523d6000602084013e611c5f565b606091505b505090508015610963576040518281527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a15050565b60008183611cc15760405162461bcd60e51b81526004016108d19190611cce565b5060006114998486612274565b600060208083528351808285015260005b81811015611cfb57858101830151858201604001528201611cdf565b81811115611d0d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610af457600080fd5b60008060408385031215611d4b57600080fd5b8235611d5681611d23565b946020939093013593505050565b600060208284031215611d7657600080fd5b813561150181611d23565b600080600060608486031215611d9657600080fd5b8335611da181611d23565b92506020840135611db181611d23565b929592945050506040919091013590565b600060208284031215611dd457600080fd5b5035919050565b80358015158114611deb57600080fd5b919050565b600080600060408486031215611e0557600080fd5b833567ffffffffffffffff80821115611e1d57600080fd5b818601915086601f830112611e3157600080fd5b813581811115611e4057600080fd5b8760208260051b8501011115611e5557600080fd5b602092830195509350611e6b9186019050611ddb565b90509250925092565b60008060408385031215611e8757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ed557611ed5611e96565b604052919050565b600067ffffffffffffffff821115611ef757611ef7611e96565b5060051b60200190565b60006020808385031215611f1457600080fd5b823567ffffffffffffffff811115611f2b57600080fd5b8301601f81018513611f3c57600080fd5b8035611f4f611f4a82611edd565b611eac565b81815260059190911b82018301908381019087831115611f6e57600080fd5b928401925b82841015611f95578335611f8681611d23565b82529284019290840190611f73565b979650505050505050565b600060208284031215611fb257600080fd5b61150182611ddb565b60008060408385031215611fce57600080fd5b8235611fd981611d23565b91506020830135611fe981611d23565b809150509250929050565b600181811c9082168061200857607f821691505b6020821081141561202957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561209457612094612064565b500290565b6000602082840312156120ab57600080fd5b815161150181611d23565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156121055781516001600160a01b0316875295820195908201906001016120e0565b509495945050505050565b82815260406020820152600061212960408301846120cc565b949350505050565b6000602080838503121561214457600080fd5b825167ffffffffffffffff81111561215b57600080fd5b8301601f8101851361216c57600080fd5b805161217a611f4a82611edd565b81815260059190911b8201830190838101908783111561219957600080fd5b928401925b82841015611f955783518252928401929084019061219e565b60208082526025908201527f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574206040820152641b1a5b5a5d60da1b606082015260800190565b60008282101561220e5761220e612064565b500390565b6000821982111561222657612226612064565b500190565b600060001982141561223f5761223f612064565b5060010190565b60008060006060848603121561225b57600080fd5b8351925060208401519150604084015190509250925092565b60008261229157634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a0604082015260006122b560a08301866120cc565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220adcaca8304014530fe104777e4044cd54f65d95dea690f72c8f44252b299a6ad64736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106102345760003560e01c806370a082311161012e57806398acb5d8116100ab578063b2abbbc41161006f578063b2abbbc4146106b6578063c49b9a80146106d6578063dd62ed3e146106f6578063e7dad4f91461073c578063f2fde38b1461077557600080fd5b806398acb5d8146106205780639b0e2e86146106405780639c1b8af514610660578063a457c2d714610676578063a9059cbb1461069657600080fd5b806385d4787b116100f257806385d4787b14610598578063871c128d146105b85780638da5cb5b146105d857806395d89b41146105f6578063979957061461060b57600080fd5b806370a08231146104ed578063715018a61461052357806371cd56af1461053857806381230a831461055857806385141a771461057857600080fd5b80632c1f5216116101bc57806349bd5a5e1161018057806349bd5a5e146104495780634a74bb02146104695780635342acb41461048857806354a5df1f146104c15780636c0a24eb146104d757600080fd5b80632c1f5216146103b2578063313ce567146103d257806339509351146103f4578063441d801f1461041457806348c54b9d1461043457600080fd5b80631694505e116102035780631694505e1461030457806318160ddd1461033c57806323b872dd1461035b57806327a14fc21461037b578063280d38211461039d57600080fd5b806306fdde0314610240578063095ea7b31461026b5780630ddc09761461029b5780630e832273146102cb57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b50610255610795565b6040516102629190611cce565b60405180910390f35b34801561027757600080fd5b5061028b610286366004611d38565b610827565b6040519015158152602001610262565b3480156102a757600080fd5b506012546013546102b6919082565b60408051928352602083019190915201610262565b3480156102d757600080fd5b5061028b6102e6366004611d64565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561031057600080fd5b50600154610324906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561034857600080fd5b50600b545b604051908152602001610262565b34801561036757600080fd5b5061028b610376366004611d81565b61083e565b34801561038757600080fd5b5061039b610396366004611dc2565b6108a7565b005b3480156103a957600080fd5b5061039b6108ee565b3480156103be57600080fd5b50601454610324906001600160a01b031681565b3480156103de57600080fd5b50600a5460405160ff9091168152602001610262565b34801561040057600080fd5b5061028b61040f366004611d38565b610967565b34801561042057600080fd5b5061039b61042f366004611df0565b61099d565b34801561044057600080fd5b5061039b6109d7565b34801561045557600080fd5b50600254610324906001600160a01b031681565b34801561047557600080fd5b50600c5461028b90610100900460ff1681565b34801561049457600080fd5b5061028b6104a3366004611d64565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104cd57600080fd5b5061034d600d5481565b3480156104e357600080fd5b5061034d600e5481565b3480156104f957600080fd5b5061034d610508366004611d64565b6001600160a01b031660009081526003602052604090205490565b34801561052f57600080fd5b5061039b6109e1565b34801561054457600080fd5b5061039b610553366004611df0565b610a55565b34801561056457600080fd5b5061039b610573366004611e74565b610a8a565b34801561058457600080fd5b50600f54610324906001600160a01b031681565b3480156105a457600080fd5b5061039b6105b3366004611f01565b610abf565b3480156105c457600080fd5b5061039b6105d3366004611dc2565b610af7565b3480156105e457600080fd5b506000546001600160a01b0316610324565b34801561060257600080fd5b50610255610b8d565b34801561061757600080fd5b5061034d610b9c565b34801561062c57600080fd5b5061039b61063b366004611d64565b610d1d565b34801561064c57600080fd5b5061039b61065b366004611f01565b610d69565b34801561066c57600080fd5b5061034d60105481565b34801561068257600080fd5b5061028b610691366004611d38565b610d9e565b3480156106a257600080fd5b5061028b6106b1366004611d38565b610ded565b3480156106c257600080fd5b5061039b6106d1366004611dc2565b610dfa565b3480156106e257600080fd5b5061039b6106f1366004611fa0565b610e29565b34801561070257600080fd5b5061034d610711366004611fbb565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561074857600080fd5b5061028b610757366004611d64565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561078157600080fd5b5061039b610790366004611d64565b610ea7565b6060600880546107a490611ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546107d090611ff4565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050905090565b6000610834338484610f91565b5060015b92915050565b600061084b8484846110b5565b61089d8433610898856040518060600160405280602881526020016122d3602891396001600160a01b038a1660009081526004602090815260408083203384529091529020549190611468565b610f91565b5060019392505050565b6000546001600160a01b031633146108da5760405162461bcd60e51b81526004016108d19061202f565b60405180910390fd5b6108e881633b9aca0061207a565b600e5550565b6000546001600160a01b031633146109185760405162461bcd60e51b81526004016108d19061202f565b4761092b6000546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610963573d6000803e3d6000fd5b5050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083491859061089890866114a2565b6000546001600160a01b031633146109c75760405162461bcd60e51b81526004016108d19061202f565b6109d2838383611508565b505050565b6109df611578565b565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016108d19061202f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610a7f5760405162461bcd60e51b81526004016108d19061202f565b6109d28383836115ce565b6000546001600160a01b03163314610ab45760405162461bcd60e51b81526004016108d19061202f565b601291909155601355565b6000546001600160a01b03163314610ae95760405162461bcd60e51b81526004016108d19061202f565b610af4816001611638565b50565b6000546001600160a01b03163314610b215760405162461bcd60e51b81526004016108d19061202f565b601054811415610b885760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b60648201526084016108d1565b601055565b6060600980546107a490611ff4565b604080516002808252606082018352600092839291906020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2e9190612099565b81600081518110610c4157610c416120b6565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610c7557610c756120b6565b6001600160a01b039283166020918202929092010152600154600d5460405163d06ca61f60e01b8152919092169163d06ca61f91610cb891908590600401612110565b600060405180830381865afa158015610cd5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cfd9190810190612131565b600181518110610d0f57610d0f6120b6565b602002602001015191505090565b6000546001600160a01b03163314610d475760405162461bcd60e51b81526004016108d19061202f565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d935760405162461bcd60e51b81526004016108d19061202f565b610af4816000611638565b60006108343384610898856040518060600160405280602581526020016122fb602591393360009081526004602090815260408083206001600160a01b038d1684529091529020549190611468565b60006108343384846110b5565b6000546001600160a01b03163314610e245760405162461bcd60e51b81526004016108d19061202f565b600d55565b6000546001600160a01b03163314610e535760405162461bcd60e51b81526004016108d19061202f565b600c80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610e9c90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610ed15760405162461bcd60e51b81526004016108d19061202f565b6001600160a01b038116610f365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d1565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610ff35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108d1565b6001600160a01b0382166110545760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108d1565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166111195760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108d1565b6001600160a01b03821661117b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108d1565b600081116111dd5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108d1565b6001600160a01b038316600090815260066020526040812054819060ff1615801561122157506001600160a01b03841660009081526006602052604090205460ff16155b801561123b57506000546001600160a01b03868116911614155b801561125557506000546001600160a01b03858116911614155b905060006112828461127c876001600160a01b031660009081526003602052604090205490565b906114a2565b90506112966000546001600160a01b031690565b6001600160a01b0316866001600160a01b0316141580156112c557506000546001600160a01b03868116911614155b80156112df5750600f546001600160a01b03868116911614155b1561138a576001600160a01b03861660009081526005602052604090205460ff1615801561132657506001600160a01b03851660009081526005602052604090205460ff16155b61138a5760405162461bcd60e51b815260206004820152602f60248201527f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060448201526e7472616e7366657220746f6b656e7360881b60648201526084016108d1565b6002546001600160a01b03878116911614156113c257600e548111156113c25760405162461bcd60e51b81526004016108d1906121b7565b6002546001600160a01b038781169116148015906113ed57506002546001600160a01b038681169116145b156113fe57600192506113fe611578565b6002546001600160a01b0387811691161480159061142a57506002546001600160a01b03868116911614155b1561145157600e548111156114515760405162461bcd60e51b81526004016108d1906121b7565b611460868686858760016116c4565b505050505050565b6000818484111561148c5760405162461bcd60e51b81526004016108d19190611cce565b50600061149984866121fc565b95945050505050565b6000806114af8385612213565b9050838110156115015760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108d1565b9392505050565b60005b82811015611572576000848483818110611527576115276120b6565b905060200201602081019061153c9190611d64565b6001600160a01b03166000908152600660205260409020805460ff1916841515179055508061156a8161222b565b91505061150b565b50505050565b306000908152600360205260409020548015610af4576000611598610b9c565b90508082101580156115ad5750600c5460ff16155b80156115c05750600c54610100900460ff165b15610963576109638161198a565b60005b828110156115725760008484838181106115ed576115ed6120b6565b90506020020160208101906116029190611d64565b6001600160a01b03166000908152600760205260409020805460ff191684151517905550806116308161222b565b9150506115d1565b60005b82518110156109d2576000838281518110611658576116586120b6565b602002602001015190508215611690576001600160a01b0381166000908152600560205260409020805460ff191660011790556116b1565b6001600160a01b0381166000908152600560205260409020805460ff191690555b50806116bc8161222b565b91505061163b565b6000836116d25760006116ed565b6012546116ed906064906116e79088906119b8565b90611a37565b90508380156116f95750825b1561171657601354611713906064906116e79088906119b8565b90505b60006117228683611a79565b6001600160a01b0389166000908152600360205260409020549091506117489087611a79565b6001600160a01b03808a16600090815260036020526040808220939093559089168152205461177790826114a2565b6001600160a01b0388166000908152600360205260408082209290925530815220546117a390836114a2565b3060009081526003602090815260409182902092909255518781526001600160a01b0389811692908b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3821561198057601454604051633974d3b160e01b81526001600160a01b038a8116600483015290911690633974d3b190602401600060405180830381600087803b15801561184657600080fd5b505af1925050508015611857575060015b50601454604051633974d3b160e01b81526001600160a01b03898116600483015290911690633974d3b190602401600060405180830381600087803b15801561189f57600080fd5b505af19250505080156118b0575060015b506014546010546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916118e99160040190815260200190565b6060604051808303816000875af1925050508015611924575060408051601f3d908101601f1916820190925261192191810190612246565b60015b61192d57611980565b601054604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b5050505050505050565b600c805460ff191660011790556119a081611abb565b476119aa81611c0d565b5050600c805460ff19169055565b6000826119c757506000610838565b60006119d3838561207a565b9050826119e08583612274565b146115015760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108d1565b600061150183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ca0565b600061150183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611468565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611af057611af06120b6565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6d9190612099565b81600181518110611b8057611b806120b6565b6001600160a01b039283166020918202929092010152600154611ba69130911684610f91565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac94790611bdf908590600090869030904290600401612296565b600060405180830381600087803b158015611bf957600080fd5b505af1158015611460573d6000803e3d6000fd5b6014546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611c5a576040519150601f19603f3d011682016040523d82523d6000602084013e611c5f565b606091505b505090508015610963576040518281527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a15050565b60008183611cc15760405162461bcd60e51b81526004016108d19190611cce565b5060006114998486612274565b600060208083528351808285015260005b81811015611cfb57858101830151858201604001528201611cdf565b81811115611d0d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610af457600080fd5b60008060408385031215611d4b57600080fd5b8235611d5681611d23565b946020939093013593505050565b600060208284031215611d7657600080fd5b813561150181611d23565b600080600060608486031215611d9657600080fd5b8335611da181611d23565b92506020840135611db181611d23565b929592945050506040919091013590565b600060208284031215611dd457600080fd5b5035919050565b80358015158114611deb57600080fd5b919050565b600080600060408486031215611e0557600080fd5b833567ffffffffffffffff80821115611e1d57600080fd5b818601915086601f830112611e3157600080fd5b813581811115611e4057600080fd5b8760208260051b8501011115611e5557600080fd5b602092830195509350611e6b9186019050611ddb565b90509250925092565b60008060408385031215611e8757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ed557611ed5611e96565b604052919050565b600067ffffffffffffffff821115611ef757611ef7611e96565b5060051b60200190565b60006020808385031215611f1457600080fd5b823567ffffffffffffffff811115611f2b57600080fd5b8301601f81018513611f3c57600080fd5b8035611f4f611f4a82611edd565b611eac565b81815260059190911b82018301908381019087831115611f6e57600080fd5b928401925b82841015611f95578335611f8681611d23565b82529284019290840190611f73565b979650505050505050565b600060208284031215611fb257600080fd5b61150182611ddb565b60008060408385031215611fce57600080fd5b8235611fd981611d23565b91506020830135611fe981611d23565b809150509250929050565b600181811c9082168061200857607f821691505b6020821081141561202957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561209457612094612064565b500290565b6000602082840312156120ab57600080fd5b815161150181611d23565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156121055781516001600160a01b0316875295820195908201906001016120e0565b509495945050505050565b82815260406020820152600061212960408301846120cc565b949350505050565b6000602080838503121561214457600080fd5b825167ffffffffffffffff81111561215b57600080fd5b8301601f8101851361216c57600080fd5b805161217a611f4a82611edd565b81815260059190911b8201830190838101908783111561219957600080fd5b928401925b82841015611f955783518252928401929084019061219e565b60208082526025908201527f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574206040820152641b1a5b5a5d60da1b606082015260800190565b60008282101561220e5761220e612064565b500390565b6000821982111561222657612226612064565b500190565b600060001982141561223f5761223f612064565b5060010190565b60008060006060848603121561225b57600080fd5b8351925060208401519150604084015190509250925092565b60008261229157634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a0604082015260006122b560a08301866120cc565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220adcaca8304014530fe104777e4044cd54f65d95dea690f72c8f44252b299a6ad64736f6c634300080c0033

Deployed Bytecode Sourcemap

9003:11919:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11316:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12149:161;;;;;;;;;;-1:-1:-1;12149:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;12149:161:0;1072:187:1;10749:22:0;;;;;;;;;;-1:-1:-1;10749:22:0;;;;;;;;;;;;;1438:25:1;;;1494:2;1479:18;;1472:34;;;;1411:18;10749:22:0;1264:248:1;13621:126:0;;;;;;;;;;-1:-1:-1;13621:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;13711:28:0;13687:4;13711:28;;;:22;:28;;;;;;;;;13621:126;9431:106;;;;;;;;;;-1:-1:-1;9431:106:0;;;;-1:-1:-1;;;;;9431:106:0;;;;;;-1:-1:-1;;;;;1959:32:1;;;1941:51;;1929:2;1914:18;9431:106:0;1769:229:1;11593:95:0;;;;;;;;;;-1:-1:-1;11673:7:0;;11593:95;;;2149:25:1;;;2137:2;2122:18;11593:95:0;2003:177:1;12318:313:0;;;;;;;;;;-1:-1:-1;12318:313:0;;;;;:::i;:::-;;:::i;13142:137::-;;;;;;;;;;-1:-1:-1;13142:137:0;;;;;:::i;:::-;;:::i;:::-;;18966:161;;;;;;;;;;;;;:::i;10778:38::-;;;;;;;;;;-1:-1:-1;10778:38:0;;;;-1:-1:-1;;;;;10778:38:0;;;11502:83;;;;;;;;;;-1:-1:-1;11568:9:0;;11502:83;;11568:9;;;;3213:36:1;;3201:2;3186:18;11502:83:0;3071:184:1;12639:218:0;;;;;;;;;;-1:-1:-1;12639:218:0;;;;;:::i;:::-;;:::i;13287:161::-;;;;;;;;;;-1:-1:-1;13287:161:0;;;;;:::i;:::-;;:::i;18489:66::-;;;;;;;;;;;;;:::i;9544:41::-;;;;;;;;;;-1:-1:-1;9544:41:0;;;;-1:-1:-1;;;;;9544:41:0;;;10095:40;;;;;;;;;;-1:-1:-1;10095:40:0;;;;;;;;;;;15785:124;;;;;;;;;;-1:-1:-1;15785:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;15874:27:0;15850:4;15874:27;;;:18;:27;;;;;;;;;15785:124;10142:50;;;;;;;;;;;;;;;;10208:58;;;;;;;;;;;;;;;;11696:119;;;;;;;;;;-1:-1:-1;11696:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;11789:18:0;11762:7;11789:18;;;:9;:18;;;;;;;11696:119;7785:148;;;;;;;;;;;;;:::i;13456:157::-;;;;;;;;;;-1:-1:-1;13456:157:0;;;;;:::i;:::-;;:::i;14381:150::-;;;;;;;;;;-1:-1:-1;14381:150:0;;;;;:::i;:::-;;:::i;10273:70::-;;;;;;;;;;-1:-1:-1;10273:70:0;;;;-1:-1:-1;;;;;10273:70:0;;;14656:128;;;;;;;;;;-1:-1:-1;14656:128:0;;;;;:::i;:::-;;:::i;18039:209::-;;;;;;;;;;-1:-1:-1;18039:209:0;;;;;:::i;:::-;;:::i;7571:79::-;;;;;;;;;;-1:-1:-1;7609:7:0;7636:6;-1:-1:-1;;;;;7636:6:0;7571:79;;11407:87;;;;;;;;;;;;;:::i;15502:275::-;;;;;;;;;;;;;:::i;18563:166::-;;;;;;;;;;-1:-1:-1;18563:166:0;;;;;:::i;:::-;;:::i;14792:131::-;;;;;;;;;;-1:-1:-1;14792:131:0;;;;;:::i;:::-;;:::i;10350:39::-;;;;;;;;;;;;;;;;12865:269;;;;;;;;;;-1:-1:-1;12865:269:0;;;;;:::i;:::-;;:::i;11823:167::-;;;;;;;;;;-1:-1:-1;11823:167:0;;;;;:::i;:::-;;:::i;14007:122::-;;;;;;;;;;-1:-1:-1;14007:122:0;;;;;:::i;:::-;;:::i;15286:171::-;;;;;;;;;;-1:-1:-1;15286:171:0;;;;;:::i;:::-;;:::i;11998:143::-;;;;;;;;;;-1:-1:-1;11998:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;12106:18:0;;;12079:7;12106:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11998:143;14539:109;;;;;;;;;;-1:-1:-1;14539:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;14624:16:0;14600:4;14624:16;;;:10;:16;;;;;;;;;14539:109;7941:244;;;;;;;;;;-1:-1:-1;7941:244:0;;;;;:::i;:::-;;:::i;11316:83::-;11353:13;11386:5;11379:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11316:83;:::o;12149:161::-;12224:4;12241:39;4659:10;12264:7;12273:6;12241:8;:39::i;:::-;-1:-1:-1;12298:4:0;12149:161;;;;;:::o;12318:313::-;12416:4;12433:36;12443:6;12451:9;12462:6;12433:9;:36::i;:::-;12480:121;12489:6;4659:10;12511:89;12549:6;12511:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12511:19:0;;;;;;:11;:19;;;;;;;;4659:10;12511:33;;;;;;;;;;:37;:89::i;:::-;12480:8;:121::i;:::-;-1:-1:-1;12619:4:0;12318:313;;;;;:::o;13142:137::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;;;;;;;;;13246:25:::1;:15:::0;13264:7:::1;13246:25;:::i;:::-;13227:16;:44:::0;-1:-1:-1;13142:137:0:o;18966:161::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;19050:21:::1;19090:7;7609::::0;7636:6;-1:-1:-1;;;;;7636:6:0;;7571:79;19090:7:::1;-1:-1:-1::0;;;;;19082:25:0::1;:37;19108:10;19082:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;19018:109;18966:161::o:0;12639:218::-;4659:10;12727:4;12776:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12776:34:0;;;;;;;;;;12727:4;;12744:83;;12767:7;;12776:50;;12815:10;12776:38;:50::i;13287:161::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;13399:41:::1;13412:9;;13423:16;13399:12;:41::i;:::-;13287:161:::0;;;:::o;18489:66::-;18532:15;:13;:15::i;:::-;18489:66::o;7785:148::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;7892:1:::1;7876:6:::0;;7855:40:::1;::::0;-1:-1:-1;;;;;7876:6:0;;::::1;::::0;7855:40:::1;::::0;7892:1;;7855:40:::1;7923:1;7906:19:::0;;-1:-1:-1;;;;;;7906:19:0::1;::::0;;7785:148::o;13456:157::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;13566:39:::1;13583:9;;13594:10;13566:16;:39::i;14381:150::-:0;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;14464:7:::1;:23:::0;;;;14498:15;:25;14381:150::o;14656:128::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;14740:36:::1;14760:9;14771:4;14740:19;:36::i;:::-;14656:128:::0;:::o;18039:209::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;18137:16:::1;;18125:8;:28;;18117:85;;;::::0;-1:-1:-1;;;18117:85:0;;7982:2:1;18117:85:0::1;::::0;::::1;7964:21:1::0;8021:2;8001:18;;;7994:30;8060:34;8040:18;;;8033:62;-1:-1:-1;;;8111:18:1;;;8104:42;8163:19;;18117:85:0::1;7780:408:1::0;18117:85:0::1;18213:16;:27:::0;18039:209::o;11407:87::-;11446:13;11479:7;11472:14;;;;;:::i;15502:275::-;15604:16;;;15618:1;15604:16;;;;;;;;15559:7;;;;15604:16;15618:1;15604:16;;;;;;;;-1:-1:-1;;15641:15:0;;:22;;;-1:-1:-1;;;15641:22:0;;;;15580:40;;-1:-1:-1;;;;;;15641:15:0;;;;:20;;-1:-1:-1;15641:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15631:4;15636:1;15631:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;15631:32:0;;;-1:-1:-1;;;;;15631:32:0;;;;;15692:4;15674;15679:1;15674:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15674:23:0;;;:7;;;;;;;;;:23;15715:15;;15745:14;;15715:51;;-1:-1:-1;;;15715:51:0;;:15;;;;;:29;;:51;;15745:14;15761:4;;15715:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15715:51:0;;;;;;;;;;;;:::i;:::-;15767:1;15715:54;;;;;;;;:::i;:::-;;;;;;;15708:61;;;15502:275;:::o;18563:166::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;18654:15:::1;:67:::0;;-1:-1:-1;;;;;;18654:67:0::1;-1:-1:-1::0;;;;;18654:67:0;;;::::1;::::0;;;::::1;::::0;;18563:166::o;14792:131::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;14878:37:::1;14898:9;14909:5;14878:19;:37::i;12865:269::-:0;12958:4;12975:129;4659:10;12998:7;13007:96;13046:15;13007:96;;;;;;;;;;;;;;;;;4659:10;13007:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13007:34:0;;;;;;;;;;;;:38;:96::i;11823:167::-;11901:4;11918:42;4659:10;11942:9;11953:6;11918:9;:42::i;14007:122::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;14089:14:::1;:32:::0;14007:122::o;15286:171::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;15363:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;15363:32:0;;::::1;;::::0;;15411:38:::1;::::0;::::1;::::0;::::1;::::0;15387:8;1237:14:1;1230:22;1212:41;;1200:2;1185:18;;1072:187;15411:38:0::1;;;;;;;;15286:171:::0;:::o;7941:244::-;7698:6;;-1:-1:-1;;;;;7698:6:0;4659:10;7698:22;7690:67;;;;-1:-1:-1;;;7690:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8030:22:0;::::1;8022:73;;;::::0;-1:-1:-1;;;8022:73:0;;10472:2:1;8022:73:0::1;::::0;::::1;10454:21:1::0;10511:2;10491:18;;;10484:30;10550:34;10530:18;;;10523:62;-1:-1:-1;;;10601:18:1;;;10594:36;10647:19;;8022:73:0::1;10270:402:1::0;8022:73:0::1;8132:6;::::0;;8111:38:::1;::::0;-1:-1:-1;;;;;8111:38:0;;::::1;::::0;8132:6;::::1;::::0;8111:38:::1;::::0;::::1;8160:6;:17:::0;;-1:-1:-1;;;;;;8160:17:0::1;-1:-1:-1::0;;;;;8160:17:0;;;::::1;::::0;;;::::1;::::0;;7941:244::o;15917:337::-;-1:-1:-1;;;;;16010:19:0;;16002:68;;;;-1:-1:-1;;;16002:68:0;;10879:2:1;16002:68:0;;;10861:21:1;10918:2;10898:18;;;10891:30;10957:34;10937:18;;;10930:62;-1:-1:-1;;;11008:18:1;;;11001:34;11052:19;;16002:68:0;10677:400:1;16002:68:0;-1:-1:-1;;;;;16089:21:0;;16081:68;;;;-1:-1:-1;;;16081:68:0;;11284:2:1;16081:68:0;;;11266:21:1;11323:2;11303:18;;;11296:30;11362:34;11342:18;;;11335:62;-1:-1:-1;;;11413:18:1;;;11406:32;11455:19;;16081:68:0;11082:398:1;16081:68:0;-1:-1:-1;;;;;16162:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16214:32;;2149:25:1;;;16214:32:0;;2122:18:1;16214:32:0;;;;;;;15917:337;;;:::o;16262:1374::-;-1:-1:-1;;;;;16350:18:0;;16342:68;;;;-1:-1:-1;;;16342:68:0;;11687:2:1;16342:68:0;;;11669:21:1;11726:2;11706:18;;;11699:30;11765:34;11745:18;;;11738:62;-1:-1:-1;;;11816:18:1;;;11809:35;11861:19;;16342:68:0;11485:401:1;16342:68:0;-1:-1:-1;;;;;16429:16:0;;16421:64;;;;-1:-1:-1;;;16421:64:0;;12093:2:1;16421:64:0;;;12075:21:1;12132:2;12112:18;;;12105:30;12171:34;12151:18;;;12144:62;-1:-1:-1;;;12222:18:1;;;12215:33;12265:19;;16421:64:0;11891:399:1;16421:64:0;16513:1;16504:6;:10;16496:64;;;;-1:-1:-1;;;16496:64:0;;12497:2:1;16496:64:0;;;12479:21:1;12536:2;12516:18;;;12509:30;12575:34;12555:18;;;12548:62;-1:-1:-1;;;12626:18:1;;;12619:39;12675:19;;16496:64:0;12295:405:1;16496:64:0;-1:-1:-1;;;;;16618:24:0;;16571:11;16618:24;;;:18;:24;;;;;;16571:11;;16618:24;;16617:25;:52;;;;-1:-1:-1;;;;;;16647:22:0;;;;;;:18;:22;;;;;;;;16646:23;16617:52;:71;;;;-1:-1:-1;7609:7:0;7636:6;-1:-1:-1;;;;;16673:15:0;;;7636:6;;16673:15;;16617:71;:88;;;;-1:-1:-1;7609:7:0;7636:6;-1:-1:-1;;;;;16692:13:0;;;7636:6;;16692:13;;16617:88;16601:104;;16716:21;16740:25;16758:6;16740:13;16750:2;-1:-1:-1;;;;;11789:18:0;11762:7;11789:18;;;:9;:18;;;;;;;11696:119;16740:13;:17;;:25::i;:::-;16716:49;;16877:7;7609;7636:6;-1:-1:-1;;;;;7636:6:0;;7571:79;16877:7;-1:-1:-1;;;;;16869:15:0;:4;-1:-1:-1;;;;;16869:15:0;;;:32;;;;-1:-1:-1;7609:7:0;7636:6;-1:-1:-1;;;;;16888:13:0;;;7636:6;;16888:13;;16869:32;:52;;;;-1:-1:-1;16911:10:0;;-1:-1:-1;;;;;16905:16:0;;;16911:10;;16905:16;;16869:52;16865:181;;;-1:-1:-1;;;;;16947:16:0;;;;;;:10;:16;;;;;;;;16946:17;:36;;;;-1:-1:-1;;;;;;16968:14:0;;;;;;:10;:14;;;;;;;;16967:15;16946:36;16938:96;;;;-1:-1:-1;;;16938:96:0;;12907:2:1;16938:96:0;;;12889:21:1;12946:2;12926:18;;;12919:30;12985:34;12965:18;;;12958:62;-1:-1:-1;;;13036:18:1;;;13029:45;13091:19;;16938:96:0;12705:411:1;16938:96:0;17068:13;;-1:-1:-1;;;;;17060:21:0;;;17068:13;;17060:21;17056:137;;;17123:16;;17106:13;:33;;17098:83;;;;-1:-1:-1;;;17098:83:0;;;;;;;:::i;:::-;17215:13;;-1:-1:-1;;;;;17207:21:0;;;17215:13;;17207:21;;;;:44;;-1:-1:-1;17238:13:0;;-1:-1:-1;;;;;17232:19:0;;;17238:13;;17232:19;17207:44;17203:189;;;17346:4;17337:13;;17365:15;:13;:15::i;:::-;17414:13;;-1:-1:-1;;;;;17406:21:0;;;17414:13;;17406:21;;;;:44;;-1:-1:-1;17437:13:0;;-1:-1:-1;;;;;17431:19:0;;;17437:13;;17431:19;;17406:44;17402:160;;;17492:16;;17475:13;:33;;17467:83;;;;-1:-1:-1;;;17467:83:0;;;;;;;:::i;:::-;17572:56;17587:4;17593:2;17597:6;17605:8;17615:6;17623:4;17572:14;:56::i;:::-;16331:1305;;;16262:1374;;;:::o;3051:192::-;3137:7;3173:12;3165:6;;;;3157:29;;;;-1:-1:-1;;;3157:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3197:9:0;3209:5;3213:1;3209;:5;:::i;:::-;3197:17;3051:192;-1:-1:-1;;;;;3051:192:0:o;2718:181::-;2776:7;;2808:5;2812:1;2808;:5;:::i;:::-;2796:17;;2837:1;2832;:6;;2824:46;;;;-1:-1:-1;;;2824:46:0;;13992:2:1;2824:46:0;;;13974:21:1;14031:2;14011:18;;;14004:30;14070:29;14050:18;;;14043:57;14117:18;;2824:46:0;13790:351:1;2824:46:0;2890:1;2718:181;-1:-1:-1;;;2718:181:0:o;14137:236::-;14224:9;14219:147;14239:20;;;14219:147;;;14281:12;14296:9;;14306:1;14296:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;14323:24:0;;;;;:18;:24;;;;;:31;;-1:-1:-1;;14323:31:0;;;;;;;-1:-1:-1;14261:3:0;;;;:::i;:::-;;;;14219:147;;;;14137:236;;;:::o;17644:387::-;17737:4;17688:28;11789:18;;;:9;:18;;;;;;17758:24;;17754:270;;17799:19;17821:26;:24;:26::i;:::-;17799:48;;17890:11;17866:20;:35;;:56;;;;-1:-1:-1;17906:16:0;;;;17905:17;17866:56;:81;;;;-1:-1:-1;17926:21:0;;;;;;;17866:81;17862:151;;;17968:29;17985:11;17968:16;:29::i;13755:244::-;13846:9;13841:151;13861:20;;;13841:151;;;13903:12;13918:9;;13928:1;13918:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13945:28:0;;;;;:22;:28;;;;;:35;;-1:-1:-1;;13945:35:0;;;;;;;-1:-1:-1;13883:3:0;;;;:::i;:::-;;;;13841:151;;14931:347;15026:9;15021:250;15045:9;:16;15041:1;:20;15021:250;;;15083:12;15098:9;15108:1;15098:12;;;;;;;;:::i;:::-;;;;;;;15083:27;;15129:7;15125:135;;;-1:-1:-1;;;;;15157:16:0;;;;;;:10;:16;;;;;:23;;-1:-1:-1;;15157:23:0;15176:4;15157:23;;;15125:135;;;-1:-1:-1;;;;;15228:16:0;;;;;;:10;:16;;;;;15221:23;;-1:-1:-1;;15221:23:0;;;15125:135;-1:-1:-1;15063:3:0;;;;:::i;:::-;;;;15021:250;;19801:1118;19947:17;19967:8;:50;;20016:1;19967:50;;;19989:7;:14;19978:35;;20009:3;;19978:26;;:6;;:10;:26::i;:::-;:30;;:35::i;:::-;19947:70;;20032:8;:18;;;;;20044:6;20032:18;20028:99;;;20090:15;;20079:36;;20111:3;;20079:27;;:6;;:10;:27::i;:36::-;20067:48;;20028:99;20137:22;20162:21;:6;20173:9;20162:10;:21::i;:::-;-1:-1:-1;;;;;20214:17:0;;;;;;:9;:17;;;;;;20137:46;;-1:-1:-1;20214:29:0;;20236:6;20214:21;:29::i;:::-;-1:-1:-1;;;;;20194:17:0;;;;;;;:9;:17;;;;;;:49;;;;20277:20;;;;;;;:40;;20302:14;20277:24;:40::i;:::-;-1:-1:-1;;;;;20254:20:0;;;;;;:9;:20;;;;;;:63;;;;20373:4;20355:24;;;;:39;;20384:9;20355:28;:39::i;:::-;20346:4;20328:24;;;;:9;:24;;;;;;;;;:66;;;;20410:35;2149:25:1;;;-1:-1:-1;;;;;20410:35:0;;;;;;;;;;2122:18:1;20410:35:0;;;;;;;20462:17;20458:454;;;20500:15;;:39;;-1:-1:-1;;;20500:39:0;;-1:-1:-1;;;;;1959:32:1;;;20500:39:0;;;1941:51:1;20500:15:0;;;;:31;;1914:18:1;;20500:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20496:54;20568:15;;:42;;-1:-1:-1;;;20568:42:0;;-1:-1:-1;;;;;1959:32:1;;;20568:42:0;;;1941:51:1;20568:15:0;;;;:31;;1914:18:1;;20568:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20564:57;20639:15;;20663:16;;20639:41;;-1:-1:-1;;;;;;20639:41:0;;-1:-1:-1;;;;;20639:15:0;;;;:23;;:41;;;;2149:25:1;;;2137:2;2122:18;;2003:177;20639:41:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20639:41:0;;;;;;;;-1:-1:-1;;20639:41:0;;;;;;;;;;;;:::i;:::-;;;20635:266;;;;;20849:16;;20778:99;;;14828:25:1;;;14884:2;14869:18;;14862:34;;;14912:18;;;14905:34;;;14970:2;14955:18;;14948:34;;;;20778:99:0;20867:9;;20843:4;;20778:99;;;;;14815:3:1;20778:99:0;;;20681:212;;;20635:266;19936:983;;19801:1118;;;;;;:::o;18256:225::-;9347:16;:23;;-1:-1:-1;;9347:23:0;9366:4;9347:23;;;18343:38:::1;18360:20:::0;18343:16:::1;:38::i;:::-;18413:21;18445:28;18413:21:::0;18445:16:::1;:28::i;:::-;-1:-1:-1::0;;9393:16:0;:24;;-1:-1:-1;;9393:24:0;;;18256:225::o;3251:471::-;3309:7;3554:6;3550:47;;-1:-1:-1;3584:1:0;3577:8;;3550:47;3609:9;3621:5;3625:1;3621;:5;:::i;:::-;3609:17;-1:-1:-1;3654:1:0;3645:5;3649:1;3609:17;3645:5;:::i;:::-;:10;3637:56;;;;-1:-1:-1;;;3637:56:0;;15417:2:1;3637:56:0;;;15399:21:1;15456:2;15436:18;;;15429:30;15495:34;15475:18;;;15468:62;-1:-1:-1;;;15546:18:1;;;15539:31;15587:19;;3637:56:0;15215:397:1;3730:132:0;3788:7;3815:39;3819:1;3822;3815:39;;;;;;;;;;;;;;;;;:3;:39::i;2907:136::-;2965:7;2992:43;2996:1;2999;2992:43;;;;;;;;;;;;;;;;;:3;:43::i;19135:585::-;19285:16;;;19299:1;19285:16;;;;;;;;19261:21;;19285:16;;;;;;;;;;-1:-1:-1;19285:16:0;19261:40;;19330:4;19312;19317:1;19312:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19312:23:0;;;:7;;;;;;;;;;:23;;;;19356:15;;:22;;;-1:-1:-1;;;19356:22:0;;;;:15;;;;;:20;;:22;;;;;19312:7;;19356:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19346:4;19351:1;19346:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19346:32:0;;;:7;;;;;;;;;:32;19421:15;;19389:62;;19406:4;;19421:15;19439:11;19389:8;:62::i;:::-;19488:15;;:224;;-1:-1:-1;;;19488:224:0;;-1:-1:-1;;;;;19488:15:0;;;;:66;;:224;;19569:11;;19488:15;;19639:4;;19666;;19686:15;;19488:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18737:221;18827:15;;18819:52;;18802:12;;-1:-1:-1;;;;;18827:15:0;;18857:9;;18802:12;18819:52;18802:12;18819:52;18857:9;18827:15;18819:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18801:70;;;18886:7;18882:69;;;18915:24;;2149:25:1;;;18915:24:0;;2137:2:1;2122:18;18915:24:0;;;;;;;18790:168;18737:221;:::o;3870:278::-;3956:7;3991:12;3984:5;3976:28;;;;-1:-1:-1;;;3976:28:0;;;;;;;;:::i;:::-;-1:-1:-1;4015:9:0;4027:5;4031:1;4027;:5;:::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1517:247::-;1576:6;1629:2;1617:9;1608:7;1604:23;1600:32;1597:52;;;1645:1;1642;1635:12;1597:52;1684:9;1671:23;1703:31;1728:5;1703:31;:::i;2185:456::-;2262:6;2270;2278;2331:2;2319:9;2310:7;2306:23;2302:32;2299:52;;;2347:1;2344;2337:12;2299:52;2386:9;2373:23;2405:31;2430:5;2405:31;:::i;:::-;2455:5;-1:-1:-1;2512:2:1;2497:18;;2484:32;2525:33;2484:32;2525:33;:::i;:::-;2185:456;;2577:7;;-1:-1:-1;;;2631:2:1;2616:18;;;;2603:32;;2185:456::o;2646:180::-;2705:6;2758:2;2746:9;2737:7;2733:23;2729:32;2726:52;;;2774:1;2771;2764:12;2726:52;-1:-1:-1;2797:23:1;;2646:180;-1:-1:-1;2646:180:1:o;3260:160::-;3325:20;;3381:13;;3374:21;3364:32;;3354:60;;3410:1;3407;3400:12;3354:60;3260:160;;;:::o;3425:689::-;3517:6;3525;3533;3586:2;3574:9;3565:7;3561:23;3557:32;3554:52;;;3602:1;3599;3592:12;3554:52;3642:9;3629:23;3671:18;3712:2;3704:6;3701:14;3698:34;;;3728:1;3725;3718:12;3698:34;3766:6;3755:9;3751:22;3741:32;;3811:7;3804:4;3800:2;3796:13;3792:27;3782:55;;3833:1;3830;3823:12;3782:55;3873:2;3860:16;3899:2;3891:6;3888:14;3885:34;;;3915:1;3912;3905:12;3885:34;3970:7;3963:4;3953:6;3950:1;3946:14;3942:2;3938:23;3934:34;3931:47;3928:67;;;3991:1;3988;3981:12;3928:67;4022:4;4014:13;;;;-1:-1:-1;4046:6:1;-1:-1:-1;4071:37:1;;4087:20;;;-1:-1:-1;4071:37:1;:::i;:::-;4061:47;;3425:689;;;;;:::o;4327:248::-;4395:6;4403;4456:2;4444:9;4435:7;4431:23;4427:32;4424:52;;;4472:1;4469;4462:12;4424:52;-1:-1:-1;;4495:23:1;;;4565:2;4550:18;;;4537:32;;-1:-1:-1;4327:248:1:o;4580:127::-;4641:10;4636:3;4632:20;4629:1;4622:31;4672:4;4669:1;4662:15;4696:4;4693:1;4686:15;4712:275;4783:2;4777:9;4848:2;4829:13;;-1:-1:-1;;4825:27:1;4813:40;;4883:18;4868:34;;4904:22;;;4865:62;4862:88;;;4930:18;;:::i;:::-;4966:2;4959:22;4712:275;;-1:-1:-1;4712:275:1:o;4992:183::-;5052:4;5085:18;5077:6;5074:30;5071:56;;;5107:18;;:::i;:::-;-1:-1:-1;5152:1:1;5148:14;5164:4;5144:25;;4992:183::o;5180:966::-;5264:6;5295:2;5338;5326:9;5317:7;5313:23;5309:32;5306:52;;;5354:1;5351;5344:12;5306:52;5394:9;5381:23;5427:18;5419:6;5416:30;5413:50;;;5459:1;5456;5449:12;5413:50;5482:22;;5535:4;5527:13;;5523:27;-1:-1:-1;5513:55:1;;5564:1;5561;5554:12;5513:55;5600:2;5587:16;5623:60;5639:43;5679:2;5639:43;:::i;:::-;5623:60;:::i;:::-;5717:15;;;5799:1;5795:10;;;;5787:19;;5783:28;;;5748:12;;;;5823:19;;;5820:39;;;5855:1;5852;5845:12;5820:39;5879:11;;;;5899:217;5915:6;5910:3;5907:15;5899:217;;;5995:3;5982:17;6012:31;6037:5;6012:31;:::i;:::-;6056:18;;5932:12;;;;6094;;;;5899:217;;;6135:5;5180:966;-1:-1:-1;;;;;;;5180:966:1:o;6151:180::-;6207:6;6260:2;6248:9;6239:7;6235:23;6231:32;6228:52;;;6276:1;6273;6266:12;6228:52;6299:26;6315:9;6299:26;:::i;6336:388::-;6404:6;6412;6465:2;6453:9;6444:7;6440:23;6436:32;6433:52;;;6481:1;6478;6471:12;6433:52;6520:9;6507:23;6539:31;6564:5;6539:31;:::i;:::-;6589:5;-1:-1:-1;6646:2:1;6631:18;;6618:32;6659:33;6618:32;6659:33;:::i;:::-;6711:7;6701:17;;;6336:388;;;;;:::o;6729:380::-;6808:1;6804:12;;;;6851;;;6872:61;;6926:4;6918:6;6914:17;6904:27;;6872:61;6979:2;6971:6;6968:14;6948:18;6945:38;6942:161;;;7025:10;7020:3;7016:20;7013:1;7006:31;7060:4;7057:1;7050:15;7088:4;7085:1;7078:15;6942:161;;6729:380;;;:::o;7114:356::-;7316:2;7298:21;;;7335:18;;;7328:30;7394:34;7389:2;7374:18;;7367:62;7461:2;7446:18;;7114:356::o;7475:127::-;7536:10;7531:3;7527:20;7524:1;7517:31;7567:4;7564:1;7557:15;7591:4;7588:1;7581:15;7607:168;7647:7;7713:1;7709;7705:6;7701:14;7698:1;7695:21;7690:1;7683:9;7676:17;7672:45;7669:71;;;7720:18;;:::i;:::-;-1:-1:-1;7760:9:1;;7607:168::o;8193:251::-;8263:6;8316:2;8304:9;8295:7;8291:23;8287:32;8284:52;;;8332:1;8329;8322:12;8284:52;8364:9;8358:16;8383:31;8408:5;8383:31;:::i;8449:127::-;8510:10;8505:3;8501:20;8498:1;8491:31;8541:4;8538:1;8531:15;8565:4;8562:1;8555:15;8581:461;8634:3;8672:5;8666:12;8699:6;8694:3;8687:19;8725:4;8754:2;8749:3;8745:12;8738:19;;8791:2;8784:5;8780:14;8812:1;8822:195;8836:6;8833:1;8830:13;8822:195;;;8901:13;;-1:-1:-1;;;;;8897:39:1;8885:52;;8957:12;;;;8992:15;;;;8933:1;8851:9;8822:195;;;-1:-1:-1;9033:3:1;;8581:461;-1:-1:-1;;;;;8581:461:1:o;9047:332::-;9254:6;9243:9;9236:25;9297:2;9292;9281:9;9277:18;9270:30;9217:4;9317:56;9369:2;9358:9;9354:18;9346:6;9317:56;:::i;:::-;9309:64;9047:332;-1:-1:-1;;;;9047:332:1:o;9384:881::-;9479:6;9510:2;9553;9541:9;9532:7;9528:23;9524:32;9521:52;;;9569:1;9566;9559:12;9521:52;9602:9;9596:16;9635:18;9627:6;9624:30;9621:50;;;9667:1;9664;9657:12;9621:50;9690:22;;9743:4;9735:13;;9731:27;-1:-1:-1;9721:55:1;;9772:1;9769;9762:12;9721:55;9801:2;9795:9;9824:60;9840:43;9880:2;9840:43;:::i;9824:60::-;9918:15;;;10000:1;9996:10;;;;9988:19;;9984:28;;;9949:12;;;;10024:19;;;10021:39;;;10056:1;10053;10046:12;10021:39;10080:11;;;;10100:135;10116:6;10111:3;10108:15;10100:135;;;10182:10;;10170:23;;10133:12;;;;10213;;;;10100:135;;13121:401;13323:2;13305:21;;;13362:2;13342:18;;;13335:30;13401:34;13396:2;13381:18;;13374:62;-1:-1:-1;;;13467:2:1;13452:18;;13445:35;13512:3;13497:19;;13121:401::o;13527:125::-;13567:4;13595:1;13592;13589:8;13586:34;;;13600:18;;:::i;:::-;-1:-1:-1;13637:9:1;;13527:125::o;13657:128::-;13697:3;13728:1;13724:6;13721:1;13718:13;13715:39;;;13734:18;;:::i;:::-;-1:-1:-1;13770:9:1;;13657:128::o;14146:135::-;14185:3;-1:-1:-1;;14206:17:1;;14203:43;;;14226:18;;:::i;:::-;-1:-1:-1;14273:1:1;14262:13;;14146:135::o;14286:306::-;14374:6;14382;14390;14443:2;14431:9;14422:7;14418:23;14414:32;14411:52;;;14459:1;14456;14449:12;14411:52;14488:9;14482:16;14472:26;;14538:2;14527:9;14523:18;14517:25;14507:35;;14582:2;14571:9;14567:18;14561:25;14551:35;;14286:306;;;;;:::o;14993:217::-;15033:1;15059;15049:132;;15103:10;15098:3;15094:20;15091:1;15084:31;15138:4;15135:1;15128:15;15166:4;15163:1;15156:15;15049:132;-1:-1:-1;15195:9:1;;14993:217::o;15617:582::-;15916:6;15905:9;15898:25;15959:6;15954:2;15943:9;15939:18;15932:34;16002:3;15997:2;15986:9;15982:18;15975:31;15879:4;16023:57;16075:3;16064:9;16060:19;16052:6;16023:57;:::i;:::-;-1:-1:-1;;;;;16116:32:1;;;;16111:2;16096:18;;16089:60;-1:-1:-1;16180:3:1;16165:19;16158:35;16015:65;15617:582;-1:-1:-1;;;15617:582:1:o

Swarm Source

ipfs://adcaca8304014530fe104777e4044cd54f65d95dea690f72c8f44252b299a6ad
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.