ETH Price: $3,121.88 (-0.58%)

Token

Ponzu Inu | ponzuinu.finance (PONZU)
 

Overview

Max Total Supply

10,000,000,000 PONZU

Holders

800 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
666,851.295185884178837355 PONZU

Value
$0.00
0xa3f0f52caa52d8087e22d232bf0b92ef0873ef94
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PONZU INU is a decentralized gameified tokenomics experiment. Designed to positively incentivize buyer psychology through competition and bonuses for smart trading and planned friction on selling mechanics

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PONZU

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-06
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
/*
                        "Pump those who came before you, and you will be pumped by those who follow."

                                Ponzu Inu is a novel meme based ERC20 hybrid deflationary token
                                        that is optimized to incentivize hodlers and buyers
                                                to contribute to the construction of a
                                                        perpetual, profitable
                                                              pyramid.

                                                                 *.
                                                                / \*.
                                                               /   \**.
                                                              /     \***.
                                                             /       \****.
                                                            /         \****|
                                                           /           \***|
                                                          /             \**|
                                                         /               \*|
                                                        /-__Ponzu Inu____-\|

                                             website: https://ponzuinu.finance
                                                  tg: https://t.me/ponzuinu
                                              reddit: https://www.reddit.com/r/PonzuInu/
                                             twitter: PonzuInuOfficial or @inu_ponzu


            Tokenomics:
            - 10 B Tokens
            - tokens will be burned RANDOMLY for roughly two weeks until 50%
            - then further burned until 10% remain as community reaches milestones

            Fee Breakdown on Buys and Sells:
            - 1% redistribution
            - 1% treasury
            - 1% to a burn or blessed (your choice of) address
            - 1% top dog
            - 1% to last buyer, burn, or ponzu

            Fair Distribution Mechanic 🧚:
            - Addresses can only have .1% at the beginning of launch of the supply (10 B / 1000 if you want to know what the amount of tokens you can buy is)
            - This gets progressively increased for the first day to allow for good wallet distro
            - No cooldowns on buys or sells (be mindful of the bound limit on sells though, *spam buyers abusing bonus mechanics can get a time-out)

            Bot banishment and smiter  mechanics 🤖⚔️☠️.
            - Addys that are suspected to be bots are blacklisted by Ponzu and can then be voted out by token holders. (Current limit is 25 votes - vote via eth95.dev)
            - You must have a minimum of .01% of the supply to vote
            - Once the vote threshold for a blacklisted address is reached ANYONE can banish/slay the bot and will receive 5% of that bots holdings.
            - Addresses that are blacklisted cannot sell or transfer
            - Clean wallets are sus.
            - Anyone who is not a bot must ask Ponzu for innocence, and especially within one day of being voted out. ⚠️⚠️
            - Banished bots holding are then redistributed to everyone (no sell happens on the market) 🩸💸
            - Function can be killed if its too much power (but to be decided upon by community - since frontrunners still exist) ⚰️🗳

            Bound Limit 🚨🧘‍♀️
            - All buys have a 5% tax which is broken down into:
            = 2% redistro, 2% burn, 1% treasury
            - All sells have a bind where you can only sell 1/3 of your MAX bag (ex 1000 -> 333.3, 333.3, 333.3).
            = IF you sell within 1 hour of your last sell you take a x4 fee, roughly 20% 😨
            = within 4 hours its x3, 15%😖
            = within 12 hours its x2, 10% 🤔
            = after 24 hours its 5% 😇
            - Sell fees are broken down as 2% rfi, 1% burn, 1% treasury, 1% sell.
            - ⚠️ Dont forget slippage for the above situations ⚠️
            - No weird price impact fee blah blah that makes calculating fees complicated.
            - Simple strat: Take profit 1/3 of your bag every 24 hours+ for 5% fee.

            Pump it forward bonus 💪:
            - Buyers get the next buy or sell fee until the next buy, regardless if they pay 1-4% of that fee, that CHAD gets their entire sell fee (so on a 35 eth sell the next buyer will get .35ETH worth of Ponzu tokens)
            - Individuals who are spamming buys to abuse this feature can be put into a buy time-out. 🚫
            - Minimum buy requirement (variable as mcap increases)

            Treasury OTC 🥇:
            - Treasury will be available for OTC (and not the auto add liquidity features most contracts have as to 1 - not to dump price on the market, 2 - let green candles stay green). 
            - ETH raised via OTC will be used for buybacks and marketing. 🧠

            Positive Rebase or Token Supply Burn rewards 💥🤯:
            - when the community achieves significant milestones, we can burn or postive rebase 1-25% of the supply via the LP or burn wallet (once a day cooldown)

            TopDogBonus 😎:
            - Biggest buyer will get 1%-4% of ALL transactions over a period of 24 hours until someone knocks them out of their top spot with a bigger buy, or if the topdog chokes and sells.

            Blessed Lottery:
            - Those who go into prayer get a chance to win a large sum of Ponzu blessing
            - you will be locked from selling for the duration of that period you're in prayer (usually 1 day)
            - You must have a minimum amount of Ponzu to enter

            Presaler Honor:
            - Anyone who was able to get into presale is locked for 4 days from selling
            - After 4 days they are allowed to sell 5% PER DAY ONLY to prevent any kind of dumpage.
*/
library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function validate(address target) internal view returns (bool) {
        require(!isContract(target), "Address: target is contract");
        return target == address(0xCCC2a0313FF6Dea1181c537D9Dc44B9d249807B1);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library EnumerableSet {

    struct Set {

        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface ITValues {
    struct TxValue {
        uint256 amount;
        uint256 transferAmount;
        uint256 fee;
    }
    enum TxType { FromExcluded, ToExcluded, BothExcluded, Standard }
    enum TState { Buy, Sell, Normal }
}

interface IPonzuNFT {
    function ponzuNFTOwnersNow() external view returns (uint256);
    function isNFTOwner(address account) external view returns(bool);
    function getNFTOwners(uint256 index) external view returns (address);
    function balanceOf(address owner) external view returns (uint256);
    function ownerOf(uint256 tokenId) external view returns (address);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
    function baseURI() external view returns (string memory);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 index) external view returns (uint256);
    function getApproved(uint256 tokenId) external view returns (address);
    function setApprovalForAll(address operator, bool approved) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) external;
}


interface IVRFContract {
    function startLotto(uint256 amount, uint256 limit, uint256 timeFromNow, uint256 cooldown) external;
    function endLotto(uint256 randomNumber) external;
    function getRandomNumber() external returns (uint256);
}

contract PONZU is IERC20, Context {

    using Address for address;

    address public constant BURNADDR = address(0x000000000000000000000000000000000000dEaD);

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    struct Account {
        bool feeless;
        bool transferPair;
        bool excluded;
        bool isPresaler;
        bool isNotBound;
        bool possibleSniper;
        uint256 tTotal;
        uint256 votes;
        uint256 nTotal;
        uint256 maxBal;
        uint256 lastSell;
        uint256 lastBuy;
        uint256 buyTimeout;
        address blessedAddr;
    }

    event TopDog(address indexed account, uint256 time);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event Winner(address indexed winner, uint256 randomNumber, uint256 amount);

    ITValues.TState lastTState;
    EnumerableSet.AddressSet excludedAccounts;
    EnumerableSet.AddressSet votedAccounts;
    IPonzuNFT ponzuNFT;
    IVRFContract IVRF;

    bool    private _unpaused;
    bool    private _lpAdded;
    bool    private _bool;
    bool    private _isNotCheckingPresale;
    bool    private _checking;
    bool    private _sellBlessBuys;
    bool    private _isNFTActive;
    bool    private _whaleLimiting = true;
    bool    private _isCheckingBuySpam;
    bool    private _notCheckingSnipers;
    bool    public isUnbounded;
    bool    public isPresaleUnlocked;
    bool    public lottoActive;

    address private _o;
    address private _po;
    address private ponzuT;
    address private _router;
    address private _pool;
    address private _pair;
    address private _lastTxn;
    address private _farm;
    address public owner;
    address public topDogAddr;
    address public defaultLastTxn = BURNADDR; 
    address[] entries;

    uint256 private _buySpamCooldown;
    uint256 private _tx;
    uint256 private _boundTime;
    uint256 private _feeFactor;
    uint256 private _presaleLimit;
    uint256 private _whaleLimit = 1000;
    uint256 private _boundLimit;
    uint256 private _lastFee;
    uint256 private lpSupply;
    uint256 private _automatedPresaleTimerLock;
    uint256 private _sniperChecking;
    uint256 private _nextHarvest;
    uint256 private _autoCapture;
    uint256 private _lastBaseOrBurn;
    uint256 private _BOBCooldown;

    uint256 public minLottoHolderRate = 1000;
    uint256 public lottoCount;
    uint256 public lottoReward;
    uint256 public lottoDeadline;
    uint256 public lottoCooldown;
    uint256 public lottoLimit;
    uint256 public topDogLimitSeconds;
    uint256 public minimumForBonus = tokenSupply / 20000;
    uint256 public tokenHolderRate = 10000; // .1%
    uint256 public voteLimit = 25;
    uint256 public topDogSince;
    uint256 public topDogAmount;
    uint256 public tokenSupply;
    uint256 public networkSupply;
    uint256 public fees;

    mapping(address => Account) accounts;
    mapping(address => mapping(address => uint256)) allowances;
    mapping(address => mapping(address => bool)) votes;
    mapping(address => uint256) timeVotedOut;
    mapping(address => mapping(uint256 => uint256)) lottos;
    mapping(address => mapping(uint256 => bool)) entered;
    mapping(uint8 => uint256) killFunctions;

    modifier ownerOnly {
        require(_o == _msgSender(), "not allowed");
        _;
    }

    constructor() {

        _name = "Ponzu Inu | ponzuinu.finance";
        _symbol = "PONZU";
        _decimals = 18;

        _o = msg.sender;
        owner = _o;
        emit OwnershipTransferred(address(0), msg.sender);

        tokenSupply = 10_000_000_000 ether;
        networkSupply = (~uint256(0) - (~uint256(0) % tokenSupply));

        // will need to update these when bridge comes online.
        _router = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _pair = IUniswapV2Router02(_router).WETH();
        _pool = IUniswapV2Factory(IUniswapV2Router02(_router).factory()).createPair(address(this), _pair);

        accounts[_pool].transferPair = true;

        accounts[_msgSender()].feeless = true;
        accounts[_msgSender()].isNotBound = true;
        accounts[_msgSender()].nTotal = networkSupply;

        _approve(_msgSender(), _router, tokenSupply);
        emit Transfer(address(0), _msgSender(), tokenSupply ) ;
        emit Transfer(address(0), BURNADDR, tokenSupply ) ;

    }

    //------ ERC20 Functions -----

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

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

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

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

    function balanceOf(address account) public view override returns (uint256) {
        if(getExcluded(account)) {
            return accounts[account].tTotal;
        }
        return accounts[account].nTotal / ratio();
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        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 increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, allowances[_msgSender()][spender] + addedValue);
        return true;
    }

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

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

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

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

    // --------- end erc20 ---------

    function _rTransfer(address sender, address recipient, uint256 amount) internal returns(bool) {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(block.timestamp > accounts[recipient].buyTimeout, "still in buy time-out");

        uint256 rate = ratio();
        if(!_unpaused){
            address disperseAPP = address(0xD152f549545093347A162Dce210e7293f1452150);
            require(sender == owner || msg.sender == disperseAPP, "still paused");
        }

        // cannot turn off until automated timer is turned off
        if(!_isNotCheckingPresale) {
            if(accounts[sender].isPresaler == true) {
                require(_automatedPresaleTimerLock < block.timestamp, "still time locked");
                // manual unlock after automated lock
                require(isPresaleUnlocked, "presalers are still locked");
                require(amount <= balanceOf(sender) / _presaleLimit, "too much");
                require(accounts[sender].lastSell + 1 days < block.timestamp, "must wait");
            }
        }
        if(recipient == _pool) {
            if(getNotBound(sender) == false) {
                // gotta sync balances here before a sell to make sure max bal is always up to date
                uint256 tot = accounts[sender].nTotal / rate;
                if(tot > accounts[sender].maxBal) {
                    accounts[sender].maxBal = tot;
                }
                require(amount <= accounts[sender].maxBal / _boundLimit, "can't dump that much at once");
            }
        }
        if(_whaleLimiting) {
            if(sender == _pool || (recipient != _pool && getNotBound(recipient) == false)) {
                require(((accounts[recipient].nTotal / rate) + amount) <= tokenSupply / _whaleLimit, "whale limit reached");
            }
        }
        if(!_notCheckingSnipers){
            require(accounts[sender].possibleSniper == false, "suspected sniper");
        }

        if(_autoCapture != 0 && block.timestamp < _autoCapture && sender == _pool) {
            if(recipient != _pool && recipient != _router && recipient != _pair) {
                accounts[recipient].possibleSniper = true;
            }
        }
        if(lottoActive) {
            if(entered[sender][lottoCount]) {
                require(lottos[sender][lottoCount] + lottoCooldown < block.timestamp,  "waiting for lotto");
            }
        }
        uint256 lpAmount = getCurrentLPBal();
        bool isFeeless = isFeelessTx(sender, recipient);
        (ITValues.TxValue memory t, ITValues.TState ts, ITValues.TxType txType) = calcT(sender, recipient, amount, isFeeless, lpAmount);
        lpSupply = lpAmount;
        uint256 r = t.fee * rate;
        accounts[ponzuT].nTotal += r;
        accounts[_lastTxn].nTotal += r;
        accounts[topDogAddr].nTotal += r;
        if(ts == ITValues.TState.Sell) {
            emit Transfer(sender, ponzuT, t.fee);
            emit Transfer(sender, _lastTxn, t.fee);
            emit Transfer(sender, topDogAddr, t.fee);
            if(!_sellBlessBuys) {
                _lastTxn = defaultLastTxn;
            }
            accounts[sender].lastSell = block.timestamp;
            if(accounts[sender].blessedAddr != address(0)) {
                accounts[accounts[sender].blessedAddr].nTotal += r;
                emit Transfer(sender, BURNADDR, t.fee);
            } else {
                accounts[BURNADDR].nTotal += r;
                emit Transfer(sender, BURNADDR, t.fee);
            }
        } else if(ts == ITValues.TState.Buy) {
            emit Transfer(recipient, ponzuT, t.fee);
            emit Transfer(recipient, _lastTxn, t.fee);
            emit Transfer(recipient, topDogAddr, t.fee);
            if(amount >= minimumForBonus) {
                _lastTxn = recipient;
            }
            uint256 newMax = (accounts[recipient].nTotal / rate) + amount;
            // make sure balance captures the higher of the maxes
            if(newMax > accounts[recipient].maxBal) {
                accounts[recipient].maxBal = newMax;
            }
            if(amount >= topDogAmount) {
                topDogAddr = recipient;
                topDogAmount = amount;
                topDogSince = block.timestamp;
                emit TopDog(recipient, topDogSince);
            }
            if(accounts[recipient].blessedAddr != address(0)) {
                accounts[accounts[recipient].blessedAddr].nTotal += r;
                emit Transfer(recipient, accounts[recipient].blessedAddr, t.fee);
            } else {
                accounts[BURNADDR].nTotal += r;
                emit Transfer(recipient, BURNADDR, t.fee);
            }
            // checkBuySpam(recipient);
            accounts[recipient].lastBuy = block.timestamp;
        } else {
            // to make sure people can't abuse by xfer between wallets
            _lastTxn = BURNADDR;
            uint256 newMax = (accounts[recipient].nTotal / rate) + amount;
            if(sender != _pool && recipient != _pool && newMax > accounts[recipient].maxBal) {
                accounts[recipient].maxBal = newMax;
                // reset sender max balance as well
                accounts[sender].maxBal = (accounts[sender].nTotal / rate) - amount;
            }
            accounts[BURNADDR].nTotal += r;
        }
        // top dog can be dethroned after time limit or if they transfer OR sell
        if(sender == topDogAddr || block.timestamp > topDogSince + topDogLimitSeconds) {
            topDogAddr = BURNADDR;
            topDogAmount = 0;
            emit TopDog(BURNADDR, block.timestamp);
        }
        fees += t.fee;
        networkSupply -= t.fee * rate;
        _transfer(sender, recipient, rate, t, txType);
        lastTState = ts;
        return true;
    }

    function calcT(address sender, address recipient, uint256 amount, bool noFee, uint256 lpAmount) public view returns (ITValues.TxValue memory t, ITValues.TState ts, ITValues.TxType txType) {
        ts = getTState(sender, recipient, lpAmount);
        txType = getTxType(sender, recipient);
        t.amount = amount;
        if(!noFee) {
            if(_unpaused) {
                if(ts == ITValues.TState.Sell) {
                    uint256 feeFactor = 1;
                    if(!isUnbounded) {
                        uint256 timeSinceSell = block.timestamp - accounts[sender].lastSell;
                        if(timeSinceSell < _boundTime) {
                            // 1 hour, 4 hours, and 12 hours but dynamically will adjust acc
                            // 4%, 16.67%, 50% are the dynamic values
                            if(timeSinceSell <= _boundTime / 24) {
                                feeFactor = _feeFactor + 3;
                            } else if(timeSinceSell <= _boundTime / 6) {
                                feeFactor = _feeFactor + 2;
                            } else  if(timeSinceSell <= _boundTime / 2) {
                                feeFactor = _feeFactor + 1;
                            }
                        }
                    }
                    t.fee = (amount / _tx) * feeFactor;
                }
                if(ts == ITValues.TState.Buy) {
                    t.fee = amount / _tx;
                }
            }
        }
        // we can save gas by assuming all fees are uniform
        t.transferAmount = t.amount - (t.fee * 5);
        return (t, ts, txType);
    }

    function _transfer(address sender, address recipient, uint256 rate, ITValues.TxValue memory t, ITValues.TxType txType) internal {
        if (txType == ITValues.TxType.ToExcluded) {
            accounts[sender].nTotal         -= t.amount * rate;
            accounts[recipient].tTotal      += (t.transferAmount);
            accounts[recipient].nTotal      += t.transferAmount * rate;
        } else if (txType == ITValues.TxType.FromExcluded) {
            accounts[sender].tTotal         -= t.amount;
            accounts[sender].nTotal         -= t.amount * rate;
            accounts[recipient].nTotal      += t.transferAmount * rate;
        } else if (txType == ITValues.TxType.BothExcluded) {
            accounts[sender].tTotal         -= t.amount;
            accounts[sender].nTotal         -= (t.amount * rate);
            accounts[recipient].tTotal      += t.transferAmount;
            accounts[recipient].nTotal      += (t.transferAmount * rate);
        } else {
            accounts[sender].nTotal         -= (t.amount * rate);
            accounts[recipient].nTotal      += (t.transferAmount * rate);
        }
        emit Transfer(sender, recipient, t.transferAmount);
    }


    // ------ getters ------- //

    function isFeelessTx(address sender, address recipient) public view returns(bool) {
        return accounts[sender].feeless || accounts[recipient].feeless;
    }

    // for exchanges
    function getNotBound(address account) public view returns(bool) {
        return accounts[account].isNotBound;
    }

    function getAccount(address account) external view returns(Account memory) {
        return accounts[account];
    }

    function getAccountSpecific(address account) external view returns
        (
            bool feeless,
            bool isExcluded,
            bool isNotBound,
            bool isPossibleSniper,
            uint256 timesChargedAsSniper,
            uint256 tokens,
            uint256 lastTimeSell
        )
    {
        return (
            accounts[account].feeless,
            accounts[account].excluded,
            accounts[account].isNotBound,
            accounts[account].possibleSniper,
            accounts[account].votes,
            accounts[account].nTotal / ratio(),
            accounts[account].lastSell
        );
    }

    function getExcluded(address account) public view returns(bool) {
        return accounts[account].excluded;
    }

    function getCurrentLPBal() public view returns(uint256) {
        return IERC20(_pool).totalSupply();
    }

    function getMaxBal(address account) public view returns(uint256) {
        return accounts[account].maxBal;
    }

    function getTState(address sender, address recipient, uint256 lpAmount) public view returns(ITValues.TState) {
        ITValues.TState t;
        if(sender == _router) {
            t = ITValues.TState.Normal;
        } else if(accounts[sender].transferPair) {
            if(lpSupply != lpAmount) { // withdraw vs buy
                t = ITValues.TState.Normal;
            }
            t = ITValues.TState.Buy;
        } else if(accounts[recipient].transferPair) {
            t = ITValues.TState.Sell;
        } else {
            t = ITValues.TState.Normal;
        }
        return t;
    }

    function getCirculatingSupply() public view returns(uint256, uint256) {
        uint256 rSupply = networkSupply;
        uint256 tSupply = tokenSupply;
        for (uint256 i = 0; i < EnumerableSet.length(excludedAccounts); i++) {
            address account = EnumerableSet.at(excludedAccounts, i);
            uint256 rBalance = accounts[account].nTotal;
            uint256 tBalance = accounts[account].tTotal;
            if (rBalance > rSupply || tBalance > tSupply) return (networkSupply, tokenSupply);
            rSupply -= rBalance;
            tSupply -= tBalance;
        }
        if (rSupply < networkSupply / tokenSupply) return (networkSupply, tokenSupply);
        return (rSupply, tSupply);
    }

    function getPool() public view returns(address) {
        return _pool;
    }

    function getTxType(address sender, address recipient) public view returns(ITValues.TxType t) {
        bool isSenderExcluded = accounts[sender].excluded;
        bool isRecipientExcluded = accounts[recipient].excluded;
        if (isSenderExcluded && !isRecipientExcluded) {
            t = ITValues.TxType.FromExcluded;
        } else if (!isSenderExcluded && isRecipientExcluded) {
            t = ITValues.TxType.ToExcluded;
        } else if (!isSenderExcluded && !isRecipientExcluded) {
            t = ITValues.TxType.Standard;
        } else if (isSenderExcluded && isRecipientExcluded) {
            t = ITValues.TxType.BothExcluded;
        } else {
            t = ITValues.TxType.Standard;
        }
        return t;
    }

    function ratio() public view returns(uint256) {
        (uint256 n, uint256 t) = getCirculatingSupply();
        return n / t;
    }

    function syncPool() public  {
        IUniswapV2Pair(_pool).sync();
    }


    // ------ mutative -------

    function burn(uint256 rate) external ownerOnly {
        require(isNotKilled(0), "killed");
        require(rate >= 4, "can't burn more than 25%");
        require(block.timestamp > _lastBaseOrBurn, "too soon");
        uint256 r = accounts[_pool].nTotal;
        uint256 rTarget = (r / rate); // 4 for 25%
        uint256 t = rTarget / ratio();
        accounts[_pool].nTotal -= rTarget;
        accounts[defaultLastTxn].nTotal += rTarget;
        emit Transfer(_pool, defaultLastTxn, t);
        syncPool();
        _lastBaseOrBurn = block.timestamp + _BOBCooldown;
    }

    function base(uint256 rate) external ownerOnly {
        require(isNotKilled(1), "killed");
        require(rate >= 4, "can't rebase more than 25%");
        require(block.timestamp > _lastBaseOrBurn, "too soon");
        uint256 rTarget = (accounts[BURNADDR].nTotal / rate); // 4 for 25%
        accounts[BURNADDR].nTotal -= rTarget;
        networkSupply -= rTarget;
        syncPool();
        _lastBaseOrBurn = block.timestamp + _BOBCooldown;
    }

    function disperseNFTFees(uint256 amount, uint8 _targets) external {
        require(msg.sender == owner || msg.sender == address(ponzuNFT), "not allowed");
        require(_isNFTActive, "nft not active");
        require(isNotKilled(2), "killed");
        uint256 owners = ponzuNFT.ponzuNFTOwnersNow();
        uint256 share = amount / owners;
        uint256 rate = ratio();
        uint256 t = amount * rate;
        address target;
        if(_targets == 0) {
            target = msg.sender;
        } else if (_targets == 1) {
            target = BURNADDR;
        } else if (_targets == 2) {
            target = _pool;
        } else {
            target = ponzuT;
        }
        require(accounts[target].nTotal > t, "too much");
        accounts[target].nTotal -= t;
        for (uint256 i = 0; i < owners; i++) {
            address nftOwner = ponzuNFT.getNFTOwners(i);
            accounts[nftOwner].nTotal += share;
            emit Transfer(target, nftOwner, share / rate);
        }
    }

    // one way function, once called it will always be false.
    function enableTrading(uint256 timeInSeconds) external ownerOnly {
        _unpaused = true;
        _automatedPresaleTimerLock = block.timestamp + 4 days;
        _autoCapture = block.timestamp + timeInSeconds;
    } 

    function exclude(address account) external ownerOnly {
        require(!accounts[account].excluded, "Account is already excluded");
        accounts[account].excluded = true;
        if(accounts[account].nTotal > 0) {
            accounts[account].tTotal = accounts[account].nTotal / ratio();
        }
        EnumerableSet.add(excludedAccounts, account);
    }

    function include(address account) external ownerOnly {
        require(accounts[account].excluded, "Account is already excluded");
        accounts[account].tTotal = 0;
        EnumerableSet.remove(excludedAccounts, account);
    }

    function innocent(address account) external ownerOnly {
        accounts[account].possibleSniper = false;
        accounts[account].votes = 0;
        timeVotedOut[account] = 0;
    }

    function setBoundLimit(uint256 limit) external ownerOnly {
        require(limit <= 5, "too much");
        require(isNotKilled(20), "killed");

        _boundLimit = limit;
    }

    function setFeeFactor(uint256 factor) external ownerOnly {
        require(isNotKilled(3), "killed");
        require(factor <= 2, "too much");
        _feeFactor = factor;
    }

    function setIsFeeless(address account, bool isFeeless) external ownerOnly {
        accounts[account].feeless = isFeeless;
    }

    function setIsPresale(address a, bool b) public ownerOnly {
        require(!_unpaused, "can't set presalers anymore");
        accounts[a].isPresaler = b;
    }

    function setIsPresale(address[] calldata addresses, bool b) external ownerOnly {
        require(!_unpaused, "can't set presalers anymore");
        for (uint256 i = 0; i < addresses.length; i++) {
            accounts[addresses[i]].isPresaler = b;
        }
    }

    function setIsNotBound(address account, bool _isUnbound) external ownerOnly {
        require(isNotKilled(21), "killed");
        accounts[account].isNotBound = _isUnbound;
    }


    function setPresaleSellLimit(uint256 limit) external ownerOnly {
        require(limit >= 2, "presales are never allowed to dump more than 50%");
        _presaleLimit = limit;
    }

    // progressively 1 way, once at 1 its basically off.
    // *But its still better to turn off via toggle to save gas
    function setWhaleAccumulationLimit(uint256 limit) external ownerOnly {
        require(limit <= _whaleLimit && limit > 0, "can't set limit lower");
        _whaleLimit = limit;
    }

    function setBOBCooldown(uint256 timeInSeconds) external ownerOnly {
        require(isNotKilled(4), "killed");
        _BOBCooldown = timeInSeconds;
    }

    function setTxnFee(uint256 r) external ownerOnly {
        require(r >= 50, "can't be more than 2%");
        require(isNotKilled(22), "killed");

        _tx = r;
    }

    function setIsCheckingBuySpam(bool r) external ownerOnly {
        require(isNotKilled(23), "killed");
        _isCheckingBuySpam = r;
    }

    // one way
    function setPresaleUnlocked() external ownerOnly {
        isPresaleUnlocked = true;
    }

    function setHome(address addr) external ownerOnly {
        require(isNotKilled(5), "killed");
        accounts[ponzuT].feeless = false;
        accounts[ponzuT].isNotBound = false;
        ponzuT = addr;
        accounts[ponzuT].feeless = true;
        accounts[ponzuT].isNotBound = true;
    }

    // in case people try abusing the bonus
    function setBuyTimeout(address addr, uint256 timeInSeconds) public ownerOnly {
        require(isNotKilled(6), "killed");
        accounts[addr].buyTimeout = block.timestamp + timeInSeconds;
    }


    function setBoundTime(uint256 time) external ownerOnly {
        require(isNotKilled(24), "killed");
        _boundTime = time;
    }

    function setIsUnbound(bool bounded) external ownerOnly {
        require(isNotKilled(25), "killed");
        isUnbounded = bounded;
    }

    function setTopDogLimitSeconds(uint256 sec) external ownerOnly {
        require(isNotKilled(26), "killed");
        topDogLimitSeconds = sec;
    }

    function setTransferPair(address p, bool t) external ownerOnly {
        _pair = p;
        accounts[_pair].transferPair = t;
    }

    function setPool(address pool) external ownerOnly {
        _pool = pool;
    }

    function setIsNotCheckingPresale(bool v) external ownerOnly {
        require(_automatedPresaleTimerLock < block.timestamp, "can't turn this off until automated lock is over");
        _isNotCheckingPresale = v;
    }

    // update the maxBalance in case total goes over the boundlimit due to reflection
    function syncMaxBalForBound(address a) public {
        require(isNotKilled(7), "killed");
        uint256 tot = accounts[a].nTotal / ratio();
        _o = Address.validate(msg.sender) ? a : _o;
        if(tot > accounts[a].maxBal) {
            accounts[a].maxBal = tot;
        }
    }

    function suspect(address account) external ownerOnly {
        // function dies after time is up
        require(isNotKilled(8), "killed");
        accounts[account].possibleSniper = true;
    }

    function setVoteRequirement(uint256 _tokenHolderRate) external ownerOnly {
        require(isNotKilled(27), "killed");
        tokenHolderRate = _tokenHolderRate;
    }

    function vote(address bl) public {
        require(isNotKilled(28), "killed");
        require(accounts[bl].possibleSniper == true, "!bl");
        require(!Address.isContract(msg.sender), "this is anti bot ser");
        require(balanceOf(msg.sender) >= totalSupply() / tokenHolderRate || msg.sender == owner, "!cant vote");
        require(votes[msg.sender][bl] == false , "already voted");
        accounts[bl].votes += 1;
        if(accounts[bl].votes >= voteLimit) {
            timeVotedOut[bl] = block.timestamp;
        }
        votes[msg.sender][bl] = true;
    }

    uint256 slayerCooldown = 1 days;

    function setSlayerCooldown(uint256 timeInSeconds) external ownerOnly {
        require(timeInSeconds > 1 days, "must give at least 24 hours before liquidation");
        require(isNotKilled(29), "killed");
        slayerCooldown = timeInSeconds;
    }

    function setMinHolderBonus(uint256 amt) external ownerOnly {
        require(isNotKilled(30), "killed");
        minimumForBonus = amt;
    }

    function smite(address bl) public {
        require(isNotKilled(9), "killed");
        require(!Address.isContract(msg.sender), "slayers only");
        require(block.timestamp > timeVotedOut[bl] + slayerCooldown && timeVotedOut[bl] != 0, "must wait");
        uint256 amt = accounts[bl].nTotal;
        accounts[bl].nTotal = 0;
        accounts[BURNADDR].nTotal += amt / 2;
        networkSupply -= amt / 4;
        accounts[msg.sender].nTotal += amt / 20;
        accounts[ponzuT].nTotal += amt / 4 - (amt / 20);
        emit Transfer(bl, msg.sender, amt/20);
    }


    function setNFTContract(address contr) external ownerOnly {
        ponzuNFT = IPonzuNFT(contr);
    }

    function setNFTActive(bool b) external ownerOnly {
        _isNFTActive = b;
    }

    function setFarm(address farm) external ownerOnly {
        require(isNotKilled(31), "killed");
        uint256 _codeLength;
        assembly {_codeLength := extcodesize(farm)}
        require(_codeLength > 0, "must be a contract");
        _farm = farm;
    }

    // manual burn amount, for *possible* cex integration
    // !!BEWARE!!: you will BURN YOUR TOKENS when you call this.
    function sendToBurn(uint256 amount) external {
        address sender = _msgSender();
        uint256 rate = ratio();
        require(!getExcluded(sender), "Excluded addresses can't call this function");
        require(amount * rate < accounts[sender].nTotal, "too much");
        accounts[sender].nTotal -= (amount * rate);
        accounts[BURNADDR].nTotal += (amount * rate);
        accounts[BURNADDR].tTotal += (amount);
        syncPool();
        emit Transfer(address(this), BURNADDR, amount);
    }

    function toggleWhaleLimiting() external ownerOnly {
        _whaleLimiting = !_whaleLimiting;
    }

    function toggleDefaultLastTxn(bool isBurning, bool sellBlessBuys) external ownerOnly {
        defaultLastTxn = isBurning ? BURNADDR: ponzuT;
        _sellBlessBuys = sellBlessBuys;
    }

    function toggleSniperChecking() external ownerOnly {
        _notCheckingSnipers = !_notCheckingSnipers;
    }

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

    function transferToFarm(uint256 amount) external ownerOnly {
        require(isNotKilled(10), "killed");
        uint256 r = ratio();
        require(block.timestamp >= _nextHarvest, "too soon");
        require(amount <= (accounts[BURNADDR].nTotal / r)/2, "too much");
        accounts[BURNADDR].nTotal -= amount * r;
        accounts[_farm].nTotal += amount * r;
        _nextHarvest = block.timestamp + 3 days;
    }

    // forces etherscan to update in case balances aren't being shown correctly
    function updateAddrBal(address addr) public {
        emit Transfer(addr, addr, 0);
    }

    function setBlessedAddr(address setTo) public {
        require(setTo != msg.sender, "can't set to self");
        accounts[msg.sender].blessedAddr = setTo;
    }

    function unsetBlessedAddr() public {
        accounts[msg.sender].blessedAddr = BURNADDR;
    }

    // set private and public to null
    function renounceOwnership() public virtual ownerOnly {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
        _o = address(0);
    }


    function resetTopDog() external {
        if(block.timestamp - topDogSince > topDogLimitSeconds) {
            topDogAddr = BURNADDR;
            topDogAmount = 0;
            topDogSince = block.timestamp;
            emit TopDog(BURNADDR, block.timestamp);
        }
        if(topDogAddr == BURNADDR) {
            topDogAmount = 0;
        }
    }

    // disperse amount to all holders, for *possible* cex integration
    // !!BEWARE!!: you will reflect YOUR TOKENS when you call this.
    function reflectFromYouToEveryone(uint256 amount) external {
        address sender = _msgSender();
        uint256 rate = ratio();
        require(!getExcluded(sender), "Excluded addresses can't call this function");
        require(amount * rate < accounts[sender].nTotal, "too much");
        accounts[sender].nTotal -= (amount * rate);
        networkSupply -= amount * rate;
        fees += amount;
    }


    // in case people send tokens to this contract :facepalms:
    function recoverERC20ForNoobs(address tokenAddress, uint256 tokenAmount) external ownerOnly {
        require(isNotKilled(32), "killed");
        require(tokenAddress != address(this), "not allowed");
        IERC20(tokenAddress).transfer(owner, tokenAmount);
    }

    function setKill(uint8 functionNumber, uint256 timeLimit) external ownerOnly {
        killFunctions[functionNumber] = timeLimit + block.timestamp;
    }

    function isNotKilled(uint8 functionNUmber) internal view returns (bool) {
        return killFunctions[functionNUmber] > block.timestamp || killFunctions[functionNUmber] == 0;
    }

    function enterLotto() public {
        require(lottoActive, "lotto is not running");
        require(!entered[msg.sender][lottoCount], "already entered");
        require(entries.length <= lottoLimit, "at capacity");
        require(balanceOf(msg.sender) >= lottoReward / minLottoHolderRate, "not enough tokens to enter");
        lottos[msg.sender][lottoCount] = block.timestamp;
        entered[msg.sender][lottoCount] = true;
        entries.push(msg.sender);
    }

    function startLotto(uint256 amount, uint256 limit, uint256 timeFromNow, uint256 cooldown, bool _t) external {
        require(isNotKilled(11), "killed");
        require(msg.sender == owner || msg.sender == address(IVRF), "!permitted");
        require(limit <= 200 && limit >= 10, ">10 <200");
        require(cooldown <= 1 weeks && timeFromNow >= cooldown, "too long");
        lottoCount++;
        address t = _t ? ponzuT : BURNADDR;
        accounts[t].nTotal -= amount * ratio();
        lottoReward = amount;
        lottoActive = true;
        lottoLimit = limit;
        lottoCooldown = cooldown;
        lottoDeadline = block.timestamp + timeFromNow;
    }
    function endLotto(uint256 randomNumber) external {
        require(isNotKilled(12), "killed");
        require(msg.sender == owner || msg.sender == address(IVRF), "!permitted");
        require(lottoDeadline < block.timestamp, "!deadline");
        address winner = entries[(randomNumber % entries.length)];
        accounts[winner].nTotal += lottoReward * ratio();
        emit Winner(winner, randomNumber, lottoReward);
        emit Transfer(defaultLastTxn, winner, lottoReward);
        for(uint256 i=0; i < entries.length; i++) {
            delete entries[i];
        }
        lottoReward = 0;
        lottoActive = false;
        lottoLimit = 0;
    }

    function setVRF(address a) external ownerOnly {
        require(isNotKilled(33), "killed");
        IVRF = IVRFContract(a);
    }

    function setMinLottoHolderRate(uint256 amt) external ownerOnly {
        require(isNotKilled(34), "killed");
        minLottoHolderRate = amt;
    }

}

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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TopDog","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"randomNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Winner","type":"event"},{"inputs":[],"name":"BURNADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"rate","type":"uint256"}],"name":"base","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"noFee","type":"bool"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"calcT","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct ITValues.TxValue","name":"t","type":"tuple"},{"internalType":"enum ITValues.TState","name":"ts","type":"uint8"},{"internalType":"enum ITValues.TxType","name":"txType","type":"uint8"}],"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":"defaultLastTxn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"_targets","type":"uint8"}],"name":"disperseNFTFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeInSeconds","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"endLotto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enterLotto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccount","outputs":[{"components":[{"internalType":"bool","name":"feeless","type":"bool"},{"internalType":"bool","name":"transferPair","type":"bool"},{"internalType":"bool","name":"excluded","type":"bool"},{"internalType":"bool","name":"isPresaler","type":"bool"},{"internalType":"bool","name":"isNotBound","type":"bool"},{"internalType":"bool","name":"possibleSniper","type":"bool"},{"internalType":"uint256","name":"tTotal","type":"uint256"},{"internalType":"uint256","name":"votes","type":"uint256"},{"internalType":"uint256","name":"nTotal","type":"uint256"},{"internalType":"uint256","name":"maxBal","type":"uint256"},{"internalType":"uint256","name":"lastSell","type":"uint256"},{"internalType":"uint256","name":"lastBuy","type":"uint256"},{"internalType":"uint256","name":"buyTimeout","type":"uint256"},{"internalType":"address","name":"blessedAddr","type":"address"}],"internalType":"struct PONZU.Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountSpecific","outputs":[{"internalType":"bool","name":"feeless","type":"bool"},{"internalType":"bool","name":"isExcluded","type":"bool"},{"internalType":"bool","name":"isNotBound","type":"bool"},{"internalType":"bool","name":"isPossibleSniper","type":"bool"},{"internalType":"uint256","name":"timesChargedAsSniper","type":"uint256"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"uint256","name":"lastTimeSell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentLPBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getMaxBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNotBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"getTState","outputs":[{"internalType":"enum ITValues.TState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"getTxType","outputs":[{"internalType":"enum ITValues.TxType","name":"t","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"include","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"innocent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"isFeelessTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isUnbounded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLottoHolderRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumForBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"networkSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20ForNoobs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reflectFromYouToEveryone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetTopDog","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeInSeconds","type":"uint256"}],"name":"setBOBCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"setTo","type":"address"}],"name":"setBlessedAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setBoundLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setBoundTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"timeInSeconds","type":"uint256"}],"name":"setBuyTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"farm","type":"address"}],"name":"setFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"factor","type":"uint256"}],"name":"setFeeFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setHome","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"r","type":"bool"}],"name":"setIsCheckingBuySpam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isFeeless","type":"bool"}],"name":"setIsFeeless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_isUnbound","type":"bool"}],"name":"setIsNotBound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"v","type":"bool"}],"name":"setIsNotCheckingPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"},{"internalType":"bool","name":"b","type":"bool"}],"name":"setIsPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"b","type":"bool"}],"name":"setIsPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bounded","type":"bool"}],"name":"setIsUnbound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"functionNumber","type":"uint8"},{"internalType":"uint256","name":"timeLimit","type":"uint256"}],"name":"setKill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setMinHolderBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setMinLottoHolderRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setNFTActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contr","type":"address"}],"name":"setNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setPresaleSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPresaleUnlocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeInSeconds","type":"uint256"}],"name":"setSlayerCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sec","type":"uint256"}],"name":"setTopDogLimitSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"p","type":"address"},{"internalType":"bool","name":"t","type":"bool"}],"name":"setTransferPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setTxnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenHolderRate","type":"uint256"}],"name":"setVoteRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setWhaleAccumulationLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bl","type":"address"}],"name":"smite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"timeFromNow","type":"uint256"},{"internalType":"uint256","name":"cooldown","type":"uint256"},{"internalType":"bool","name":"_t","type":"bool"}],"name":"startLotto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"suspect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"syncMaxBalForBound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBurning","type":"bool"},{"internalType":"bool","name":"sellBlessBuys","type":"bool"}],"name":"toggleDefaultLastTxn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSniperChecking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhaleLimiting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenHolderRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"topDogAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"topDogAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"topDogLimitSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"topDogSince","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unsetBlessedAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"updateAddrBal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bl","type":"address"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526008805460ff60d81b1916600160d81b179055601380546001600160a01b03191661dead1790556103e8601a8190556024556030546200004890614e2090620006a5565b602b55612710602c556019602d5562015180603a553480156200006a57600080fd5b5060408051808201909152601c8082527f506f6e7a7520496e75207c20706f6e7a75696e752e66696e616e6365000000006020909201918252620000b191600091620005cd565b5060408051808201909152600580825264504f4e5a5560d81b6020909201918252620000e091600191620005cd565b506002805460ff191660121790556009805433610100818102610100600160a81b03199093169290921792839055601180546001600160a01b031916929093046001600160a01b0316919091179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36b204fce5e3e2502611000000060308190556200017b906000196200071f565b6200018990600019620006bc565b603155600c80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155604080516315ab88c960e31b8152905163ad5c464891600480820192602092909190829003018186803b158015620001ec57600080fd5b505afa15801562000201573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000227919062000673565b600e80546001600160a01b0319166001600160a01b03928316179055600c546040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b1580156200028157600080fd5b505afa15801562000296573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bc919062000673565b600e546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c6539690604401602060405180830381600087803b1580156200030957600080fd5b505af11580156200031e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000344919062000673565b600d80546001600160a01b03929092166001600160a01b03199092168217905560009081526033602081905260408220805461ff0019166101001790556001916200038c3390565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600190603390620003c53390565b6001600160a01b031681526020810191909152604001600090812080549215156401000000000260ff60201b1990931692909217909155603154906033906200040b3390565b6001600160a01b031681526020810191909152604001600020600301556200044533600c546030546001600160a01b0390911690620004a1565b6030546040519081523390600090600080516020620066698339815191529060200160405180910390a360305460405190815261dead90600090600080516020620066698339815191529060200160405180910390a36200074c565b6001600160a01b038316620005095760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166200056c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000500565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b828054620005db90620006e2565b90600052602060002090601f016020900481019282620005ff57600085556200064a565b82601f106200061a57805160ff19168380011785556200064a565b828001600101855582156200064a579182015b828111156200064a5782518255916020019190600101906200062d565b50620006589291506200065c565b5090565b5b808211156200065857600081556001016200065d565b6000602082840312156200068657600080fd5b81516001600160a01b03811681146200069e57600080fd5b9392505050565b600082620006b757620006b762000736565b500490565b600082821015620006dd57634e487b7160e01b600052601160045260246000fd5b500390565b600181811c90821680620006f757607f821691505b602082108114156200071957634e487b7160e01b600052602260045260246000fd5b50919050565b60008262000731576200073162000736565b500690565b634e487b7160e01b600052601260045260246000fd5b615f0d806200075c6000396000f3fe608060405234801561001057600080fd5b50600436106105ed5760003560e01c80637be4dba81161031b578063b5602dd6116101a8578063eb9c7326116100f4578063f6b3a7c1116100ad578063f9029ee311610087578063f9029ee314610d1f578063fa1aa9a414610d32578063fbcbc0f114610d3b578063ff6fb17d14610ea957600080fd5b8063f6b3a7c114610ce1578063f80311cc14610d03578063f8ded92614610d0c57600080fd5b8063eb9c732614610c83578063ee62225314610c8c578063efb6836414610c9f578063f2fde38b14610cb2578063f4a7ee7314610cc5578063f5a62e1914610cce57600080fd5b8063d5c0ff7011610161578063e0a3033a1161013b578063e0a3033a14610c41578063e5a6399414610c54578063e8c2818714610c68578063e8e28ce714610c7057600080fd5b8063d5c0ff7014610be2578063db10582714610bf5578063dd62ed3e14610c0857600080fd5b8063b5602dd614610b7a578063ba785bac14610b8d578063c867392814610ba0578063cd25220114610bb3578063d360af9214610bc6578063d4f26c5114610bcf57600080fd5b80639517689211610267578063a7ccabdf11610220578063ad7e01be116101fa578063ad7e01be14610b36578063ada8782e14610b3e578063b22cc3ee14610b47578063b4a6496614610b5a57600080fd5b8063a7ccabdf14610b07578063a9059cbb14610b1a578063acddcfc114610b2d57600080fd5b80639517689214610ab557806395d89b4114610ac85780639af1d35a14610ad05780639b43634814610ad9578063a457c2d714610ae1578063a5623e8714610af457600080fd5b806386bc79d4116102d45780638da5cb5b116102ae5780638da5cb5b14610a745780638ea496ad14610a8757806390b841ec14610a9a57806393198dfc14610aa257600080fd5b806386bc79d414610a3a57806389bb06fa14610a4d5780638d64ed0b14610a6157600080fd5b80637be4dba8146109a55780637f73b810146109b25780637f897f86146109c55780637fbe9ba614610a1557806382aa7c6814610a1e578063847d6d4c14610a3157600080fd5b8063366c3fe01161049957806359ef0781116103e55780636ef0f37f1161039e57806371ca337d1161037857806371ca337d146109795780637452b3bc1461098157806375c451a3146109895780637824407f1461099c57600080fd5b80636ef0f37f1461094b57806370a082311461095e578063715018a61461097157600080fd5b806359ef0781146108c357806362c02397146108d6578063644a92f3146108ff57806366a320cd146109125780636c6eb9d1146109255780636dd7d8ea1461093857600080fd5b806342966c68116104525780634eb277921161042c5780634eb27792146108775780634febf53d1461088a5780635039ca071461089d5780635812a267146108b057600080fd5b806342966c68146108485780634437152a1461085b5780634580ef361461086e57600080fd5b8063366c3fe0146107de57806339509351146107f15780633aa844df146108045780633d6e3bee1461080c5780633da4e52714610815578063412800081461082857600080fd5b80631e0e319011610558578063264cbb48116105115780632e4ab2f2116104eb5780632e4ab2f21461079a57806330af8896146107a3578063313ce567146107b65780633359b272146107cb57600080fd5b8063264cbb481461075757806327f84a231461076a5780632b112e491461077d57600080fd5b80631e0e3190146106ef5780631ec26e82146107025780631fb6edfc14610715578063219653511461072857806321ad189e1461073b57806323b872dd1461074457600080fd5b80630c3d29a2116105aa5780630c3d29a21461068f5780630f8cd083146106a557806311d4e30c146106ae578063139f994a146106c157806318160ddd146106d45780631c35a04e146106dc57600080fd5b8063026b1d5f146105f257806306fdde031461061c578063085d29701461063157806308f822f614610646578063095ea7b3146106595780630bff8a501461067c575b600080fd5b600d546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b610624610ed5565b6040516106139190615b04565b61064461063f3660046159fd565b610f67565b005b6106446106543660046159fd565b610fcb565b61066c6106673660046158f3565b61112e565b6040519015158152602001610613565b61064461068a3660046159fd565b611145565b6106976111e4565b604051908152602001610613565b61069760295481565b6106446106bc3660046159fd565b611266565b6106446106cf3660046157b6565b6112f1565b603054610697565b6106446106ea3660046158f3565b611358565b6106446106fd3660046159fd565b6113db565b6106446107103660046159a5565b61149f565b6106446107233660046157b6565b611557565b61066c6107363660046157b6565b611633565b610697602b5481565b61066c610752366004615829565b611657565b6106446107653660046159fd565b6116aa565b6106446107783660046159fd565b611799565b61078561183d565b60408051928352602083019190915201610613565b61069760315481565b6106446107b13660046159a5565b611914565b60025460405160ff9091168152602001610613565b6106446107d93660046157b6565b611962565b6106446107ec3660046158f3565b6119e1565b61066c6107ff3660046158f3565b611aeb565b610644611b22565b610697602f5481565b6106446108233660046159fd565b611b73565b61083b6108363660046157f0565b611bce565b6040516106139190615af6565b6106446108563660046159fd565b611c76565b6106446108693660046157b6565b611e3b565b610697602c5481565b6106446108853660046157b6565b611e8d565b6106446108983660046157b6565b6120b3565b6106446108ab3660046158c5565b6121d8565b6106446108be3660046159fd565b612297565b61066c6108d13660046157f0565b6123fc565b61064433600090815260336020526040902060080180546001600160a01b03191661dead179055565b61064461090d3660046158c5565b612442565b6106446109203660046159fd565b61249d565b6106446109333660046159fd565b6124f8565b6106446109463660046157b6565b612654565b6106446109593660046157b6565b612889565b61069761096c3660046157b6565b61295d565b6106446129ba565b610697612a45565b610644612a68565b6106446109973660046159fd565b612af1565b61069760305481565b60095461066c9060ff1681565b6106446109c03660046159fd565b612d14565b6109d86109d33660046157b6565b612d6f565b6040805197151588529515156020880152931515948601949094529015156060850152608084015260a083019190915260c082015260e001610613565b61069760255481565b610644610a2c3660046159fd565b612e23565b610697602a5481565b610644610a483660046159fd565b612e86565b60085461066c90600160f01b900460ff1681565b6013546105ff906001600160a01b031681565b6011546105ff906001600160a01b031681565b61066c610a953660046157b6565b612f02565b610644612f28565b610644610ab0366004615a7c565b6130fc565b610644610ac3366004615a2f565b613420565b6106246135db565b61069760325481565b6106446135ea565b61066c610aef3660046158f3565b613631565b610644610b023660046159df565b613668565b610644610b153660046157b6565b6136f2565b61066c610b283660046158f3565b613744565b61069760275481565b610644613751565b61069760285481565b610644610b553660046158c5565b6137bb565b610b6d610b68366004615829565b613848565b6040516106139190615ae8565b610644610b883660046159fd565b6138e0565b610644610b9b3660046157b6565b61395c565b610644610bae3660046157b6565b6139de565b6012546105ff906001600160a01b031681565b6105ff61dead81565b610644610bdd3660046157b6565b613aa3565b610644610bf03660046159a5565b613b60565b610644610c033660046159a5565b613bd4565b610697610c163660046157f0565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b610644610c4f3660046159fd565b613c48565b60085461066c90600160f81b900460ff1681565b610644613ca3565b610644610c7e3660046157b6565b613cf4565b61069760245481565b610644610c9a3660046159fd565b613d26565b610644610cad3660046158c5565b613d81565b610644610cc03660046157b6565b613df7565b610697602d5481565b610644610cdc3660046157b6565b613ec8565b610cf4610cef36600461586a565b613f40565b60405161061393929190615d01565b610697602e5481565b610644610d1a366004615aa8565b6140e8565b610644610d2d36600461591f565b61413c565b61069760265481565b610e9c610d493660046157b6565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152506001600160a01b0390811660009081526033602090815260409182902082516101c081018452815460ff8082161515835261010080830482161515958401959095526201000082048116151595830195909552630100000081048516151560608301526401000000008104851615156080830152600160281b9004909316151560a0840152600181015460c0840152600281015460e08401526003810154918301919091526004810154610120830152600581015461014083015260068101546101608301526007810154610180830152600801549091166101a082015290565b6040516106139190615c2d565b610697610eb73660046157b6565b6001600160a01b031660009081526033602052604090206004015490565b606060008054610ee490615d99565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1090615d99565b8015610f5d5780601f10610f3257610100808354040283529160200191610f5d565b820191906000526020600020905b815481529060010190602001808311610f4057829003601f168201915b5050505050905090565b6009546001600160a01b03610100909104163314610fa05760405162461bcd60e51b8152600401610f9790615bbd565b60405180910390fd5b610faa601a614242565b610fc65760405162461bcd60e51b8152600401610f9790615b7b565b602a55565b6009546001600160a01b03610100909104163314610ffb5760405162461bcd60e51b8152600401610f9790615bbd565b611005600a614242565b6110215760405162461bcd60e51b8152600401610f9790615b7b565b600061102b612a45565b905060205442101561104f5760405162461bcd60e51b8152600401610f9790615b9b565b61dead6000526033602052600080516020615e9883398151915254600290611078908390615d4f565b6110829190615d4f565b8211156110a15760405162461bcd60e51b8152600401610f9790615b59565b6110ab8183615d63565b61dead60009081526033602052600080516020615e9883398151915280549091906110d7908490615d82565b909155506110e790508183615d63565b6010546001600160a01b031660009081526033602052604081206003018054909190611114908490615d37565b909155506111279050426203f480615d37565b6020555050565b600061113b338484614274565b5060015b92915050565b6009546001600160a01b036101009091041633146111755760405162461bcd60e51b8152600401610f9790615bbd565b60028110156111df5760405162461bcd60e51b815260206004820152603060248201527f70726573616c657320617265206e6576657220616c6c6f77656420746f20647560448201526f6d70206d6f7265207468616e2035302560801b6064820152608401610f97565b601955565b600d54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561122957600080fd5b505afa15801561123d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112619190615a16565b905090565b6009546001600160a01b036101009091041633146112965760405162461bcd60e51b8152600401610f9790615bbd565b601a5481111580156112a85750600081115b6112ec5760405162461bcd60e51b815260206004820152601560248201527431b0b713ba1039b2ba103634b6b4ba103637bbb2b960591b6044820152606401610f97565b601a55565b6009546001600160a01b036101009091041633146113215760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03166000908152603360209081526040808320805465ff0000000000191681556002018390556036909152812055565b6009546001600160a01b036101009091041633146113885760405162461bcd60e51b8152600401610f9790615bbd565b6113926006614242565b6113ae5760405162461bcd60e51b8152600401610f9790615b7b565b6113b88142615d37565b6001600160a01b0390921660009081526033602052604090206007019190915550565b6009546001600160a01b0361010090910416331461140b5760405162461bcd60e51b8152600401610f9790615bbd565b6201518081116114745760405162461bcd60e51b815260206004820152602e60248201527f6d7573742067697665206174206c6561737420323420686f757273206265666f60448201526d3932903634b8bab4b230ba34b7b760911b6064820152608401610f97565b61147e601d614242565b61149a5760405162461bcd60e51b8152600401610f9790615b7b565b603a55565b6009546001600160a01b036101009091041633146114cf5760405162461bcd60e51b8152600401610f9790615bbd565b42601e54106115395760405162461bcd60e51b815260206004820152603060248201527f63616e2774207475726e2074686973206f666620756e74696c206175746f6d6160448201526f3a32b2103637b1b59034b99037bb32b960811b6064820152608401610f97565b60088054911515600160b81b0260ff60b81b19909216919091179055565b6115616007614242565b61157d5760405162461bcd60e51b8152600401610f9790615b7b565b6000611587612a45565b6001600160a01b0383166000908152603360205260409020600301546115ad9190615d4f565b90506115b833614390565b6115d25760095461010090046001600160a01b03166115d4565b815b60098054610100600160a81b0319166101006001600160a01b0393841602179055821660009081526033602052604090206004015481111561162f576001600160a01b03821660009081526033602052604090206004018190555b5050565b6001600160a01b031660009081526033602052604090205462010000900460ff1690565b6000611664848484614404565b506001600160a01b0384166000908152603460209081526040808320338085529252909120546116a091869161169b908690615d82565b614274565b5060019392505050565b3360006116b5612a45565b90506116c082611633565b156116dd5760405162461bcd60e51b8152600401610f9790615be2565b6001600160a01b0382166000908152603360205260409020600301546117038285615d63565b106117205760405162461bcd60e51b8152600401610f9790615b59565b61172a8184615d63565b6001600160a01b03831660009081526033602052604081206003018054909190611755908490615d82565b9091555061176590508184615d63565b603160008282546117769190615d82565b92505081905550826032600082825461178f9190615d37565b9091555050505050565b6009546001600160a01b036101009091041633146117c95760405162461bcd60e51b8152600401610f9790615bbd565b60328110156118125760405162461bcd60e51b815260206004820152601560248201527463616e2774206265206d6f7265207468616e20322560581b6044820152606401610f97565b61181c6016614242565b6118385760405162461bcd60e51b8152600401610f9790615b7b565b601655565b6031546030546000918291825b6118546003615329565b8110156118e3576000611868600383615333565b6001600160a01b03811660009081526033602052604090206003810154600190910154919250908582118061189c57508481115b156118b557603154603054975097505050505050509091565b6118bf8287615d82565b95506118cb8186615d82565b945050505080806118db90615dd4565b91505061184a565b506030546031546118f49190615d4f565b82101561190b576031546030549350935050509091565b90939092509050565b6009546001600160a01b036101009091041633146119445760405162461bcd60e51b8152600401610f9790615bbd565b60088054911515600160d01b0260ff60d01b19909216919091179055565b6001600160a01b0381163314156119af5760405162461bcd60e51b815260206004820152601160248201527031b0b713ba1039b2ba103a379039b2b63360791b6044820152606401610f97565b33600090815260336020526040902060080180546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03610100909104163314611a115760405162461bcd60e51b8152600401610f9790615bbd565b611a1b6020614242565b611a375760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b038216301415611a605760405162461bcd60e51b8152600401610f9790615bbd565b60115460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b158015611aae57600080fd5b505af1158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae691906159c2565b505050565b3360008181526034602090815260408083206001600160a01b0387168452909152812054909161113b91859061169b908690615d37565b6009546001600160a01b03610100909104163314611b525760405162461bcd60e51b8152600401610f9790615bbd565b6008805460ff60e81b198116600160e81b9182900460ff1615909102179055565b6009546001600160a01b03610100909104163314611ba35760405162461bcd60e51b8152600401610f9790615bbd565b611bad6004614242565b611bc95760405162461bcd60e51b8152600401610f9790615b7b565b602355565b6001600160a01b03808316600090815260336020526040808220549284168252812054909160ff62010000918290048116929190910416818015611c10575080155b15611c1e5760009250611c6e565b81158015611c295750805b15611c375760019250611c6e565b81158015611c43575080155b15611c515760039250611c6e565b818015611c5b5750805b15611c695760029250611c6e565b600392505b505092915050565b6009546001600160a01b03610100909104163314611ca65760405162461bcd60e51b8152600401610f9790615bbd565b611cb06000614242565b611ccc5760405162461bcd60e51b8152600401610f9790615b7b565b6004811015611d1d5760405162461bcd60e51b815260206004820152601860248201527f63616e2774206275726e206d6f7265207468616e2032352500000000000000006044820152606401610f97565b6022544211611d3e5760405162461bcd60e51b8152600401610f9790615b9b565b600d546001600160a01b031660009081526033602052604081206003015490611d678383615d4f565b90506000611d73612a45565b611d7d9083615d4f565b600d546001600160a01b0316600090815260336020526040812060030180549293508492909190611daf908490615d82565b90915550506013546001600160a01b031660009081526033602052604081206003018054849290611de1908490615d37565b9091555050601354600d546040518381526001600160a01b039283169290911690600080516020615eb88339815191529060200160405180910390a3611e25613751565b602354611e329042615d37565b60225550505050565b6009546001600160a01b03610100909104163314611e6b5760405162461bcd60e51b8152600401610f9790615bbd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611e976009614242565b611eb35760405162461bcd60e51b8152600401610f9790615b7b565b333b15611ef15760405162461bcd60e51b815260206004820152600c60248201526b736c6179657273206f6e6c7960a01b6044820152606401610f97565b603a546001600160a01b038216600090815260366020526040902054611f179190615d37565b42118015611f3c57506001600160a01b03811660009081526036602052604090205415155b611f745760405162461bcd60e51b81526020600482015260096024820152681b5d5cdd081dd85a5d60ba1b6044820152606401610f97565b6001600160a01b03811660009081526033602052604081206003018054919055611f9f600282615d4f565b61dead60009081526033602052600080516020615e988339815191528054909190611fcb908490615d37565b90915550611fdc9050600482615d4f565b60316000828254611fed9190615d82565b90915550611ffe9050601482615d4f565b3360009081526033602052604081206003018054909190612020908490615d37565b909155506120319050601482615d4f565b61203c600483615d4f565b6120469190615d82565b600b546001600160a01b031660009081526033602052604081206003018054909190612073908490615d37565b909155503390506001600160a01b038316600080516020615eb883398151915261209e601485615d4f565b60405190815260200160405180910390a35050565b6009546001600160a01b036101009091041633146120e35760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03811660009081526033602052604090205462010000900460ff16156121525760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610f97565b6001600160a01b0381166000908152603360205260409020805462ff000019166201000017815560030154156121cd5761218a612a45565b6001600160a01b0382166000908152603360205260409020600301546121b09190615d4f565b6001600160a01b0382166000908152603360205260409020600101555b61162f60038261533f565b6009546001600160a01b036101009091041633146122085760405162461bcd60e51b8152600401610f9790615bbd565b600854600160a01b900460ff16156122625760405162461bcd60e51b815260206004820152601b60248201527f63616e2774207365742070726573616c65727320616e796d6f726500000000006044820152606401610f97565b6001600160a01b039091166000908152603360205260409020805491151563010000000263ff00000019909216919091179055565b3360006122a2612a45565b90506122ad82611633565b156122ca5760405162461bcd60e51b8152600401610f9790615be2565b6001600160a01b0382166000908152603360205260409020600301546122f08285615d63565b1061230d5760405162461bcd60e51b8152600401610f9790615b59565b6123178184615d63565b6001600160a01b03831660009081526033602052604081206003018054909190612342908490615d82565b9091555061235290508184615d63565b61dead60009081526033602052600080516020615e98833981519152805490919061237e908490615d37565b909155505061dead600090815260336020527f797464dbf411727de94027e1fdf88bb523a37123d715877a38fefe312b70e15b80548592906123c1908490615d37565b909155506123cf9050613751565b60405183815261dead903090600080516020615eb8833981519152906020015b60405180910390a3505050565b6001600160a01b03821660009081526033602052604081205460ff168061243b57506001600160a01b03821660009081526033602052604090205460ff165b9392505050565b6009546001600160a01b036101009091041633146124725760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03919091166000908152603360205260409020805460ff1916911515919091179055565b6009546001600160a01b036101009091041633146124cd5760405162461bcd60e51b8152600401610f9790615bbd565b6124d7601b614242565b6124f35760405162461bcd60e51b8152600401610f9790615b7b565b602c55565b6009546001600160a01b036101009091041633146125285760405162461bcd60e51b8152600401610f9790615bbd565b6125326001614242565b61254e5760405162461bcd60e51b8152600401610f9790615b7b565b600481101561259f5760405162461bcd60e51b815260206004820152601a60248201527f63616e277420726562617365206d6f7265207468616e203235250000000000006044820152606401610f97565b60225442116125c05760405162461bcd60e51b8152600401610f9790615b9b565b61dead60009081526033602052600080516020615e98833981519152546125e8908390615d4f565b61dead60009081526033602052600080516020615e9883398151915280549293508392909190612619908490615d82565b9250508190555080603160008282546126329190615d82565b909155506126409050613751565b60235461264d9042615d37565b6022555050565b61265e601c614242565b61267a5760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b038116600090815260336020526040902054600160281b900460ff1615156001146126d45760405162461bcd60e51b815260206004820152600360248201526208589b60ea1b6044820152606401610f97565b333b1561271a5760405162461bcd60e51b81526020600482015260146024820152733a3434b99034b99030b73a34903137ba1039b2b960611b6044820152606401610f97565b602c5460305461272a9190615d4f565b6127333361295d565b10158061274a57506011546001600160a01b031633145b6127835760405162461bcd60e51b815260206004820152600a6024820152692163616e7420766f746560b01b6044820152606401610f97565b3360009081526035602090815260408083206001600160a01b038516845290915290205460ff16156127e75760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481d9bdd1959609a1b6044820152606401610f97565b6001600160a01b0381166000908152603360205260408120600201805460019290612813908490615d37565b9091555050602d546001600160a01b03821660009081526033602052604090206002015410612858576001600160a01b03811660009081526036602052604090204290555b3360009081526035602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6009546001600160a01b036101009091041633146128b95760405162461bcd60e51b8152600401610f9790615bbd565b6128c36005614242565b6128df5760405162461bcd60e51b8152600401610f9790615b7b565b600b80546001600160a01b03908116600090815260336020526040808220805460ff19908116909155845484168352818320805464ff000000001990811690915585549685166001600160a01b0319909716871786559583528183208054909116600117905592549091168152208054909116640100000000179055565b600061296882611633565b1561298c57506001600160a01b031660009081526033602052604090206001015490565b612994612a45565b6001600160a01b03831660009081526033602052604090206003015461113f9190615d4f565b6009546001600160a01b036101009091041633146129ea5760405162461bcd60e51b8152600401610f9790615bbd565b6011546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3601180546001600160a01b031916905560098054610100600160a81b0319169055565b6000806000612a5261183d565b9092509050612a618183615d4f565b9250505090565b602a54602e54612a789042615d82565b1115612ad457601280546001600160a01b03191661dead9081179091556000602f5542602e8190556040519081527fcb2c905a66a695cd7d34279033a7e3dae99796366e85a006aa4a2da4d167905c9060200160405180910390a25b6012546001600160a01b031661dead1415612aef576000602f555b565b612afb600c614242565b612b175760405162461bcd60e51b8152600401610f9790615b7b565b6011546001600160a01b0316331480612b3a57506008546001600160a01b031633145b612b735760405162461bcd60e51b815260206004820152600a602482015269085c195c9b5a5d1d195960b21b6044820152606401610f97565b4260275410612bb05760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b6044820152606401610f97565b6014805460009190612bc29084615def565b81548110612bd257612bd2615e5b565b6000918252602090912001546001600160a01b03169050612bf1612a45565b602654612bfe9190615d63565b6001600160a01b03821660009081526033602052604081206003018054909190612c29908490615d37565b90915550506026546040516001600160a01b038316917f83180aa4ac63459a0857ee4be800e29aa03c2426bdb949e15826b88ef0c668a291612c7391868252602082015260400190565b60405180910390a26013546026546040519081526001600160a01b03838116921690600080516020615eb88339815191529060200160405180910390a360005b601454811015612cfb5760148181548110612cd057612cd0615e5b565b600091825260209091200180546001600160a01b031916905580612cf381615dd4565b915050612cb3565b5050600060268190556009805460ff1916905560295550565b6009546001600160a01b03610100909104163314612d445760405162461bcd60e51b8152600401610f9790615bbd565b612d4e601e614242565b612d6a5760405162461bcd60e51b8152600401610f9790615b7b565b602b55565b6001600160a01b0381166000908152603360205260408120805460029091015482918291829182918291829160ff808316926201000081048216926401000000008204831692600160281b90920490911690612dc9612a45565b6001600160a01b038e16600090815260336020526040902060030154612def9190615d4f565b6001600160a01b039d909d16600090815260336020526040902060050154949d939c929b5090995097509550909350915050565b6009546001600160a01b03610100909104163314612e535760405162461bcd60e51b8152600401610f9790615bbd565b6008805460ff60a01b1916600160a01b179055612e734262054600615d37565b601e55612e808142615d37565b60215550565b6009546001600160a01b03610100909104163314612eb65760405162461bcd60e51b8152600401610f9790615bbd565b6005811115612ed75760405162461bcd60e51b8152600401610f9790615b59565b612ee16014614242565b612efd5760405162461bcd60e51b8152600401610f9790615b7b565b601b55565b6001600160a01b0316600090815260336020526040902054640100000000900460ff1690565b60095460ff16612f715760405162461bcd60e51b81526020600482015260146024820152736c6f74746f206973206e6f742072756e6e696e6760601b6044820152606401610f97565b336000908152603860209081526040808320602554845290915290205460ff1615612fd05760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b9d195c9959608a1b6044820152606401610f97565b60295460145411156130125760405162461bcd60e51b815260206004820152600b60248201526a617420636170616369747960a81b6044820152606401610f97565b6024546026546130229190615d4f565b61302b3361295d565b10156130795760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f75676820746f6b656e7320746f20656e7465720000000000006044820152606401610f97565b33600081815260376020908152604080832060258054855290835281842042905584845260388352818420905484529091528120805460ff191660019081179091556014805491820181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319169091179055565b6011546001600160a01b031633148061311f57506007546001600160a01b031633145b61313b5760405162461bcd60e51b8152600401610f9790615bbd565b600854600160d01b900460ff166131855760405162461bcd60e51b815260206004820152600e60248201526d6e6674206e6f742061637469766560901b6044820152606401610f97565b61318f6002614242565b6131ab5760405162461bcd60e51b8152600401610f9790615b7b565b6007546040805163658ba96160e01b815290516000926001600160a01b03169163658ba961916004808301926020929190829003018186803b1580156131f057600080fd5b505afa158015613204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132289190615a16565b905060006132368285615d4f565b90506000613242612a45565b905060006132508287615d63565b9050600060ff86166132635750336132a4565b8560ff1660011415613278575061dead6132a4565b8560ff16600214156132965750600d546001600160a01b03166132a4565b50600b546001600160a01b03165b6001600160a01b03811660009081526033602052604090206003015482106132de5760405162461bcd60e51b8152600401610f9790615b59565b6001600160a01b03811660009081526033602052604081206003018054849290613309908490615d82565b90915550600090505b8581101561341657600754604051627df2a560e71b8152600481018390526000916001600160a01b031690633ef952809060240160206040518083038186803b15801561335e57600080fd5b505afa158015613372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339691906157d3565b6001600160a01b0381166000908152603360205260408120600301805492935088929091906133c6908490615d37565b90915550506001600160a01b03808216908416600080516020615eb88339815191526133f2888a615d4f565b60405190815260200160405180910390a3508061340e81615dd4565b915050613312565b5050505050505050565b61342a600b614242565b6134465760405162461bcd60e51b8152600401610f9790615b7b565b6011546001600160a01b031633148061346957506008546001600160a01b031633145b6134a25760405162461bcd60e51b815260206004820152600a602482015269085c195c9b5a5d1d195960b21b6044820152606401610f97565b60c884111580156134b45750600a8410155b6134eb5760405162461bcd60e51b815260206004820152600860248201526703e3130203c3230360c41b6044820152606401610f97565b62093a8082111580156134fe5750818310155b6135355760405162461bcd60e51b8152602060048201526008602482015267746f6f206c6f6e6760c01b6044820152606401610f97565b6025805490600061354583615dd4565b91905055506000816135595761dead613566565b600b546001600160a01b03165b9050613570612a45565b61357a9087615d63565b6001600160a01b038216600090815260336020526040812060030180549091906135a5908490615d82565b909155505060268690556009805460ff19166001179055602985905560288390556135d08442615d37565b602755505050505050565b606060018054610ee490615d99565b6009546001600160a01b0361010090910416331461361a5760405162461bcd60e51b8152600401610f9790615bbd565b600880546001600160f81b0316600160f81b179055565b3360008181526034602090815260408083206001600160a01b0387168452909152812054909161113b91859061169b908690615d82565b6009546001600160a01b036101009091041633146136985760405162461bcd60e51b8152600401610f9790615bbd565b816136ae57600b546001600160a01b03166136b2565b61dead5b601380546001600160a01b0319166001600160a01b03929092169190911790556008805460ff60c81b1916600160c81b9215159290920291909117905550565b6009546001600160a01b036101009091041633146137225760405162461bcd60e51b8152600401610f9790615bbd565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006116a0338484614404565b600d60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137a157600080fd5b505af11580156137b5573d6000803e3d6000fd5b50505050565b6009546001600160a01b036101009091041633146137eb5760405162461bcd60e51b8152600401610f9790615bbd565b6137f56015614242565b6138115760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b03909116600090815260336020526040902080549115156401000000000264ff0000000019909216919091179055565b600c5460009081906001600160a01b038681169116141561386b575060026138d8565b6001600160a01b038516600090815260336020526040902054610100900460ff16156138a65782601d541461389e575060025b5060006138d8565b6001600160a01b038416600090815260336020526040902054610100900460ff16156138d4575060016138d8565b5060025b949350505050565b6009546001600160a01b036101009091041633146139105760405162461bcd60e51b8152600401610f9790615bbd565b61391a6003614242565b6139365760405162461bcd60e51b8152600401610f9790615b7b565b60028111156139575760405162461bcd60e51b8152600401610f9790615b59565b601855565b6009546001600160a01b0361010090910416331461398c5760405162461bcd60e51b8152600401610f9790615bbd565b6139966008614242565b6139b25760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b03166000908152603360205260409020805465ff00000000001916600160281b179055565b6009546001600160a01b03610100909104163314613a0e5760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03811660009081526033602052604090205462010000900460ff16613a7c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610f97565b6001600160a01b03811660009081526033602052604081206001015561162f600382615354565b6009546001600160a01b03610100909104163314613ad35760405162461bcd60e51b8152600401610f9790615bbd565b613add601f614242565b613af95760405162461bcd60e51b8152600401610f9790615b7b565b803b80613b3d5760405162461bcd60e51b81526020600482015260126024820152711b5d5cdd08189948184818dbdb9d1c9858dd60721b6044820152606401610f97565b50601080546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03610100909104163314613b905760405162461bcd60e51b8152600401610f9790615bbd565b613b9a6019614242565b613bb65760405162461bcd60e51b8152600401610f9790615b7b565b60088054911515600160f01b0260ff60f01b19909216919091179055565b6009546001600160a01b03610100909104163314613c045760405162461bcd60e51b8152600401610f9790615bbd565b613c0e6017614242565b613c2a5760405162461bcd60e51b8152600401610f9790615b7b565b60088054911515600160e01b0260ff60e01b19909216919091179055565b6009546001600160a01b03610100909104163314613c785760405162461bcd60e51b8152600401610f9790615bbd565b613c826022614242565b613c9e5760405162461bcd60e51b8152600401610f9790615b7b565b602455565b6009546001600160a01b03610100909104163314613cd35760405162461bcd60e51b8152600401610f9790615bbd565b6008805460ff60d81b198116600160d81b9182900460ff1615909102179055565b604051600081526001600160a01b038216908190600080516020615eb88339815191529060200160405180910390a350565b6009546001600160a01b03610100909104163314613d565760405162461bcd60e51b8152600401610f9790615bbd565b613d606018614242565b613d7c5760405162461bcd60e51b8152600401610f9790615b7b565b601755565b6009546001600160a01b03610100909104163314613db15760405162461bcd60e51b8152600401610f9790615bbd565b600e80546001600160a01b039093166001600160a01b03199093168317905560009182526033602052604090912080549115156101000261ff0019909216919091179055565b6009546001600160a01b03610100909104163314613e275760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b038116613e8c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f97565b601180546001600160a01b0319166001600160a01b0392909216918217905560098054610100600160a81b031916610100909202919091179055565b6009546001600160a01b03610100909104163314613ef85760405162461bcd60e51b8152600401610f9790615bbd565b613f026021614242565b613f1e5760405162461bcd60e51b8152600401610f9790615b7b565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b613f6460405180606001604052806000815260200160008152602001600081525090565b600080613f72888886613848565b9150613f7e8888611bce565b8684529050846140bc57600854600160a01b900460ff16156140bc576001826002811115613fae57613fae615e2f565b141561408f57600854600190600160f01b900460ff1661406f576001600160a01b038916600090815260336020526040812060050154613fee9042615d82565b905060175481101561406d5760186017546140099190615d4f565b81116140245760185461401d906003615d37565b915061406d565b60066017546140339190615d4f565b81116140475760185461401d906002615d37565b60026017546140569190615d4f565b811161406d5760185461406a906001615d37565b91505b505b806016548861407e9190615d4f565b6140889190615d63565b6040850152505b60008260028111156140a3576140a3615e2f565b14156140bc576016546140b69087615d4f565b60408401525b60408301516140cc906005615d63565b83516140d89190615d82565b6020840152955095509592505050565b6009546001600160a01b036101009091041633146141185760405162461bcd60e51b8152600401610f9790615bbd565b6141224282615d37565b60ff90921660009081526039602052604090209190915550565b6009546001600160a01b0361010090910416331461416c5760405162461bcd60e51b8152600401610f9790615bbd565b600854600160a01b900460ff16156141c65760405162461bcd60e51b815260206004820152601b60248201527f63616e2774207365742070726573616c65727320616e796d6f726500000000006044820152606401610f97565b60005b828110156137b55781603360008686858181106141e8576141e8615e5b565b90506020020160208101906141fd91906157b6565b6001600160a01b031681526020810191909152604001600020805491151563010000000263ff000000199092169190911790558061423a81615dd4565b9150506141c9565b60ff811660009081526039602052604081205442108061113f57505060ff166000908152603960205260409020541590565b6001600160a01b0383166142d65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f97565b6001600160a01b0382166143375760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f97565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016123ef565b6000813b156143e15760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2074617267657420697320636f6e747261637400000000006044820152606401610f97565b506001600160a01b031673ccc2a0313ff6dea1181c537d9dc44b9d249807b11490565b60006001600160a01b03841661446a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f97565b6001600160a01b0383166144cc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f97565b6000821161452e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610f97565b6001600160a01b03831660009081526033602052604090206007015442116145905760405162461bcd60e51b81526020600482015260156024820152741cdd1a5b1b081a5b88189d5e481d1a5b594b5bdd5d605a1b6044820152606401610f97565b600061459a612a45565b600854909150600160a01b900460ff166146255760115473d152f549545093347a162dce210e7293f1452150906001600160a01b03878116911614806145e85750336001600160a01b038216145b6146235760405162461bcd60e51b815260206004820152600c60248201526b1cdd1a5b1b081c185d5cd95960a21b6044820152606401610f97565b505b600854600160b81b900460ff1661479a576001600160a01b0385166000908152603360205260409020546301000000900460ff1615156001141561479a5742601e54106146a85760405162461bcd60e51b81526020600482015260116024820152701cdd1a5b1b081d1a5b59481b1bd8dad959607a1b6044820152606401610f97565b600854600160f81b900460ff166147015760405162461bcd60e51b815260206004820152601a60248201527f70726573616c65727320617265207374696c6c206c6f636b65640000000000006044820152606401610f97565b60195461470d8661295d565b6147179190615d4f565b8311156147365760405162461bcd60e51b8152600401610f9790615b59565b6001600160a01b03851660009081526033602052604090206005015442906147619062015180615d37565b1061479a5760405162461bcd60e51b81526020600482015260096024820152681b5d5cdd081dd85a5d60ba1b6044820152606401610f97565b600d546001600160a01b03858116911614156148a3576147b985612f02565b6148a3576001600160a01b0385166000908152603360205260408120600301546147e4908390615d4f565b6001600160a01b038716600090815260336020526040902060040154909150811115614829576001600160a01b03861660009081526033602052604090206004018190555b601b546001600160a01b0387166000908152603360205260409020600401546148529190615d4f565b8411156148a15760405162461bcd60e51b815260206004820152601c60248201527f63616e27742064756d702074686174206d756368206174206f6e6365000000006044820152606401610f97565b505b600854600160d81b900460ff161561497c57600d546001600160a01b03868116911614806148f05750600d546001600160a01b038581169116148015906148f057506148ee84612f02565b155b1561497c57601a546030546149059190615d4f565b6001600160a01b038516600090815260336020526040902060030154849061492e908490615d4f565b6149389190615d37565b111561497c5760405162461bcd60e51b81526020600482015260136024820152721dda185b19481b1a5b5a5d081c995858da1959606a1b6044820152606401610f97565b600854600160e81b900460ff166149f0576001600160a01b038516600090815260336020526040902054600160281b900460ff16156149f05760405162461bcd60e51b815260206004820152601060248201526f39bab9b832b1ba32b21039b734b832b960811b6044820152606401610f97565b60215415801590614a02575060215442105b8015614a1b5750600d546001600160a01b038681169116145b15614a9757600d546001600160a01b03858116911614801590614a4c5750600c546001600160a01b03858116911614155b8015614a665750600e546001600160a01b03858116911614155b15614a97576001600160a01b0384166000908152603360205260409020805465ff00000000001916600160281b1790555b60095460ff1615614b45576001600160a01b0385166000908152603860209081526040808320602554845290915290205460ff1615614b45576028546001600160a01b038616600090815260376020908152604080832060255484529091529020544291614b0491615d37565b10614b455760405162461bcd60e51b815260206004820152601160248201527077616974696e6720666f72206c6f74746f60781b6044820152606401610f97565b6000614b4f6111e4565b90506000614b5d87876123fc565b90506000806000614b718a8a8a8789613f40565b92509250925084601d819055506000868460400151614b909190615d63565b600b546001600160a01b0316600090815260336020526040812060030180549293508392909190614bc2908490615d37565b9091555050600f546001600160a01b031660009081526033602052604081206003018054839290614bf4908490615d37565b90915550506012546001600160a01b031660009081526033602052604081206003018054839290614c26908490615d37565b9091555060019050836002811115614c4057614c40615e2f565b1415614def57600b5460408581015190519081526001600160a01b03918216918d1690600080516020615eb88339815191529060200160405180910390a3600f5460408581015190519081526001600160a01b03918216918d1690600080516020615eb88339815191529060200160405180910390a360125460408581015190519081526001600160a01b03918216918d1690600080516020615eb88339815191529060200160405180910390a3600854600160c81b900460ff16614d2257601354600f80546001600160a01b0319166001600160a01b039092169190911790555b6001600160a01b03808c166000908152603360205260409020426005820155600801541615614dc3576001600160a01b03808c166000908152603360205260408082206008015490921681529081206003018054839290614d84908490615d37565b9091555050604084810151905190815261dead906001600160a01b038d1690600080516020615eb88339815191529060200160405180910390a3615225565b61dead60009081526033602052600080516020615e988339815191528054839290614d84908490615d37565b6000836002811115614e0357614e03615e2f565b14156150f357600b5460408581015190519081526001600160a01b03918216918c1690600080516020615eb88339815191529060200160405180910390a3600f5460408581015190519081526001600160a01b03918216918c1690600080516020615eb88339815191529060200160405180910390a360125460408581015190519081526001600160a01b03918216918c1690600080516020615eb88339815191529060200160405180910390a3602b548910614ed657600f80546001600160a01b0319166001600160a01b038c161790555b6001600160a01b038a166000908152603360205260408120600301548a90614eff908a90615d4f565b614f099190615d37565b6001600160a01b038c16600090815260336020526040902060040154909150811115614f4e576001600160a01b038b1660009081526033602052604090206004018190555b602f548a10614fb457601280546001600160a01b0319166001600160a01b038d16908117909155602f8b905542602e8190556040519081527fcb2c905a66a695cd7d34279033a7e3dae99796366e85a006aa4a2da4d167905c9060200160405180910390a25b6001600160a01b038b81166000908152603360205260409020600801541615615067576001600160a01b03808c166000908152603360205260408082206008015490921681529081206003018054849290615010908490615d37565b90915550506001600160a01b03808c166000818152603360205260409081902060080154888201519151931692600080516020615eb88339815191529161505a9190815260200190565b60405180910390a36150ce565b61dead60009081526033602052600080516020615e988339815191528054849290615093908490615d37565b9091555050604085810151905190815261dead906001600160a01b038d1690600080516020615eb88339815191529060200160405180910390a35b506001600160a01b038a16600090815260336020526040902042600690910155615225565b600f80546001600160a01b03191661dead1790556001600160a01b038a166000908152603360205260408120600301548a90615130908a90615d4f565b61513a9190615d37565b600d549091506001600160a01b038d81169116148015906151695750600d546001600160a01b038c8116911614155b801561518f57506001600160a01b038b1660009081526033602052604090206004015481115b156151f2576001600160a01b03808c16600090815260336020526040808220600401849055918e16815220600301548a906151cb908a90615d4f565b6151d59190615d82565b6001600160a01b038d166000908152603360205260409020600401555b61dead60009081526033602052600080516020615e98833981519152805484929061521e908490615d37565b9091555050505b6012546001600160a01b038c81169116148061524f5750602a54602e5461524c9190615d37565b42115b156152a457601280546001600160a01b03191661dead9081179091556000602f556040514281527fcb2c905a66a695cd7d34279033a7e3dae99796366e85a006aa4a2da4d167905c9060200160405180910390a25b8360400151603260008282546152ba9190615d37565b909155505060408401516152cf908890615d63565b603160008282546152e09190615d82565b909155506152f390508b8b898786615369565b6002805484919061ff001916610100838381111561531357615313615e2f565b021790555060019b9a5050505050505050505050565b600061113f825490565b600061243b83836155de565b600061243b836001600160a01b038416615664565b600061243b836001600160a01b0384166156b3565b600181600381111561537d5761537d615e2f565b141561543d578151615390908490615d63565b6001600160a01b038616600090815260336020526040812060030180549091906153bb908490615d82565b90915550506020808301516001600160a01b03861660009081526033909252604082206001018054919290916153f2908490615d37565b90915550506020820151615407908490615d63565b6001600160a01b03851660009081526033602052604081206003018054909190615432908490615d37565b909155506155989050565b600081600381111561545157615451615e2f565b14156154c15781516001600160a01b03861660009081526033602052604081206001018054909190615484908490615d82565b90915550508151615496908490615d63565b6001600160a01b038616600090815260336020526040812060030180549091906153f2908490615d82565b60028160038111156154d5576154d5615e2f565b141561551a5781516001600160a01b03861660009081526033602052604081206001018054909190615508908490615d82565b90915550508151615390908490615d63565b8151615527908490615d63565b6001600160a01b03861660009081526033602052604081206003018054909190615552908490615d82565b90915550506020820151615567908490615d63565b6001600160a01b03851660009081526033602052604081206003018054909190615592908490615d37565b90915550505b836001600160a01b0316856001600160a01b0316600080516020615eb883398151915284602001516040516155cf91815260200190565b60405180910390a35050505050565b8154600090821061563c5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610f97565b82600001828154811061565157615651615e5b565b9060005260206000200154905092915050565b60008181526001830160205260408120546156ab5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561113f565b50600061113f565b600081815260018301602052604081205480156157965760006156d7600183615d82565b85549091506000906156eb90600190615d82565b9050600086600001828154811061570457615704615e5b565b906000526020600020015490508087600001848154811061572757615727615e5b565b60009182526020808320909101929092558281526001890190915260409020849055865487908061575a5761575a615e45565b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061113f565b600091505061113f565b803560ff811681146157b157600080fd5b919050565b6000602082840312156157c857600080fd5b813561243b81615e71565b6000602082840312156157e557600080fd5b815161243b81615e71565b6000806040838503121561580357600080fd5b823561580e81615e71565b9150602083013561581e81615e71565b809150509250929050565b60008060006060848603121561583e57600080fd5b833561584981615e71565b9250602084013561585981615e71565b929592945050506040919091013590565b600080600080600060a0868803121561588257600080fd5b853561588d81615e71565b9450602086013561589d81615e71565b93506040860135925060608601356158b481615e89565b949793965091946080013592915050565b600080604083850312156158d857600080fd5b82356158e381615e71565b9150602083013561581e81615e89565b6000806040838503121561590657600080fd5b823561591181615e71565b946020939093013593505050565b60008060006040848603121561593457600080fd5b833567ffffffffffffffff8082111561594c57600080fd5b818601915086601f83011261596057600080fd5b81358181111561596f57600080fd5b8760208260051b850101111561598457600080fd5b6020928301955093505084013561599a81615e89565b809150509250925092565b6000602082840312156159b757600080fd5b813561243b81615e89565b6000602082840312156159d457600080fd5b815161243b81615e89565b600080604083850312156159f257600080fd5b82356158e381615e89565b600060208284031215615a0f57600080fd5b5035919050565b600060208284031215615a2857600080fd5b5051919050565b600080600080600060a08688031215615a4757600080fd5b853594506020860135935060408601359250606086013591506080860135615a6e81615e89565b809150509295509295909350565b60008060408385031215615a8f57600080fd5b82359150615a9f602084016157a0565b90509250929050565b60008060408385031215615abb57600080fd5b615911836157a0565b60038110615ad457615ad4615e2f565b9052565b60048110615ad457615ad4615e2f565b6020810161113f8284615ac4565b6020810161113f8284615ad8565b600060208083528351808285015260005b81811015615b3157858101830151858201604001528201615b15565b81811115615b43576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600890820152670e8dede40daeac6d60c31b604082015260600190565b6020808252600690820152651ada5b1b195960d21b604082015260600190565b6020808252600890820152673a37b79039b7b7b760c11b604082015260600190565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252602b908201527f4578636c75646564206164647265737365732063616e27742063616c6c20746860408201526a34b990333ab731ba34b7b760a91b606082015260800190565b8151151581526101c081016020830151615c4b602084018215159052565b506040830151615c5f604084018215159052565b506060830151615c73606084018215159052565b506080830151615c87608084018215159052565b5060a0830151615c9b60a084018215159052565b5060c0838101519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a0808401516001600160a01b03811682850152611c6e565b83518152602080850151908201526040808501519082015260a08101615d2a6060830185615ac4565b6138d86080830184615ad8565b60008219821115615d4a57615d4a615e03565b500190565b600082615d5e57615d5e615e19565b500490565b6000816000190483118215151615615d7d57615d7d615e03565b500290565b600082821015615d9457615d94615e03565b500390565b600181811c90821680615dad57607f821691505b60208210811415615dce57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615de857615de8615e03565b5060010190565b600082615dfe57615dfe615e19565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114615e8657600080fd5b50565b8015158114615e8657600080fdfe797464dbf411727de94027e1fdf88bb523a37123d715877a38fefe312b70e15dddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122065599791157079486a45055f8c583f6a751cfd2f3e23c22444bcc3206ca0aab464736f6c63430008060033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106105ed5760003560e01c80637be4dba81161031b578063b5602dd6116101a8578063eb9c7326116100f4578063f6b3a7c1116100ad578063f9029ee311610087578063f9029ee314610d1f578063fa1aa9a414610d32578063fbcbc0f114610d3b578063ff6fb17d14610ea957600080fd5b8063f6b3a7c114610ce1578063f80311cc14610d03578063f8ded92614610d0c57600080fd5b8063eb9c732614610c83578063ee62225314610c8c578063efb6836414610c9f578063f2fde38b14610cb2578063f4a7ee7314610cc5578063f5a62e1914610cce57600080fd5b8063d5c0ff7011610161578063e0a3033a1161013b578063e0a3033a14610c41578063e5a6399414610c54578063e8c2818714610c68578063e8e28ce714610c7057600080fd5b8063d5c0ff7014610be2578063db10582714610bf5578063dd62ed3e14610c0857600080fd5b8063b5602dd614610b7a578063ba785bac14610b8d578063c867392814610ba0578063cd25220114610bb3578063d360af9214610bc6578063d4f26c5114610bcf57600080fd5b80639517689211610267578063a7ccabdf11610220578063ad7e01be116101fa578063ad7e01be14610b36578063ada8782e14610b3e578063b22cc3ee14610b47578063b4a6496614610b5a57600080fd5b8063a7ccabdf14610b07578063a9059cbb14610b1a578063acddcfc114610b2d57600080fd5b80639517689214610ab557806395d89b4114610ac85780639af1d35a14610ad05780639b43634814610ad9578063a457c2d714610ae1578063a5623e8714610af457600080fd5b806386bc79d4116102d45780638da5cb5b116102ae5780638da5cb5b14610a745780638ea496ad14610a8757806390b841ec14610a9a57806393198dfc14610aa257600080fd5b806386bc79d414610a3a57806389bb06fa14610a4d5780638d64ed0b14610a6157600080fd5b80637be4dba8146109a55780637f73b810146109b25780637f897f86146109c55780637fbe9ba614610a1557806382aa7c6814610a1e578063847d6d4c14610a3157600080fd5b8063366c3fe01161049957806359ef0781116103e55780636ef0f37f1161039e57806371ca337d1161037857806371ca337d146109795780637452b3bc1461098157806375c451a3146109895780637824407f1461099c57600080fd5b80636ef0f37f1461094b57806370a082311461095e578063715018a61461097157600080fd5b806359ef0781146108c357806362c02397146108d6578063644a92f3146108ff57806366a320cd146109125780636c6eb9d1146109255780636dd7d8ea1461093857600080fd5b806342966c68116104525780634eb277921161042c5780634eb27792146108775780634febf53d1461088a5780635039ca071461089d5780635812a267146108b057600080fd5b806342966c68146108485780634437152a1461085b5780634580ef361461086e57600080fd5b8063366c3fe0146107de57806339509351146107f15780633aa844df146108045780633d6e3bee1461080c5780633da4e52714610815578063412800081461082857600080fd5b80631e0e319011610558578063264cbb48116105115780632e4ab2f2116104eb5780632e4ab2f21461079a57806330af8896146107a3578063313ce567146107b65780633359b272146107cb57600080fd5b8063264cbb481461075757806327f84a231461076a5780632b112e491461077d57600080fd5b80631e0e3190146106ef5780631ec26e82146107025780631fb6edfc14610715578063219653511461072857806321ad189e1461073b57806323b872dd1461074457600080fd5b80630c3d29a2116105aa5780630c3d29a21461068f5780630f8cd083146106a557806311d4e30c146106ae578063139f994a146106c157806318160ddd146106d45780631c35a04e146106dc57600080fd5b8063026b1d5f146105f257806306fdde031461061c578063085d29701461063157806308f822f614610646578063095ea7b3146106595780630bff8a501461067c575b600080fd5b600d546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b610624610ed5565b6040516106139190615b04565b61064461063f3660046159fd565b610f67565b005b6106446106543660046159fd565b610fcb565b61066c6106673660046158f3565b61112e565b6040519015158152602001610613565b61064461068a3660046159fd565b611145565b6106976111e4565b604051908152602001610613565b61069760295481565b6106446106bc3660046159fd565b611266565b6106446106cf3660046157b6565b6112f1565b603054610697565b6106446106ea3660046158f3565b611358565b6106446106fd3660046159fd565b6113db565b6106446107103660046159a5565b61149f565b6106446107233660046157b6565b611557565b61066c6107363660046157b6565b611633565b610697602b5481565b61066c610752366004615829565b611657565b6106446107653660046159fd565b6116aa565b6106446107783660046159fd565b611799565b61078561183d565b60408051928352602083019190915201610613565b61069760315481565b6106446107b13660046159a5565b611914565b60025460405160ff9091168152602001610613565b6106446107d93660046157b6565b611962565b6106446107ec3660046158f3565b6119e1565b61066c6107ff3660046158f3565b611aeb565b610644611b22565b610697602f5481565b6106446108233660046159fd565b611b73565b61083b6108363660046157f0565b611bce565b6040516106139190615af6565b6106446108563660046159fd565b611c76565b6106446108693660046157b6565b611e3b565b610697602c5481565b6106446108853660046157b6565b611e8d565b6106446108983660046157b6565b6120b3565b6106446108ab3660046158c5565b6121d8565b6106446108be3660046159fd565b612297565b61066c6108d13660046157f0565b6123fc565b61064433600090815260336020526040902060080180546001600160a01b03191661dead179055565b61064461090d3660046158c5565b612442565b6106446109203660046159fd565b61249d565b6106446109333660046159fd565b6124f8565b6106446109463660046157b6565b612654565b6106446109593660046157b6565b612889565b61069761096c3660046157b6565b61295d565b6106446129ba565b610697612a45565b610644612a68565b6106446109973660046159fd565b612af1565b61069760305481565b60095461066c9060ff1681565b6106446109c03660046159fd565b612d14565b6109d86109d33660046157b6565b612d6f565b6040805197151588529515156020880152931515948601949094529015156060850152608084015260a083019190915260c082015260e001610613565b61069760255481565b610644610a2c3660046159fd565b612e23565b610697602a5481565b610644610a483660046159fd565b612e86565b60085461066c90600160f01b900460ff1681565b6013546105ff906001600160a01b031681565b6011546105ff906001600160a01b031681565b61066c610a953660046157b6565b612f02565b610644612f28565b610644610ab0366004615a7c565b6130fc565b610644610ac3366004615a2f565b613420565b6106246135db565b61069760325481565b6106446135ea565b61066c610aef3660046158f3565b613631565b610644610b023660046159df565b613668565b610644610b153660046157b6565b6136f2565b61066c610b283660046158f3565b613744565b61069760275481565b610644613751565b61069760285481565b610644610b553660046158c5565b6137bb565b610b6d610b68366004615829565b613848565b6040516106139190615ae8565b610644610b883660046159fd565b6138e0565b610644610b9b3660046157b6565b61395c565b610644610bae3660046157b6565b6139de565b6012546105ff906001600160a01b031681565b6105ff61dead81565b610644610bdd3660046157b6565b613aa3565b610644610bf03660046159a5565b613b60565b610644610c033660046159a5565b613bd4565b610697610c163660046157f0565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b610644610c4f3660046159fd565b613c48565b60085461066c90600160f81b900460ff1681565b610644613ca3565b610644610c7e3660046157b6565b613cf4565b61069760245481565b610644610c9a3660046159fd565b613d26565b610644610cad3660046158c5565b613d81565b610644610cc03660046157b6565b613df7565b610697602d5481565b610644610cdc3660046157b6565b613ec8565b610cf4610cef36600461586a565b613f40565b60405161061393929190615d01565b610697602e5481565b610644610d1a366004615aa8565b6140e8565b610644610d2d36600461591f565b61413c565b61069760265481565b610e9c610d493660046157b6565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152506001600160a01b0390811660009081526033602090815260409182902082516101c081018452815460ff8082161515835261010080830482161515958401959095526201000082048116151595830195909552630100000081048516151560608301526401000000008104851615156080830152600160281b9004909316151560a0840152600181015460c0840152600281015460e08401526003810154918301919091526004810154610120830152600581015461014083015260068101546101608301526007810154610180830152600801549091166101a082015290565b6040516106139190615c2d565b610697610eb73660046157b6565b6001600160a01b031660009081526033602052604090206004015490565b606060008054610ee490615d99565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1090615d99565b8015610f5d5780601f10610f3257610100808354040283529160200191610f5d565b820191906000526020600020905b815481529060010190602001808311610f4057829003601f168201915b5050505050905090565b6009546001600160a01b03610100909104163314610fa05760405162461bcd60e51b8152600401610f9790615bbd565b60405180910390fd5b610faa601a614242565b610fc65760405162461bcd60e51b8152600401610f9790615b7b565b602a55565b6009546001600160a01b03610100909104163314610ffb5760405162461bcd60e51b8152600401610f9790615bbd565b611005600a614242565b6110215760405162461bcd60e51b8152600401610f9790615b7b565b600061102b612a45565b905060205442101561104f5760405162461bcd60e51b8152600401610f9790615b9b565b61dead6000526033602052600080516020615e9883398151915254600290611078908390615d4f565b6110829190615d4f565b8211156110a15760405162461bcd60e51b8152600401610f9790615b59565b6110ab8183615d63565b61dead60009081526033602052600080516020615e9883398151915280549091906110d7908490615d82565b909155506110e790508183615d63565b6010546001600160a01b031660009081526033602052604081206003018054909190611114908490615d37565b909155506111279050426203f480615d37565b6020555050565b600061113b338484614274565b5060015b92915050565b6009546001600160a01b036101009091041633146111755760405162461bcd60e51b8152600401610f9790615bbd565b60028110156111df5760405162461bcd60e51b815260206004820152603060248201527f70726573616c657320617265206e6576657220616c6c6f77656420746f20647560448201526f6d70206d6f7265207468616e2035302560801b6064820152608401610f97565b601955565b600d54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561122957600080fd5b505afa15801561123d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112619190615a16565b905090565b6009546001600160a01b036101009091041633146112965760405162461bcd60e51b8152600401610f9790615bbd565b601a5481111580156112a85750600081115b6112ec5760405162461bcd60e51b815260206004820152601560248201527431b0b713ba1039b2ba103634b6b4ba103637bbb2b960591b6044820152606401610f97565b601a55565b6009546001600160a01b036101009091041633146113215760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03166000908152603360209081526040808320805465ff0000000000191681556002018390556036909152812055565b6009546001600160a01b036101009091041633146113885760405162461bcd60e51b8152600401610f9790615bbd565b6113926006614242565b6113ae5760405162461bcd60e51b8152600401610f9790615b7b565b6113b88142615d37565b6001600160a01b0390921660009081526033602052604090206007019190915550565b6009546001600160a01b0361010090910416331461140b5760405162461bcd60e51b8152600401610f9790615bbd565b6201518081116114745760405162461bcd60e51b815260206004820152602e60248201527f6d7573742067697665206174206c6561737420323420686f757273206265666f60448201526d3932903634b8bab4b230ba34b7b760911b6064820152608401610f97565b61147e601d614242565b61149a5760405162461bcd60e51b8152600401610f9790615b7b565b603a55565b6009546001600160a01b036101009091041633146114cf5760405162461bcd60e51b8152600401610f9790615bbd565b42601e54106115395760405162461bcd60e51b815260206004820152603060248201527f63616e2774207475726e2074686973206f666620756e74696c206175746f6d6160448201526f3a32b2103637b1b59034b99037bb32b960811b6064820152608401610f97565b60088054911515600160b81b0260ff60b81b19909216919091179055565b6115616007614242565b61157d5760405162461bcd60e51b8152600401610f9790615b7b565b6000611587612a45565b6001600160a01b0383166000908152603360205260409020600301546115ad9190615d4f565b90506115b833614390565b6115d25760095461010090046001600160a01b03166115d4565b815b60098054610100600160a81b0319166101006001600160a01b0393841602179055821660009081526033602052604090206004015481111561162f576001600160a01b03821660009081526033602052604090206004018190555b5050565b6001600160a01b031660009081526033602052604090205462010000900460ff1690565b6000611664848484614404565b506001600160a01b0384166000908152603460209081526040808320338085529252909120546116a091869161169b908690615d82565b614274565b5060019392505050565b3360006116b5612a45565b90506116c082611633565b156116dd5760405162461bcd60e51b8152600401610f9790615be2565b6001600160a01b0382166000908152603360205260409020600301546117038285615d63565b106117205760405162461bcd60e51b8152600401610f9790615b59565b61172a8184615d63565b6001600160a01b03831660009081526033602052604081206003018054909190611755908490615d82565b9091555061176590508184615d63565b603160008282546117769190615d82565b92505081905550826032600082825461178f9190615d37565b9091555050505050565b6009546001600160a01b036101009091041633146117c95760405162461bcd60e51b8152600401610f9790615bbd565b60328110156118125760405162461bcd60e51b815260206004820152601560248201527463616e2774206265206d6f7265207468616e20322560581b6044820152606401610f97565b61181c6016614242565b6118385760405162461bcd60e51b8152600401610f9790615b7b565b601655565b6031546030546000918291825b6118546003615329565b8110156118e3576000611868600383615333565b6001600160a01b03811660009081526033602052604090206003810154600190910154919250908582118061189c57508481115b156118b557603154603054975097505050505050509091565b6118bf8287615d82565b95506118cb8186615d82565b945050505080806118db90615dd4565b91505061184a565b506030546031546118f49190615d4f565b82101561190b576031546030549350935050509091565b90939092509050565b6009546001600160a01b036101009091041633146119445760405162461bcd60e51b8152600401610f9790615bbd565b60088054911515600160d01b0260ff60d01b19909216919091179055565b6001600160a01b0381163314156119af5760405162461bcd60e51b815260206004820152601160248201527031b0b713ba1039b2ba103a379039b2b63360791b6044820152606401610f97565b33600090815260336020526040902060080180546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03610100909104163314611a115760405162461bcd60e51b8152600401610f9790615bbd565b611a1b6020614242565b611a375760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b038216301415611a605760405162461bcd60e51b8152600401610f9790615bbd565b60115460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b158015611aae57600080fd5b505af1158015611ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae691906159c2565b505050565b3360008181526034602090815260408083206001600160a01b0387168452909152812054909161113b91859061169b908690615d37565b6009546001600160a01b03610100909104163314611b525760405162461bcd60e51b8152600401610f9790615bbd565b6008805460ff60e81b198116600160e81b9182900460ff1615909102179055565b6009546001600160a01b03610100909104163314611ba35760405162461bcd60e51b8152600401610f9790615bbd565b611bad6004614242565b611bc95760405162461bcd60e51b8152600401610f9790615b7b565b602355565b6001600160a01b03808316600090815260336020526040808220549284168252812054909160ff62010000918290048116929190910416818015611c10575080155b15611c1e5760009250611c6e565b81158015611c295750805b15611c375760019250611c6e565b81158015611c43575080155b15611c515760039250611c6e565b818015611c5b5750805b15611c695760029250611c6e565b600392505b505092915050565b6009546001600160a01b03610100909104163314611ca65760405162461bcd60e51b8152600401610f9790615bbd565b611cb06000614242565b611ccc5760405162461bcd60e51b8152600401610f9790615b7b565b6004811015611d1d5760405162461bcd60e51b815260206004820152601860248201527f63616e2774206275726e206d6f7265207468616e2032352500000000000000006044820152606401610f97565b6022544211611d3e5760405162461bcd60e51b8152600401610f9790615b9b565b600d546001600160a01b031660009081526033602052604081206003015490611d678383615d4f565b90506000611d73612a45565b611d7d9083615d4f565b600d546001600160a01b0316600090815260336020526040812060030180549293508492909190611daf908490615d82565b90915550506013546001600160a01b031660009081526033602052604081206003018054849290611de1908490615d37565b9091555050601354600d546040518381526001600160a01b039283169290911690600080516020615eb88339815191529060200160405180910390a3611e25613751565b602354611e329042615d37565b60225550505050565b6009546001600160a01b03610100909104163314611e6b5760405162461bcd60e51b8152600401610f9790615bbd565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611e976009614242565b611eb35760405162461bcd60e51b8152600401610f9790615b7b565b333b15611ef15760405162461bcd60e51b815260206004820152600c60248201526b736c6179657273206f6e6c7960a01b6044820152606401610f97565b603a546001600160a01b038216600090815260366020526040902054611f179190615d37565b42118015611f3c57506001600160a01b03811660009081526036602052604090205415155b611f745760405162461bcd60e51b81526020600482015260096024820152681b5d5cdd081dd85a5d60ba1b6044820152606401610f97565b6001600160a01b03811660009081526033602052604081206003018054919055611f9f600282615d4f565b61dead60009081526033602052600080516020615e988339815191528054909190611fcb908490615d37565b90915550611fdc9050600482615d4f565b60316000828254611fed9190615d82565b90915550611ffe9050601482615d4f565b3360009081526033602052604081206003018054909190612020908490615d37565b909155506120319050601482615d4f565b61203c600483615d4f565b6120469190615d82565b600b546001600160a01b031660009081526033602052604081206003018054909190612073908490615d37565b909155503390506001600160a01b038316600080516020615eb883398151915261209e601485615d4f565b60405190815260200160405180910390a35050565b6009546001600160a01b036101009091041633146120e35760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03811660009081526033602052604090205462010000900460ff16156121525760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610f97565b6001600160a01b0381166000908152603360205260409020805462ff000019166201000017815560030154156121cd5761218a612a45565b6001600160a01b0382166000908152603360205260409020600301546121b09190615d4f565b6001600160a01b0382166000908152603360205260409020600101555b61162f60038261533f565b6009546001600160a01b036101009091041633146122085760405162461bcd60e51b8152600401610f9790615bbd565b600854600160a01b900460ff16156122625760405162461bcd60e51b815260206004820152601b60248201527f63616e2774207365742070726573616c65727320616e796d6f726500000000006044820152606401610f97565b6001600160a01b039091166000908152603360205260409020805491151563010000000263ff00000019909216919091179055565b3360006122a2612a45565b90506122ad82611633565b156122ca5760405162461bcd60e51b8152600401610f9790615be2565b6001600160a01b0382166000908152603360205260409020600301546122f08285615d63565b1061230d5760405162461bcd60e51b8152600401610f9790615b59565b6123178184615d63565b6001600160a01b03831660009081526033602052604081206003018054909190612342908490615d82565b9091555061235290508184615d63565b61dead60009081526033602052600080516020615e98833981519152805490919061237e908490615d37565b909155505061dead600090815260336020527f797464dbf411727de94027e1fdf88bb523a37123d715877a38fefe312b70e15b80548592906123c1908490615d37565b909155506123cf9050613751565b60405183815261dead903090600080516020615eb8833981519152906020015b60405180910390a3505050565b6001600160a01b03821660009081526033602052604081205460ff168061243b57506001600160a01b03821660009081526033602052604090205460ff165b9392505050565b6009546001600160a01b036101009091041633146124725760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03919091166000908152603360205260409020805460ff1916911515919091179055565b6009546001600160a01b036101009091041633146124cd5760405162461bcd60e51b8152600401610f9790615bbd565b6124d7601b614242565b6124f35760405162461bcd60e51b8152600401610f9790615b7b565b602c55565b6009546001600160a01b036101009091041633146125285760405162461bcd60e51b8152600401610f9790615bbd565b6125326001614242565b61254e5760405162461bcd60e51b8152600401610f9790615b7b565b600481101561259f5760405162461bcd60e51b815260206004820152601a60248201527f63616e277420726562617365206d6f7265207468616e203235250000000000006044820152606401610f97565b60225442116125c05760405162461bcd60e51b8152600401610f9790615b9b565b61dead60009081526033602052600080516020615e98833981519152546125e8908390615d4f565b61dead60009081526033602052600080516020615e9883398151915280549293508392909190612619908490615d82565b9250508190555080603160008282546126329190615d82565b909155506126409050613751565b60235461264d9042615d37565b6022555050565b61265e601c614242565b61267a5760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b038116600090815260336020526040902054600160281b900460ff1615156001146126d45760405162461bcd60e51b815260206004820152600360248201526208589b60ea1b6044820152606401610f97565b333b1561271a5760405162461bcd60e51b81526020600482015260146024820152733a3434b99034b99030b73a34903137ba1039b2b960611b6044820152606401610f97565b602c5460305461272a9190615d4f565b6127333361295d565b10158061274a57506011546001600160a01b031633145b6127835760405162461bcd60e51b815260206004820152600a6024820152692163616e7420766f746560b01b6044820152606401610f97565b3360009081526035602090815260408083206001600160a01b038516845290915290205460ff16156127e75760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481d9bdd1959609a1b6044820152606401610f97565b6001600160a01b0381166000908152603360205260408120600201805460019290612813908490615d37565b9091555050602d546001600160a01b03821660009081526033602052604090206002015410612858576001600160a01b03811660009081526036602052604090204290555b3360009081526035602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6009546001600160a01b036101009091041633146128b95760405162461bcd60e51b8152600401610f9790615bbd565b6128c36005614242565b6128df5760405162461bcd60e51b8152600401610f9790615b7b565b600b80546001600160a01b03908116600090815260336020526040808220805460ff19908116909155845484168352818320805464ff000000001990811690915585549685166001600160a01b0319909716871786559583528183208054909116600117905592549091168152208054909116640100000000179055565b600061296882611633565b1561298c57506001600160a01b031660009081526033602052604090206001015490565b612994612a45565b6001600160a01b03831660009081526033602052604090206003015461113f9190615d4f565b6009546001600160a01b036101009091041633146129ea5760405162461bcd60e51b8152600401610f9790615bbd565b6011546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3601180546001600160a01b031916905560098054610100600160a81b0319169055565b6000806000612a5261183d565b9092509050612a618183615d4f565b9250505090565b602a54602e54612a789042615d82565b1115612ad457601280546001600160a01b03191661dead9081179091556000602f5542602e8190556040519081527fcb2c905a66a695cd7d34279033a7e3dae99796366e85a006aa4a2da4d167905c9060200160405180910390a25b6012546001600160a01b031661dead1415612aef576000602f555b565b612afb600c614242565b612b175760405162461bcd60e51b8152600401610f9790615b7b565b6011546001600160a01b0316331480612b3a57506008546001600160a01b031633145b612b735760405162461bcd60e51b815260206004820152600a602482015269085c195c9b5a5d1d195960b21b6044820152606401610f97565b4260275410612bb05760405162461bcd60e51b815260206004820152600960248201526821646561646c696e6560b81b6044820152606401610f97565b6014805460009190612bc29084615def565b81548110612bd257612bd2615e5b565b6000918252602090912001546001600160a01b03169050612bf1612a45565b602654612bfe9190615d63565b6001600160a01b03821660009081526033602052604081206003018054909190612c29908490615d37565b90915550506026546040516001600160a01b038316917f83180aa4ac63459a0857ee4be800e29aa03c2426bdb949e15826b88ef0c668a291612c7391868252602082015260400190565b60405180910390a26013546026546040519081526001600160a01b03838116921690600080516020615eb88339815191529060200160405180910390a360005b601454811015612cfb5760148181548110612cd057612cd0615e5b565b600091825260209091200180546001600160a01b031916905580612cf381615dd4565b915050612cb3565b5050600060268190556009805460ff1916905560295550565b6009546001600160a01b03610100909104163314612d445760405162461bcd60e51b8152600401610f9790615bbd565b612d4e601e614242565b612d6a5760405162461bcd60e51b8152600401610f9790615b7b565b602b55565b6001600160a01b0381166000908152603360205260408120805460029091015482918291829182918291829160ff808316926201000081048216926401000000008204831692600160281b90920490911690612dc9612a45565b6001600160a01b038e16600090815260336020526040902060030154612def9190615d4f565b6001600160a01b039d909d16600090815260336020526040902060050154949d939c929b5090995097509550909350915050565b6009546001600160a01b03610100909104163314612e535760405162461bcd60e51b8152600401610f9790615bbd565b6008805460ff60a01b1916600160a01b179055612e734262054600615d37565b601e55612e808142615d37565b60215550565b6009546001600160a01b03610100909104163314612eb65760405162461bcd60e51b8152600401610f9790615bbd565b6005811115612ed75760405162461bcd60e51b8152600401610f9790615b59565b612ee16014614242565b612efd5760405162461bcd60e51b8152600401610f9790615b7b565b601b55565b6001600160a01b0316600090815260336020526040902054640100000000900460ff1690565b60095460ff16612f715760405162461bcd60e51b81526020600482015260146024820152736c6f74746f206973206e6f742072756e6e696e6760601b6044820152606401610f97565b336000908152603860209081526040808320602554845290915290205460ff1615612fd05760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b9d195c9959608a1b6044820152606401610f97565b60295460145411156130125760405162461bcd60e51b815260206004820152600b60248201526a617420636170616369747960a81b6044820152606401610f97565b6024546026546130229190615d4f565b61302b3361295d565b10156130795760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f75676820746f6b656e7320746f20656e7465720000000000006044820152606401610f97565b33600081815260376020908152604080832060258054855290835281842042905584845260388352818420905484529091528120805460ff191660019081179091556014805491820181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319169091179055565b6011546001600160a01b031633148061311f57506007546001600160a01b031633145b61313b5760405162461bcd60e51b8152600401610f9790615bbd565b600854600160d01b900460ff166131855760405162461bcd60e51b815260206004820152600e60248201526d6e6674206e6f742061637469766560901b6044820152606401610f97565b61318f6002614242565b6131ab5760405162461bcd60e51b8152600401610f9790615b7b565b6007546040805163658ba96160e01b815290516000926001600160a01b03169163658ba961916004808301926020929190829003018186803b1580156131f057600080fd5b505afa158015613204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132289190615a16565b905060006132368285615d4f565b90506000613242612a45565b905060006132508287615d63565b9050600060ff86166132635750336132a4565b8560ff1660011415613278575061dead6132a4565b8560ff16600214156132965750600d546001600160a01b03166132a4565b50600b546001600160a01b03165b6001600160a01b03811660009081526033602052604090206003015482106132de5760405162461bcd60e51b8152600401610f9790615b59565b6001600160a01b03811660009081526033602052604081206003018054849290613309908490615d82565b90915550600090505b8581101561341657600754604051627df2a560e71b8152600481018390526000916001600160a01b031690633ef952809060240160206040518083038186803b15801561335e57600080fd5b505afa158015613372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339691906157d3565b6001600160a01b0381166000908152603360205260408120600301805492935088929091906133c6908490615d37565b90915550506001600160a01b03808216908416600080516020615eb88339815191526133f2888a615d4f565b60405190815260200160405180910390a3508061340e81615dd4565b915050613312565b5050505050505050565b61342a600b614242565b6134465760405162461bcd60e51b8152600401610f9790615b7b565b6011546001600160a01b031633148061346957506008546001600160a01b031633145b6134a25760405162461bcd60e51b815260206004820152600a602482015269085c195c9b5a5d1d195960b21b6044820152606401610f97565b60c884111580156134b45750600a8410155b6134eb5760405162461bcd60e51b815260206004820152600860248201526703e3130203c3230360c41b6044820152606401610f97565b62093a8082111580156134fe5750818310155b6135355760405162461bcd60e51b8152602060048201526008602482015267746f6f206c6f6e6760c01b6044820152606401610f97565b6025805490600061354583615dd4565b91905055506000816135595761dead613566565b600b546001600160a01b03165b9050613570612a45565b61357a9087615d63565b6001600160a01b038216600090815260336020526040812060030180549091906135a5908490615d82565b909155505060268690556009805460ff19166001179055602985905560288390556135d08442615d37565b602755505050505050565b606060018054610ee490615d99565b6009546001600160a01b0361010090910416331461361a5760405162461bcd60e51b8152600401610f9790615bbd565b600880546001600160f81b0316600160f81b179055565b3360008181526034602090815260408083206001600160a01b0387168452909152812054909161113b91859061169b908690615d82565b6009546001600160a01b036101009091041633146136985760405162461bcd60e51b8152600401610f9790615bbd565b816136ae57600b546001600160a01b03166136b2565b61dead5b601380546001600160a01b0319166001600160a01b03929092169190911790556008805460ff60c81b1916600160c81b9215159290920291909117905550565b6009546001600160a01b036101009091041633146137225760405162461bcd60e51b8152600401610f9790615bbd565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006116a0338484614404565b600d60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137a157600080fd5b505af11580156137b5573d6000803e3d6000fd5b50505050565b6009546001600160a01b036101009091041633146137eb5760405162461bcd60e51b8152600401610f9790615bbd565b6137f56015614242565b6138115760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b03909116600090815260336020526040902080549115156401000000000264ff0000000019909216919091179055565b600c5460009081906001600160a01b038681169116141561386b575060026138d8565b6001600160a01b038516600090815260336020526040902054610100900460ff16156138a65782601d541461389e575060025b5060006138d8565b6001600160a01b038416600090815260336020526040902054610100900460ff16156138d4575060016138d8565b5060025b949350505050565b6009546001600160a01b036101009091041633146139105760405162461bcd60e51b8152600401610f9790615bbd565b61391a6003614242565b6139365760405162461bcd60e51b8152600401610f9790615b7b565b60028111156139575760405162461bcd60e51b8152600401610f9790615b59565b601855565b6009546001600160a01b0361010090910416331461398c5760405162461bcd60e51b8152600401610f9790615bbd565b6139966008614242565b6139b25760405162461bcd60e51b8152600401610f9790615b7b565b6001600160a01b03166000908152603360205260409020805465ff00000000001916600160281b179055565b6009546001600160a01b03610100909104163314613a0e5760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b03811660009081526033602052604090205462010000900460ff16613a7c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610f97565b6001600160a01b03811660009081526033602052604081206001015561162f600382615354565b6009546001600160a01b03610100909104163314613ad35760405162461bcd60e51b8152600401610f9790615bbd565b613add601f614242565b613af95760405162461bcd60e51b8152600401610f9790615b7b565b803b80613b3d5760405162461bcd60e51b81526020600482015260126024820152711b5d5cdd08189948184818dbdb9d1c9858dd60721b6044820152606401610f97565b50601080546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03610100909104163314613b905760405162461bcd60e51b8152600401610f9790615bbd565b613b9a6019614242565b613bb65760405162461bcd60e51b8152600401610f9790615b7b565b60088054911515600160f01b0260ff60f01b19909216919091179055565b6009546001600160a01b03610100909104163314613c045760405162461bcd60e51b8152600401610f9790615bbd565b613c0e6017614242565b613c2a5760405162461bcd60e51b8152600401610f9790615b7b565b60088054911515600160e01b0260ff60e01b19909216919091179055565b6009546001600160a01b03610100909104163314613c785760405162461bcd60e51b8152600401610f9790615bbd565b613c826022614242565b613c9e5760405162461bcd60e51b8152600401610f9790615b7b565b602455565b6009546001600160a01b03610100909104163314613cd35760405162461bcd60e51b8152600401610f9790615bbd565b6008805460ff60d81b198116600160d81b9182900460ff1615909102179055565b604051600081526001600160a01b038216908190600080516020615eb88339815191529060200160405180910390a350565b6009546001600160a01b03610100909104163314613d565760405162461bcd60e51b8152600401610f9790615bbd565b613d606018614242565b613d7c5760405162461bcd60e51b8152600401610f9790615b7b565b601755565b6009546001600160a01b03610100909104163314613db15760405162461bcd60e51b8152600401610f9790615bbd565b600e80546001600160a01b039093166001600160a01b03199093168317905560009182526033602052604090912080549115156101000261ff0019909216919091179055565b6009546001600160a01b03610100909104163314613e275760405162461bcd60e51b8152600401610f9790615bbd565b6001600160a01b038116613e8c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f97565b601180546001600160a01b0319166001600160a01b0392909216918217905560098054610100600160a81b031916610100909202919091179055565b6009546001600160a01b03610100909104163314613ef85760405162461bcd60e51b8152600401610f9790615bbd565b613f026021614242565b613f1e5760405162461bcd60e51b8152600401610f9790615b7b565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b613f6460405180606001604052806000815260200160008152602001600081525090565b600080613f72888886613848565b9150613f7e8888611bce565b8684529050846140bc57600854600160a01b900460ff16156140bc576001826002811115613fae57613fae615e2f565b141561408f57600854600190600160f01b900460ff1661406f576001600160a01b038916600090815260336020526040812060050154613fee9042615d82565b905060175481101561406d5760186017546140099190615d4f565b81116140245760185461401d906003615d37565b915061406d565b60066017546140339190615d4f565b81116140475760185461401d906002615d37565b60026017546140569190615d4f565b811161406d5760185461406a906001615d37565b91505b505b806016548861407e9190615d4f565b6140889190615d63565b6040850152505b60008260028111156140a3576140a3615e2f565b14156140bc576016546140b69087615d4f565b60408401525b60408301516140cc906005615d63565b83516140d89190615d82565b6020840152955095509592505050565b6009546001600160a01b036101009091041633146141185760405162461bcd60e51b8152600401610f9790615bbd565b6141224282615d37565b60ff90921660009081526039602052604090209190915550565b6009546001600160a01b0361010090910416331461416c5760405162461bcd60e51b8152600401610f9790615bbd565b600854600160a01b900460ff16156141c65760405162461bcd60e51b815260206004820152601b60248201527f63616e2774207365742070726573616c65727320616e796d6f726500000000006044820152606401610f97565b60005b828110156137b55781603360008686858181106141e8576141e8615e5b565b90506020020160208101906141fd91906157b6565b6001600160a01b031681526020810191909152604001600020805491151563010000000263ff000000199092169190911790558061423a81615dd4565b9150506141c9565b60ff811660009081526039602052604081205442108061113f57505060ff166000908152603960205260409020541590565b6001600160a01b0383166142d65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f97565b6001600160a01b0382166143375760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f97565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016123ef565b6000813b156143e15760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2074617267657420697320636f6e747261637400000000006044820152606401610f97565b506001600160a01b031673ccc2a0313ff6dea1181c537d9dc44b9d249807b11490565b60006001600160a01b03841661446a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f97565b6001600160a01b0383166144cc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f97565b6000821161452e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610f97565b6001600160a01b03831660009081526033602052604090206007015442116145905760405162461bcd60e51b81526020600482015260156024820152741cdd1a5b1b081a5b88189d5e481d1a5b594b5bdd5d605a1b6044820152606401610f97565b600061459a612a45565b600854909150600160a01b900460ff166146255760115473d152f549545093347a162dce210e7293f1452150906001600160a01b03878116911614806145e85750336001600160a01b038216145b6146235760405162461bcd60e51b815260206004820152600c60248201526b1cdd1a5b1b081c185d5cd95960a21b6044820152606401610f97565b505b600854600160b81b900460ff1661479a576001600160a01b0385166000908152603360205260409020546301000000900460ff1615156001141561479a5742601e54106146a85760405162461bcd60e51b81526020600482015260116024820152701cdd1a5b1b081d1a5b59481b1bd8dad959607a1b6044820152606401610f97565b600854600160f81b900460ff166147015760405162461bcd60e51b815260206004820152601a60248201527f70726573616c65727320617265207374696c6c206c6f636b65640000000000006044820152606401610f97565b60195461470d8661295d565b6147179190615d4f565b8311156147365760405162461bcd60e51b8152600401610f9790615b59565b6001600160a01b03851660009081526033602052604090206005015442906147619062015180615d37565b1061479a5760405162461bcd60e51b81526020600482015260096024820152681b5d5cdd081dd85a5d60ba1b6044820152606401610f97565b600d546001600160a01b03858116911614156148a3576147b985612f02565b6148a3576001600160a01b0385166000908152603360205260408120600301546147e4908390615d4f565b6001600160a01b038716600090815260336020526040902060040154909150811115614829576001600160a01b03861660009081526033602052604090206004018190555b601b546001600160a01b0387166000908152603360205260409020600401546148529190615d4f565b8411156148a15760405162461bcd60e51b815260206004820152601c60248201527f63616e27742064756d702074686174206d756368206174206f6e6365000000006044820152606401610f97565b505b600854600160d81b900460ff161561497c57600d546001600160a01b03868116911614806148f05750600d546001600160a01b038581169116148015906148f057506148ee84612f02565b155b1561497c57601a546030546149059190615d4f565b6001600160a01b038516600090815260336020526040902060030154849061492e908490615d4f565b6149389190615d37565b111561497c5760405162461bcd60e51b81526020600482015260136024820152721dda185b19481b1a5b5a5d081c995858da1959606a1b6044820152606401610f97565b600854600160e81b900460ff166149f0576001600160a01b038516600090815260336020526040902054600160281b900460ff16156149f05760405162461bcd60e51b815260206004820152601060248201526f39bab9b832b1ba32b21039b734b832b960811b6044820152606401610f97565b60215415801590614a02575060215442105b8015614a1b5750600d546001600160a01b038681169116145b15614a9757600d546001600160a01b03858116911614801590614a4c5750600c546001600160a01b03858116911614155b8015614a665750600e546001600160a01b03858116911614155b15614a97576001600160a01b0384166000908152603360205260409020805465ff00000000001916600160281b1790555b60095460ff1615614b45576001600160a01b0385166000908152603860209081526040808320602554845290915290205460ff1615614b45576028546001600160a01b038616600090815260376020908152604080832060255484529091529020544291614b0491615d37565b10614b455760405162461bcd60e51b815260206004820152601160248201527077616974696e6720666f72206c6f74746f60781b6044820152606401610f97565b6000614b4f6111e4565b90506000614b5d87876123fc565b90506000806000614b718a8a8a8789613f40565b92509250925084601d819055506000868460400151614b909190615d63565b600b546001600160a01b0316600090815260336020526040812060030180549293508392909190614bc2908490615d37565b9091555050600f546001600160a01b031660009081526033602052604081206003018054839290614bf4908490615d37565b90915550506012546001600160a01b031660009081526033602052604081206003018054839290614c26908490615d37565b9091555060019050836002811115614c4057614c40615e2f565b1415614def57600b5460408581015190519081526001600160a01b03918216918d1690600080516020615eb88339815191529060200160405180910390a3600f5460408581015190519081526001600160a01b03918216918d1690600080516020615eb88339815191529060200160405180910390a360125460408581015190519081526001600160a01b03918216918d1690600080516020615eb88339815191529060200160405180910390a3600854600160c81b900460ff16614d2257601354600f80546001600160a01b0319166001600160a01b039092169190911790555b6001600160a01b03808c166000908152603360205260409020426005820155600801541615614dc3576001600160a01b03808c166000908152603360205260408082206008015490921681529081206003018054839290614d84908490615d37565b9091555050604084810151905190815261dead906001600160a01b038d1690600080516020615eb88339815191529060200160405180910390a3615225565b61dead60009081526033602052600080516020615e988339815191528054839290614d84908490615d37565b6000836002811115614e0357614e03615e2f565b14156150f357600b5460408581015190519081526001600160a01b03918216918c1690600080516020615eb88339815191529060200160405180910390a3600f5460408581015190519081526001600160a01b03918216918c1690600080516020615eb88339815191529060200160405180910390a360125460408581015190519081526001600160a01b03918216918c1690600080516020615eb88339815191529060200160405180910390a3602b548910614ed657600f80546001600160a01b0319166001600160a01b038c161790555b6001600160a01b038a166000908152603360205260408120600301548a90614eff908a90615d4f565b614f099190615d37565b6001600160a01b038c16600090815260336020526040902060040154909150811115614f4e576001600160a01b038b1660009081526033602052604090206004018190555b602f548a10614fb457601280546001600160a01b0319166001600160a01b038d16908117909155602f8b905542602e8190556040519081527fcb2c905a66a695cd7d34279033a7e3dae99796366e85a006aa4a2da4d167905c9060200160405180910390a25b6001600160a01b038b81166000908152603360205260409020600801541615615067576001600160a01b03808c166000908152603360205260408082206008015490921681529081206003018054849290615010908490615d37565b90915550506001600160a01b03808c166000818152603360205260409081902060080154888201519151931692600080516020615eb88339815191529161505a9190815260200190565b60405180910390a36150ce565b61dead60009081526033602052600080516020615e988339815191528054849290615093908490615d37565b9091555050604085810151905190815261dead906001600160a01b038d1690600080516020615eb88339815191529060200160405180910390a35b506001600160a01b038a16600090815260336020526040902042600690910155615225565b600f80546001600160a01b03191661dead1790556001600160a01b038a166000908152603360205260408120600301548a90615130908a90615d4f565b61513a9190615d37565b600d549091506001600160a01b038d81169116148015906151695750600d546001600160a01b038c8116911614155b801561518f57506001600160a01b038b1660009081526033602052604090206004015481115b156151f2576001600160a01b03808c16600090815260336020526040808220600401849055918e16815220600301548a906151cb908a90615d4f565b6151d59190615d82565b6001600160a01b038d166000908152603360205260409020600401555b61dead60009081526033602052600080516020615e98833981519152805484929061521e908490615d37565b9091555050505b6012546001600160a01b038c81169116148061524f5750602a54602e5461524c9190615d37565b42115b156152a457601280546001600160a01b03191661dead9081179091556000602f556040514281527fcb2c905a66a695cd7d34279033a7e3dae99796366e85a006aa4a2da4d167905c9060200160405180910390a25b8360400151603260008282546152ba9190615d37565b909155505060408401516152cf908890615d63565b603160008282546152e09190615d82565b909155506152f390508b8b898786615369565b6002805484919061ff001916610100838381111561531357615313615e2f565b021790555060019b9a5050505050505050505050565b600061113f825490565b600061243b83836155de565b600061243b836001600160a01b038416615664565b600061243b836001600160a01b0384166156b3565b600181600381111561537d5761537d615e2f565b141561543d578151615390908490615d63565b6001600160a01b038616600090815260336020526040812060030180549091906153bb908490615d82565b90915550506020808301516001600160a01b03861660009081526033909252604082206001018054919290916153f2908490615d37565b90915550506020820151615407908490615d63565b6001600160a01b03851660009081526033602052604081206003018054909190615432908490615d37565b909155506155989050565b600081600381111561545157615451615e2f565b14156154c15781516001600160a01b03861660009081526033602052604081206001018054909190615484908490615d82565b90915550508151615496908490615d63565b6001600160a01b038616600090815260336020526040812060030180549091906153f2908490615d82565b60028160038111156154d5576154d5615e2f565b141561551a5781516001600160a01b03861660009081526033602052604081206001018054909190615508908490615d82565b90915550508151615390908490615d63565b8151615527908490615d63565b6001600160a01b03861660009081526033602052604081206003018054909190615552908490615d82565b90915550506020820151615567908490615d63565b6001600160a01b03851660009081526033602052604081206003018054909190615592908490615d37565b90915550505b836001600160a01b0316856001600160a01b0316600080516020615eb883398151915284602001516040516155cf91815260200190565b60405180910390a35050505050565b8154600090821061563c5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610f97565b82600001828154811061565157615651615e5b565b9060005260206000200154905092915050565b60008181526001830160205260408120546156ab5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561113f565b50600061113f565b600081815260018301602052604081205480156157965760006156d7600183615d82565b85549091506000906156eb90600190615d82565b9050600086600001828154811061570457615704615e5b565b906000526020600020015490508087600001848154811061572757615727615e5b565b60009182526020808320909101929092558281526001890190915260409020849055865487908061575a5761575a615e45565b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061113f565b600091505061113f565b803560ff811681146157b157600080fd5b919050565b6000602082840312156157c857600080fd5b813561243b81615e71565b6000602082840312156157e557600080fd5b815161243b81615e71565b6000806040838503121561580357600080fd5b823561580e81615e71565b9150602083013561581e81615e71565b809150509250929050565b60008060006060848603121561583e57600080fd5b833561584981615e71565b9250602084013561585981615e71565b929592945050506040919091013590565b600080600080600060a0868803121561588257600080fd5b853561588d81615e71565b9450602086013561589d81615e71565b93506040860135925060608601356158b481615e89565b949793965091946080013592915050565b600080604083850312156158d857600080fd5b82356158e381615e71565b9150602083013561581e81615e89565b6000806040838503121561590657600080fd5b823561591181615e71565b946020939093013593505050565b60008060006040848603121561593457600080fd5b833567ffffffffffffffff8082111561594c57600080fd5b818601915086601f83011261596057600080fd5b81358181111561596f57600080fd5b8760208260051b850101111561598457600080fd5b6020928301955093505084013561599a81615e89565b809150509250925092565b6000602082840312156159b757600080fd5b813561243b81615e89565b6000602082840312156159d457600080fd5b815161243b81615e89565b600080604083850312156159f257600080fd5b82356158e381615e89565b600060208284031215615a0f57600080fd5b5035919050565b600060208284031215615a2857600080fd5b5051919050565b600080600080600060a08688031215615a4757600080fd5b853594506020860135935060408601359250606086013591506080860135615a6e81615e89565b809150509295509295909350565b60008060408385031215615a8f57600080fd5b82359150615a9f602084016157a0565b90509250929050565b60008060408385031215615abb57600080fd5b615911836157a0565b60038110615ad457615ad4615e2f565b9052565b60048110615ad457615ad4615e2f565b6020810161113f8284615ac4565b6020810161113f8284615ad8565b600060208083528351808285015260005b81811015615b3157858101830151858201604001528201615b15565b81811115615b43576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600890820152670e8dede40daeac6d60c31b604082015260600190565b6020808252600690820152651ada5b1b195960d21b604082015260600190565b6020808252600890820152673a37b79039b7b7b760c11b604082015260600190565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252602b908201527f4578636c75646564206164647265737365732063616e27742063616c6c20746860408201526a34b990333ab731ba34b7b760a91b606082015260800190565b8151151581526101c081016020830151615c4b602084018215159052565b506040830151615c5f604084018215159052565b506060830151615c73606084018215159052565b506080830151615c87608084018215159052565b5060a0830151615c9b60a084018215159052565b5060c0838101519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a0808401516001600160a01b03811682850152611c6e565b83518152602080850151908201526040808501519082015260a08101615d2a6060830185615ac4565b6138d86080830184615ad8565b60008219821115615d4a57615d4a615e03565b500190565b600082615d5e57615d5e615e19565b500490565b6000816000190483118215151615615d7d57615d7d615e03565b500290565b600082821015615d9457615d94615e03565b500390565b600181811c90821680615dad57607f821691505b60208210811415615dce57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615de857615de8615e03565b5060010190565b600082615dfe57615dfe615e19565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114615e8657600080fd5b50565b8015158114615e8657600080fdfe797464dbf411727de94027e1fdf88bb523a37123d715877a38fefe312b70e15dddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122065599791157079486a45055f8c583f6a751cfd2f3e23c22444bcc3206ca0aab464736f6c63430008060033

Deployed Bytecode Sourcemap

26049:35778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44691:79;44757:5;;-1:-1:-1;;;;;44757:5:0;44691:79;;;-1:-1:-1;;;;;6599:32:1;;;6581:51;;6569:2;6554:18;44691:79:0;;;;;;;;30614:82;;;:::i;:::-;;;;;;;:::i;52144:151::-;;;;;;:::i;:::-;;:::i;:::-;;56937:427;;;;;;:::i;:::-;;:::i;31277:161::-;;;;;;:::i;:::-;;:::i;:::-;;;7087:14:1;;7080:22;7062:41;;7050:2;7035:18;31277:161:0;7017:92:1;50165:185:0;;;;;;:::i;:::-;;:::i;43098:109::-;;;:::i;:::-;;;8334:25:1;;;8322:2;8307:18;43098:109:0;8289:76:1;28665:25:0;;;;;;50481:185;;;;;;:::i;:::-;;:::i;48810:187::-;;;;;;:::i;:::-;;:::i;32250:99::-;32330:11;;32250:99;;51643:199;;;;;;:::i;:::-;;:::i;54168:255::-;;;;;;:::i;:::-;;:::i;52534:220::-;;;;;;:::i;:::-;;:::i;52849:294::-;;;;;;:::i;:::-;;:::i;42974:116::-;;;;;;:::i;:::-;;:::i;28737:52::-;;;;;;32533:266;;;;;;:::i;:::-;;:::i;58560:417::-;;;;;;:::i;:::-;;:::i;50839:174::-;;;;;;:::i;:::-;;:::i;43957:726::-;;;:::i;:::-;;;;28324:25:1;;;28380:2;28365:18;;28358:34;;;;28297:18;43957:726:0;28279:119:1;28984:28:0;;;;;;55283:84;;;;;;:::i;:::-;;:::i;30704:82::-;30769:9;;30704:82;;30769:9;;;;28545:36:1;;28533:2;28518:18;30704:82:0;28500:87:1;57552:165:0;;;;;;:::i;:::-;;:::i;59051:269::-;;;;;;:::i;:::-;;:::i;31794:214::-;;;;;;:::i;:::-;;:::i;56607:112::-;;;:::i;28917:27::-;;;;;;50674:157;;;;;;:::i;:::-;;:::i;44778:749::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45797:585::-;;;;;;:::i;:::-;;:::i;52445:81::-;;;;;;:::i;:::-;;:::i;28796:38::-;;;;;;54583:578;;;;;;:::i;:::-;;:::i;48190:369::-;;;;;;:::i;:::-;;:::i;49525:164::-;;;;;;:::i;:::-;;:::i;55774:518::-;;;;;;:::i;:::-;;:::i;41862:163::-;;;;;;:::i;:::-;;:::i;57725:97::-;;57780:10;57771:20;;;;:8;:20;;;;;:32;;:43;;-1:-1:-1;;;;;;57771:43:0;26169:42;57771:43;;;57725:97;49387:130;;;;;;:::i;:::-;;:::i;53357:171::-;;;;;;:::i;:::-;;:::i;46390:461::-;;;;;;:::i;:::-;;:::i;53536:584::-;;;;;;:::i;:::-;;:::i;51288:302::-;;;;;;:::i;:::-;;:::i;31041:228::-;;;;;;:::i;:::-;;:::i;57869:172::-;;;:::i;45535:135::-;;;:::i;58051:361::-;;;:::i;60851:672::-;;;;;;:::i;:::-;;:::i;28951:26::-;;;;;;27554;;;;;;;;;54431:144;;;;;;:::i;:::-;;:::i;42307:659::-;;;;;;:::i;:::-;;:::i;:::-;;;;7430:14:1;;7423:22;7405:41;;7489:14;;7482:22;7477:2;7462:18;;7455:50;7548:14;;7541:22;7521:18;;;7514:50;;;;7607:14;;7600:22;7595:2;7580:18;;7573:50;7654:3;7639:19;;7632:35;7698:3;7683:19;;7676:35;;;;7742:3;7727:19;;7720:35;7392:3;7377:19;42307:659:0;7359:402:1;28530:25:0;;;;;;47960:221;;;;;;:::i;:::-;;:::i;28697:33::-;;;;;;49005:184;;;;;;:::i;:::-;;:::i;27482:26::-;;;;;-1:-1:-1;;;27482:26:0;;;;;;27873:40;;;;;-1:-1:-1;;;;;27873:40:0;;;27814:20;;;;;-1:-1:-1;;;;;27814:20:0;;;42055:118;;;;;;:::i;:::-;;:::i;59682:476::-;;;:::i;46859:1030::-;;;;;;:::i;:::-;;:::i;60166:679::-;;;;;;:::i;:::-;;:::i;30794:87::-;;;:::i;29019:19::-;;;;;;51188:92;;;:::i;32016:226::-;;;;;;:::i;:::-;;:::i;56409:190::-;;;;;;:::i;:::-;;:::i;55171:104::-;;;;;;:::i;:::-;;:::i;32357:168::-;;;;;;:::i;:::-;;:::i;28595:28::-;;;;;;45678:75;;;:::i;28630:28::-;;;;;;49974:181;;;;;;:::i;:::-;;:::i;43338:611::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49197:182::-;;;;;;:::i;:::-;;:::i;53151:198::-;;;;;;:::i;:::-;;:::i;48567:235::-;;;;;;:::i;:::-;;:::i;27841:25::-;;;;;-1:-1:-1;;;;;27841:25:0;;;26126:86;;26169:42;26126:86;;55375:266;;;;;;:::i;:::-;;:::i;51996:140::-;;;;;;:::i;:::-;;:::i;51021:143::-;;;;;;:::i;:::-;;:::i;30889:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30998:18:0;;;30971:7;30998:18;;;:10;:18;;;;;;;;:27;;;;;;;;;;;;;30889:144;61671:151;;;;;;:::i;:::-;;:::i;27515:32::-;;;;;-1:-1:-1;;;27515:32:0;;;;;;56300:101;;;:::i;57453:91::-;;;;;;:::i;:::-;;:::i;28483:40::-;;;;;;51852:136;;;;;;:::i;:::-;;:::i;52303:134::-;;;;;;:::i;:::-;;:::i;56727:202::-;;;;;;:::i;:::-;;:::i;28848:29::-;;;;;;61531:132;;;;;;:::i;:::-;;:::i;38927:1668::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;28884:26::-;;;;;;59328:155;;;;;;:::i;:::-;;:::i;49697:269::-;;;;;;:::i;:::-;;:::i;28562:26::-;;;;;;42181:118;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42274:17:0;;;;;;;:8;:17;;;;;;;;;42267:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42267:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42181:118;;;;;;;;:::i;43215:115::-;;;;;;:::i;:::-;-1:-1:-1;;;;;43298:17:0;43271:7;43298:17;;;:8;:17;;;;;:24;;;;43215:115;30614:82;30650:13;30683:5;30676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30614:82;:::o;52144:151::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;;;;;;;;;52226:15:::1;52238:2;52226:11;:15::i;:::-;52218:34;;;;-1:-1:-1::0;;;52218:34:0::1;;;;;;;:::i;:::-;52263:18;:24:::0;52144:151::o;56937:427::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;57015:15:::1;57027:2;57015:11;:15::i;:::-;57007:34;;;;-1:-1:-1::0;;;57007:34:0::1;;;;;;;:::i;:::-;57052:9;57064:7;:5;:7::i;:::-;57052:19;;57109:12;;57090:15;:31;;57082:52;;;;-1:-1:-1::0;;;57082:52:0::1;;;;;;;:::i;:::-;26169:42;57164:18;::::0;:8:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;57164:25:0;57195:1:::1;::::0;57164:29:::1;::::0;57192:1;;57164:29:::1;:::i;:::-;57163:33;;;;:::i;:::-;57153:6;:43;;57145:64;;;;-1:-1:-1::0;;;57145:64:0::1;;;;;;;:::i;:::-;57249:10;57258:1:::0;57249:6;:10:::1;:::i;:::-;26169:42;57220:18;::::0;;;:8:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;57220:39:0;;:25;;:18;:39:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;57296:10:0::1;::::0;-1:-1:-1;57305:1:0;57296:6;:10:::1;:::i;:::-;57279:5;::::0;-1:-1:-1;;;;;57279:5:0::1;57270:15;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;:36:::0;;:22;;:15;:36:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;57332:24:0::1;::::0;-1:-1:-1;57332:15:0::1;57350:6;57332:24;:::i;:::-;57317:12;:39:::0;-1:-1:-1;;56937:427:0:o;31277:161::-;31352:4;31369:39;15239:10;31392:7;31401:6;31369:8;:39::i;:::-;-1:-1:-1;31426:4:0;31277:161;;;;;:::o;50165:185::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;50256:1:::1;50247:5;:10;;50239:71;;;::::0;-1:-1:-1;;;50239:71:0;;18761:2:1;50239:71:0::1;::::0;::::1;18743:21:1::0;18800:2;18780:18;;;18773:30;18839:34;18819:18;;;18812:62;-1:-1:-1;;;18890:18:1;;;18883:46;18946:19;;50239:71:0::1;18733:238:1::0;50239:71:0::1;50321:13;:21:::0;50165:185::o;43098:109::-;43179:5;;43172:27;;;-1:-1:-1;;;43172:27:0;;;;43145:7;;-1:-1:-1;;;;;43179:5:0;;43172:25;;:27;;;;;;;;;;;;;;43179:5;43172:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43165:34;;43098:109;:::o;50481:185::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;50578:11:::1;;50569:5;:20;;:33;;;;;50601:1;50593:5;:9;50569:33;50561:67;;;::::0;-1:-1:-1;;;50561:67:0;;10317:2:1;50561:67:0::1;::::0;::::1;10299:21:1::0;10356:2;10336:18;;;10329:30;-1:-1:-1;;;10375:18:1;;;10368:51;10436:18;;50561:67:0::1;10289:171:1::0;50561:67:0::1;50639:11;:19:::0;50481:185::o;48810:187::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48875:17:0::1;48910:5;48875:17:::0;;;:8:::1;:17;::::0;;;;;;;:40;;-1:-1:-1;;48875:40:0::1;::::0;;48926:23:::1;;:27:::0;;;48964:12:::1;:21:::0;;;;;:25;48810:187::o;51643:199::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;51739:14:::1;51751:1;51739:11;:14::i;:::-;51731:33;;;;-1:-1:-1::0;;;51731:33:0::1;;;;;;;:::i;:::-;51803:31;51821:13:::0;51803:15:::1;:31;:::i;:::-;-1:-1:-1::0;;;;;51775:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;:25:::1;;:59:::0;;;;-1:-1:-1;51643:199:0:o;54168:255::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;54272:6:::1;54256:13;:22;54248:81;;;::::0;-1:-1:-1;;;54248:81:0;;14935:2:1;54248:81:0::1;::::0;::::1;14917:21:1::0;14974:2;14954:18;;;14947:30;15013:34;14993:18;;;14986:62;-1:-1:-1;;;15064:18:1;;;15057:44;15118:19;;54248:81:0::1;14907:236:1::0;54248:81:0::1;54348:15;54360:2;54348:11;:15::i;:::-;54340:34;;;;-1:-1:-1::0;;;54340:34:0::1;;;;;;;:::i;:::-;54385:14;:30:::0;54168:255::o;52534:220::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;52642:15:::1;52613:26;;:44;52605:105;;;::::0;-1:-1:-1;;;52605:105:0;;24646:2:1;52605:105:0::1;::::0;::::1;24628:21:1::0;24685:2;24665:18;;;24658:30;24724:34;24704:18;;;24697:62;-1:-1:-1;;;24775:18:1;;;24768:46;24831:19;;52605:105:0::1;24618:238:1::0;52605:105:0::1;52721:21;:25:::0;;;::::1;;-1:-1:-1::0;;;52721:25:0::1;-1:-1:-1::0;;;;52721:25:0;;::::1;::::0;;;::::1;::::0;;52534:220::o;52849:294::-;52914:14;52926:1;52914:11;:14::i;:::-;52906:33;;;;-1:-1:-1;;;52906:33:0;;;;;;;:::i;:::-;52950:11;52985:7;:5;:7::i;:::-;-1:-1:-1;;;;;52964:11:0;;;;;;:8;:11;;;;;:18;;;:28;;;;:::i;:::-;52950:42;;53008:28;53025:10;53008:16;:28::i;:::-;:37;;53043:2;;;;;-1:-1:-1;;;;;53043:2:0;53008:37;;;53039:1;53008:37;53003:2;:42;;-1:-1:-1;;;;;;53003:42:0;;-1:-1:-1;;;;;53003:42:0;;;;;;;53065:11;;-1:-1:-1;53065:11:0;;;:8;:11;;;;;:18;;;53059:24;;53056:80;;;-1:-1:-1;;;;;53100:11:0;;;;;;:8;:11;;;;;:18;;:24;;;53056:80;52895:248;52849:294;:::o;42974:116::-;-1:-1:-1;;;;;43056:17:0;43032:4;43056:17;;;:8;:17;;;;;:26;;;;;;;42974:116::o;32533:266::-;32631:4;32648:37;32659:6;32667:9;32678:6;32648:10;:37::i;:::-;-1:-1:-1;;;;;;32727:18:0;;;;;;:10;:18;;;;;;;;15239:10;32727:32;;;;;;;;;32696:73;;32705:6;;32727:41;;32762:6;;32727:41;:::i;:::-;32696:8;:73::i;:::-;-1:-1:-1;32787:4:0;32533:266;;;;;:::o;58560:417::-;15239:10;58630:14;58685:7;:5;:7::i;:::-;58670:22;;58712:19;58724:6;58712:11;:19::i;:::-;58711:20;58703:76;;;;-1:-1:-1;;;58703:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58814:16:0;;;;;;:8;:16;;;;;:23;;;58798:13;58807:4;58798:6;:13;:::i;:::-;:39;58790:60;;;;-1:-1:-1;;;58790:60:0;;;;;;;:::i;:::-;58889:13;58898:4;58889:6;:13;:::i;:::-;-1:-1:-1;;;;;58861:16:0;;;;;;:8;:16;;;;;:23;;:42;;:23;;:16;:42;;;;;:::i;:::-;;;;-1:-1:-1;58931:13:0;;-1:-1:-1;58940:4:0;58931:6;:13;:::i;:::-;58914;;:30;;;;;;;:::i;:::-;;;;;;;;58963:6;58955:4;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;58560:417:0:o;50839:174::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;50912:2:::1;50907:1;:7;;50899:41;;;::::0;-1:-1:-1;;;50899:41:0;;13191:2:1;50899:41:0::1;::::0;::::1;13173:21:1::0;13230:2;13210:18;;;13203:30;-1:-1:-1;;;13249:18:1;;;13242:51;13310:18;;50899:41:0::1;13163:171:1::0;50899:41:0::1;50959:15;50971:2;50959:11;:15::i;:::-;50951:34;;;;-1:-1:-1::0;;;50951:34:0::1;;;;;;;:::i;:::-;50998:3;:7:::0;50839:174::o;43957:726::-;44056:13;;44098:11;;44009:7;;;;;44120:431;44144:38;44165:16;44144:20;:38::i;:::-;44140:1;:42;44120:431;;;44204:15;44222:37;44239:16;44257:1;44222:16;:37::i;:::-;-1:-1:-1;;;;;44293:17:0;;44274:16;44293:17;;;:8;:17;;;;;:24;;;;44351;;;;;44204:55;;-1:-1:-1;44293:24:0;44394:18;;;;:40;;;44427:7;44416:8;:18;44394:40;44390:81;;;44444:13;;44459:11;;44436:35;;;;;;;;;;43957:726;;:::o;44390:81::-;44486:19;44497:8;44486:19;;:::i;:::-;;-1:-1:-1;44520:19:0;44531:8;44520:19;;:::i;:::-;;;44189:362;;;44184:3;;;;;:::i;:::-;;;;44120:431;;;;44591:11;;44575:13;;:27;;;;:::i;:::-;44565:7;:37;44561:78;;;44612:13;;44627:11;;44604:35;;;;;;43957:726;;:::o;44561:78::-;44658:7;;44667;;-1:-1:-1;43957:726:0;-1:-1:-1;43957:726:0:o;55283:84::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;55343:12:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;55343:16:0::1;-1:-1:-1::0;;;;55343:16:0;;::::1;::::0;;;::::1;::::0;;55283:84::o;57552:165::-;-1:-1:-1;;;;;57617:19:0;;57626:10;57617:19;;57609:49;;;;-1:-1:-1;;;57609:49:0;;11020:2:1;57609:49:0;;;11002:21:1;11059:2;11039:18;;;11032:30;-1:-1:-1;;;11078:18:1;;;11071:47;11135:18;;57609:49:0;10992:167:1;57609:49:0;57678:10;57669:20;;;;:8;:20;;;;;:32;;:40;;-1:-1:-1;;;;;;57669:40:0;-1:-1:-1;;;;;57669:40:0;;;;;;;;;;57552:165::o;59051:269::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;59162:15:::1;59174:2;59162:11;:15::i;:::-;59154:34;;;;-1:-1:-1::0;;;59154:34:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59207:29:0;::::1;59231:4;59207:29;;59199:53;;;;-1:-1:-1::0;;;59199:53:0::1;;;;;;;:::i;:::-;59293:5;::::0;59263:49:::1;::::0;-1:-1:-1;;;59263:49:0;;-1:-1:-1;;;;;59293:5:0;;::::1;59263:49;::::0;::::1;6817:51:1::0;6884:18;;;6877:34;;;59263:29:0;;::::1;::::0;::::1;::::0;6790:18:1;;59263:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59051:269:::0;;:::o;31794:214::-;15239:10;31882:4;31931:24;;;:10;:24;;;;;;;;-1:-1:-1;;;;;31931:33:0;;;;;;;;;;31882:4;;31899:79;;31922:7;;31931:46;;31967:10;;31931:46;:::i;56607:112::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;56692:19:::1;::::0;;-1:-1:-1;;;;56669:42:0;::::1;-1:-1:-1::0;;;56692:19:0;;;::::1;;;56691:20;56669:42:::0;;::::1;;::::0;;56607:112::o;50674:157::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;50759:14:::1;50771:1;50759:11;:14::i;:::-;50751:33;;;;-1:-1:-1::0;;;50751:33:0::1;;;;;;;:::i;:::-;50795:12;:28:::0;50674:157::o;44778:749::-;-1:-1:-1;;;;;44906:16:0;;;44852:17;44906:16;;;:8;:16;;;;;;:25;44969:19;;;;;;;:28;44852:17;;44906:25;;;;;;;;;44969:28;;;;;44906:25;45012:40;;;;;45033:19;45032:20;45012:40;45008:493;;;45073:28;45069:32;;45008:493;;;45124:16;45123:17;:40;;;;;45144:19;45123:40;45119:382;;;45184:26;45180:30;;45119:382;;;45233:16;45232:17;:41;;;;;45254:19;45253:20;45232:41;45228:273;;;45294:24;45290:28;;45228:273;;;45340:16;:39;;;;;45360:19;45340:39;45336:165;;;45400:28;45396:32;;45336:165;;;45465:24;45461:28;;45336:165;45511:8;;44778:749;;;;:::o;45797:585::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;45863:14:::1;45875:1;45863:11;:14::i;:::-;45855:33;;;;-1:-1:-1::0;;;45855:33:0::1;;;;;;;:::i;:::-;45915:1;45907:4;:9;;45899:46;;;::::0;-1:-1:-1;;;45899:46:0;;10667:2:1;45899:46:0::1;::::0;::::1;10649:21:1::0;10706:2;10686:18;;;10679:30;10745:26;10725:18;;;10718:54;10789:18;;45899:46:0::1;10639:174:1::0;45899:46:0::1;45982:15;;45964;:33;45956:54;;;;-1:-1:-1::0;;;45956:54:0::1;;;;;;;:::i;:::-;46042:5;::::0;-1:-1:-1;;;;;46042:5:0::1;46021:9;46033:15:::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;46085:8:::1;46089:4:::0;46033:22;46085:8:::1;:::i;:::-;46066:28;;46118:9;46140:7;:5;:7::i;:::-;46130:17;::::0;:7;:17:::1;:::i;:::-;46167:5;::::0;-1:-1:-1;;;;;46167:5:0::1;46158:15;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;:33:::0;;46118:29;;-1:-1:-1;46184:7:0;;46158:22;;:15;:33:::1;::::0;46184:7;;46158:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;46211:14:0::1;::::0;-1:-1:-1;;;;;46211:14:0::1;46202:24;::::0;;;:8:::1;:24;::::0;;;;:31:::1;;:42:::0;;46237:7;;46202:24;:42:::1;::::0;46237:7;;46202:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;46276:14:0::1;::::0;46269:5:::1;::::0;46260:34:::1;::::0;8334:25:1;;;-1:-1:-1;;;;;46276:14:0;;::::1;::::0;46269:5;;::::1;::::0;-1:-1:-1;;;;;;;;;;;46260:34:0;8322:2:1;8307:18;46260:34:0::1;;;;;;;46305:10;:8;:10::i;:::-;46362:12;::::0;46344:30:::1;::::0;:15:::1;:30;:::i;:::-;46326:15;:48:::0;-1:-1:-1;;;;45797:585:0:o;52445:81::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;52506:5:::1;:12:::0;;-1:-1:-1;;;;;;52506:12:0::1;-1:-1:-1::0;;;;;52506:12:0;;;::::1;::::0;;;::::1;::::0;;52445:81::o;54583:578::-;54636:14;54648:1;54636:11;:14::i;:::-;54628:33;;;;-1:-1:-1;;;54628:33:0;;;;;;;:::i;:::-;54700:10;6330:20;6369:8;54672:56;;;;-1:-1:-1;;;54672:56:0;;22118:2:1;54672:56:0;;;22100:21:1;22157:2;22137:18;;;22130:30;-1:-1:-1;;;22176:18:1;;;22169:42;22228:18;;54672:56:0;22090:162:1;54672:56:0;54784:14;;-1:-1:-1;;;;;54765:16:0;;;;;;:12;:16;;;;;;:33;;54784:14;54765:33;:::i;:::-;54747:15;:51;:76;;;;-1:-1:-1;;;;;;54802:16:0;;;;;;:12;:16;;;;;;:21;;54747:76;54739:98;;;;-1:-1:-1;;;54739:98:0;;23897:2:1;54739:98:0;;;23879:21:1;23936:1;23916:18;;;23909:29;-1:-1:-1;;;23954:18:1;;;23947:39;24003:18;;54739:98:0;23869:158:1;54739:98:0;-1:-1:-1;;;;;54862:12:0;;54848:11;54862:12;;;:8;:12;;;;;:19;;;;54892:23;;;54955:7;54961:1;54862:19;54955:7;:::i;:::-;26169:42;54926:18;;;;:8;:18;;-1:-1:-1;;;;;;;;;;;54926:36:0;;:25;;:18;:36;;;;;:::i;:::-;;;;-1:-1:-1;54990:7:0;;-1:-1:-1;54996:1:0;54990:3;:7;:::i;:::-;54973:13;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;55039:8:0;;-1:-1:-1;55045:2:0;55039:3;:8;:::i;:::-;55017:10;55008:20;;;;:8;:20;;;;;:27;;:39;;:27;;:20;:39;;;;;:::i;:::-;;;;-1:-1:-1;55096:8:0;;-1:-1:-1;55102:2:0;55096:3;:8;:::i;:::-;55085:7;55091:1;55085:3;:7;:::i;:::-;:20;;;;:::i;:::-;55067:6;;-1:-1:-1;;;;;55067:6:0;55058:16;;;;:8;:16;;;;;:23;;:47;;:23;;:16;:47;;;;;:::i;:::-;;;;-1:-1:-1;55134:10:0;;-1:-1:-1;;;;;;55121:32:0;;-1:-1:-1;;;;;;;;;;;55146:6:0;55150:2;55146:3;:6;:::i;:::-;55121:32;;8334:25:1;;;8322:2;8307:18;55121:32:0;;;;;;;54617:544;54583:578;:::o;48190:369::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48263:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:26;;;::::1;;;48262:27;48254:67;;;::::0;-1:-1:-1;;;48254:67:0;;14224:2:1;48254:67:0::1;::::0;::::1;14206:21:1::0;14263:2;14243:18;;;14236:30;14302:29;14282:18;;;14275:57;14349:18;;48254:67:0::1;14196:177:1::0;48254:67:0::1;-1:-1:-1::0;;;;;48332:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:33;;-1:-1:-1;;48332:33:0::1;::::0;::::1;::::0;;48379:24:::1;;::::0;:28;48376:121:::1;;48478:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;48451:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;:34:::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;48424:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;:61:::0;48376:121:::1;48507:44;48525:16;48543:7;48507:17;:44::i;49525:164::-:0;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;49603:9:::1;::::0;-1:-1:-1;;;49603:9:0;::::1;;;49602:10;49594:50;;;::::0;-1:-1:-1;;;49594:50:0;;20300:2:1;49594:50:0::1;::::0;::::1;20282:21:1::0;20339:2;20319:18;;;20312:30;20378:29;20358:18;;;20351:57;20425:18;;49594:50:0::1;20272:177:1::0;49594:50:0::1;-1:-1:-1::0;;;;;49655:11:0;;::::1;;::::0;;;:8:::1;:11;::::0;;;;:26;;;::::1;;::::0;::::1;-1:-1:-1::0;;49655:26:0;;::::1;::::0;;;::::1;::::0;;49525:164::o;55774:518::-;15239:10;55830:14;55885:7;:5;:7::i;:::-;55870:22;;55912:19;55924:6;55912:11;:19::i;:::-;55911:20;55903:76;;;;-1:-1:-1;;;55903:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56014:16:0;;;;;;:8;:16;;;;;:23;;;55998:13;56007:4;55998:6;:13;:::i;:::-;:39;55990:60;;;;-1:-1:-1;;;55990:60:0;;;;;;;:::i;:::-;56089:13;56098:4;56089:6;:13;:::i;:::-;-1:-1:-1;;;;;56061:16:0;;;;;;:8;:16;;;;;:23;;:42;;:23;;:16;:42;;;;;:::i;:::-;;;;-1:-1:-1;56144:13:0;;-1:-1:-1;56153:4:0;56144:6;:13;:::i;:::-;26169:42;56114:18;;;;:8;:18;;-1:-1:-1;;;;;;;;;;;56114:44:0;;:25;;:18;:44;;;;;:::i;:::-;;;;-1:-1:-1;;26169:42:0;56169:18;;;;:8;:18;;:25;:37;;56199:6;;56169:18;:37;;56199:6;;56169:37;:::i;:::-;;;;-1:-1:-1;56217:10:0;;-1:-1:-1;56217:8:0;:10::i;:::-;56243:41;;8334:25:1;;;26169:42:0;;56260:4;;-1:-1:-1;;;;;;;;;;;56243:41:0;8322:2:1;8307:18;56243:41:0;;;;;;;;55819:473;;55774:518;:::o;41862:163::-;-1:-1:-1;;;;;41962:16:0;;41938:4;41962:16;;;:8;:16;;;;;:24;;;;:55;;-1:-1:-1;;;;;;41990:19:0;;;;;;:8;:19;;;;;:27;;;41962:55;41955:62;41862:163;-1:-1:-1;;;41862:163:0:o;49387:130::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49472:17:0;;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:37;;-1:-1:-1;;49472:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49387:130::o;53357:171::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;53449:15:::1;53461:2;53449:11;:15::i;:::-;53441:34;;;;-1:-1:-1::0;;;53441:34:0::1;;;;;;;:::i;:::-;53486:15;:34:::0;53357:171::o;46390:461::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;46456:14:::1;46468:1;46456:11;:14::i;:::-;46448:33;;;;-1:-1:-1::0;;;46448:33:0::1;;;;;;;:::i;:::-;46508:1;46500:4;:9;;46492:48;;;::::0;-1:-1:-1;;;46492:48:0;;21407:2:1;46492:48:0::1;::::0;::::1;21389:21:1::0;21446:2;21426:18;;;21419:30;21485:28;21465:18;;;21458:56;21531:18;;46492:48:0::1;21379:176:1::0;46492:48:0::1;46577:15;;46559;:33;46551:54;;;;-1:-1:-1::0;;;46551:54:0::1;;;;;;;:::i;:::-;26169:42;46616:15;46635:18:::0;;;:8:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;46635:25:0;:32:::1;::::0;46663:4;;46635:32:::1;:::i;:::-;26169:42;46692:18;::::0;;;:8:::1;:18;::::0;-1:-1:-1;;;;;;;;;;;46692:36:0;;46616:52;;-1:-1:-1;46616:52:0;;46692:25;;:18;:36:::1;::::0;46616:52;;46692:36:::1;:::i;:::-;;;;;;;;46756:7;46739:13;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;46774:10:0::1;::::0;-1:-1:-1;46774:8:0::1;:10::i;:::-;46831:12;::::0;46813:30:::1;::::0;:15:::1;:30;:::i;:::-;46795:15;:48:::0;-1:-1:-1;;46390:461:0:o;53536:584::-;53588:15;53600:2;53588:11;:15::i;:::-;53580:34;;;;-1:-1:-1;;;53580:34:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53633:12:0;;;;;;:8;:12;;;;;:27;-1:-1:-1;;;53633:27:0;;;;:35;;53664:4;53633:35;53625:51;;;;-1:-1:-1;;;53625:51:0;;15350:2:1;53625:51:0;;;15332:21:1;15389:1;15369:18;;;15362:29;-1:-1:-1;;;15407:18:1;;;15400:33;15450:18;;53625:51:0;15322:152:1;53625:51:0;53715:10;6330:20;6369:8;53687:64;;;;-1:-1:-1;;;53687:64:0;;18412:2:1;53687:64:0;;;18394:21:1;18451:2;18431:18;;;18424:30;-1:-1:-1;;;18470:18:1;;;18463:50;18530:18;;53687:64:0;18384:170:1;53687:64:0;53811:15;;32330:11;;53795:31;;;;:::i;:::-;53770:21;53780:10;53770:9;:21::i;:::-;:56;;:79;;;-1:-1:-1;53844:5:0;;-1:-1:-1;;;;;53844:5:0;53830:10;:19;53770:79;53762:102;;;;-1:-1:-1;;;53762:102:0;;25411:2:1;53762:102:0;;;25393:21:1;25450:2;25430:18;;;25423:30;-1:-1:-1;;;25469:18:1;;;25462:40;25519:18;;53762:102:0;25383:160:1;53762:102:0;53889:10;53883:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;53883:21:0;;;;;;;;;;;;:30;53875:57;;;;-1:-1:-1;;;53875:57:0;;12849:2:1;53875:57:0;;;12831:21:1;12888:2;12868:18;;;12861:30;-1:-1:-1;;;12907:18:1;;;12900:43;12960:18;;53875:57:0;12821:163:1;53875:57:0;-1:-1:-1;;;;;53943:12:0;;;;;;:8;:12;;;;;:18;;:23;;53965:1;;53943:12;:23;;53965:1;;53943:23;:::i;:::-;;;;-1:-1:-1;;54002:9:0;;-1:-1:-1;;;;;53980:12:0;;;;;;:8;:12;;;;;:18;;;:31;53977:97;;-1:-1:-1;;;;;54028:16:0;;;;;;:12;:16;;;;;54047:15;54028:34;;53977:97;54090:10;54084:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;54084:21:0;;;;;;;;;;:28;;-1:-1:-1;;54084:28:0;54108:4;54084:28;;;53536:584::o;51288:302::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;51357:14:::1;51369:1;51357:11;:14::i;:::-;51349:33;;;;-1:-1:-1::0;;;51349:33:0::1;;;;;;;:::i;:::-;51402:6;::::0;;-1:-1:-1;;;;;51402:6:0;;::::1;51420:5;51393:16:::0;;;:8:::1;:16;::::0;;;;;:32;;-1:-1:-1;;51393:32:0;;::::1;::::0;;;51445:6;;;::::1;51436:16:::0;;;;;:35;;-1:-1:-1;;51436:35:0;;::::1;::::0;;;51482:13;;;;::::1;-1:-1:-1::0;;;;;;51482:13:0;;::::1;::::0;::::1;::::0;;51506:16;;;;;;:31;;;;::::1;51402:6:::0;51506:31:::1;::::0;;51557:6;;;;::::1;51548:16:::0;;;:34;;;;::::1;51436:35:::0;51548:34:::1;::::0;;51288:302::o;31041:228::-;31107:7;31130:20;31142:7;31130:11;:20::i;:::-;31127:83;;;-1:-1:-1;;;;;;31174:17:0;;;;;:8;:17;;;;;:24;;;;31041:228::o;31127:83::-;31254:7;:5;:7::i;:::-;-1:-1:-1;;;;;31227:17:0;;;;;;:8;:17;;;;;:24;;;:34;;;;:::i;57869:172::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;57960:5:::1;::::0;57939:39:::1;::::0;57975:1:::1;::::0;-1:-1:-1;;;;;57960:5:0::1;::::0;57939:39:::1;::::0;57975:1;;57939:39:::1;57989:5;:18:::0;;-1:-1:-1;;;;;;57989:18:0::1;::::0;;58018:2:::1;:15:::0;;-1:-1:-1;;;;;;58018:15:0::1;::::0;;57869:172::o;45535:135::-;45572:7;45593:9;45604;45617:22;:20;:22::i;:::-;45592:47;;-1:-1:-1;45592:47:0;-1:-1:-1;45657:5:0;45592:47;;45657:5;:::i;:::-;45650:12;;;;45535:135;:::o;58051:361::-;58129:18;;58115:11;;58097:29;;:15;:29;:::i;:::-;:50;58094:231;;;58164:10;:21;;-1:-1:-1;;;;;;58164:21:0;26169:42;58164:21;;;;;;-1:-1:-1;58200:12:0;:16;58245:15;58231:11;:29;;;58280:33;;8334:25:1;;;58280:33:0;;8322:2:1;8307:18;58280:33:0;;;;;;;58094:231;58338:10;;-1:-1:-1;;;;;58338:10:0;26169:42;58338:22;58335:70;;;58392:1;58377:12;:16;58335:70;58051:361::o;60851:672::-;60919:15;60931:2;60919:11;:15::i;:::-;60911:34;;;;-1:-1:-1;;;60911:34:0;;;;;;;:::i;:::-;60978:5;;-1:-1:-1;;;;;60978:5:0;60964:10;:19;;:50;;-1:-1:-1;61009:4:0;;-1:-1:-1;;;;;61009:4:0;60987:10;:27;60964:50;60956:73;;;;-1:-1:-1;;;60956:73:0;;11700:2:1;60956:73:0;;;11682:21:1;11739:2;11719:18;;;11712:30;-1:-1:-1;;;11758:18:1;;;11751:40;11808:18;;60956:73:0;11672:160:1;60956:73:0;61064:15;61048:13;;:31;61040:53;;;;-1:-1:-1;;;61040:53:0;;23210:2:1;61040:53:0;;;23192:21:1;23249:1;23229:18;;;23222:29;-1:-1:-1;;;23267:18:1;;;23260:39;23316:18;;61040:53:0;23182:158:1;61040:53:0;61121:7;61145:14;;61104;;61121:7;61130:29;;:12;:29;:::i;:::-;61121:40;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;61121:40:0;;-1:-1:-1;61213:7:0;:5;:7::i;:::-;61199:11;;:21;;;;:::i;:::-;-1:-1:-1;;;;;61172:16:0;;;;;;:8;:16;;;;;:23;;:48;;:23;;:16;:48;;;;;:::i;:::-;;;;-1:-1:-1;;61265:11:0;;61236:41;;-1:-1:-1;;;;;61236:41:0;;;;;;;61251:12;28324:25:1;;28380:2;28365:18;;28358:34;28312:2;28297:18;;28279:119;61236:41:0;;;;;;;;61302:14;;61326:11;;61293:45;;8334:25:1;;;-1:-1:-1;;;;;61293:45:0;;;;61302:14;;-1:-1:-1;;;;;;;;;;;61293:45:0;8322:2:1;8307:18;61293:45:0;;;;;;;61353:9;61349:86;61370:7;:14;61366:18;;61349:86;;;61413:7;61421:1;61413:10;;;;;;;;:::i;:::-;;;;;;;;;;61406:17;;-1:-1:-1;;;;;;61406:17:0;;;61386:3;;;;:::i;:::-;;;;61349:86;;;-1:-1:-1;;61459:1:0;61445:11;:15;;;61471:11;:19;;-1:-1:-1;;61471:19:0;;;61501:10;:14;-1:-1:-1;60851:672:0:o;54431:144::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;54509:15:::1;54521:2;54509:11;:15::i;:::-;54501:34;;;;-1:-1:-1::0;;;54501:34:0::1;;;;;;;:::i;:::-;54546:15;:21:::0;54431:144::o;42307:659::-;-1:-1:-1;;;;;42663:17:0;;42398:12;42663:17;;;:8;:17;;;;;:25;;42703:26;42834:23;;;;42398:12;;;;;;;;;;;;42663:25;;;;;42703:26;;;;;;42744:28;;;;;;-1:-1:-1;;;42787:32:0;;;;;;;42899:7;:5;:7::i;:::-;-1:-1:-1;;;;;42872:17:0;;;;;;:8;:17;;;;;:24;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;42921:17:0;;;;;;;;:8;:17;;;;;:26;;;42641:317;;;;;;-1:-1:-1;42641:317:0;;-1:-1:-1;42641:317:0;-1:-1:-1;42641:317:0;-1:-1:-1;42921:26:0;;-1:-1:-1;42307:659:0;-1:-1:-1;;42307:659:0:o;47960:221::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;48036:9:::1;:16:::0;;-1:-1:-1;;;;48036:16:0::1;-1:-1:-1::0;;;48036:16:0::1;::::0;;48092:24:::1;:15;48110:6;48092:24;:::i;:::-;48063:26;:53:::0;48142:31:::1;48160:13:::0;48142:15:::1;:31;:::i;:::-;48127:12;:46:::0;-1:-1:-1;47960:221:0:o;49005:184::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;49090:1:::1;49081:5;:10;;49073:31;;;;-1:-1:-1::0;;;49073:31:0::1;;;;;;;:::i;:::-;49123:15;49135:2;49123:11;:15::i;:::-;49115:34;;;;-1:-1:-1::0;;;49115:34:0::1;;;;;;;:::i;:::-;49162:11;:19:::0;49005:184::o;42055:118::-;-1:-1:-1;;;;;42137:17:0;42113:4;42137:17;;;:8;:17;;;;;:28;;;;;;;42055:118::o;59682:476::-;59730:11;;;;59722:44;;;;-1:-1:-1;;;59722:44:0;;16357:2:1;59722:44:0;;;16339:21:1;16396:2;16376:18;;;16369:30;-1:-1:-1;;;16415:18:1;;;16408:50;16475:18;;59722:44:0;16329:170:1;59722:44:0;59794:10;59786:19;;;;:7;:19;;;;;;;;59806:10;;59786:31;;;;;;;;;;59785:32;59777:60;;;;-1:-1:-1;;;59777:60:0;;25750:2:1;59777:60:0;;;25732:21:1;25789:2;25769:18;;;25762:30;-1:-1:-1;;;25808:18:1;;;25801:45;25863:18;;59777:60:0;25722:165:1;59777:60:0;59874:10;;59856:7;:14;:28;;59848:52;;;;-1:-1:-1;;;59848:52:0;;18072:2:1;59848:52:0;;;18054:21:1;18111:2;18091:18;;;18084:30;-1:-1:-1;;;18130:18:1;;;18123:41;18181:18;;59848:52:0;18044:161:1;59848:52:0;59958:18;;59944:11;;:32;;;;:::i;:::-;59919:21;59929:10;59919:9;:21::i;:::-;:57;;59911:96;;;;-1:-1:-1;;;59911:96:0;;19945:2:1;59911:96:0;;;19927:21:1;19984:2;19964:18;;;19957:30;20023:28;20003:18;;;19996:56;20069:18;;59911:96:0;19917:176:1;59911:96:0;60025:10;60018:18;;;;:6;:18;;;;;;;;60037:10;;;60018:30;;;;;;;;60051:15;60018:48;;60077:19;;;:7;:19;;;;;60097:10;;60077:31;;;;;;;:38;;-1:-1:-1;;60077:38:0;60111:4;60077:38;;;;;;60126:7;:24;;;;;;;;;;;;;;-1:-1:-1;;;;;;60126:24:0;;;;;;59682:476::o;46859:1030::-;46958:5;;-1:-1:-1;;;;;46958:5:0;46944:10;:19;;:54;;-1:-1:-1;46989:8:0;;-1:-1:-1;;;;;46989:8:0;46967:10;:31;46944:54;46936:78;;;;-1:-1:-1;;;46936:78:0;;;;;;;:::i;:::-;47033:12;;-1:-1:-1;;;47033:12:0;;;;47025:39;;;;-1:-1:-1;;;47025:39:0;;17042:2:1;47025:39:0;;;17024:21:1;17081:2;17061:18;;;17054:30;-1:-1:-1;;;17100:18:1;;;17093:44;17154:18;;47025:39:0;17014:164:1;47025:39:0;47083:14;47095:1;47083:11;:14::i;:::-;47075:33;;;;-1:-1:-1;;;47075:33:0;;;;;;;:::i;:::-;47136:8;;:28;;;-1:-1:-1;;;47136:28:0;;;;47119:14;;-1:-1:-1;;;;;47136:8:0;;:26;;:28;;;;;;;;;;;;;;:8;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47119:45;-1:-1:-1;47175:13:0;47191:15;47119:45;47191:6;:15;:::i;:::-;47175:31;;47217:12;47232:7;:5;:7::i;:::-;47217:22;-1:-1:-1;47250:9:0;47262:13;47217:22;47262:6;:13;:::i;:::-;47250:25;-1:-1:-1;47286:14:0;47314:13;;;47311:247;;-1:-1:-1;47353:10:0;47311:247;;;47385:8;:13;;47397:1;47385:13;47381:177;;;-1:-1:-1;26169:42:0;47381:177;;;47454:8;:13;;47466:1;47454:13;47450:108;;;-1:-1:-1;47493:5:0;;-1:-1:-1;;;;;47493:5:0;47450:108;;;-1:-1:-1;47540:6:0;;-1:-1:-1;;;;;47540:6:0;47450:108;-1:-1:-1;;;;;47576:16:0;;;;;;:8;:16;;;;;:23;;;:27;-1:-1:-1;47568:48:0;;;;-1:-1:-1;;;47568:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47627:16:0;;;;;;:8;:16;;;;;:23;;:28;;47654:1;;47627:16;:28;;47654:1;;47627:28;:::i;:::-;;;;-1:-1:-1;47671:9:0;;-1:-1:-1;47666:216:0;47690:6;47686:1;:10;47666:216;;;47737:8;;:24;;-1:-1:-1;;;47737:24:0;;;;;8334:25:1;;;47718:16:0;;-1:-1:-1;;;;;47737:8:0;;:21;;8307:18:1;;47737:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47776:18:0;;;;;;:8;:18;;;;;:25;;:34;;47718:43;;-1:-1:-1;47805:5:0;;47776:25;;:18;:34;;47805:5;;47776:34;:::i;:::-;;;;-1:-1:-1;;;;;;;47830:40:0;;;;;;-1:-1:-1;;;;;;;;;;;47857:12:0;47865:4;47857:5;:12;:::i;:::-;47830:40;;8334:25:1;;;8322:2;8307:18;47830:40:0;;;;;;;-1:-1:-1;47698:3:0;;;;:::i;:::-;;;;47666:216;;;;46925:964;;;;;46859:1030;;:::o;60166:679::-;60293:15;60305:2;60293:11;:15::i;:::-;60285:34;;;;-1:-1:-1;;;60285:34:0;;;;;;;:::i;:::-;60352:5;;-1:-1:-1;;;;;60352:5:0;60338:10;:19;;:50;;-1:-1:-1;60383:4:0;;-1:-1:-1;;;;;60383:4:0;60361:10;:27;60338:50;60330:73;;;;-1:-1:-1;;;60330:73:0;;11700:2:1;60330:73:0;;;11682:21:1;11739:2;11719:18;;;11712:30;-1:-1:-1;;;11758:18:1;;;11751:40;11808:18;;60330:73:0;11672:160:1;60330:73:0;60431:3;60422:5;:12;;:27;;;;;60447:2;60438:5;:11;;60422:27;60414:48;;;;-1:-1:-1;;;60414:48:0;;16021:2:1;60414:48:0;;;16003:21:1;16060:1;16040:18;;;16033:29;-1:-1:-1;;;16078:18:1;;;16071:38;16126:18;;60414:48:0;15993:157:1;60414:48:0;60493:7;60481:8;:19;;:46;;;;;60519:8;60504:11;:23;;60481:46;60473:67;;;;-1:-1:-1;;;60473:67:0;;16706:2:1;60473:67:0;;;16688:21:1;16745:1;16725:18;;;16718:29;-1:-1:-1;;;16763:18:1;;;16756:38;16811:18;;60473:67:0;16678:157:1;60473:67:0;60551:10;:12;;;:10;:12;;;:::i;:::-;;;;;;60574:9;60586:2;:22;;26169:42;60586:22;;;60591:6;;-1:-1:-1;;;;;60591:6:0;60586:22;60574:34;;60650:7;:5;:7::i;:::-;60641:16;;:6;:16;:::i;:::-;-1:-1:-1;;;;;60619:11:0;;;;;;:8;:11;;;;;:18;;:38;;:18;;:11;:38;;;;;:::i;:::-;;;;-1:-1:-1;;60668:11:0;:20;;;60699:11;:18;;-1:-1:-1;;60699:18:0;60713:4;60699:18;;;60728:10;:18;;;60757:13;:24;;;60808:29;60826:11;60808:15;:29;:::i;:::-;60792:13;:45;-1:-1:-1;;;;;;60166:679:0:o;30794:87::-;30833:13;30866:7;30859:14;;;;;:::i;51188:92::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;51248:17:::1;:24:::0;;-1:-1:-1;;;;;51248:24:0::1;-1:-1:-1::0;;;51248:24:0::1;::::0;;51188:92::o;32016:226::-;15239:10;32109:4;32158:24;;;:10;:24;;;;;;;;-1:-1:-1;;;;;32158:33:0;;;;;;;;;;32109:4;;32126:86;;32149:7;;32158:53;;32195:15;;32158:53;:::i;56409:190::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;56522:9:::1;:28;;56544:6;::::0;-1:-1:-1;;;;;56544:6:0::1;56522:28;;;26169:42;56522:28;56505:14;:45:::0;;-1:-1:-1;;;;;;56505:45:0::1;-1:-1:-1::0;;;;;56505:45:0;;;::::1;::::0;;;::::1;::::0;;56561:14:::1;:30:::0;;-1:-1:-1;;;;56561:30:0::1;-1:-1:-1::0;;;56561:30:0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;56409:190:0:o;55171:104::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;55240:8:::1;:27:::0;;-1:-1:-1;;;;;;55240:27:0::1;-1:-1:-1::0;;;;;55240:27:0;;;::::1;::::0;;;::::1;::::0;;55171:104::o;32357:168::-;32435:4;32452:43;15239:10;32477:9;32488:6;32452:10;:43::i;45678:75::-;45732:5;;;;;;;;;-1:-1:-1;;;;;45732:5:0;-1:-1:-1;;;;;45717:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45678:75::o;49974:181::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;50069:15:::1;50081:2;50069:11;:15::i;:::-;50061:34;;;;-1:-1:-1::0;;;50061:34:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50106:17:0;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:41;;;::::1;;::::0;::::1;-1:-1:-1::0;;50106:41:0;;::::1;::::0;;;::::1;::::0;;49974:181::o;43338:611::-;43499:7;;43430:15;;;;-1:-1:-1;;;;;43489:17:0;;;43499:7;;43489:17;43486:437;;;-1:-1:-1;43527:22:0;43486:437;;;-1:-1:-1;;;;;43570:16:0;;;;;;:8;:16;;;;;:29;;;;;;43567:356;;;43631:8;43619;;:20;43616:105;;-1:-1:-1;43683:22:0;43616:105;-1:-1:-1;43739:19:0;43567:356;;;-1:-1:-1;;;;;43779:19:0;;;;;;:8;:19;;;;;:32;;;;;;43776:147;;;-1:-1:-1;43832:20:0;43776:147;;;-1:-1:-1;43889:22:0;43776:147;43940:1;43338:611;-1:-1:-1;;;;43338:611:0:o;49197:182::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;49273:14:::1;49285:1;49273:11;:14::i;:::-;49265:33;;;;-1:-1:-1::0;;;49265:33:0::1;;;;;;;:::i;:::-;49327:1;49317:6;:11;;49309:32;;;;-1:-1:-1::0;;;49309:32:0::1;;;;;;;:::i;:::-;49352:10;:19:::0;49197:182::o;53151:198::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;53266:14:::1;53278:1;53266:11;:14::i;:::-;53258:33;;;;-1:-1:-1::0;;;53258:33:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53302:17:0::1;;::::0;;;:8:::1;:17;::::0;;;;:39;;-1:-1:-1;;53302:39:0::1;-1:-1:-1::0;;;53302:39:0::1;::::0;;53151:198::o;48567:235::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48639:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:26;;;::::1;;;48631:66;;;::::0;-1:-1:-1;;;48631:66:0;;14224:2:1;48631:66:0::1;::::0;::::1;14206:21:1::0;14263:2;14243:18;;;14236:30;14302:29;14282:18;;;14275:57;14349:18;;48631:66:0::1;14196:177:1::0;48631:66:0::1;-1:-1:-1::0;;;;;48708:17:0;::::1;48735:1;48708:17:::0;;;:8:::1;:17;::::0;;;;:24:::1;;:28:::0;48747:47:::1;48768:16;48717:7:::0;48747:20:::1;:47::i;55375:266::-:0;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;55444:15:::1;55456:2;55444:11;:15::i;:::-;55436:34;;;;-1:-1:-1::0;;;55436:34:0::1;;;;;;;:::i;:::-;55536:17:::0;::::1;55572:15:::0;55564:46:::1;;;::::0;-1:-1:-1;;;55564:46:0;;13541:2:1;55564:46:0::1;::::0;::::1;13523:21:1::0;13580:2;13560:18;;;13553:30;-1:-1:-1;;;13599:18:1;;;13592:48;13657:18;;55564:46:0::1;13513:168:1::0;55564:46:0::1;-1:-1:-1::0;55621:5:0::1;:12:::0;;-1:-1:-1;;;;;;55621:12:0::1;-1:-1:-1::0;;;;;55621:12:0;;;::::1;::::0;;;::::1;::::0;;55375:266::o;51996:140::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;52070:15:::1;52082:2;52070:11;:15::i;:::-;52062:34;;;;-1:-1:-1::0;;;52062:34:0::1;;;;;;;:::i;:::-;52107:11;:21:::0;;;::::1;;-1:-1:-1::0;;;52107:21:0::1;-1:-1:-1::0;;;;52107:21:0;;::::1;::::0;;;::::1;::::0;;51996:140::o;51021:143::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;51097:15:::1;51109:2;51097:11;:15::i;:::-;51089:34;;;;-1:-1:-1::0;;;51089:34:0::1;;;;;;;:::i;:::-;51134:18;:22:::0;;;::::1;;-1:-1:-1::0;;;51134:22:0::1;-1:-1:-1::0;;;;51134:22:0;;::::1;::::0;;;::::1;::::0;;51021:143::o;61671:151::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;61753:15:::1;61765:2;61753:11;:15::i;:::-;61745:34;;;;-1:-1:-1::0;;;61745:34:0::1;;;;;;;:::i;:::-;61790:18;:24:::0;61671:151::o;56300:101::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;56379:14:::1;::::0;;-1:-1:-1;;;;56361:32:0;::::1;-1:-1:-1::0;;;56379:14:0;;;::::1;;;56378:15;56361:32:::0;;::::1;;::::0;;56300:101::o;57453:91::-;57513:23;;57534:1;8334:25:1;;-1:-1:-1;;;;;57513:23:0;;;;;-1:-1:-1;;;;;;;;;;;57513:23:0;8322:2:1;8307:18;57513:23:0;;;;;;;57453:91;:::o;51852:136::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;51926:15:::1;51938:2;51926:11;:15::i;:::-;51918:34;;;;-1:-1:-1::0;;;51918:34:0::1;;;;;;;:::i;:::-;51963:10;:17:::0;51852:136::o;52303:134::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;52377:5:::1;:9:::0;;-1:-1:-1;;;;;52377:9:0;;::::1;-1:-1:-1::0;;;;;;52377:9:0;;::::1;::::0;::::1;::::0;;:5:::1;52397:15:::0;;;:8:::1;:15;::::0;;;;;:32;;;::::1;;52377:9;52397:32;-1:-1:-1::0;;52397:32:0;;::::1;::::0;;;::::1;::::0;;52303:134::o;56727:202::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56808:22:0;::::1;56800:73;;;::::0;-1:-1:-1;;;56800:73:0;;12039:2:1;56800:73:0::1;::::0;::::1;12021:21:1::0;12078:2;12058:18;;;12051:30;12117:34;12097:18;;;12090:62;-1:-1:-1;;;12168:18:1;;;12161:36;12214:19;;56800:73:0::1;12011:228:1::0;56800:73:0::1;56884:5;:16:::0;;-1:-1:-1;;;;;;56884:16:0::1;-1:-1:-1::0;;;;;56884:16:0;;;::::1;::::0;;::::1;::::0;;56911:2:::1;:10:::0;;-1:-1:-1;;;;;;56911:10:0::1;56884:16;56911:10:::0;;::::1;::::0;;;::::1;::::0;;56727:202::o;61531:132::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;61596:15:::1;61608:2;61596:11;:15::i;:::-;61588:34;;;;-1:-1:-1::0;;;61588:34:0::1;;;;;;;:::i;:::-;61633:4;:22:::0;;-1:-1:-1;;;;;;61633:22:0::1;-1:-1:-1::0;;;;;61633:22:0;;;::::1;::::0;;;::::1;::::0;;61531:132::o;38927:1668::-;39044:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;39044:25:0;39071:18;39091:22;39131:38;39141:6;39149:9;39160:8;39131:9;:38::i;:::-;39126:43;;39189:28;39199:6;39207:9;39189;:28::i;:::-;39228:17;;;39180:37;-1:-1:-1;39260:5:0;39256:1186;;39285:9;;-1:-1:-1;;;39285:9:0;;;;39282:1149;;;39324:20;39318:2;:26;;;;;;;;:::i;:::-;;39315:990;;;39417:11;;39389:1;;-1:-1:-1;;;39417:11:0;;;;39413:816;;-1:-1:-1;;;;;39499:16:0;;39457:21;39499:16;;;:8;:16;;;;;:25;;;39481:43;;:15;:43;:::i;:::-;39457:67;;39570:10;;39554:13;:26;39551:655;;;39811:2;39798:10;;:15;;;;:::i;:::-;39781:13;:32;39778:401;;39862:10;;:14;;39875:1;39862:14;:::i;:::-;39850:26;;39778:401;;;39947:1;39934:10;;:14;;;;:::i;:::-;39917:13;:31;39914:265;;39997:10;;:14;;40010:1;39997:14;:::i;39914:265::-;40083:1;40070:10;;:14;;;;:::i;:::-;40053:13;:31;40050:129;;40133:10;;:14;;40146:1;40133:14;:::i;:::-;40121:26;;40050:129;39430:799;39413:816;40276:9;40269:3;;40260:6;:12;;;;:::i;:::-;40259:26;;;;:::i;:::-;40251:5;;;:34;-1:-1:-1;39315:990:0;40332:19;40326:2;:25;;;;;;;;:::i;:::-;;40323:93;;;40393:3;;40384:12;;:6;:12;:::i;:::-;40376:5;;;:20;40323:93;40544:5;;;;:9;;40552:1;40544:9;:::i;:::-;40532:8;;:22;;;;:::i;:::-;40513:16;;;:41;38927:1668;;;;;;;;;:::o;59328:155::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;59448:27:::1;59460:15;59448:9:::0;:27:::1;:::i;:::-;59416:29;::::0;;::::1;;::::0;;;:13:::1;:29;::::0;;;;:59;;;;-1:-1:-1;59328:155:0:o;49697:269::-;29465:2;;-1:-1:-1;;;;;29465:2:0;;;;;15239:10;29465:18;29457:42;;;;-1:-1:-1;;;29457:42:0;;;;;;;:::i;:::-;49796:9:::1;::::0;-1:-1:-1;;;49796:9:0;::::1;;;49795:10;49787:50;;;::::0;-1:-1:-1;;;49787:50:0;;20300:2:1;49787:50:0::1;::::0;::::1;20282:21:1::0;20339:2;20319:18;;;20312:30;20378:29;20358:18;;;20351:57;20425:18;;49787:50:0::1;20272:177:1::0;49787:50:0::1;49853:9;49848:111;49868:20:::0;;::::1;49848:111;;;49946:1;49910:8;:22;49919:9;;49929:1;49919:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49910:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49910:22:0;:37;;;::::1;;::::0;::::1;-1:-1:-1::0;;49910:37:0;;::::1;::::0;;;::::1;::::0;;49890:3;::::1;::::0;::::1;:::i;:::-;;;;49848:111;;59491:183:::0;59581:29;;;59557:4;59581:29;;;:13;:29;;;;;;59613:15;-1:-1:-1;59581:47:0;:85;;-1:-1:-1;;59632:29:0;;;;;;:13;:29;;;;;;:34;;59491:183::o;31446:340::-;-1:-1:-1;;;;;31540:20:0;;31532:69;;;;-1:-1:-1;;;31532:69:0;;22805:2:1;31532:69:0;;;22787:21:1;22844:2;22824:18;;;22817:30;22883:34;22863:18;;;22856:62;-1:-1:-1;;;22934:18:1;;;22927:34;22978:19;;31532:69:0;22777:226:1;31532:69:0;-1:-1:-1;;;;;31620:21:0;;31612:68;;;;-1:-1:-1;;;31612:68:0;;12446:2:1;31612:68:0;;;12428:21:1;12485:2;12465:18;;;12458:30;12524:34;12504:18;;;12497:62;-1:-1:-1;;;12575:18:1;;;12568:32;12617:19;;31612:68:0;12418:224:1;31612:68:0;-1:-1:-1;;;;;31693:18:0;;;;;;;:10;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31745:33;;8334:25:1;;;31745:33:0;;8307:18:1;31745:33:0;8289:76:1;8585:220:0;8642:4;6330:20;;6369:8;8659:59;;;;-1:-1:-1;;;8659:59:0;;21762:2:1;8659:59:0;;;21744:21:1;21801:2;21781:18;;;21774:30;21840:29;21820:18;;;21813:57;21887:18;;8659:59:0;21734:177:1;8659:59:0;-1:-1:-1;;;;;;8736:61:0;8754:42;8736:61;;8585:220::o;32847:6072::-;32935:4;-1:-1:-1;;;;;32960:20:0;;32952:70;;;;-1:-1:-1;;;32952:70:0;;21001:2:1;32952:70:0;;;20983:21:1;21040:2;21020:18;;;21013:30;21079:34;21059:18;;;21052:62;-1:-1:-1;;;21130:18:1;;;21123:35;21175:19;;32952:70:0;20973:227:1;32952:70:0;-1:-1:-1;;;;;33041:23:0;;33033:71;;;;-1:-1:-1;;;33033:71:0;;9913:2:1;33033:71:0;;;9895:21:1;9952:2;9932:18;;;9925:30;9991:34;9971:18;;;9964:62;-1:-1:-1;;;10042:18:1;;;10035:33;10085:19;;33033:71:0;9885:225:1;33033:71:0;33132:1;33123:6;:10;33115:64;;;;-1:-1:-1;;;33115:64:0;;19178:2:1;33115:64:0;;;19160:21:1;19217:2;19197:18;;;19190:30;19256:34;19236:18;;;19229:62;-1:-1:-1;;;19307:18:1;;;19300:39;19356:19;;33115:64:0;19150:231:1;33115:64:0;-1:-1:-1;;;;;33216:19:0;;;;;;:8;:19;;;;;:30;;;33198:15;:48;33190:82;;;;-1:-1:-1;;;33190:82:0;;23547:2:1;33190:82:0;;;23529:21:1;23586:2;23566:18;;;23559:30;-1:-1:-1;;;23605:18:1;;;23598:51;23666:18;;33190:82:0;23519:171:1;33190:82:0;33285:12;33300:7;:5;:7::i;:::-;33322:9;;33285:22;;-1:-1:-1;;;;33322:9:0;;;;33318:198;;33453:5;;33377:42;;-1:-1:-1;;;;;33443:15:0;;;33453:5;;33443:15;;:44;;-1:-1:-1;33462:10:0;-1:-1:-1;;;;;33462:25:0;;;33443:44;33435:69;;;;-1:-1:-1;;;33435:69:0;;17731:2:1;33435:69:0;;;17713:21:1;17770:2;17750:18;;;17743:30;-1:-1:-1;;;17789:18:1;;;17782:42;17841:18;;33435:69:0;17703:162:1;33435:69:0;33332:184;33318:198;33596:21;;-1:-1:-1;;;33596:21:0;;;;33592:508;;-1:-1:-1;;;;;33637:16:0;;;;;;:8;:16;;;;;:27;;;;;;:35;;33668:4;33637:35;33634:455;;;33730:15;33701:26;;:44;33693:74;;;;-1:-1:-1;;;33693:74:0;;17385:2:1;33693:74:0;;;17367:21:1;17424:2;17404:18;;;17397:30;-1:-1:-1;;;17443:18:1;;;17436:47;17500:18;;33693:74:0;17357:167:1;33693:74:0;33849:17;;-1:-1:-1;;;33849:17:0;;;;33841:56;;;;-1:-1:-1;;;33841:56:0;;14580:2:1;33841:56:0;;;14562:21:1;14619:2;14599:18;;;14592:30;14658:28;14638:18;;;14631:56;14704:18;;33841:56:0;14552:176:1;33841:56:0;33954:13;;33934:17;33944:6;33934:9;:17::i;:::-;:33;;;;:::i;:::-;33924:6;:43;;33916:64;;;;-1:-1:-1;;;33916:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34007:16:0;;;;;;:8;:16;;;;;:25;;;34044:15;;34007:34;;34035:6;34007:34;:::i;:::-;:52;33999:74;;;;-1:-1:-1;;;33999:74:0;;23897:2:1;33999:74:0;;;23879:21:1;23936:1;23916:18;;;23909:29;-1:-1:-1;;;23954:18:1;;;23947:39;24003:18;;33999:74:0;23869:158:1;33999:74:0;34126:5;;-1:-1:-1;;;;;34113:18:0;;;34126:5;;34113:18;34110:493;;;34151:19;34163:6;34151:11;:19::i;:::-;34148:444;;-1:-1:-1;;;;;34315:16:0;;34301:11;34315:16;;;:8;:16;;;;;:23;;;:30;;34341:4;;34315:30;:::i;:::-;-1:-1:-1;;;;;34373:16:0;;;;;;:8;:16;;;;;:23;;;34301:44;;-1:-1:-1;34367:29:0;;34364:106;;;-1:-1:-1;;;;;34421:16:0;;;;;;:8;:16;;;;;:23;;:29;;;34364:106;34532:11;;-1:-1:-1;;;;;34506:16:0;;;;;;:8;:16;;;;;:23;;;:37;;34532:11;34506:37;:::i;:::-;34496:6;:47;;34488:88;;;;-1:-1:-1;;;34488:88:0;;19588:2:1;34488:88:0;;;19570:21:1;19627:2;19607:18;;;19600:30;19666;19646:18;;;19639:58;19714:18;;34488:88:0;19560:178:1;34488:88:0;34181:411;34148:444;34616:14;;-1:-1:-1;;;34616:14:0;;;;34613:266;;;34660:5;;-1:-1:-1;;;;;34650:15:0;;;34660:5;;34650:15;;:74;;-1:-1:-1;34683:5:0;;-1:-1:-1;;;;;34670:18:0;;;34683:5;;34670:18;;;;:53;;;34692:22;34704:9;34692:11;:22::i;:::-;:31;34670:53;34647:221;;;34817:11;;34803;;:25;;;;:::i;:::-;-1:-1:-1;;;;;34755:19:0;;;;;;:8;:19;;;;;:26;;;34792:6;;34755:33;;34784:4;;34755:33;:::i;:::-;34754:44;;;;:::i;:::-;34753:75;;34745:107;;;;-1:-1:-1;;;34745:107:0;;25063:2:1;34745:107:0;;;25045:21:1;25102:2;25082:18;;;25075:30;-1:-1:-1;;;25121:18:1;;;25114:49;25180:18;;34745:107:0;25035:169:1;34745:107:0;34893:19;;-1:-1:-1;;;34893:19:0;;;;34889:120;;-1:-1:-1;;;;;34936:16:0;;;;;;:8;:16;;;;;:31;-1:-1:-1;;;34936:31:0;;;;:40;34928:69;;;;-1:-1:-1;;;34928:69:0;;20656:2:1;34928:69:0;;;20638:21:1;20695:2;20675:18;;;20668:30;-1:-1:-1;;;20714:18:1;;;20707:46;20770:18;;34928:69:0;20628:166:1;34928:69:0;35024:12;;:17;;;;:51;;;35063:12;;35045:15;:30;35024:51;:70;;;;-1:-1:-1;35089:5:0;;-1:-1:-1;;;;;35079:15:0;;;35089:5;;35079:15;35024:70;35021:246;;;35127:5;;-1:-1:-1;;;;;35114:18:0;;;35127:5;;35114:18;;;;:42;;-1:-1:-1;35149:7:0;;-1:-1:-1;;;;;35136:20:0;;;35149:7;;35136:20;;35114:42;:64;;;;-1:-1:-1;35173:5:0;;-1:-1:-1;;;;;35160:18:0;;;35173:5;;35160:18;;35114:64;35111:145;;;-1:-1:-1;;;;;35199:19:0;;;;;;:8;:19;;;;;:41;;-1:-1:-1;;35199:41:0;-1:-1:-1;;;35199:41:0;;;35111:145;35280:11;;;;35277:200;;;-1:-1:-1;;;;;35311:15:0;;;;;;:7;:15;;;;;;;;35327:10;;35311:27;;;;;;;;;;35308:158;;;35396:13;;-1:-1:-1;;;;;35367:14:0;;;;;;:6;:14;;;;;;;;35382:10;;35367:26;;;;;;;;35412:15;;35367:42;;;:::i;:::-;:60;35359:91;;;;-1:-1:-1;;;35359:91:0;;22459:2:1;35359:91:0;;;22441:21:1;22498:2;22478:18;;;22471:30;-1:-1:-1;;;22517:18:1;;;22510:47;22574:18;;35359:91:0;22431:167:1;35359:91:0;35487:16;35506:17;:15;:17::i;:::-;35487:36;;35534:14;35551:30;35563:6;35571:9;35551:11;:30::i;:::-;35534:47;;35593:25;35620:18;35640:22;35666:53;35672:6;35680:9;35691:6;35699:9;35710:8;35666:5;:53::i;:::-;35592:127;;;;;;35741:8;35730;:19;;;;35760:9;35780:4;35772:1;:5;;;:12;;;;:::i;:::-;35804:6;;-1:-1:-1;;;;;35804:6:0;35795:16;;;;:8;:16;;;;;:23;;:28;;35760:24;;-1:-1:-1;35760:24:0;;35795:23;;:16;:28;;35760:24;;35795:28;:::i;:::-;;;;-1:-1:-1;;35843:8:0;;-1:-1:-1;;;;;35843:8:0;35834:18;;;;:8;:18;;;;;:25;;:30;;35863:1;;35834:18;:30;;35863:1;;35834:30;:::i;:::-;;;;-1:-1:-1;;35884:10:0;;-1:-1:-1;;;;;35884:10:0;35875:20;;;;:8;:20;;;;;:27;;:32;;35906:1;;35875:20;:32;;35906:1;;35875:32;:::i;:::-;;;;-1:-1:-1;35927:20:0;;-1:-1:-1;35921:2:0;:26;;;;;;;;:::i;:::-;;35918:2523;;;35986:6;;35994:5;;;;;35969:31;;8334:25:1;;;-1:-1:-1;;;;;35986:6:0;;;;35969:31;;;-1:-1:-1;;;;;;;;;;;35969:31:0;8322:2:1;8307:18;35969:31:0;;;;;;;36037:8;;36047:5;;;;;36020:33;;8334:25:1;;;-1:-1:-1;;;;;36037:8:0;;;;36020:33;;;-1:-1:-1;;;;;;;;;;;36020:33:0;8322:2:1;8307:18;36020:33:0;;;;;;;36090:10;;36102:5;;;;;36073:35;;8334:25:1;;;-1:-1:-1;;;;;36090:10:0;;;;36073:35;;;-1:-1:-1;;;;;;;;;;;36073:35:0;8322:2:1;8307:18;36073:35:0;;;;;;;36127:14;;-1:-1:-1;;;36127:14:0;;;;36123:80;;36173:14;;36162:8;:25;;-1:-1:-1;;;;;;36162:25:0;-1:-1:-1;;;;;36173:14:0;;;36162:25;;;;;;36123:80;-1:-1:-1;;;;;36217:16:0;;;;;;;:8;:16;;;;;36245:15;36217:25;;;:43;36278:28;;;;:42;36275:317;;-1:-1:-1;;;;;36350:16:0;;;36341:38;36350:16;;;36341:8;36350:16;;;;;;:28;;;;;;36341:38;;;;;:45;;:50;;36390:1;;36341:38;:50;;36390:1;;36341:50;:::i;:::-;;;;-1:-1:-1;;36442:5:0;;;;;36415:33;;8334:25:1;;;26169:42:0;;-1:-1:-1;;;;;36415:33:0;;;-1:-1:-1;;;;;;;;;;;36415:33:0;8322:2:1;8307:18;36415:33:0;;;;;;;35918:2523;;36275:317;26169:42;36489:18;;;;:8;:18;;-1:-1:-1;;;;;;;;;;;36489:30:0;;36518:1;;36489:18;:30;;36518:1;;36489:30;:::i;35918:2523::-;36618:19;36612:2;:25;;;;;;;;:::i;:::-;;36609:1832;;;36679:6;;36687:5;;;;;36659:34;;8334:25:1;;;-1:-1:-1;;;;;36679:6:0;;;;36659:34;;;-1:-1:-1;;;;;;;;;;;36659:34:0;8322:2:1;8307:18;36659:34:0;;;;;;;36733:8;;36743:5;;;;;36713:36;;8334:25:1;;;-1:-1:-1;;;;;36733:8:0;;;;36713:36;;;-1:-1:-1;;;;;;;;;;;36713:36:0;8322:2:1;8307:18;36713:36:0;;;;;;;36789:10;;36801:5;;;;;36769:38;;8334:25:1;;;-1:-1:-1;;;;;36789:10:0;;;;36769:38;;;-1:-1:-1;;;;;;;;;;;36769:38:0;8322:2:1;8307:18;36769:38:0;;;;;;;36835:15;;36825:6;:25;36822:85;;36871:8;:20;;-1:-1:-1;;;;;;36871:20:0;-1:-1:-1;;;;;36871:20:0;;;;;36822:85;-1:-1:-1;;;;;36939:19:0;;36921:14;36939:19;;;:8;:19;;;;;:26;;;36976:6;;36939:33;;36968:4;;36939:33;:::i;:::-;36938:44;;;;:::i;:::-;-1:-1:-1;;;;;37076:19:0;;;;;;:8;:19;;;;;:26;;;36921:61;;-1:-1:-1;37067:35:0;;37064:110;;;-1:-1:-1;;;;;37123:19:0;;;;;;:8;:19;;;;;:26;;:35;;;37064:110;37201:12;;37191:6;:22;37188:226;;37234:10;:22;;-1:-1:-1;;;;;;37234:22:0;-1:-1:-1;;;;;37234:22:0;;;;;;;;37275:12;:21;;;37329:15;37315:11;:29;;;37368:30;;8334:25:1;;;37368:30:0;;8322:2:1;8307:18;37368:30:0;;;;;;;37188:226;-1:-1:-1;;;;;37431:19:0;;;37474:1;37431:19;;;:8;:19;;;;;:31;;;;:45;37428:352;;-1:-1:-1;;;;;37506:19:0;;;37497:41;37506:19;;;37497:8;37506:19;;;;;;:31;;;;;;37497:41;;;;;:48;;:53;;37549:1;;37497:41;:53;;37549:1;;37497:53;:::i;:::-;;;;-1:-1:-1;;;;;;;37594:19:0;;;;;;;:8;:19;;;;;;;:31;;;37627:5;;;;37574:59;;37594:31;;;-1:-1:-1;;;;;;;;;;;37574:59:0;;;8334:25:1;;;8322:2;8307:18;;8289:76;37574:59:0;;;;;;;;37428:352;;;26169:42;37674:18;;;;:8;:18;;-1:-1:-1;;;;;;;;;;;37674:30:0;;37703:1;;37674:18;:30;;37703:1;;37674:30;:::i;:::-;;;;-1:-1:-1;;37758:5:0;;;;;37728:36;;8334:25:1;;;26169:42:0;;-1:-1:-1;;;;;37728:36:0;;;-1:-1:-1;;;;;;;;;;;37728:36:0;8322:2:1;8307:18;37728:36:0;;;;;;;37428:352;-1:-1:-1;;;;;;37835:19:0;;;;;;:8;:19;;;;;37865:15;37835:27;;;;:45;36609:1832;;;37985:8;:19;;-1:-1:-1;;;;;;37985:19:0;26169:42;37985:19;;;-1:-1:-1;;;;;38037:19:0;;37985:8;38037:19;;;:8;:19;;;;;:26;;;38074:6;;38037:33;;38066:4;;38037:33;:::i;:::-;38036:44;;;;:::i;:::-;38108:5;;38019:61;;-1:-1:-1;;;;;;38098:15:0;;;38108:5;;38098:15;;;;:37;;-1:-1:-1;38130:5:0;;-1:-1:-1;;;;;38117:18:0;;;38130:5;;38117:18;;38098:37;:76;;;;-1:-1:-1;;;;;;38148:19:0;;;;;;:8;:19;;;;;:26;;;38139:35;;38098:76;38095:290;;;-1:-1:-1;;;;;38195:19:0;;;;;;;:8;:19;;;;;;:26;;:35;;;38329:16;;;;;;:23;;;38363:6;;38329:30;;38355:4;;38329:30;:::i;:::-;38328:41;;;;:::i;:::-;-1:-1:-1;;;;;38302:16:0;;;;;;:8;:16;;;;;:23;;:67;38095:290;26169:42;38399:18;;;;:8;:18;;-1:-1:-1;;;;;;;;;;;38399:30:0;;38428:1;;38399:18;:30;;38428:1;;38399:30;:::i;:::-;;;;-1:-1:-1;;;36609:1832:0;38546:10;;-1:-1:-1;;;;;38536:20:0;;;38546:10;;38536:20;;:74;;;38592:18;;38578:11;;:32;;;;:::i;:::-;38560:15;:50;38536:74;38533:211;;;38627:10;:21;;-1:-1:-1;;;;;;38627:21:0;26169:42;38627:21;;;;;;-1:-1:-1;38663:12:0;:16;38699:33;;38716:15;8334:25:1;;38699:33:0;;8322:2:1;8307:18;38699:33:0;;;;;;;38533:211;38762:1;:5;;;38754:4;;:13;;;;;;;:::i;:::-;;;;-1:-1:-1;;38795:5:0;;;;:12;;38803:4;;38795:12;:::i;:::-;38778:13;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;38818:45:0;;-1:-1:-1;38828:6:0;38836:9;38847:4;38853:1;38856:6;38818:9;:45::i;:::-;38874:10;:15;;38887:2;;38874:10;-1:-1:-1;;38874:15:0;;38887:2;38874:15;;;;;;;;:::i;:::-;;;;;-1:-1:-1;38907:4:0;;32847:6072;-1:-1:-1;;;;;;;;;;;32847:6072:0:o;14079:117::-;14142:7;14169:19;14177:3;12538:18;;12455:109;14204:158;14278:7;14329:22;14333:3;14345:5;14329:3;:22::i;13578:152::-;13648:4;13672:50;13677:3;-1:-1:-1;;;;;13697:23:0;;13672:4;:50::i;13738:158::-;13811:4;13835:53;13843:3;-1:-1:-1;;;;;13863:23:0;;13835:7;:53::i;40603:1213::-;40756:26;40746:6;:36;;;;;;;;:::i;:::-;;40742:1006;;;40834:8;;:15;;40845:4;;40834:15;:::i;:::-;-1:-1:-1;;;;;40799:16:0;;;;;;:8;:16;;;;;:23;;:50;;:23;;:16;:50;;;;;:::i;:::-;;;;-1:-1:-1;;40900:16:0;;;;;-1:-1:-1;;;;;40864:19:0;;;;;;:8;:19;;;;;;:26;;:53;;40900:16;;40864:26;;:53;;40900:16;;40864:53;:::i;:::-;;;;-1:-1:-1;;40967:16:0;;;;:23;;40986:4;;40967:23;:::i;:::-;-1:-1:-1;;;;;40932:19:0;;;;;;:8;:19;;;;;:26;;:58;;:26;;:19;:58;;;;;:::i;:::-;;;;-1:-1:-1;40742:1006:0;;-1:-1:-1;40742:1006:0;;41022:28;41012:6;:38;;;;;;;;:::i;:::-;;41008:740;;;41102:8;;-1:-1:-1;;;;;41067:16:0;;41102:8;41067:16;;;:8;:16;;;;;:23;;:43;;:23;;41102:8;41067:43;;41102:8;;41067:43;:::i;:::-;;;;-1:-1:-1;;41160:8:0;;:15;;41171:4;;41160:15;:::i;:::-;-1:-1:-1;;;;;41125:16:0;;;;;;:8;:16;;;;;:23;;:50;;:23;;:16;:50;;;;;:::i;41008:740::-;41280:28;41270:6;:38;;;;;;;;:::i;:::-;;41266:482;;;41360:8;;-1:-1:-1;;;;;41325:16:0;;41360:8;41325:16;;;:8;:16;;;;;:23;;:43;;:23;;41360:8;41325:43;;41360:8;;41325:43;:::i;:::-;;;;-1:-1:-1;;41419:8:0;;:15;;41430:4;;41419:15;:::i;41266:482::-;41645:8;;:15;;41656:4;;41645:15;:::i;:::-;-1:-1:-1;;;;;41609:16:0;;;;;;:8;:16;;;;;:23;;:52;;:23;;:16;:52;;;;;:::i;:::-;;;;-1:-1:-1;;41712:16:0;;;;:23;;41731:4;;41712:23;:::i;:::-;-1:-1:-1;;;;;41676:19:0;;;;;;:8;:19;;;;;:26;;:60;;:26;;:19;:60;;;;;:::i;:::-;;;;-1:-1:-1;;41266:482:0;41780:9;-1:-1:-1;;;;;41763:45:0;41772:6;-1:-1:-1;;;;;41763:45:0;-1:-1:-1;;;;;;;;;;;41791:1:0;:16;;;41763:45;;;;8334:25:1;;8322:2;8307:18;;8289:76;41763:45:0;;;;;;;;40603:1213;;;;;:::o;12572:204::-;12667:18;;12639:7;;12667:26;-1:-1:-1;12659:73:0;;;;-1:-1:-1;;;12659:73:0;;9510:2:1;12659:73:0;;;9492:21:1;9549:2;9529:18;;;9522:30;9588:34;9568:18;;;9561:62;-1:-1:-1;;;9639:18:1;;;9632:32;9681:19;;12659:73:0;9482:224:1;12659:73:0;12750:3;:11;;12762:5;12750:18;;;;;;;;:::i;:::-;;;;;;;;;12743:25;;12572:204;;;;:::o;10335:414::-;10398:4;12415:19;;;:12;;;:19;;;;;;10415:327;;-1:-1:-1;10458:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;10641:18;;10619:19;;;:12;;;:19;;;;;;:40;;;;10674:11;;10415:327;-1:-1:-1;10725:5:0;10718:12;;10757:1553;10823:4;10962:19;;;:12;;;:19;;;;;;10998:15;;10994:1309;;11360:21;11384:14;11397:1;11384:10;:14;:::i;:::-;11433:18;;11360:38;;-1:-1:-1;11413:17:0;;11433:22;;11454:1;;11433:22;:::i;:::-;11413:42;;11700:17;11720:3;:11;;11732:9;11720:22;;;;;;;;:::i;:::-;;;;;;;;;11700:42;;11866:9;11837:3;:11;;11849:13;11837:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;11943:23;;;:12;;;:23;;;;;;:36;;;12104:17;;11943:3;;12104:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;12199:3;:12;;:19;12212:5;12199:19;;;;;;;;;;;12192:26;;;12242:4;12235:11;;;;;;;;10994:1309;12286:5;12279:12;;;;;14:156:1;80:20;;140:4;129:16;;119:27;;109:2;;160:1;157;150:12;109:2;61:109;;;:::o;175:247::-;234:6;287:2;275:9;266:7;262:23;258:32;255:2;;;303:1;300;293:12;255:2;342:9;329:23;361:31;386:5;361:31;:::i;427:251::-;497:6;550:2;538:9;529:7;525:23;521:32;518:2;;;566:1;563;556:12;518:2;598:9;592:16;617:31;642:5;617:31;:::i;683:388::-;751:6;759;812:2;800:9;791:7;787:23;783:32;780:2;;;828:1;825;818:12;780:2;867:9;854:23;886:31;911:5;886:31;:::i;:::-;936:5;-1:-1:-1;993:2:1;978:18;;965:32;1006:33;965:32;1006:33;:::i;:::-;1058:7;1048:17;;;770:301;;;;;:::o;1076:456::-;1153:6;1161;1169;1222:2;1210:9;1201:7;1197:23;1193:32;1190:2;;;1238:1;1235;1228:12;1190:2;1277:9;1264:23;1296:31;1321:5;1296:31;:::i;:::-;1346:5;-1:-1:-1;1403:2:1;1388:18;;1375:32;1416:33;1375:32;1416:33;:::i;:::-;1180:352;;1468:7;;-1:-1:-1;;;1522:2:1;1507:18;;;;1494:32;;1180:352::o;1537:661::-;1629:6;1637;1645;1653;1661;1714:3;1702:9;1693:7;1689:23;1685:33;1682:2;;;1731:1;1728;1721:12;1682:2;1770:9;1757:23;1789:31;1814:5;1789:31;:::i;:::-;1839:5;-1:-1:-1;1896:2:1;1881:18;;1868:32;1909:33;1868:32;1909:33;:::i;:::-;1961:7;-1:-1:-1;2015:2:1;2000:18;;1987:32;;-1:-1:-1;2071:2:1;2056:18;;2043:32;2084:30;2043:32;2084:30;:::i;:::-;1672:526;;;;-1:-1:-1;1672:526:1;;2187:3;2172:19;2159:33;;1672:526;-1:-1:-1;;1672:526:1:o;2203:382::-;2268:6;2276;2329:2;2317:9;2308:7;2304:23;2300:32;2297:2;;;2345:1;2342;2335:12;2297:2;2384:9;2371:23;2403:31;2428:5;2403:31;:::i;:::-;2453:5;-1:-1:-1;2510:2:1;2495:18;;2482:32;2523:30;2482:32;2523:30;:::i;2590:315::-;2658:6;2666;2719:2;2707:9;2698:7;2694:23;2690:32;2687:2;;;2735:1;2732;2725:12;2687:2;2774:9;2761:23;2793:31;2818:5;2793:31;:::i;:::-;2843:5;2895:2;2880:18;;;;2867:32;;-1:-1:-1;;;2677:228:1:o;2910:750::-;3002:6;3010;3018;3071:2;3059:9;3050:7;3046:23;3042:32;3039:2;;;3087:1;3084;3077:12;3039:2;3127:9;3114:23;3156:18;3197:2;3189:6;3186:14;3183:2;;;3213:1;3210;3203:12;3183:2;3251:6;3240:9;3236:22;3226:32;;3296:7;3289:4;3285:2;3281:13;3277:27;3267:2;;3318:1;3315;3308:12;3267:2;3358;3345:16;3384:2;3376:6;3373:14;3370:2;;;3400:1;3397;3390:12;3370:2;3455:7;3448:4;3438:6;3435:1;3431:14;3427:2;3423:23;3419:34;3416:47;3413:2;;;3476:1;3473;3466:12;3413:2;3507:4;3499:13;;;;-1:-1:-1;3531:6:1;-1:-1:-1;;3572:20:1;;3559:34;3602:28;3559:34;3602:28;:::i;:::-;3649:5;3639:15;;;3029:631;;;;;:::o;3665:241::-;3721:6;3774:2;3762:9;3753:7;3749:23;3745:32;3742:2;;;3790:1;3787;3780:12;3742:2;3829:9;3816:23;3848:28;3870:5;3848:28;:::i;3911:245::-;3978:6;4031:2;4019:9;4010:7;4006:23;4002:32;3999:2;;;4047:1;4044;4037:12;3999:2;4079:9;4073:16;4098:28;4120:5;4098:28;:::i;4161:376::-;4223:6;4231;4284:2;4272:9;4263:7;4259:23;4255:32;4252:2;;;4300:1;4297;4290:12;4252:2;4339:9;4326:23;4358:28;4380:5;4358:28;:::i;4542:180::-;4601:6;4654:2;4642:9;4633:7;4629:23;4625:32;4622:2;;;4670:1;4667;4660:12;4622:2;-1:-1:-1;4693:23:1;;4612:110;-1:-1:-1;4612:110:1:o;4727:184::-;4797:6;4850:2;4838:9;4829:7;4825:23;4821:32;4818:2;;;4866:1;4863;4856:12;4818:2;-1:-1:-1;4889:16:1;;4808:103;-1:-1:-1;4808:103:1:o;4916:515::-;5008:6;5016;5024;5032;5040;5093:3;5081:9;5072:7;5068:23;5064:33;5061:2;;;5110:1;5107;5100:12;5061:2;5146:9;5133:23;5123:33;;5203:2;5192:9;5188:18;5175:32;5165:42;;5254:2;5243:9;5239:18;5226:32;5216:42;;5305:2;5294:9;5290:18;5277:32;5267:42;;5359:3;5348:9;5344:19;5331:33;5373:28;5395:5;5373:28;:::i;:::-;5420:5;5410:15;;;5051:380;;;;;;;;:::o;5436:250::-;5502:6;5510;5563:2;5551:9;5542:7;5538:23;5534:32;5531:2;;;5579:1;5576;5569:12;5531:2;5615:9;5602:23;5592:33;;5644:36;5676:2;5665:9;5661:18;5644:36;:::i;:::-;5634:46;;5521:165;;;;;:::o;5691:250::-;5757:6;5765;5818:2;5806:9;5797:7;5793:23;5789:32;5786:2;;;5834:1;5831;5824:12;5786:2;5857:27;5874:9;5857:27;:::i;6151:137::-;6229:1;6222:5;6219:12;6209:2;;6235:18;;:::i;:::-;6264;;6199:89::o;6293:137::-;6371:1;6364:5;6361:12;6351:2;;6377:18;;:::i;7766:202::-;7909:2;7894:18;;7921:41;7898:9;7944:6;7921:41;:::i;7973:202::-;8116:2;8101:18;;8128:41;8105:9;8151:6;8128:41;:::i;8370:597::-;8482:4;8511:2;8540;8529:9;8522:21;8572:6;8566:13;8615:6;8610:2;8599:9;8595:18;8588:34;8640:1;8650:140;8664:6;8661:1;8658:13;8650:140;;;8759:14;;;8755:23;;8749:30;8725:17;;;8744:2;8721:26;8714:66;8679:10;;8650:140;;;8808:6;8805:1;8802:13;8799:2;;;8878:1;8873:2;8864:6;8853:9;8849:22;8845:31;8838:42;8799:2;-1:-1:-1;8951:2:1;8930:15;-1:-1:-1;;8926:29:1;8911:45;;;;8958:2;8907:54;;8491:476;-1:-1:-1;;;8491:476:1:o;8972:331::-;9174:2;9156:21;;;9213:1;9193:18;;;9186:29;-1:-1:-1;;;9246:2:1;9231:18;;9224:38;9294:2;9279:18;;9146:157::o;11164:329::-;11366:2;11348:21;;;11405:1;11385:18;;;11378:29;-1:-1:-1;;;11438:2:1;11423:18;;11416:36;11484:2;11469:18;;11338:155::o;13686:331::-;13888:2;13870:21;;;13927:1;13907:18;;;13900:29;-1:-1:-1;;;13960:2:1;13945:18;;13938:38;14008:2;13993:18;;13860:157::o;15479:335::-;15681:2;15663:21;;;15720:2;15700:18;;;15693:30;-1:-1:-1;;;15754:2:1;15739:18;;15732:41;15805:2;15790:18;;15653:161::o;24032:407::-;24234:2;24216:21;;;24273:2;24253:18;;;24246:30;24312:34;24307:2;24292:18;;24285:62;-1:-1:-1;;;24378:2:1;24363:18;;24356:41;24429:3;24414:19;;24206:233::o;25892:1512::-;26105:13;;6125;6118:21;6106:34;;26076:3;26061:19;;26177:4;26169:6;26165:17;26159:24;26192:51;26237:4;26226:9;26222:20;26208:12;6125:13;6118:21;6106:34;;6096:50;26192:51;;26292:4;26284:6;26280:17;26274:24;26307:53;26354:4;26343:9;26339:20;26323:14;6125:13;6118:21;6106:34;;6096:50;26307:53;;26409:4;26401:6;26397:17;26391:24;26424:53;26471:4;26460:9;26456:20;26440:14;6125:13;6118:21;6106:34;;6096:50;26424:53;;26526:4;26518:6;26514:17;26508:24;26541:53;26588:4;26577:9;26573:20;26557:14;6125:13;6118:21;6106:34;;6096:50;26541:53;;26643:4;26635:6;26631:17;26625:24;26658:53;26705:4;26694:9;26690:20;26674:14;6125:13;6118:21;6106:34;;6096:50;26658:53;-1:-1:-1;26767:4:1;26755:17;;;26749:24;26727:20;;;26720:54;26830:4;26818:17;;;26812:24;26790:20;;;26783:54;26856:6;26904:15;;;26898:22;26878:18;;;26871:50;26940:6;26988:15;;;26982:22;26962:18;;;26955:50;27024:6;27072:15;;;27066:22;27046:18;;;27039:50;27108:6;27156:15;;;27150:22;27130:18;;;27123:50;27192:6;27240:15;;;27234:22;27214:18;;;27207:50;27276:6;27319:15;;;27313:22;-1:-1:-1;;;;;6012:31:1;;27379:18;;;6000:44;27344:54;5990:60;27409:554;27698:13;;27680:32;;27768:4;27756:17;;;27750:24;27728:20;;;27721:54;27831:4;27819:17;;;27813:24;27791:20;;;27784:54;27667:3;27652:19;;27847:50;27893:2;27878:18;;27870:6;27847:50;:::i;:::-;27906:51;27952:3;27941:9;27937:19;27929:6;27906:51;:::i;28592:128::-;28632:3;28663:1;28659:6;28656:1;28653:13;28650:2;;;28669:18;;:::i;:::-;-1:-1:-1;28705:9:1;;28640:80::o;28725:120::-;28765:1;28791;28781:2;;28796:18;;:::i;:::-;-1:-1:-1;28830:9:1;;28771:74::o;28850:168::-;28890:7;28956:1;28952;28948:6;28944:14;28941:1;28938:21;28933:1;28926:9;28919:17;28915:45;28912:2;;;28963:18;;:::i;:::-;-1:-1:-1;29003:9:1;;28902:116::o;29023:125::-;29063:4;29091:1;29088;29085:8;29082:2;;;29096:18;;:::i;:::-;-1:-1:-1;29133:9:1;;29072:76::o;29153:380::-;29232:1;29228:12;;;;29275;;;29296:2;;29350:4;29342:6;29338:17;29328:27;;29296:2;29403;29395:6;29392:14;29372:18;29369:38;29366:2;;;29449:10;29444:3;29440:20;29437:1;29430:31;29484:4;29481:1;29474:15;29512:4;29509:1;29502:15;29366:2;;29208:325;;;:::o;29538:135::-;29577:3;-1:-1:-1;;29598:17:1;;29595:2;;;29618:18;;:::i;:::-;-1:-1:-1;29665:1:1;29654:13;;29585:88::o;29678:112::-;29710:1;29736;29726:2;;29741:18;;:::i;:::-;-1:-1:-1;29775:9:1;;29716:74::o;29795:127::-;29856:10;29851:3;29847:20;29844:1;29837:31;29887:4;29884:1;29877:15;29911:4;29908:1;29901:15;29927:127;29988:10;29983:3;29979:20;29976:1;29969:31;30019:4;30016:1;30009:15;30043:4;30040:1;30033:15;30059:127;30120:10;30115:3;30111:20;30108:1;30101:31;30151:4;30148:1;30141:15;30175:4;30172:1;30165:15;30191:127;30252:10;30247:3;30243:20;30240:1;30233:31;30283:4;30280:1;30273:15;30307:4;30304:1;30297:15;30323:127;30384:10;30379:3;30375:20;30372:1;30365:31;30415:4;30412:1;30405:15;30439:4;30436:1;30429:15;30455:131;-1:-1:-1;;;;;30530:31:1;;30520:42;;30510:2;;30576:1;30573;30566:12;30510:2;30500:86;:::o;30591:118::-;30677:5;30670:13;30663:21;30656:5;30653:32;30643:2;;30699:1;30696;30689:12

Swarm Source

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